Как спроектировать каркас для многооконного приложения Tkinter, используя объектно-ориентированный подход - PullRequest
0 голосов
/ 13 декабря 2018

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

Я действительно хочу стать лучше в объектно-ориентированном программировании.Моя текущая версия приложения использует один класс для приложения, а затем группу def для функциональности.Основная схема такова:

import Tkinter as tk

class Application(object):
    def __init__(self):
        <generate the frames and place them in grids>
        self.add_widgets()

    def add_widgets(self):
        <define all widgets and place them in grids within frames>

    def methods(self):
        ...

if __name__ == "__main__":
    master = tk.Tk()
    app = Application(master)
    master.mainloop()

Мое текущее исправление для нескольких окон - это отдельное отдельное приложение Tkinter, которое я вызываю с помощью кнопки в моем "основном приложении".Возможно, не идеал, но это работает.

Я представляю себе обновленную версию моего приложения, чтобы иметь следующую схему:

import Tkinter as tk

class Application(object):
    def __init__(self, master):
        self.master = master
        #<define some default variables, fonts, colors>

        # create an instance of my MainWindow class
        # will this window automatically be displayed?
        main_window = MainWindow(self, self.master)

class MainWindow(tk.Frame):
    # I am not sure what exactly I need to pass to __init__ here
    # for this main window to be associated with my application
    def __init__(self, ...):
        tk.Frame.__init__(self, ...)
        self.pack()
        # for the same of this question, lets make a simple frame with label
        label1 = tk.Label(self, text="I don't really know what I am doing here..."
        label1.pack()

if __name__ == "__main__":
    master = tk.Tk()
    app = Application(master)
    master.mainloop()

У меня есть несколько вопросов.Я не уверен, что передать методам init для моих оконных классов.Должны ли они как-то ассоциироваться с основным классом Application?Я чувствую, что есть преимущества наследования от класса Frame в Tkinter, но я на самом деле не использовал никакого сознательного наследования, и поэтому я не уверен, как именно это сделать.Найти ресурсы и примеры с Tkinter не так просто.Кроме того, я почему-то чувствую, что мой основной класс Application может наследоваться от Tkinter.Tk () - это будет полезно?Или просто менее явно?

Если бы кто-то мог помочь мне придумать базовую структуру, где каждое окно - это свой класс, это было бы очень полезно.Я думаю, что я нахожусь в той точке, где базовые знания объектно-ориентированного программирования на Python принесут мне пользу, но мне нравится изучать программирование, работая над чем-то, что меня мотивирует.


Редактировать:

IТеперь у меня есть полностью рабочий пример многооконного приложения.

#!/usr/bin/env python

import Tkinter as tk

class QueueGui(tk.Tk):
    """Docstring"""

    def __init__(self, *args, **kwargs):
        """Docstring"""
        tk.Tk.__init__(self, *args, **kwargs)

        main_window = MainWindow()

class MainWindow(object):
    def __init__(self):
        frame = tk.Frame()
        frame.pack()
        b = tk.Button(frame, text="More Functionality, Please!", command=self.launch_morefunctions)
        b.pack()

    def launch_morefunctions(self):
        convertme = ConvertMe()


class AddedFunctionality(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        tk.Toplevel.__init__(self, *args, **kwargs)

        frame = tk.Frame(self)
        frame.pack()
        b = tk.Button(frame, text="Exit", command=self.destroy)
        b.pack()


###################################
# run application
if __name__ == "__main__":
    app = QueueGui()
    app.mainloop()
###################################

Скажем, я хотел бы поместить метод launch_morefunctions в основной класс Application (хотя я не уверен, что именно этому методу принадлежит этот метод ..).).Как я могу получить доступ к этому методу, не наследуя от этого класса?

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