我制作了一个GUI应用程序,它一直在发展,直到与Tkinter的__init__
文档相似,但问题都在一个类中。我正在尝试重构许多不同类中的代码,以便稍后放入不同的文件中,因为现在阅读和理解代码很复杂。此外,测试将更加复杂,并且遵循god类方法是不好的。
我不能为不同的班级工作。我先尝试一个简短的版本。所以遵循这个代码:
■如何将EditMenu添加到主菜单栏
■如何在我的主tk元素上使用其他类的函数来编辑它或其他什么
import tkinter as tk
class MainApp(tk.Tk)
file = None
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.wm_title("Test Application")
# MENU:
menu_bar = tk.Menu(self)
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Open", command=FilesOptions.open_file)
file_menu.add_command(label="Save", command=FilesOptions.save_file)
menu_bar.add_cascade(label="File", menu=file_menu)
#CONTENT:
text_area = Text(self)
scrollbar = Scrollbar(text_area)
text_area.grid(sticky = N + E + S + W)
scrollbar.pack(side=RIGHT,fill=Y)
scrollbar.config(command=self.text_area.yview)
text_area.config(yscrollcommand=self.scrollbar.set)
# CONFIGURATION:
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
def set_title(self,name="Untitled"):
self.title(name)
class FilesOptions:
def open_file():
MainApp.file = askopenfilename(defaultextension=".txt",
filetypes=[("All Files","*.*"),
("Text Documents","*.txt")])
if MainApp.file == "": # no file to open
MainApp.file = None
else: # Try to open the file
MainApp.set_title(os.path.basename(MainApp.file))
MainApp.text_area.delete(1.0,END)
file = open(MainApp.file,"r")
MainApp.text_area.insert(1.0,file.read())
file.close()
def save_file():
MainApp.file = asksaveasfilename(initialfile='Untitled.txt',
defaultextension=".txt",
filetypes=[("All Files","*.*"),
("Text Documents","*.txt")])
if MainApp.file == "":
MainApp.file = None
else: # Try to save the file
file = open(MainApp.file,"w")
file.write(MainApp.text_area.get(1.0,END))
file.close()
MainApp.set_title(os.path.basename(MainApp.file))
class EditMenu(tk.Menu):
def __init__(self, parent, controller):
tk.Menu.__init__(self, parent)
self.add_command(label="speed filter",command=Effects.color)
self.add_command(label="blur filter",command=Effects.blur)
self.add_command(label="sharper filter", command=Effects.sharp)
class Effects():
def color():
pass
def blur():
pass
def sharp():
pass
谢谢你的帮助!
如何将EditMenu添加到主菜单栏?
由于EditMenu
继承自Menu
,因此添加其他菜单的方式相同。
class MainApp(tk.Tk)
...
def __init__(self, *args, **kwargs):
...
menu_bar = tk.Menu(self)
...
edit_menu = EditMenu(menu_bar)
menu_bar.add_cascade(label="Edit", menu=edit_menu)
如何在我的主tk元素上使用其他类的函数来编辑它或其他什么?
您所犯的错误是在类上而不是在类的实例上调用方法。如果您将方法定义为类方法,但您还没有这样做,那也没关系。
我认为更常见的解决方案是创建类的实例,向控制器传递一个参数给__init__
。然后,调用实例上的方法。这些方法将能够访问控制器,并因此能够访问由控制器管理的任何数据。
class EditMenu(tk.Menu):
def __init__(self, parent, controller):
tk.Menu.__init__(self, parent)
self.controller = controller
self.effects = Effects(controller)
self.add_command(label="speed filter",command=self.effects.color)
self.add_command(label="blur filter",command=self.effects.blur)
self.add_command(label="sharper filter", command=self.effects.sharp)