質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

963閲覧

Python(TkInter) ダイアログを開く動作を ボタン押下イベントだけでなくメニュ選択イベントでも行いたいが 無反応になるのはなぜ

saya24

総合スコア247

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/06 08:23

編集2020/05/06 08:28

ボタン押下で別の子画面を開くようになっています。

メニュまだ未操作

同じ動作をメニュの選択操作でも達成したいです。

メニュ操作している

クラスメソッドになっているためか、メニュがカスケードになっているためか、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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

クラス内に書いて上げるといいかと思います。

python

1class ModalDialogSampleApp(ttk.Frame): 2 def __init__(self, app): 3 super().__init__(app) 4 self.pack() 5 6 btn = ttk.Button(self, text="Script", command=self.openDialog1 ) 7 btn.grid(row=1, column=0) 8 9 btn = ttk.Button(self, text="Job", command=self.openDialog2 ) 10 btn.grid(row=2, column=0) 11 12 self.menu() 13 14 def menu(self): 15 menu_top = Menu(app) 16 menu_file = Menu(menu_top, tearoff=False) 17 menu_open = Menu(menu_top, tearoff=False) 18 19 app.configure(menu=menu_top, bg="#F0FFFF") 20 21 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 22 menu_top.add_command(label='Help(H)', underline=0) 23 24 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 25 menu_open.add_command(label='Script(S)', underline=0, command=self.openDialog1) 26 menu_open.add_command(label='Job(J)', underline=0, command=self.openDialog2) 27 28 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit)

投稿2020/05/06 08:46

nto

総合スコア1438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saya24

2020/05/06 09:23

ありがとうございます。できました!! __init__の中に self.menu()を追記して、menuというメソッドを追加したことで 無事解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問