我正在为我的GUI使用Tkinter开发程序。现在,我正在概念化整个项目,因此我将提供的代码非常简单。
本质上,我想创建一个主窗口,其中包含几个在各自的类中编写的小部件。窗口小部件之一将是导航栏,其中将存在“文件”->“另存为”。
我的问题是,如果我将导航栏作为在主类中实例化的单独类,则用导航栏编写的保存功能将无法查看其他类中的变量。
我已经考虑过可能的两种解决方案,但是我不确定哪一种对最佳软件工程实践来说都是正确的选择。
可能的解决方案1:创建一个单独的线程,该线程不断等待用户单击“保存”。单击“保存”后,它将更改一个事件标志,该标志使主类调用某个保存函数来保存所有变量。我的问题是,这经常浪费资源。该线程将不断浪费资源,等待单击保存按钮。
可能的解决方案2:在一个单独的类中创建导航栏,但在实例化它的主类中定义导航栏功能。我的问题是,它使主类与我想在其他地方定义的多余函数配合使用,以实现更好的实践。此外,我不太确定该怎么做,但是我确定如果花时间研究它,可以通过某种方式完成。
class Main:
def __init__(self, rt):
self.rt = rt
self.navbar = navbar.NavBar(rt)
self.rt.mainloop()
class NavBar(tkinter.Frame):
def __init__(self, master):
tkinter.Frame.__init__(self, master)
self.master = master
self.bg='red'
self.text = tkinter.Text(self, height=1, width=30)
self.text.insert(tkinter.END, "File")
self.text.pack()
self.grid(row=0, column=0)
if __name__ == "__main__":
root = tkinter.Tk()
root.title('Automation')
main = Main(root)
在这里,Navbar将具有一个名为File的按钮,如果滚动到该按钮,将生成其他按钮的列表,其中一个是“另存为”。如果单击“另存为”按钮,我希望能够保存所有属于Main的变量。
TLDR:我想找出一种创建保存文件功能的最佳方法,该功能能够保存来自不同类的变量,这些变量都在主伞类下实例化。
答案 0 :(得分:0)
通常,我将Main
类设置为所有Frames
的控制器,并让Main
直接继承自Tk
。以下是有关如何使用此方法访问其他类的属性的示例:
import tkinter as tk
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.navbar = NavBar(self)
self.another_frame = AnotherFrame(self)
self.navbar.grid(row=0, column=0)
self.another_frame.grid(row=1, column=0)
class NavBar(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.master = master
tk.Button(self,text="Button of first frame",command=self.print_other_frame).pack()
def print_other_frame(self):
print (self.master.another_frame.entry.get()) #access master attributes
class AnotherFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self, master)
self.entry = tk.Entry(self)
self.entry.pack()
self.entry.insert(0,"Test from 2nd frame")
if __name__ == "__main__":
root = Main()
root.title('Automation')
root.mainloop()