我在Python 3.5.2中使用了tkk.Combobox主题小部件。我希望在选择值时执行操作。
在Python docs中,它说:
当用户从值列表中选择元素时,组合框小部件会生成
<<ComboboxSelected>>
虚拟事件。
在Stack上,有许多答案(1,2等),展示了如何绑定事件:
cbox.bind("<<ComboboxSelected>>", function)
但是,我无法使其发挥作用。这是一个非常简单的例子,展示了我的无效功能:
import tkinter as tk
from tkinter import ttk
tkwindow = tk.Tk()
cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly')
cbox.grid(column=0, row=0)
cbox.bind("<<ComboboxSelected>>", print("Selected!"))
tkwindow.mainloop()
我得到一个&#34;选择的实例!&#34;当我运行此代码时,即使没有点击任何内容。但是当我在组合框中选择一些东西时没有任何反应。
我在Windows 7中使用IDLE,以防它有所作为。
我错过了什么?
答案 0 :(得分:7)
问题不在于事件<<ComboboxSelected>>
,而是bind
函数需要回调作为第二个参数的事实。
当你这样做时:
cbox.bind("<<ComboboxSelected>>", print("Selected!"))
您基本上将调用结果分配给print("Selected!")
作为回调。
要解决您的问题,您可以简单地指定一个函数对象,以便在事件发生时调用(选项1,这是可取的)或使用 lambda 函数(选项2)。
这里是选项1:
import tkinter as tk
from tkinter import ttk
tkwindow = tk.Tk()
cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly')
cbox.grid(column=0, row=0)
def callback(eventObject):
print(eventObject)
cbox.bind("<<ComboboxSelected>>", callback)
tkwindow.mainloop()
请注意()
之后callback
之后cbox.bind("<<ComboboxSelected>>", callback)
没有{。}}。
这里的选项2:
import tkinter as tk
from tkinter import ttk
tkwindow = tk.Tk()
cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly')
cbox.grid(column=0, row=0)
cbox.bind("<<ComboboxSelected>>", lambda _ : print("Selected!"))
tkwindow.mainloop()
检查什么是lambda函数以及如何使用它们!
查看本文以了解有关事件和绑定的更多信息:
http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
答案 1 :(得分:0)
感谢您的帖子。我尝试了* args,它也适用于bind和button:
import tkinter as tk
from tkinter import ttk
tkwindow = tk.Tk()
cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly')
def callback(*args):
print(eventObject)
cbox.bind("<<ComboboxSelected>>", callback)
btn = ttk.Button(tkwindow, text="Call Callback", command=callback);
tkwindow.mainloop()