如何将选定的文件名从tkfiledialog GUI传递到另一个函数

时间:2017-05-16 22:40:10

标签: python user-interface tkinter backend

我正在使用Tkinter构建一个简单的桌面应用程序,该应用程序具有一个浏览按钮,用户可以从他们的计算机中选择文件(下面的代码位于名为gui.py的文件中):

import Tkinter
import tkFileDialog
import tkMessageBox


class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        self.entryVariable = Tkinter.StringVar()

        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)
        self.entry.grid(column=0,row=0,sticky='EW')
        self.entry.bind("<Return>", self.OnPressEnter)
        self.entryVariable.set(u"Enter text here.")

        button_browse = Tkinter.Button(self, text = u"Browse", command = lambda:self.entryVariable.set(tkFileDialog.askopenfilename()))


        button = Tkinter.Button(self,text=u"Go",
                                 command=self.OnButtonClick)
        button_browse.grid(column=1,row=0)
        button.grid(column=2,row=0)

        self.labelVariable = Tkinter.StringVar()
        label = Tkinter.Label(self,textvariable=self.labelVariable,
                              anchor="w",fg="black",bg="white")
        label.grid(column=0,row=1,columnspan=3,sticky='EW')
        self.labelVariable.set(u"Hello !")

        self.grid_columnconfigure(0,weight=1)
        self.resizable(True,False)
        self.update()
        self.geometry(self.geometry())       
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)


    def OnButtonClick(self):
        self.labelVariable.set( self.entryVariable.get()+" (You clicked the button)" )
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def OnPressEnter(self,event):
        self.labelVariable.set( self.entryVariable.get()+" (You pressed ENTER)" )
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()

现在,当用户点击按钮&#34; Go&#34;时,我希望将所选文件名传递给以下函数(在类外),代替"filename"变量和该程序的输出应该在&#34; labelvariable&#34;中的gui中返回:

def main():
    data=[]
    total_top5=[]
    book = xlrd.open_workbook(filename)
    sheet = book.sheet_by_index(0)
    for row_index in xrange(1, sheet.nrows): # skip heading row
        text = sheet.row_values(row_index, end_colx=1)   
        data.append(text)

    #data = unicode(x).encode('UTF8') for x in data
    new_data=[]
    for x in data:    
        new_data.append(unicode(x[0]).encode('UTF8'))

我以前从未使用过Tkinter或在python中创建GUI,所以请各种帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为你的意思

这是一个解决方案,我假设您的意思是当您说要将所选文件的名称传递给predict.py时

在predict.py内部,进行这些更改;

首先导入GUI

from gui import simpleapp_tk

其次,使main函数传递参数

def main(filename="test.foo"):

最后,在您的运行例程中,实例化GUI,获取文件名,然后运行主函数

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()
    # Here it will wait until the GUI finishes and exits
    filename = app.labelVariable.get()
    main(filename)

还可以做什么

您可以从gui.py导入predict.py并更改&#34; Go&#34;的方法调用。按钮。

,或者

如果你使button_browse成为simpleapp_tk的一个属性,你可以轻松地在外部设置它的命令,如果你将GUI导入其他地方,这是在predict.py

里面
if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.configure(command=main(tkFileDialog.askopenfilename()))
    app.mainloop()