В последнее время я работаю над небольшим приложением.Теперь он работает хорошо, но у меня есть несколько идей для расширения его функциональности.Это будет включать использование главного окна, которое показывает, когда приложение запускается, и нескольких всплывающих окон, которые предоставляют свои собственные дополнительные функции.Всего мне в конечном итоге понадобится четыре окна.
Я действительно хочу стать лучше в объектно-ориентированном программировании.Моя текущая версия приложения использует один класс для приложения, а затем группу 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 (хотя я не уверен, что именно этому методу принадлежит этот метод ..).).Как я могу получить доступ к этому методу, не наследуя от этого класса?