2014-06-27 87 views
0

我是Tkinter和GUI设计的新手,但我非常兴奋学习。我试图创建一个用户界面,允许用户加载Excel电子表格.xls。如果电子表格成功打开,那么应弹出一个按钮,允许用户将信息导入数据库。tkinter filedialog开放方法奇怪的行为

我的问题是,每当我运行这段代码时,弹出的文件对话框会在弹出的实际浏览按钮之前弹出。我做了一些测试,这种行为是由于调用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
tk.Button(root, text = "Browse", command = openFile, width = 10).pack() 

你不想实际调用它,当你设置的按钮

+0

谢谢您解决了单击按钮之前打开文件对话框的问题。没有意识到,加入()调用函数而不是命令=函数名。 – user3761743

1

当你这样做,command = importTLAtoDB(TLA_sheet)调用该函数和函数的值赋给命令。

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

所以你的按钮行应该是这样的:

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

而且,你可能要检查这个问题。 How to pass arguments to a Button command in Tkinter?

+0

谢谢你的工作!因此,通过使用调用importTLAtoDB函数的lambda函数,在按下按钮之前不会调用lambda函数? – user3761743

+0

是的。确切的是它是如何工作的。 – Lafexlos