Python OptionMenu回调未按预期传递字符串或变量
我有一个使用tkinter构建的简单表单。我的一个小部件是一个文本选项菜单,允许用户选择4种公司或实体类型中的1种。之后的小部件需要公司或实体注册号 从逻辑上讲,如果用户选择“独资企业”,则不需要注册号,因为独资企业没有注册号,因此如果出现这种情况,并且用户选择“独资企业”,我希望注册号小部件消失 因此,我要做的是跟踪OptionMenu变量和if,并将其传递给回调,如下所示:Python OptionMenu回调未按预期传递字符串或变量,python,tkinter,arguments,optionmenu,Python,Tkinter,Arguments,Optionmenu,我有一个使用tkinter构建的简单表单。我的一个小部件是一个文本选项菜单,允许用户选择4种公司或实体类型中的1种。之后的小部件需要公司或实体注册号 从逻辑上讲,如果用户选择“独资企业”,则不需要注册号,因为独资企业没有注册号,因此如果出现这种情况,并且用户选择“独资企业”,我希望注册号小部件消失 因此,我要做的是跟踪OptionMenu变量和if,并将其传递给回调,如下所示: # Organisation Type (Drop List) CurrentRowXAlignment += 3 O
# Organisation Type (Drop List)
CurrentRowXAlignment += 3
OrgTypeLabel = tk.Label(SetUpWindow, text="Organisation Type:", font=('Helvetica', 11, 'bold'))
OrgTypeLabel.place(x=ColumnXAlignment1, y=CurrentRowXAlignment, anchor=LabelAnchors)
OrgType = tk.StringVar(SetUpWindow)
OrgType.set(client_data_list[2])
OrgTypeEntry = tk.OptionMenu(SetUpWindow, OrgType, "Private Company (\"(Pty) Ltd\")",
"Public Company (\"Limited\")",
"Closed Corporation (\"cc\")", "Sole Proprietor")
OrgTypeEntry.place(x=ColumnXAlignment2 - 2, y=CurrentRowXAlignment - 3, anchor=EntryBoxAnchors)
OrgTypeEntry.bind("<Tab>",MovetoNextField)
OrgType.trace("w", lambda *args, org_type=OrgType.get(): ShowRegNumber(org_type, *args))
CurrentRowXAlignment += RowGap
由于某些原因,组织类型未通过-我已尝试调试,但它一直通过“”,因此无论选择菜单上的哪个选项,它都会一直转到“else”
有人知道我做错了什么吗?当你在
lambda
org_type=OrgType.get()
然后它只在开始时获取一次值OrgType.get()
,并分配该值
你可以用
lambda *args: ShowRegNumber( OrgType.get(), *args)
但更具可读性的是在函数中使用它
def ShowRegNumber(*args):
org_type = OrgType.get()
但更好的方法是使用
tk.OptionMenu(..., command=ShowRegNumber)
然后在ShowRegNumber
def ShowRegNumber(org_type):
最小工作示例
import tkinter as tk
# --- functions ---
def show_reg_number(selected):
print(selected)
# --- main ---
setup_window = tk.Tk()
client_data_list = [
'Private Company ("(Pty) Ltd")',
'Public Company ("Limited")',
'Closed Corporation ("cc")',
'Sole Proprietor',
]
org_type = tk.StringVar(setup_window)
org_type.set(client_data_list[2])
org_type_entry = tk.OptionMenu(setup_window, org_type, *client_data_list, command=show_reg_number)
org_type_entry.pack()
setup_window.mainloop()
顺便说一句:
我对变量和函数使用小写名称,因为您应该在函数内部使用
OrgType.get()
函数ShowRegNumber()
-在当前代码中,它只从OrgType.get()
获取值一次-在开始时-而不是在选项菜单中更改值时。您不需要跟踪
,而是选项菜单(…,命令=…)
else:pass
没有用。如果这部分没有代码,你就不必使用else
。谢谢@furas。你能不能给我看一下命令=
我需要用来传递OrgType…也就是说,我在回答中失败了请看代码-它会自动将所选值发送到函数并您不必使用OrgType.get()
。
import tkinter as tk
# --- functions ---
def show_reg_number(selected):
print(selected)
# --- main ---
setup_window = tk.Tk()
client_data_list = [
'Private Company ("(Pty) Ltd")',
'Public Company ("Limited")',
'Closed Corporation ("cc")',
'Sole Proprietor',
]
org_type = tk.StringVar(setup_window)
org_type.set(client_data_list[2])
org_type_entry = tk.OptionMenu(setup_window, org_type, *client_data_list, command=show_reg_number)
org_type_entry.pack()
setup_window.mainloop()