我正在用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