Я собираюсь начать новый проект Python3/tkinter, и я хочу убедиться, что получаю как можно больше кода. Я создаю приложение, которое будет иметь, на данный момент, одно окно состоит из 3-х областей:в Python3/tkinter можно создать панель инструментов в отдельный класс, но все же разрешить ей взаимодействовать с основным приложением?
- Toolbar
- центр/главная площадь
- Statusbar
Я пытаюсь сохранить основной класс приложения как можно более чистый, разгружая код другим вспомогательным классам. Итак, следуя некоторым учебным пособиям и адаптировавшись к тому, что я делал до сих пор, я уже смог установить внешний класс панели инструментов, который можно изменить по требованию, из основного приложения. Теперь я пытаюсь создать класс для панели инструментов, но я боюсь, что будет невозможно создать кнопки и их соответствующие обратные вызовы в отдельном классе, так как я не знаю, как заставить их вызывать функции, которые в главном приложении. Возможно ли это?
Это то, что я получил прямо сейчас:
#!/usr/bin/python3
from tkinter import *
from tkinter import ttk
class App:
""" main class for the application """
def __init__(self,master):
mainframe = ttk.Frame(master)
topframe = ttk.Frame(mainframe)
centerframe = ttk.Frame(mainframe)
bottomframe = ttk.Frame(mainframe)
my_toolbar = Toolbar(topframe)
my_statusbar = StatusBar(mainframe)
my_statusbar.set("This is the statusbar")
centerlabel = ttk.Label(centerframe, text="Center stuff goes here")
centerlabel.pack()
topframe.pack(side=TOP, fill=X)
centerframe.pack(side=TOP, fill=BOTH)
bottomframe.pack(side=BOTTOM, fill=X)
mainframe.pack(side=TOP, expand=True, fill=BOTH)
def button_function(self, *event):
print("filter")
class StatusBar(ttk.Frame):
""" Simple Status Bar class - based on Frame """
def __init__(self,master):
ttk.Frame.__init__(self,master)
self.label = ttk.Label(self,anchor=W)
self.label.pack()
self.pack(side=BOTTOM, fill=X)
def set(self,texto):
self.label.config(text=texto)
self.label.update_idletasks()
def clear(self):
self.label.config(text="")
self.label.update_idletasks()
class Toolbar:
""" Toolbar """
def button_one(self):
print("button 1 pressed")
def button_two(self):
print("button 2 pressed")
def __init__(self,master):
self.button1 = ttk.Button(master,text="One",command=self.button_one())
self.button2 = ttk.Button(master,text="Two",command=self.button_two())
self.button1.grid(row=0,column=0)
self.button2.grid(row=0,column=1)
if __name__ == "__main__":
root = Tk()
app = App(root)
root.mainloop()
Допустим, что мне нужно сделать, чтобы вызвать button1
button_function()
для того, чтобы обновить некоторую информацию показывается там. Должен ли я просто перемещать панель инструментов в класс App
, например, в методе класса, называемом из его __init__()
? Или есть лучший способ?
Возможно, я должен добавить, что позже я добавлю некоторые окна Toplevel
, которые, вероятно, могут использовать некоторые из этих общих классов. Я хочу хорошо проложить дорогу.