我是Tkinter和GUI设计的新手,但我非常高兴能够学习。我正在尝试创建一个用户界面,允许用户加载Excel电子表格.xls。如果电子表格成功打开,则会弹出一个按钮,允许用户将信息导入数据库。
我的问题是,每当我运行此代码时,弹出文件对话框,然后弹出实际浏览按钮的主gui。我做了一些测试,这种行为是由于调用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()
答案 0 :(得分:1)
执行此操作时,command = importTLAtoDB(TLA_sheet)
调用该函数并将函数值赋给命令。
如果你想用一个参数调用一个函数,你需要使用lambda或partials(可能还有其他选项,但据我所知,这两个选项是最受欢迎的选项)。
所以你的Button行应该是这样的:
tk.Button(root, text="Import TLAs", command=lambda: importTLAtoDB(TLA_sheet)).pack()
另外,您可能想查看此问题。 How to pass arguments to a Button command in Tkinter?
答案 1 :(得分:0)
tk.Button(root, text = "Browse", command = openFile, width = 10).pack()
你不想在设置按钮时实际调用它