のエントリを複製します。Tkinterの - 私は複数のモードを持つことになりますと、モードの変化に応じて、ウィンドウのさまざまな部分にフレームを変更したいTkinterのプログラムを書いていた辞書と予想外のパック()の挙動
次のコードが含まれるフレームを切り替えることができ抽象SwitcherClassを作成することを意図しています。 SwitchedFrameはSwitcherClassから派生し、切り替えるべきフレーム(この場合はMyclassとMyotherclass)をリストするclass属性を持っています。
それは2つの予期しない動作があります。SwitcherClassで
辞書self.childrenは、2つのエントリを持つ必要があり、それは4で終了。 SubClassオブジェクトはキーと値のように辞書内で終了するので、ループを実行するたびに2つの辞書エントリが作成されます。
パック()とpack_forget()は何もしないSwitcherClassに呼び出します。実際、SwitcherClassの子がパックされていないと、メインウィンドウにはまだ表示されます。どうして?
これらのパズルのいずれかまたは両方に対する回答をいただければ幸いです。まず
import tkinter as tk
class Myclass(tk.Frame):
def __init__(self,parent):
super().__init__(parent)
tk.Button(text='Myclass',command=parent.switch).pack()
class Myotherclass(tk.Frame):
def __init__(self,parent):
super().__init__(parent)
tk.Button(text='Myotherclass',command=parent.switch).pack()
class SwitcherClass(tk.Frame):
def __init__(self,parent):
super().__init__(parent)
self.children = {}
for label,Subclass in self.contains:
self.children[label] = Subclass(self)
print(self.children)
self.frame = 'first'
self.children[self.frame].pack()
def switch(self):
old_frame = self.frame
if self.frame == 'second':
self.frame = 'first'
else:
self.frame = 'second'
self.children[old_frame].pack_forget()
self.children[self.frame].pack()
class SwitchedFrame(SwitcherClass):
contains = (('first',Myclass),('second',Myotherclass))
root = tk.Tk()
tk.Label(root,text='root frame').pack()
SwitchedFrame(root).pack()
root.mainloop()
'tk.Button()'を 'parent'なしで使うと' root'に割り当てられます。 – furas
'tkiner'はすでに' self.children'を使って自分の子供を保持しています - 別の名前を使用します。 'self.my_children' – furas