我正在用python製作應用程序。這一切都工作。到目前爲止,所有內容都在一個源文件中你從小開始,然後全部成長。 我已經到了代碼難以理解的地步。所以我決定我需要在模塊和類中分解代碼。在Python中用Tkinter進行子類化
我終於得到了一些東西在一起,讓這一切工作。但是,我無法找到有關使用python製作複雜GUI的更多信息。因此使用類來創建小部件等等。
我做了演示以下小示例應用程序:
- 拆分GUI代碼和行動代碼。在我的例子中,動作代碼是由一個獨立的類來處理的,這也可能只是一個單獨的模塊。
- 在我的示例Tkinter.LabelFrame中,通過繼承容器創建自定義小部件。
- 使用傳播的虛擬/自定義事件觸發主代碼中的操作。
- 與子類/小部件
此篇的目的交換數據是雙重的。
- 我希望其他人能夠從我必須弄清楚的鬥爭中受益。
- 也許別人可以進一步改進這個例子。
我的例子有四個源文件。
start.py。該模塊只啓動應用程序,創建Gui類的一個對象。
import main if __name__ == '__main__': title = "Test" gui = main.Gui(title)
main.py.該模塊包含Gui類,並保存GUI的根元素。
import Tkinter import action import widget class Gui(): def __init__(self, title): self.root = Tkinter.Tk() self.root.protocol("WM_DELETE_WINDOW", self.applicationExit) self.root.title(title) #create the action object self.process = action.Adder() #create the input frame self.frameIn = widget.Input(self.root) self.frameIn.grid(row=0, column=0, padx = 5, pady =5, ipadx = 5, ipady = 5, sticky = Tkinter.N) #create the output frame self.frameOut = widget.Output(self.root) self.frameOut.grid(row=1, column=0, padx = 5, pady =5, ipadx = 5, ipady = 5, sticky = Tkinter.N) #bind events self.root.bind("<<input_submit>>", self.__submit) self.root.mainloop() def applicationExit(self): self.root.destroy() def __submit(self, event = None): value = self.frameIn.getValue() result = self.process.addValue(value) self.frameOut.outputText.set(result)
widget.py。該模塊包含兩個用於GUI的自定義小部件。
import Tkinter class Input(Tkinter.LabelFrame): def __init__(self, master): Tkinter.LabelFrame.__init__(self, master, text = "Input") self.inputText = Tkinter.StringVar() #create entry box self.entInput = Tkinter.Entry(self, textvariable = self.inputText, width = 20,) self.entInput.grid(row = 0, column = 0, padx = 5, pady = 2, sticky = Tkinter.N) #create submite button self.btnSubmit = Tkinter.Button(self, text = "Add", width = 10, command = self.__handlerSubmitButton) self.btnSubmit.grid(row = 1, column = 0, padx = 5, pady = 2, sticky = Tkinter.N) def getValue(self): value = self.inputText.get() if value.isdigit(): return int(value) else: None def __handlerSubmitButton(self, event = None): self.btnSubmit.event_generate("<<input_submit>>") class Output(Tkinter.LabelFrame): def __init__(self, master): Tkinter.LabelFrame.__init__(self, master, text = "Output") self.outputText = Tkinter.StringVar() #create out put label box self.lblOutput = Tkinter.Label(self, textvariable = self.outputText, width = 20, anchor = Tkinter.E) self.lblOutput.grid(row = 0, column = 0, padx = 5, pady = 2, sticky = Tkinter.N) def setValue(self, value): self.outputText.set(value)
action.py。該模塊包含將執行應用程序的實際任務的代碼。
class Adder(): def __init__(self): self.count = 0 def addValue(self, value): if value: self.count += value return self.count
任何改進都非常歡迎。
如果你唯一的問題是,「也許別人可以進一步改善的例子」,這將是更適合於[代碼審查(http://codereview.stackexchange.com/。) – Kevin