我正在尝试制作一个 tkinter GUI,它允许用户选择要显示的图形。我希望当用户单击 tkinter 菜单时显示此图表,然后如果用户选择任何菜单选项,图表的部分将被删除/添加。
例如,在下图中,我希望当用户单击“速度”时显示一个图表,即使他们没有单击其下面的任何选项,“u”,“v”等。
这是我的代码。正如你所看到的,我尝试使用 postcommand,但我认为我误解了它的作用,因为它没有按照我想要的方式工作。
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
# Initial setup
super().__init__()
self.title('Class based reader')
self.minsize(800,600)
# Widgets
self.option_add('*tearOff', False)
menu_bar = tk.Menu(self)
self.config(menu = menu_bar)
velocity_menu = tk.Menu(self, postcommand = self.do_something())
menu_bar.add_cascade(label='Velocity', menu = velocity_menu)
velocity_dict= {
'u': tk.StringVar(),
'v': tk.StringVar(),
'du': tk.StringVar(),
'dv': tk.StringVar()
}
for var, check in velocity_dict.items():
velocity_menu.add_checkbutton(label = var, variable = check, onvalue = 1, offvalue = 0)
flux_menu = tk.Menu(self, postcommand = self.do_something2())
menu_bar.add_cascade(label='Momentum Flux', menu = flux_menu)
flux_dict= {
'uu': tk.StringVar(),
'uv': tk.StringVar(),
'vu': tk.StringVar(),
'vv': tk.StringVar()
}
for var, check in flux_dict.items():
flux_menu.add_checkbutton(label = var, variable = check, onvalue = 1, offvalue = 0)
pressure_menu = tk.Menu(self)
menu_bar.add_cascade(label='Pressure', menu = pressure_menu)
force_menu = tk.Menu(self)
menu_bar.add_cascade(label='Force', menu = force_menu)
analytic_menu = tk.Menu(self)
menu_bar.add_cascade(label='Compare Analytic', menu = analytic_menu)
# Run the app
self.mainloop()
def do_something(self):
print("something")
def do_something2(self):
print("something2")
App()
代码中的问题源于您在菜单小部件初始化期间如何使用 postcommand 参数。您不是传递函数引用,而是直接调用函数。
我会这样尝试:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
# Initial setup
super().__init__()
self.title('Class based reader')
self.minsize(800,600)
# Widgets
self.option_add('*tearOff', False)
menu_bar = tk.Menu(self)
self.config(menu=menu_bar)
velocity_menu = tk.Menu(self)
velocity_menu.add_command(label='Velocity', command=self.do_something)
menu_bar.add_cascade(label='Velocity', menu=velocity_menu)
velocity_dict = {
'u': tk.StringVar(),
'v': tk.StringVar(),
'du': tk.StringVar(),
'dv': tk.StringVar()
}
for var, check in velocity_dict.items():
velocity_menu.add_checkbutton(label=var, variable=check, onvalue=1, offvalue=0)
flux_menu = tk.Menu(self)
flux_menu.add_command(label='Momentum Flux', command=self.do_something2)
menu_bar.add_cascade(label='Momentum Flux', menu=flux_menu)
flux_dict = {
'uu': tk.StringVar(),
'uv': tk.StringVar(),
'vu': tk.StringVar(),
'vv': tk.StringVar()
}
for var, check in flux_dict.items():
flux_menu.add_checkbutton(label=var, variable=check, onvalue=1, offvalue=0)
pressure_menu = tk.Menu(self)
menu_bar.add_cascade(label='Pressure', menu=pressure_menu)
force_menu = tk.Menu(self)
menu_bar.add_cascade(label='Force', menu=force_menu)
analytic_menu = tk.Menu(self)
menu_bar.add_cascade(label='Compare Analytic', menu=analytic_menu)
# Run the app
self.mainloop()
def do_something(self):
print("Velocity menu clicked")
def do_something2(self):
print("Momentum Flux menu clicked")
App()
从“菜单”小部件初始化中删除了“postcommand”参数,因为在这种情况下没有必要。
在“add_command”中为每个菜单项添加了“command”参数,以便在单击菜单项时调用相应的功能。