如何在tkinter

时间:2016-11-16 19:55:06

标签: python python-3.x tkinter combobox

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

在Python docs中,它说:

  

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

在Stack上,有许多答案(12等),展示了如何绑定事件:

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,以防它有所作为。

我错过了什么?

2 个答案:

答案 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()