Python:添加来自其他类的tk菜单元素



我制作了一个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)

相关内容

  • 没有找到相关文章

最新更新