【发布时间】:2015-09-19 03:49:09
【问题描述】:
我以前使用 tkinter 进行过编程,但通常会编写一个长的过程 GUI 类来实现我创建的其他非 GUI 类。这次我想使用更多的 OOP 来实现它,使其更加模块化。
我遇到了一个问题,我已经搜索了答案但没有找到任何答案,这通常意味着它要么真的很容易,要么我真的错了。我从 tk.LabelFrame 创建了一个继承的类,并在其中创建了 GUI 小部件。我也有方法来操作类中的小部件,但我不知道如何在另一个继承的类中执行函数,部分原因是我不知道如何正确地从另一个类(有 tkinter ('parent') 对象作为参数)。
我会通过重载构造函数来做到这一点吗?我已经看到了一些关于 @classmethods 和 *args, **kwargs 但还没有对它们采取行动,因为我不确定这是否是正确的路线。关于在 python 中实现重载构造函数的最佳/正确方法存在一些争论。对于我想要完成的事情,我很困惑什么是最合适的......
谢谢
#python 2.7 on win7
import Tkinter as tk
class Testing(tk.LabelFrame):
buttonwidth = 10
def __init__(self, parent):
self.parent=parent
#results = Results(???) #<-- Don't know how to instantiate Results object
tk.LabelFrame.__init__(self, self.parent,
text="Test Operations",
padx=10,
pady=10,
)
self.taskButton = tk.Button(
self,
text="Do A Task",
width=self.buttonWidth,
command=self.doATask,
)
self.taskButton.pack()
def doATask(self):
#want to execute function in Results.getResult() but don't know how
#results.getResults() #<--what I want to do
print("place holder")
class Results(tk.LabelFrame):
def __init__(self, parent):
self.parent = parent
tk.LabelFrame.__init__(self, self.parent, text="Visual Results")
self.resultLbl = tk.Label(self, text="Result")
self.resultLbl.pack()
def getResult(self):
self.resultLbl.configure(bg='yellow')
class Application(tk.Frame):
def __init__(self, parent):
self.parent = parent
tk.Frame.__init__(self, self.parent)
self.Testing = Testing(self.parent)
self.Results = Results(self.parent)
self.Testing.pack(fill=tk.X)
self.Results.pack(fill=tk.X)
if __name__ == "__main__":
root = tk.Tk()
root.title("Modular GUI App")
Application(root).pack()
root.mainloop()
【问题讨论】:
标签: python user-interface inheritance tkinter