ボタン押下で別の子画面を開くようになっています。
同じ動作をメニュの選択操作でも達成したいです。
クラスメソッドになっているためか、メニュがカスケードになっているためか、File->Open->Scriptの操作を行っても無反応です。エラーにはなりません。以下が現況のコーディングで、ボタン押下時に設定しているコールバック関数を、メニュ選択時のコマンドにも仕掛ければ どうにかなると思ったのですが(以下コードの【これダメみたい】の部分) そうは問屋が卸さないようです。
どういった対策を施せば良いのでしょうか?
ネット上の記事の切貼りで進め、学習より先に手を動かしてしまった結果、やはり躓きました。対策をご教示頂けたら幸いです。
よろしくお願いします。
Python
1from tkinter import * 2import tkinter.ttk as ttk 3import math 4 5class ModalDialogSampleApp(ttk.Frame): 6 7 def __init__(self, app): 8 super().__init__(app) 9 self.pack() 10 11 btn = ttk.Button(self, text="Script", command=self.openDialog1 ) 12 btn.grid(row=1, column=0) 13 14 btn = ttk.Button(self, text="Job", command=self.openDialog2 ) 15 btn.grid(row=2, column=0) 16 17 # 子画面①開く 18 def openDialog1(self): 19 20 self.dialog = Toplevel(self) 21 self.dialog.title("Script Menu") 22 23 #フォームサイズを実行端末から導き、ド真中に配置表示 24 lw = math.ceil(ww * 0.408) 25 lh = math.ceil(wh * 0.477) 26 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 27 28 self.dialog.configure(bg="#F0FFFF") 29 self.dialog.resizable(0,0) 30 self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 31 # modalに 32 self.dialog.grab_set() 33 closeButton = Button(self.dialog, text="close", command=self.closeDialog) 34 closeButton.pack() 35 36 37 # 子画面②開く 38 def openDialog2(self): 39 40 self.dialog = Toplevel(self) 41 self.dialog.title("Job Menu") 42 43 #フォームサイズを実行端末から導き、ド真中に配置表示 44 lw = math.ceil(ww * 0.408) 45 lh = math.ceil(wh * 0.477) 46 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 47 48 self.dialog.configure(bg="#F0FFFF") 49 self.dialog.resizable(0,0) 50 self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 51 # modalに 52 self.dialog.grab_set() 53 closeButton = Button(self.dialog, text="close", command=self.closeDialog) 54 closeButton.pack() 55 56 57 # 子画面閉じる 58 def closeDialog(self): 59 self.dialog.destroy() 60 61 62 63if __name__ == '__main__': 64 65 #世間でいうrootをappとしています 66 app = Tk() 67 68 #実行端末の画面サイズを取得 69 ww = app.winfo_screenwidth() 70 wh = app.winfo_screenheight() 71 72 app.update_idletasks() 73 74 #フォームサイズを実行端末から導き、ド真中に配置表示 75 lw = math.ceil(ww * 0.208) 76 lh = math.ceil(wh * 0.277) 77 app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 78 79 #タイトルを指定 80 app.title("Main Menu") 81 82 83 #フォームの最大化、×ボタン操作を無効化 84 app.resizable(0,0) 85 app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 86 87 88 menu_top = Menu(app) 89 menu_file = Menu(menu_top, tearoff=False) 90 menu_open = Menu(menu_top, tearoff=False) 91 92 app.configure(menu=menu_top, bg="#F0FFFF") 93 94 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 95 menu_top.add_command(label='Help(H)', underline=0) 96 97 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 98 menu_open.add_command(label='Script(S)', underline=0, command='app.openDialog1()') # 【これダメみたい】 99 menu_open.add_command(label='Job(J)', underline=0, command='app.openDialog2()') # 【これダメみたい】) 100 101 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) 102 103 104 105 # フレームを作成する 106 frame = ModalDialogSampleApp(app) 107 # 格納したTkインスタンスのmainloopで画面を起こす 108 app.mainloop()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 09:23