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

OptionMenu callback not passing string or variable as expected

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

从逻辑上讲,如果用户 selects 是“独资经营者”,则不需要注册号,因为独资经营者没有注册号,所以如果是这种情况并且用户 selects “独资经营者”,我希望注册号小部件消失。

所以我所做的是跟踪 OptionMenu 变量并将其传递给回调,如下所示:

# 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

回调函数如下:

def ShowRegNumber(org_type, *args):

    if org_type == "Sole Proprietor":
        CoRegNumLabel.forget()
        CoRegNumEntry.forget()
    else:
        pass

出于某种原因,组织类型未通过 - 我已尝试调试,但它一直在通过 '',因此无论菜单上的选项是什么,它都会继续转到“其他”select编辑

有人知道我做错了什么吗?

当您在 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()    

顺便说一句:

由于PEP 8 -- Style Guide for Python Code

,我对变量和函数使用小写名称