【问题标题】:tkinter filedialog open method strange behaviortkinter 文件对话框打开方法奇怪的行为
【发布时间】:2014-08-17 23:46:50
【问题描述】:

我是 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()

【问题讨论】:

    标签: python excel user-interface tkinter filedialog


    【解决方案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?

    【讨论】:

    • 感谢工作!那么通过使用调用importTLAtoDB函数的lambda函数,在按下按钮之前不会调用lambda函数?
    【解决方案2】:
    tk.Button(root, text = "Browse", command = openFile, width = 10).pack()
    

    您不想在设置按钮时实际调用它

    【讨论】:

    • 感谢这解决了在单击按钮之前打开文件对话框的问题。没有意识到添加 () 会调用函数而不是 command = functionname。
    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 2014-03-30
    • 2014-10-06
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多