Python Tkinter:函数不';选项菜单动态链接时不打印

Python Tkinter:函数不';选项菜单动态链接时不打印,python,tkinter,widget,tkinter.optionmenu,Python,Tkinter,Widget,Tkinter.optionmenu,我正在尝试创建2个相互依赖的选项菜单s,第一个菜单上的选择将为第二个菜单提供不同的选项 我能够使用trace将这两个链接在一起。 两个选项功能表s都链接到一个命令,每当进行选择时,终端上都会打印一条消息 虽然这适用于第一个选项菜单,但在第二个选项上进行选择时,我无法打印任何内容。请注意,如果两个选项menus没有动态链接(即,如果它们被构造为单独的小部件),那么打印对它们都非常有用 你知道可能是什么问题吗 这里有一段代码说明了这个问题 import tkinter as tk from tkin

我正在尝试创建2个相互依赖的
选项菜单
s,第一个菜单上的选择将为第二个菜单提供不同的选项

我能够使用
trace
将这两个链接在一起。 两个
选项功能表
s都链接到一个命令,每当进行选择时,终端上都会打印一条消息

虽然这适用于第一个
选项菜单
,但在第二个选项上进行选择时,我无法打印任何内容。请注意,如果两个
选项menus
没有动态链接(即,如果它们被构造为单独的小部件),那么打印对它们都非常有用

你知道可能是什么问题吗

这里有一段代码说明了这个问题

import tkinter as tk
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

from PIL import ImageTk, Image

import os

#____________________________________________________________________________________________   
#This will be the main window
window = tk.Tk()
window.geometry('700x700')
window.title("daq")

#____________________________________________________________________________________________
#Lower frame
frame_main = Frame(window)
frame_main.place(rely=0.10, relx=0.0, relwidth=1.0)

#Create a tabcontrol
tabControl = ttk.Notebook(frame_main)
tabControl.grid(column=0, row=1)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Digitizer tab
tab_Digitizer    = ttk.Frame(tabControl)
tabControl.add(tab_Digitizer, text='   Digitizer   ')
digitizer_tab_dummy_label = Label(tab_Digitizer, text="")
digitizer_tab_dummy_label.grid(column=0, row=0)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Channel settings

frame_channel_registers = Frame(tab_Digitizer)
frame_channel_registers.grid(column=0, row=4)

#Channel settings - general

frame_general_channel_registers = Frame(frame_channel_registers)
frame_general_channel_registers.grid(column=0, row=2, padx=25, sticky=W)

#Channel settings - PSD

frame_PSD_channel_registers = Frame(frame_channel_registers)
frame_PSD_channel_registers.grid(column=0, row=4, padx=25, sticky=W)

#Charge sensitivity
def charge_sensitivity_selection(event):
     print ("~!@#$%^&*()_+")
     #print ("Charge sensitivity       :", var_charge_sensitivity.get() )
     pass

lbl_charge_sensitivity = Label(frame_PSD_channel_registers, text="Charge sensitivity")
lbl_charge_sensitivity.grid(column=0, row=3, padx=25, sticky=W)


var_charge_sensitivity = StringVar(frame_PSD_channel_registers)
charge_sensitivity     = OptionMenu(frame_PSD_channel_registers, var_charge_sensitivity, '', command=charge_sensitivity_selection)
charge_sensitivity.grid(column=1, row=3, sticky=W)


#ADC range
def update_options(*args):
    adc_range=opt_ADC_range[var_ADC_range.get()]
    var_charge_sensitivity.set(adc_range[0])
    
    menu = charge_sensitivity['menu']
    menu.delete(0, 'end')
    
    for adc in adc_range:
         menu.add_command(label=adc, command=lambda sens=adc: var_charge_sensitivity.set(sens) )
         
def ADC_range_selection(event):
    print ("ADC range                 :", var_ADC_range.get() )
    pass
    
lbl_ADC_range = Label(frame_general_channel_registers, text="ADC range")
lbl_ADC_range.grid(column=0, row=1, padx=25, sticky=W)

opt_ADC_range = {'0.5':['1.25', '5', '20', '80', '320', '1280'], '2':['5', '20', '80', '320', '1280', '5120']}
var_ADC_range = StringVar(frame_general_channel_registers)
var_ADC_range.trace('w', update_options)
ADC_range     = OptionMenu(frame_general_channel_registers, var_ADC_range, *opt_ADC_range.keys(), command = ADC_range_selection)
var_ADC_range.set('2')
ADC_range.grid(column=1, row=1, sticky=W)

#This keeps the window open - has to be at the end
window.mainloop()

如果注释掉行
var\u ADC\u range.trace('w',update\u options)
,则会发生以下情况:

  • “充电灵敏度”菜单为“空”,意味着它只有一个空条目
  • 如果选择此条目,则调用
    charge\u sensitivity\u selection
    函数
  • ->您将看到
    ~!@$%^&*()打印
这意味着
update\u options
功能将覆盖当选择“充电灵敏度”菜单中的条目时将调用的命令。这种情况发生在:

menu.add\u命令(label=adc,command=lambda sens=adc:var\u charge\u sensitivity.set(sens))
可以尝试用如下函数对象替换上行中的
lambda
表达式:

。。。

charge_sensitivity.grid(column=1,row=3,sticky=W)#为什么要在
print()
函数之后使用
pass
。我认为OP只是在添加
print
语句时忘了删除它。我有时也这样做:D@Matiiss这正是塞利扎德所说的。我不认为这是问题所在,是吗?我没有经验,所以我可能错了。我根本不会使用
OptionMenu
。我会使用
ttk.Combobox
。为什么不在第二个选项菜单的变量上使用
trace
command=run\u on\u charge\u sens\u selection(adc)
甚至在选择它之前都会执行。@CoolCloud
run\u on\u charge\u sens\u selection(adc)
只初始化函数对象(或functor)类型
run\u on\u charge\u sens\u selection
,参数为
adc
。稍后,当有人单击“充电灵敏度”菜单中的一个条目时,将执行此函数,然后将执行函子的
\uuu call\uuu
方法。