前提
tkinterを使用して画面上にボタンを作成するプログラムを書いています。
以下のは今回の質問内容に関係するソースコードです、こちらのソースコードに変更を加えたところ不具合が発生したためその不具合について質問させていただきます。
変更したところは以下のソースコードです。
python
1if __name__ == "__main__": 2 root = tk.Tk() 3 app = テスト(master = root) 4 app.key_listener.start() 5 app.mainloop() 6 app.key_listener.stop() 7 print("終了")
変更した結果以下の場所でエラーが起きていました。
python
1def 終了(): 2 root.destroy()
このエラーのせいで作成した終了のボタンを押しても作成したボタンウィンドウが閉じてくれません
作成したボタンウィンドウが閉じるためにはどのようにすればいいでしょうか?
該当のソースコード
変更前のソースコード
python
1import tkinter as tk 2from pynput.keyboard import Key, Listener 3 4class テスト(tk.Frame): 5 def __init__(self, master = None): 6 super().__init__(master) 7 self.master.title("質問用") 8 self.master.geometry("420x640") 9 self.key_listener = Listener(on_press=self.on_press) 10 11 button1 = tk.Button(self.master, 12 font=("", "10"), 13 text="ボタン1", # ボタンの表示名 14 command=lambda: self.on_press("1"), # クリックされたときに呼ばれるメソッド 15 width=10, 16 height=5 17 ) 18 button1.place(x=10, y=10) 19 20 button2 = tk.Button(self.master, 21 font=("", "10"), 22 text="ボタン2", # ボタンの表示名 23 command=lambda: self.on_press("2"), # クリックされたときに呼ばれるメソッド 24 width=10, 25 height=5 26 ) 27 button2.place(x=90, y=10) 28 29 def on_press(self,key): 30 if not type(key) is str: 31 key = key.char 32 if key == "1": 33 __class__.neko() 34 elif key == "2": 35 __class__.終了() 36 37 def 終了(): 38 root.destroy() 39 40 def neko(): 41 print("ねこ") 42 43if __name__ == "__main__": 44 root = tk.Tk() 45 app = テスト(master = root) 46 app.key_listener.start() 47 app.mainloop() 48 app.key_listener.stop() 49 print("終了")
変更後のソースコード
python
1import tkinter as tk 2from pynput.keyboard import Key, Listener 3 4class テスト(tk.Frame): 5 def __init__(self, master = None): 6 super().__init__(master) 7 self.master.title("質問用") 8 self.master.geometry("420x640") 9 self.key_listener = Listener(on_press=self.on_press) 10 11 button1 = tk.Button(self.master, 12 font=("", "10"), 13 text="ボタン1", # ボタンの表示名 14 command=lambda: self.on_press("1"), # クリックされたときに呼ばれるメソッド 15 width=10, 16 height=5 17 ) 18 button1.place(x=10, y=10) 19 20 button2 = tk.Button(self.master, 21 font=("", "10"), 22 text="ボタン2", # ボタンの表示名 23 command=lambda: self.on_press("2"), # クリックされたときに呼ばれるメソッド 24 width=10, 25 height=5 26 ) 27 button2.place(x=90, y=10) 28 29 def on_press(self,key): 30 if not type(key) is str: 31 key = key.char 32 if key == "1": 33 __class__.neko() 34 elif key == "2": 35 __class__.終了() 36 37 def 終了(): 38 root.destroy() 39 40 def neko(): 41 print("ねこ") 42 43def 開始(): 44 root = tk.Tk() 45 app = テスト(master = root) 46 app.key_listener.start() 47 app.mainloop() 48 app.key_listener.stop() 49 50 51if __name__ == "__main__": 52 開始() 53 print("終了")
実現したいこと
- ボタン2を押すのとキーボードの2を押すのとで両方ともボタンウィンドウが閉じる
- def 開始():についてはclass テスト(tk.Frame):内にあっても外にあってもどちらでも大丈夫です。できるやり方の方を教えてください。
- global は使わないでください、もしglobal を使わないとできないのであればそう教えてからglobal を使用したやり方を教えてください。
発生している問題・エラーメッセージ
"root" is not defined
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/24 09:02
2022/10/24 09:08