我的组合框只运行一次

时间:2017-03-31 07:32:58

标签: tkinter combobox

            from tkinter import *
            from tkinter.ttk import *

            month  = (1,2,3,4,5,6,7,8,9,10,11,12)

            def func1(self,event = None):
                var = self.CB1.get()
                print(var)
                print("Your Birthday is: " + var)


            class app():
                def __init__(self):

                    window = Tk()


                    self.CB1 = Combobox(window,values = month,state = "readonly")
                    self.CB1.current(0)

                    self.CB1.bind("<<ComboboxSelected>>", func1(self,event = None))

                    self.CB1.pack()

                    window.mainloop()


            app()

因此它会输出1,然后说“你的生日是1”,如果我选择不同的号码,它将不再这样做。我已经尝试了10多个不同的页面来理解组合框,我很难理解。任何帮助,将不胜感激。感谢所有帮助的人。

2 个答案:

答案 0 :(得分:2)

这是因为在行

self.CB1.bind("<<ComboboxSelected>>", func1(self,event = None))

func1直接执行,结果(None)被指定为绑定“函数”。使用像这样的lambda表达式:

self.CB1.bind("<<ComboboxSelected>>", lambda x: func1(self, x))

现在你将匿名函数绑定到事件而不执行它。

答案 1 :(得分:1)

关于lambda函数的@TidB答案以及为什么你的组合框只运行一次绝对正确!

但我对你如何建立课程以及如何在课堂外传递selfevent感到困惑。这真的是你想要的,还是你想做这样的事情?

try:
    import tkinter as tk
    import tkinter.ttk as ttk
except ImportError:
    import Tkinter as tk
    import ttk

month = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

class App():
    def __init__(self):
        window = tk.Tk()

        self.CB1 = ttk.Combobox(window, values=month, state="readonly")
        self.CB1.current(0)
        self.CB1.bind("<<ComboboxSelected>>", self.func1)
        self.CB1.pack()

        window.mainloop()

    def func1(self, event=None):
        var = self.CB1.get()
        print(var)
        print("Your Birthday is: " + var)

App()

Python隐含地传递了您的selfevent,那么为什么您要尝试做同样的工作呢? 所以我认为一个真正的问题源于你的班级结构。这就是为什么你的组合框只运行一次的真正原因。