tkinter filedialog 打开方法的奇怪行为
我刚开始学习Tkinter和图形用户界面设计,对此非常兴奋。我想创建一个用户界面,让用户可以加载一个.xls格式的Excel电子表格。如果电子表格成功打开,就会弹出一个按钮,允许用户将信息导入数据库。
我遇到的问题是,每次运行这段代码时,文件选择对话框会在主界面和实际的浏览按钮之前弹出。我做了一些测试,发现这个问题是因为调用了fname.show()。我的理解是,我需要使用fname.show()来获取文件路径,这样才能把文件路径传给xlrd.open_workbook方法,以便从电子表格中读取数据。如果有其他方法可以获取文件名吗?我觉得应该有简单的解决方案,但关于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()
2 个回答
2
当你执行 command = importTLAtoDB(TLA_sheet)
这行代码时,你实际上是在调用一个函数,并把这个函数的返回值赋给了变量 command。
如果你想在调用函数时传递一些参数,你需要使用 lambda 表达式或者 部分函数(当然还有其他方法,但我知道的这两种是最常用的)。
所以你的按钮代码应该像这样:
tk.Button(root, text="Import TLAs", command=lambda: importTLAtoDB(TLA_sheet)).pack()
另外,你可能还想看看这个问题。 如何在 Tkinter 中给按钮命令传递参数?
0
tk.Button(root, text = "Browse", command = openFile, width = 10).pack()
你在设置按钮的时候其实不想直接调用它。