使用tkinter OptionMenu时,命令输入允许您激活一项功能,但即使您单击已设置选项,也会激活相同的功能.例如:选项"A"已设置,再次点击选项"A"命令激活,但我希望只有当我将选项从"A"更改为另一个不是"A"的选项(如"B"或"C"),反之亦然.

以下是我的代码:

import tkinter 
from tkinter import *

# Create window------------------------------------------
window = tkinter.Tk()
window.title("Window")
window.geometry("800x500")
#--------------------------------------------------------

# Function-----------------------------------------------
def print_message(*args):
    print("the option has been changed")
#--------------------------------------------------------

# Dropdown menu------------------------------------------
# Datatype
option_selected = StringVar()  
# Create dropdown menu
option_list = ["A", "B", "C"]
option_selected.set(option_list[0]) 
option_menu = OptionMenu(window, option_selected, *option_list)
option_menu.pack()
option_selected.trace("w",print_message)
#--------------------------------------------------------

# Maintain window open
window.mainloop()

推荐答案

基本上OptionMenu不支持此功能,但您可以创建自定义OptionMenu来提供此功能:

import tkinter as tk

class CustomOptionMenu(tk.OptionMenu):
    def __init__(self, master, var, *values, command=None):
        super().__init__(master, var, *values,
                         command=self.on_selected if command else None)
        self.command = command
        self.value = var.get()

    def on_selected(self, value):
        # execute callback only if selected value is changed
        if self.value != value:
            self.command(value)
            self.value = value  # save the selected value

# Create window------------------------------------------
window = tk.Tk()
window.title("Window")
window.geometry("800x500")
#--------------------------------------------------------

# Function-----------------------------------------------
def print_message(value):
    print(f"the option has been changed to {value}")
#--------------------------------------------------------

# Dropdown menu------------------------------------------
# Datatype
option_selected = tk.StringVar()
# Create dropdown menu
option_list = ["A", "B", "C"]
option_selected.set(option_list[0])
option_menu = CustomOptionMenu(window, option_selected, *option_list, command=print_message)
option_menu.pack()
#--------------------------------------------------------

# Maintain window open
window.mainloop()

Python相关问答推荐

螺旋桨图上意外颠倒的次y轴

使用Curses for Python保存和恢复终端窗口内容

从单个列创建多个列并按pandas分组

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

如何使用Selenium访问svg对象内部的元素

模型序列化器中未调用现场验证器

不允许AMBIMA API请求方法

LAB中的增强数组

更改matplotlib彩色条的字体并勾选标签?

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

使用miniconda创建环境的问题

删除所有列值,但判断是否存在任何二元组

如何使用Python以编程方式判断和检索Angular网站的动态内容?

ThreadPoolExecutor和单个线程的超时

如何在Polars中从列表中的所有 struct 中 Select 字段?

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

如何在Python中使用另一个数据框更改列值(列表)

如何使regex代码只适用于空的目标单元格

Flask Jinja2如果语句总是计算为false&