tkinter filedialog打开方法奇怪的行为

我是Tkinter和GUIdevise的新手,但是我非常高兴学习。 我试图创build一个用户界面,允许用户加载Excel电子表格.xls。 如果电子表格成功打开,则应该popup一个button,允许用户将信息导入数据库。

我的问题是,每当我运行这个代码时,文件对话框popup之前的主要gui实际浏览buttonpopup。 我做了一些testing,这是由于调用fname.show()。 事情是,请纠正我,如果我错了,我需要使用fname.show()获取文件path,以便我可以将文件path传递到xlrd.open_workbook方法从电子表格中读取数据。 有另一种获得文件名的方法吗? 我觉得应该有一个简单的解决scheme,但没有太多关于tkFileDialog的细节文档。

谢谢。

以下是我的代码:

import config from importdb import importTLAtoDB import Tkinter as tk import tkFileDialog as tkfd import tkMessageBox as tkmb import xlrd def openFile(): #returns an opened file fname = tkfd.Open(filetypes = [("xls files","*.xls")]) fpath = fname.show() if fname: try: TLA_sheet = xlrd.open_workbook(fpath).\ sheet_by_name('Q3 TLA - TOP SKUs') tk.Button(root, text = "Import TLAs", command = importTLAtoDB(TLA_sheet)).pack() tkmb.showinfo("Success!", "Spreadsheet successfully loaded. \n\ Click Import TLAs to load TLA info into RCKHYVEDB database.") except: tkmb.showerror("Error", "Failed to read file\n '%s'\n\ Make sure file is a type .xls" % fpath) #GUI setup root = tk.Tk() root.title("TLA Database Tool") tk.Button(root, text = "Browse", command = openFile(), width = 10).pack() root.mainloop() 

 tk.Button(root, text = "Browse", command = openFile, width = 10).pack() 

当你设置button时,你不想实际调用它

当你这样做, command = importTLAtoDB(TLA_sheet)你调用函数并分配函数的值的命令。

如果你想用一个参数来调用一个函数,你需要使用lambda或partials (可能还有其他选项,但是据我所知,这两个是最优选的)。

所以你的Button线应该是这样的:

 tk.Button(root, text="Import TLAs", command=lambda: importTLAtoDB(TLA_sheet)).pack() 

另外,你可能想检查这个问题。 如何将parameter passing给Tkinter中的Button命令?