Классы Python продолжают называть друг друга - PullRequest
0 голосов
/ 10 декабря 2018

Я пытался использовать классы для обоих моих файлов.Я сделал gui.py с:

class GuiStart:    
    def __init__(self, master):
        self.master = master
        self.master.title("DECTools 1.3")

У меня есть другой файл с методами, которые я хочу выполнить.Этот файл называется foo.py

class DecToolsClass:
    def __init__(self):
        self.gui = gui.GuiStart()

Я получаю сообщение об ошибке, потому что я не даю ему параметр master.Я не могу установить его на None, потому что у него нет метода .title.

Я выполняю файл gui с:

if __name__ == "gui":
    root = tkinter.Tk()
    my_gui = GuiStart(root)
    root.mainloop()

Проблема в том, что мне нужно выполнить метод из foo.py с моим файлом gui.py, и мне нужно получить доступ к атрибутам из моегофайл gui.py с моим файлом foo.py.Я пытался сделать это, и я знаю, что не могу использовать несколько конструкторов, как в Java.

Возможно ли то, что я хочу или мне нужно переписать мой код?

Заранее спасибо!

1 Ответ

0 голосов
/ 10 декабря 2018

Класс GuiStart запускает графический интерфейс tkinter.Окно с кнопками и записями создается с этим классом.Из класса GuiStart я вызываю методы, которые делают такие вещи, как копирование файлов в определенное место

Хорошо, поэтому, чтобы подвести итог, у вас есть класс, который обрабатывает взаимодействие с пользователем, и набор универсальных методов, выполняющихнет взаимодействия с пользователем, что GuiStart предоставляет графический интерфейс для.Если я неправильно понимаю, этот ответ будет гораздо менее полезен.

Это действительно хорошая идея, чтобы разделить их, но для того, чтобы это разделение было эффективным, вы не должны иметь прямых ссылок друг от друга.Это означает, что это окончательное значение НЕ :

class DecToolsClass:
    def __init__(self):
        self.gui = gui.GuiStart()

Если вам действительно нужны инструменты для доступа к графическому интерфейсу, вы бы добавили его.Но, как правило, вы захотите сделать это наоборот: инструменты должны быть общими и вообще не знать о Gui.С другой стороны, Гуй знает о них.Предполагая, что остальная часть кода верна (я не знаю tkinter):

def main():
    tools = DecToolsClass()  # not shown, but it no longer has self.gui

    root = tkinter.Tk()
    my_gui = gui.GuiStart(root, tools)
    root.mainloop()

if __name__ == '__main__':
    main()

Что означает, конечно, что GuiStart должен взять набор инструментов, который он будет использовать в качестве аргумента:

class GuiStart:    
    def __init__(self, master, tools):
        self.master = master
        self.master.title("DECTools 1.3")
        self.tools = tools

Теперь повсюду в GuiStart любое использование инструментов должно проходить через self.tools.В качестве дополнительного бонуса в ваших юнит-тестах вы можете передать фиктивный объект tools, который просто проверяет, как он называется, что делает тестирование очень простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...