如何在单击 tkinter 菜单而不是菜单选项时执行命令?

问题描述 投票:0回答:1

我正在尝试制作一个 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()
python tkinter
1个回答
0
投票

代码中的问题源于您在菜单小部件初始化期间如何使用 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”参数,以便在单击菜单项时调用相应的功能。

© www.soinside.com 2019 - 2024. All rights reserved.