Python 3.x 从下拉列表中选择项目时运行函数

Python 3.x 从下拉列表中选择项目时运行函数,python-3.x,user-interface,tkinter,Python 3.x,User Interface,Tkinter,我在tkinter中有一个下拉列表,其中填充了一些项目 OPTIONS = [0,1,2,3,4,5,6,7] clicked = tk.StringVar() clicked.set(OPTIONS[0]) # default value drop = tk.OptionMenu(frame2, clicked, *OPTIONS) drop.place(relx = 0.65, rely=0.25, relwidth=0.08, relheight=0.6) 然而,当用户选择一个值时,我希

我在tkinter中有一个下拉列表,其中填充了一些项目

OPTIONS = [0,1,2,3,4,5,6,7]
clicked = tk.StringVar()
clicked.set(OPTIONS[0]) # default value
drop = tk.OptionMenu(frame2, clicked, *OPTIONS)
drop.place(relx = 0.65, rely=0.25, relwidth=0.08, relheight=0.6)
然而,当用户选择一个值时,我希望其他事情也发生。 例如,将值返回到全局变量,或者使按钮的状态正常,以便再次可见

选择项目或选择其他项目时,如何运行函数

编辑: 根据Lizzard的建议,我将代码更改为:

# this function is triggered, when a value is selected from the dropdown
def dropdown_selection():    
   global dropdown_value
   dropdown_value = clicked.get()
   print("You changed the selection. The new selection is %s." % dropdown_value)
   button_single['state'] = 'normal'

OPTIONS = list(range(8))
clicked = tk.StringVar(master=frame2)
clicked.set(OPTIONS[0])
clicked.trace("w", dropdown_selection)
drop = tk.OptionMenu(frame2, clicked, *OPTIONS)
drop.place(relx = 0.65, rely=0.25, relwidth=0.08, relheight=0.6)
但是,我得到了这个错误:

TypeError: dropdown_selection() takes 0 positional arguments but 3 were given
试试这个:

将tkinter作为tk导入
def已更改(*参数):
打印(“您更改了选择。新选择是%s。%clicked.get())
root=tk.tk()
选项=列表(范围(8))
clicked=tk.StringVar(master=root)#始终传递'master'关键字参数
单击。设置(选项[0])#默认值
单击。跟踪(“w”,已更改)
drop=tk.OptionMenu(根目录,单击,*选项)
drop.pack()
root.mainloop()
在tkinter中,您可以使用
.trace(mode,callback)
向变量添加回调,如
StringVar
,了解更多信息

同时始终将
master
关键字参数传递给所有tkinter小部件/变量。您可以使用
选项菜单
(通常是第一个参数)执行此操作。但您并不是为了
StringVar
而这样做的。如果您总是传递
master
关键字参数,那么您就不会感到头痛了

编辑:


当tkinter在变量更改时调用回调时,它会传递一些参数(我认为它们没有用),因此请确保回调接受它们。不要使用
def callback()
使用
def callback(*args)

尝试使用
clicked.trace(“w”,callback)
跟踪
单击的
!然而,对于什么是主要论点,我有点困惑。在我的应用程序中,下拉列表存在于一个名为frame2的框架内(从代码中可以看到)。这是否意味着单击的主参数也必须是frame2?像
clicked=tk.StringVar(master=frame2)
?@user1584421是。这就是
master
参数。我在代码中遇到了一个奇怪的错误。我用新代码更新了我的问题。@user1584421将
def dropdown\u selection()
更改为
def dropdown\u selection(*args)
。我编辑了我的答案。