如何在tkinter中使用<ComboboxSelected>虚拟事件

bit*_*ack 3 python combobox tkinter python-3.x

我在Python 3.5.2中使用了一个tkk.Combobox主题小部件.我希望在选择值时执行操作.

在Python 文档中,它说:

<<ComboboxSelected>>当用户从值列表中选择元素时,组合框小部件生成虚拟事件.

这里的堆栈,有一些答案(的1,2,等等),显示如何绑定事件:

cbox.bind("<<ComboboxSelected>>", function)
Run Code Online (Sandbox Code Playgroud)

但是,我无法使其发挥作用.这是一个非常简单的例子,展示了我的无效功能:

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()
Run Code Online (Sandbox Code Playgroud)

我得到一个"被选中"的例子.当我运行此代码时,即使没有点击任何内容.但是当我在组合框中选择一些东西时没有任何反应.

我在Windows 7中使用IDLE,以防它有所作为.

我错过了什么?

nbr*_*bro 10

问题不在于事件<<ComboboxSelected>>,而在于bind函数需要回调作为第二个参数.

当你这样做时:

cbox.bind("<<ComboboxSelected>>", print("Selected!"))
Run Code Online (Sandbox Code Playgroud)

你基本上把调用的结果分配给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()
Run Code Online (Sandbox Code Playgroud)

注意没有()经过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()
Run Code Online (Sandbox Code Playgroud)

检查什么是lambda函数以及如何使用它们!

查看本文以了解有关事件和绑定的更多信息:

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm