我一直嘗試OOP與Tkinter的使用 - 林到達那裏(我認爲),緩慢...的Tkinter類結構(每幀類)問題與複製部件
我想建立一個結構,其中每個幀由其自己的類處理,包括它的所有小部件和功能。也許我來自錯誤的角度,但這對我來說最合乎邏輯。 - 隨時告訴我,如果你同意/不同意!
我知道問題出現的原因 - 即時呼叫每個班級時,我的__init__
每次都運行並構建相關的小部件,無論它們是否已存在於框架中。但是,我能想到繞過這一點的唯一方法就是在我的主類GUI_Start
的__init__
中構建每個幀。 - 雖然這似乎是一個混亂和無組織的解決問題。
有沒有一種方法可以實現一個結構,其中每個類都照顧它自己的函數和小部件,但不會每次構建框架?
請參閱以下問題的小例子:
from Tkinter import *
class GUI_Start:
def __init__(self, master):
self.master = master
self.master.geometry('300x300')
self.master.grid_rowconfigure(0, weight=1)
self.master.grid_columnconfigure(0, weight=1)
self.win_colour = '#D2B48C'
self.frames = {}
for window in ['win1', 'win2']:
frame = Frame(self.master, bg=self.win_colour, bd=10, relief=GROOVE)
frame.grid(row=0, column=0, sticky='news')
setattr(self, window, frame)
self.frames[window] = frame
Page_1(self.frames)
def Next_Page(self, frames, controller):
controller(frames)
class Page_1(GUI_Start):
def __init__(self, master):
self.master = master
self.master['win1'].tkraise()
page1_label = Label(self.master['win1'], text='PAGE 1')
page1_label.pack(fill=X)
page1_button = Button(self.master['win1'], text='Visit Page 2...', command=lambda: self.Next_Page(self.master, Page_2))
page1_button.pack(fill=X, side=BOTTOM)
class Page_2(GUI_Start):
def __init__(self, master):
self.master = master
self.master['win2'].tkraise()
page2_label = Label(self.master['win2'], text='PAGE 2')
page2_label.pack(fill=X)
page2_button = Button(self.master['win2'], text='Back to Page 1...', command=lambda: self.Next_Page(self.master, Page_1))
page2_button.pack(fill=X, side=BOTTOM)
root = Tk()
gui = GUI_Start(root)
root.mainloop()
隨意批判結構,我可能會嘗試從錯誤的角度接近這個!
任何反饋將不勝感激! Luke
您最初複製的代碼是否正確的方式。每個「頁面」應該從「Frame」繼承,並且頁面中的所有小部件都進入該幀。你想通過不同的方式完成什麼?請參閱http://stackoverflow.com/a/7557028/7432 –
不確定您最初複製的代碼是什麼意思!你的例子中的幾個問題 - 它看起來像你創建一個框架來包含其他框架,因爲我創建框架和網格在根。你有這樣的理由嗎?或者我應該怎麼做?另外,你可以擴展你爲什麼在每個類中都有雙重__init__嗎? –
爲什麼它的價值,我沒有複製任何代碼:) –