Python Tkinter:函数不';选项菜单动态链接时不打印
我正在尝试创建2个相互依赖的Python Tkinter:函数不';选项菜单动态链接时不打印,python,tkinter,widget,tkinter.optionmenu,Python,Tkinter,Widget,Tkinter.optionmenu,我正在尝试创建2个相互依赖的选项菜单s,第一个菜单上的选择将为第二个菜单提供不同的选项 我能够使用trace将这两个链接在一起。 两个选项功能表s都链接到一个命令,每当进行选择时,终端上都会打印一条消息 虽然这适用于第一个选项菜单,但在第二个选项上进行选择时,我无法打印任何内容。请注意,如果两个选项menus没有动态链接(即,如果它们被构造为单独的小部件),那么打印对它们都非常有用 你知道可能是什么问题吗 这里有一段代码说明了这个问题 import tkinter as tk from tkin
选项菜单
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)
甚至在选择它之前都会执行。@CoolCloudrun\u on\u charge\u sens\u selection(adc)
只初始化函数对象(或functor)类型run\u on\u charge\u sens\u selection
,参数为adc
。稍后,当有人单击“充电灵敏度”菜单中的一个条目时,将执行此函数,然后将执行函子的\uuu call\uuu
方法。