Как создать функцию сохранения для приложения с несколькими классами? - PullRequest
0 голосов
/ 26 июня 2019

Я разрабатываю программу с использованием Tkinter для моего GUI.Сейчас я концептуализирую весь проект, поэтому код, который я предоставлю, очень упрощен.

По сути, я хотел создать главное окно, в котором есть несколько виджетов, каждый из которых написан в своих собственных классах.Одним из виджетов будет панель навигации, в которой будет существовать «Файл» -> «Сохранить как».

Моя проблема с этим заключается в том, что если у меня есть отдельный класс navbar, который создается в мастер-классе, сохранитьФункция, написанная в панели навигации, не сможет просматривать переменные в других классах.

Я подумал о двух возможных решениях для этого, но я не уверен, что одно из них обязательно является правильным для достижения наилучших результатов.Практика разработки программного обеспечения.

Потенциальное решение 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 будет кнопка с именемФайл, который при прокрутке генерирует список других кнопок, одной из которых является «Сохранить как».Если нажать эту кнопку «Сохранить как», я бы хотел сохранить все переменные, относящиеся к Main.

TLDR: я хочу выяснить, как лучше всего создать функциональность для сохранения файла, имея возможностьсохранить переменные из разных классов, все экземпляры которых создаются в главном классе-зонте.

1 Ответ

0 голосов
/ 26 июня 2019

Обычно я устанавливаю класс 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()
...