How to use a <ComboboxSelected> virtual event with tkinter

|▌冷眼眸甩不掉的悲伤 提交于 2021-01-21 07:47:05

问题


I am using a tkk.Combobox themed widget in Python 3.5.2. I want an action to happen when a value is selected.

In the Python docs, it says:

The combobox widgets generates a <<ComboboxSelected>> virtual event when the user selects an element from the list of values.

Here on the Stack, there are a number of answers (1, 2, etc) that show how to bind the event:

cbox.bind("<<ComboboxSelected>>", function)

However, I can't make it work. Here's a very simple example demonstrating my non-functioning attempt:

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

I get one instance of "Selected!" immediately when I run this code, even without clicking anything. But nothing happens when I actually select something in the combobox.

I'm using IDLE in Windows 7, in case it makes a difference.

What am I missing?


回答1:


The problem is not with the event <<ComboboxSelected>>, but the fact that bind function requires a callback as second argument.

When you do:

cbox.bind("<<ComboboxSelected>>", print("Selected!"))

you're basically assigning the result of the call to print("Selected!") as callback.

To solve your problem, you can either simply assign a function object to call whenever the event occurs (option 1, which is the advisable one) or use lambda functions (option 2).

Here's the option 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()

Note the absence of () after callback in: cbox.bind("<<ComboboxSelected>>", callback).

Here's option 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()

Check what are lambda functions and how to use them!

Check this article to know more about events and bindings:

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




回答2:


Thanks you for the posts. I tried *args and it workes with bind and button as well:

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


来源:https://stackoverflow.com/questions/40641130/how-to-use-a-comboboxselected-virtual-event-with-tkinter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!