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()
顺便说一句:
,我对变量和函数使用小写名称
我有一个使用 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()
顺便说一句:
,我对变量和函数使用小写名称