【问题标题】:Tkinter Button events firing on loadTkinter 按钮事件在加载时触发
【发布时间】:2014-01-22 21:26:07
【问题描述】:

到目前为止,我有一个非常简单的程序,只有几个带有事件的按钮。但是,当我运行程序时,一旦按钮启动,按钮事件就会触发。

我的代码的麻烦部分如下所示:

def initUI(self):

    self.parent.title("Windows")
    self.style = Style()
    self.style.theme_use("default")
    self.pack(fill=BOTH, expand=1)

    abtn = Button(self, text="Open", command=load_file(area))
    abtn.grid(row=1, column=3)

    cbtn = Button(self, text="Close", command=self.parent.destroy)
    cbtn.grid(row=2, column=3, pady=4)

我一行一行地运行它并且 load_file(它是一个打开的文件对话框,区域是我之前初始化的画布)事件甚至在下一个按钮初始化或窗口可见之前就打开了。 尽可能具体:我不希望它在没有我点击按钮的情况下触发。那么我在这里做错了什么?

编辑:

这是 load_file 事件:

def load_file(area):
    fname = askopenfilename(filetypes=(("TIF", "*.tif;*.tiff"),
                                       ("GIF", "*.gif"),
                                       ("JPEG", "*.jpg") ))
    if fname:
        fname = fname.replace("/", "\\")
        print(fname)
        Images.path = fname
        import_file(fname, area)
    else:
        print "Could not open file ", fname

    return fname

【问题讨论】:

    标签: python events button tkinter


    【解决方案1】:

    下面这行代码没有load_file,而是调用load_file并绑定函数调用的返回值。

    abtn = Button(self, text="Open", command=load_file(area))
    

    使用labmda将其替换为函数对象:

    abtn = Button(self, text="Open", command=lambda: load_file(area))
    

    【讨论】:

    • 它的工作,谢谢。我只是想知道为什么这是我在谷歌搜索一小时后第一次看到这个 lamdba 选项......
    • @Martin,或者,您可以定义另一个函数(我们称之为f)调用load_file(area) 而不是lambda,并将f 作为command 参数传递。跨度>
    【解决方案2】:

    应该是command=lambda: load_file(area)

    command=load_file(area) 将调用load_file 并将返回值设置为command

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 2022-01-09
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多