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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2640閲覧

root.destroy()を使ってdef内のroot = tk.Tk()を閉じたい

mikumikuDM

総合スコア81

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/10/23 21:09

前提

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

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

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

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

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

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

guest

回答2

0

root ってのをグローバル変数にしましょう

投稿2022/10/23 22:24

y_waiwai

総合スコア87749

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

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

mikumikuDM

2022/10/24 09:02

実現したいことの1つとして global は使わないでください、もしglobal を使わないとできないのであればそう教えてからglobal を使用したやり方を教えてください。とあります。
mikumikuDM

2022/10/24 09:08

早とちりしました失礼しました。globalを使用せずにグローバル変数にする方法について教えていただけますでしょうか?
guest

0

ベストアンサー

提示コードにおいてインスタンス変数であるmasterrootを指しているので、終了関数内でroot.destory()ではなく(インスタンス).master.destory()とすればよいです。
現状のクラスメソッドのままインスタンスを引数として渡してもよいですが、インスタンスメソッドに変更するほうが自然だと思います。

投稿2022/10/24 00:43

can110

総合スコア38262

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

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

mikumikuDM

2022/10/24 09:14

def 終了(): root.destroy() を def 終了(): テスト().master.destroy() にすることで解決できましたありがとうございました! こちらにベストアンサーをつけさせていただきたいと思います。 現状のクラスメソッドのままインスタンスを引数として渡す方法について、どのようにやればいいかを考えてみたのですがわかりませんでした。もし必要になった場合はまた質問させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問