Python OptionMenu回调未按预期传递字符串或变量

Python OptionMenu回调未按预期传递字符串或变量,python,tkinter,arguments,optionmenu,Python,Tkinter,Arguments,Optionmenu,我有一个使用tkinter构建的简单表单。我的一个小部件是一个文本选项菜单,允许用户选择4种公司或实体类型中的1种。之后的小部件需要公司或实体注册号 从逻辑上讲,如果用户选择“独资企业”,则不需要注册号,因为独资企业没有注册号,因此如果出现这种情况,并且用户选择“独资企业”,我希望注册号小部件消失 因此,我要做的是跟踪OptionMenu变量和if,并将其传递给回调,如下所示: # Organisation Type (Drop List) CurrentRowXAlignment += 3 O

我有一个使用tkinter构建的简单表单。我的一个小部件是一个文本选项菜单,允许用户选择4种公司或实体类型中的1种。之后的小部件需要公司或实体注册号

从逻辑上讲,如果用户选择“独资企业”,则不需要注册号,因为独资企业没有注册号,因此如果出现这种情况,并且用户选择“独资企业”,我希望注册号小部件消失

因此,我要做的是跟踪OptionMenu变量和if,并将其传递给回调,如下所示:

# 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()