Pythonでプログラムしています。プログラムはメイン(parent.py)と2つの子(child1.py、child2.py)にしています。
(1)目標はタブ移動時に元のタブの入力項に入力が無い場合に移動選択した移動先タブに移動せず元のタブに
戻りたい。
(2)TkinterのNOTEBOOKでタブを作りNOTEBOOKの<<NotebookTabChanged>>にgetTabIdを設定。
このgetTabId内でタブのIdを入手し、移動元の入力項の入力有無を判断し条件により移動元のタブに
戻る。
移動元のタブIdを変数old_tab_idに代入して、この変数をchild2.py内の他の自作関数でも使う
(3)当該コードを実行するとフォームは表示されますが下記エラーメッセージが表示されます。
対策を教えて下さい。又child2.py中のdef getTabId(self):の記述内容は上記エラー
改善後動作するのでしょうか。
変数old_tab_idの値はその他の関数でも使おうと思っています、getTabId(self)内で受け取った値は
その後の利用で有効なのでしょうか。
(4)<<NotebookTabChanged>>はタブ移動後に動作するように思われます。移動元タブが表示されており、
移動先タブが表示される前に必須入力条件等を判断し元のタブにとどまる様な処理は無いのでしょうか
発生している問題・エラーメッセージ
File "c:\PyPost\child2.py", line 12, in getTabId wd1 = str.strip(self.entry1.get()) AttributeError: 'Event' object has no attribute 'entry1'エラーメッセージ
該当のソースコード
# ******* parent.py import tkinter as tk import tkinter.ttk as ttk import child1 as ch1 import child2 as ch2 class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent # ********* タブ移動時の旧タブId(初期値設定) self.old_tab_id = 1 #********画面作成 ch1.create_notebook(self) self.pack() def quit(self, event=None): # 終了時の処理 self.master.destroy() application = tk.Tk() application.geometry("1000x600") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop() #**** child1.py import tkinter as tk import tkinter.ttk as ttk import child2 as ch2 # **********画面作成 def create_notebook(self): # ノートブック self.nb = ttk.Notebook(self,width=800, height=400) # タブの作成 self.tab1 = tk.Frame(self.nb) self.tab2 = tk.Frame(self.nb) self.nb.add(self.tab1, text='入力', padding=3) self.nb.add(self.tab2, text='出力', padding=3) # ********タアブ移動時タブのId入手 self.nb.bind("<<NotebookTabChanged>>",ch2.getTabId) self.nb.pack(expand=1, fill='both') # 入力タブ内の画面 self.entry1 = tk.Entry(self.tab1,font=("",14),justify="center",width=15) self.entry1.pack(side="left") # 出力タブ内の画面 self.entry2 = tk.Entry(self.tab2,font=("",14),justify="center",width=15) self.entry2.pack(side="left") # **** child2.py import tkinter as tk import tkinter.ttk as ttk import child1 as ch1 # ******各種アクション集 def getTabId(self): # タブ1,2の入力値を取得 wd1 = str.strip(self.entry1.get()) wd2 = str.strip(self.entry2.get()) # 移動後のタブナンバー取得 new_tab_id = self.nb.index(self.nb.select()) # 移動前後のタブ番号を入れ替えた後、元のタブに戻る dummy = self.old_tab_id self.old_tab_id = new_tab_id self.nb.select(self.dummy) # 入れ替え後のタブナンバー表示 print(dummy,self.old_tab_id) ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/29 07:48