2014-01-05 80 views
1

我有一个相当简单的程序,到目前为止,只有几个按钮与他们的事件。但是,当我运行程序时,按钮事件触发一旦启动按钮。Tkinter按钮事件触发负载

闹事一块我的代码看起来是这样的:

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 

回答

3

在下面一行,代码不load_file,但调用load_file并绑定函数调用的返回值。

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

使用labmda函数对象进行更换:

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

它的工作,谢谢。我只是想知道为什么这是我第一次在google搜索一小时后看到这个lamdba选项... – Martin

+0

@Martin,或者,你可以定义另一个调用'load_file(area)'的函数(我们称之为'f')而不是'lambda',并将'f'作为'command'参数传递。 – falsetru

2

应该command=lambda: load_file(area)

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