如何为具有多个类的应用程序创建保存功能?

时间:2019-06-26 03:38:04

标签: python tkinter architecture software-design

我正在为我的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:我想找出一种创建保存文件功能的最佳方法,该功能能够保存来自不同类的变量,这些变量都在主伞类下实例化。

1 个答案:

答案 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()