前提・実現したいこと
tkinterのToplevelを用いて増やしたウインドウ上で、
表示されたボタンを選択すると、選択したボタンの名称を表示するGUIを作成したい。
困っていること
- Toplevelを用いないウインドウ上では、上記目的のGUIを作成できました。
⇒選択したボタン名称を表示する。
- Toplevelを用いて増やしたウインドウ上で同様の動作をするGUIが作成できません。
⇒選択するボタンがすべて「Python」と表示される。
該当のソースコード
Python
1# Toplevelを用いないコード 2import tkinter as tk 3 4root = tk.Tk() 5v = tk.IntVar() 6v.set(1) 7languages = [("Python",1), ("Perl",2), ("Java",3), ("C++",4), ("C",5)] 8def ShowChoice(): 9 for language, val in languages: 10 if val == v.get(): 11 print(language) 12 break 13tk.Label(root, text="""好みのプログラミング言語を\n \ 14一つ選択していください。:""", justify = tk.LEFT, padx = 20).grid() 15for language, val in languages: 16 tk.Radiobutton(root, 17 text=language, 18 indicatoron = 0, #0はインジケーター、1はラジオボタン 19 width = 20, 20 padx = 20, 21 variable=v, 22 command=ShowChoice, 23 value=val).grid(sticky=tk.W) 24# mainloop 25root.mainloop() 26 27 28 29
Python
1# Toplevelを用いるコード 2import tkinter as tk 3 4# 子ウインドウ 5class ChildWindow: 6 def __init__(self, parent): 7 self.parent = parent 8 self.window = None 9 def init(self): 10 if not self.window: 11 self.window = tk.Toplevel(self.parent) 12 self.root = tk.Tk() 13 self.root.title(u'ChildWindow)') 14 self.root.geometry('600x400') 15 v = tk.IntVar() 16 v.set(1) 17 languages = [("Python",1), ("Perl",2), ("Java",3), ("C++",4), ("C",5)] 18 def ShowChoice(): 19 for language, val in languages: 20 if val == v.get(): 21 print(language) 22 break 23 tk.Label(self.root, text="""好みのプログラミング言語を\n \ 24 一つ選択していください。:""", justify = tk.LEFT, padx = 20).grid() 25 for language, val in languages: 26 tk.Radiobutton(self.root, 27 text=language, 28 indicatoron = 0, #0はインジケーター、1はラジオボタン 29 width = 20, 30 padx = 20, 31 variable=v, 32 command=ShowChoice, 33 value=val).grid(sticky=tk.W) 34 self.root.mainloop() 35 def this_window_close(self): 36 self.window.withdraw() 37 self.window = None 38 return "break" 39 40 41# 親ウィンドウ メイン画面 42class MainWindow: 43 cap, w, h, img = None, None, None, None 44 def __init__(self): 45 self.root = tk.Tk() 46 self.root.geometry("800x600+10+10") 47 self.root.title("MainWindow") 48 self.root.resizable(width=False, height=False) 49 self.variety_root = ChildWindow(self.root) 50 self.btn_child = tk.Button(text="子ウインドウ", command=self.variety_root.init) 51 self.btn_child.grid(row=1, column=0) 52 self.root.mainloop() 53def main(): 54 MainWindow() 55if __name__ == "__main__": 56 main()
試したこと
Toplevelを用いてウインドウを増やしていくと、Classを用いて管理した方がコードとして綺麗になると思い、
色々とネット上の情報を参考にして上記のようにコードを作成しましたが、動作の挙動が異なり困っています。
補足情報(FW/ツールのバージョンなど)
Python 3.8.3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/16 06:21 編集
2020/12/16 06:35
2020/12/16 06:45
2020/12/16 09:05 編集
2020/12/16 09:22