【问题标题】:How to use a <ComboboxSelected> virtual event with tkinter如何在 tkinter 中使用 <ComboboxSelected> 虚拟事件
【发布时间】:2017-03-31 04:22:51
【问题描述】:

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

在 Python docs 中,它说:

当用户从值列表中选择一个元素时,组合框小部件会生成一个&lt;&lt;ComboboxSelected&gt;&gt; 虚拟事件。

在堆栈上,有许多答案(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()

我得到一个“已选择!”的实例当我运行这段代码时,即使没有点击任何东西。但是,当我在组合框中实际选择某些内容时,什么也没有发生。

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

我错过了什么?

【问题讨论】:

    标签: python python-3.x tkinter combobox


    【解决方案1】:

    感谢您的帖子。我试过 *args 它也适用于绑定和按钮:

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

    【讨论】:

      【解决方案2】:

      问题不在于事件&lt;&lt;ComboboxSelected&gt;&gt;,而是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("&lt;&lt;ComboboxSelected&gt;&gt;", 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 2021-07-13
        • 2010-10-17
        • 2015-10-26
        • 2010-11-10
        • 2015-03-03
        • 1970-01-01
        相关资源
        最近更新 更多