tkinter Menu.add_command如何绑定事件
时间: 2024-05-15 12:19:21 浏览: 8
您可以使用`command`参数来绑定一个函数,当菜单项被点击时,该函数将被调用。
例如:
```python
from tkinter import *
def do_something():
print("Menu item clicked")
root = Tk()
menu = Menu(root)
root.config(menu=menu)
file_menu = Menu(menu)
menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=do_something)
root.mainloop()
```
在上面的例子中,当用户点击“Open”菜单项时,将会调用`do_something`函数。
相关问题
# 创建菜单栏 menu_bar = tk.Menu(master) # 创建“文件”菜单 file_menu = tk.Menu(menu_bar, tearoff=0) file_menu.add_command(label="5M點檢表", command=lambda: self.read_from_excel(file_menu, "5M點檢表")) file_menu.add_command(label="Router首件检查记录表", command=lambda: self.read_from_excel1(file_menu, "Router首件检查记录表")) file_menu.add_command(label="板组作业首件检查记录表", command=lambda: self.read_from_excel2(file_menu, "板组作业首件检查记录表")) # 创建“保养”菜单 maintenance_menu = tk.Menu(menu_bar, tearoff=0) maintenance_menu.add_command(label="日保養", command=lambda: self.read_from_excel3(maintenance_menu, "日保養")) maintenance_menu.add_command(label="周保養", command=lambda: self.read_from_excel4(maintenance_menu, "周保養")) # 创建“测试”菜单 test_menu = tk.Menu(menu_bar, tearoff=0) test_menu.add_command(label="人工測試站表單", command=lambda: self.read_from_excel5(test_menu, "人工測試站表單")) test_menu.add_command(label="自動化測試站表單", command=lambda: self.read_from_excel6(test_menu, "自動化測試站表單")) # 将子菜单添加到菜单栏 menu_bar.add_cascade(label="PA", menu=file_menu) menu_bar.add_cascade(label="保养表單", menu=maintenance_menu) menu_bar.add_cascade(label="F/T表單", menu=test_menu) # 将菜单栏添加到主窗口 master.config(menu=menu_bar)修改為多級菜單欄
要创建多级菜单栏,你需要使用`tk.Menu`的`add_cascade`方法。这个方法可以让你将一个子菜单添加到父菜单下面,形成多级菜单。
以下是一个示例代码,其中包含了多级菜单栏以及点击菜单项后弹出对话框的功能:
```
import tkinter as tk
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title("多级菜单栏")
self.pack()
self.create_menu()
def create_menu(self):
# 创建菜单栏
menu_bar = tk.Menu(self.master)
# 创建第一级菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
maintenance_menu = tk.Menu(menu_bar, tearoff=0)
test_menu = tk.Menu(menu_bar, tearoff=0)
# 创建第二级菜单
file_menu_2 = tk.Menu(file_menu, tearoff=0)
maintenance_menu_2 = tk.Menu(maintenance_menu, tearoff=0)
test_menu_2 = tk.Menu(test_menu, tearoff=0)
# 创建第三级菜单
file_menu_3 = tk.Menu(file_menu_2, tearoff=0)
maintenance_menu_3 = tk.Menu(maintenance_menu_2, tearoff=0)
test_menu_3 = tk.Menu(test_menu_2, tearoff=0)
# 添加菜单项,并绑定事件处理函数
file_menu_3.add_command(label="文件1", command=lambda: self.show_message("文件1"))
file_menu_3.add_command(label="文件2", command=lambda: self.show_message("文件2"))
file_menu_2.add_cascade(label="文件子菜单", menu=file_menu_3)
file_menu.add_cascade(label="文件", menu=file_menu_2)
maintenance_menu_3.add_command(label="保养1", command=lambda: self.show_message("保养1"))
maintenance_menu_3.add_command(label="保养2", command=lambda: self.show_message("保养2"))
maintenance_menu_2.add_cascade(label="保养子菜单", menu=maintenance_menu_3)
maintenance_menu.add_cascade(label="保养表单", menu=maintenance_menu_2)
test_menu_3.add_command(label="测试1", command=lambda: self.show_message("测试1"))
test_menu_3.add_command(label="测试2", command=lambda: self.show_message("测试2"))
test_menu_2.add_cascade(label="测试子菜单", menu=test_menu_3)
test_menu.add_cascade(label="测试表单", menu=test_menu_2)
# 将菜单栏添加到主窗口
self.master.config(menu=menu_bar)
def show_message(self, message):
messagebox.showinfo("提示", message)
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
在这个示例中,我们创建了三个一级菜单:文件、保养表单和测试表单。每个一级菜单下面都有一个二级菜单,分别是文件子菜单、保养子菜单和测试子菜单。文件子菜单、保养子菜单和测试子菜单下面又各自有一个三级菜单,分别是文件1、文件2、保养1、保养2、测试1和测试2。
当用户点击菜单项时,会弹出一个消息框,显示被点击的菜单项的名称。你可以根据自己的需求修改这个功能。
import tkinter as tk from tkinter import filedialog from common import LayoutCenter class EditForm: def __init__(self, master): self.master = master LayoutCenter(master, "修订评分标准") # 创建滚动条 vsb = tk.Scrollbar(master, orient=tk.VERTICAL) vsb.pack(side="right", fill="y") # 创建文本框并关联滚动条 self.text = tk.Text(self.master, yscrollcommand=vsb.set) self.text.pack(fill="y", expand=True) vsb.config(command=self.text.yview) self.create_menu() self.text.bind("<KeyRelease>", self.update_line_numbers) self.text.tag_configure("line_numbers", justify="right") # 添加行号标记 def update_line_numbers(self,event=None): self.text.delete("line_numbers") for i, line in enumerate(self.text.get("1.0", "end").split("\n")): self.text.insert(f"{i+1}.0", f"{i+1}\n", "line_numbers") def create_menu(self): menu = tk.Menu(self.master) self.master.config(menu=menu) file_menu = tk.Menu(menu) menu.add_cascade(label="File", menu=file_menu) file_menu.add_command(label="Open", command=self.open_file) file_menu.add_command(label="Save", command=self.save_file) file_menu.add_separator() file_menu.add_command(label="Exit", command=self.exit) def open_file(self): file_path = filedialog.askopenfilename() if file_path: with open(file_path, "r") as file: self.text.delete("1.0", "end") self.text.insert("1.0", file.read()) def save_file(self): file_path = filedialog.asksaveasfilename() if file_path: with open(file_path, "w") as file: file.write(self.text.get("1.0", "end")) def exit(self): self.master.destroy() def run(self): self.master.mainloop() root = tk.Tk() my_gui = EditForm(root) root.mainloop()
这段代码中存在语法错误。第一行的import语句和第二行的from语句之间需要添加一个换行符,否则会报错。将这两行代码修改为如下形式即可:
```
import tkinter as tk
from tkinter import filedialog
from common import LayoutCenter
class EditForm:
def __init__(self, master):
self.master = master
LayoutCenter(master, "修订评分标准")
# 创建滚动条
vsb = tk.Scrollbar(master, orient=tk.VERTICAL)
vsb.pack(side="right", fill="y")
# 创建文本框并关联滚动条
self.text = tk.Text(self.master, yscrollcommand=vsb.set)
self.text.pack(fill="y", expand=True)
vsb.config(command=self.text.yview)
self.create_menu()
self.text.bind("<KeyRelease>", self.update_line_numbers)
self.text.tag_configure("line_numbers", justify="right")
# 添加行号标记
def update_line_numbers(self,event=None):
self.text.delete("line_numbers")
for i, line in enumerate(self.text.get("1.0", "end").split("\n")):
self.text.insert(f"{i+1}.0", f"{i+1}\n", "line_numbers")
def create_menu(self):
menu = tk.Menu(self.master)
self.master.config(menu=menu)
file_menu = tk.Menu(menu)
menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=self.open_file)
file_menu.add_command(label="Save", command=self.save_file)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=self.exit)
def open_file(self):
file_path = filedialog.askopenfilename()
if file_path:
with open(file_path, "r") as file:
self.text.delete("1.0", "end")
self.text.insert("1.0", file.read())
def save_file(self):
file_path = filedialog.asksaveasfilename()
if file_path:
with open(file_path, "w") as file:
file.write(self.text.get("1.0", "end"))
def exit(self):
self.master.destroy()
def run(self):
self.master.mainloop()
root = tk.Tk()
my_gui = EditForm(root)
my_gui.run()
```
请注意,我还将root.mainloop()替换为my_gui.run(),这样可以避免在运行时出现多个Tkinter窗口的问题。