tkinter - 询问用户文件目录,然后运行脚本

时间:2014-10-21 09:11:55

标签: python tkinter

我是Python的新手,我真的需要帮助,我一直在寻找,但我找不到答案。

我创建了一个脚本,用于比较来自2个Excel文件的数据,并在新文件中编写报告。这是一个包含大量功能和对象的长脚本。

现在我想让这个脚本对我的团队中的任何人都有用并创建一个GUI。我正在使用Tkinter。我创建了2个按钮来询问用户文件目录并将其存储在列表中。 我希望我的原始脚本使用两个输入,并在单击第三个按钮时运行。

我应该如何在tkinder app脚本中包含我的脚本?这是我的应用程序:

from Tkinter import *
import Tkinter, Tkconstants, tkFileDialog

listfile = []

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

    def initialize(self):

        button = Tkinter.Button(self,text=u"data 1",command=self.OnButtonClick)
        button2 = Tkinter.Button(self,text=u"data 2",command=self.OnButtonClick)
        #here is the third button to run the script, the command isn't right
        button3 = Tkinter.Button(self,text=u"Run script",command=self.OnButtonClick)
        button.pack(side='bottom',padx=15,pady=15) 
        button2.pack(side='bottom',padx=15,pady=15)
        button3.pack(side='bottom',padx=15,pady=15) 

    def OnButtonClick(self):
        x = tkFileDialog.askopenfilename(title='Please select data directory')
        listfile.append(x)

    # def OnButtonClick2(self):
        # Can I run my original script here?
        # I read one should not include a function into a function

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

3 个答案:

答案 0 :(得分:1)

Tk提供了一个函数tk_chooseDirectory,可以在Windows上启动系统提供的目录选择器,我相信MacOSX或其他合适的对话框。在Tkinter上,这是使用 filedialog 命名空间公开的,例如:

from tkinter import filedialog
filedialog.askdirectory()

有关示例,请参阅TkDocs(搜索chooseDirectory)。

如果您要求的实际上是关于从解释器中执行python脚本的话,那么How to execute a file within the python interpreter?已经在What is an alternative to execfile in Python 3.0?处给出了添加Python3的问题。

答案 1 :(得分:1)

假设您的原始脚本名为excel_report.py,并且它与您的Tkinter脚本位于同一目录中。我假设excel_report.py已正确组织,以便所有处理都在函数中进行,并且它具有main()函数,该函数从命令行收集文件名,然后调用执行实际工作的函数,

例如make_report(excelfilename1, excelfilename2, reportname)

我还假设excel_report.py

结尾
if __name__ == "__main__":
    main()

如果所有这些都是真的,那么在你的Tkinter脚本中你可以放

from excel_report import make_report 

靠近剧本顶部,

然后在第3个按钮的回调函数中调用make_report()(例如)

def OnButtonClick3(self):
    make_report(self.name1, self.name2, self.reportname)

self.name1self.name2self.reportname包含您使用Tkinter文件对话框收集的文件名。

答案 2 :(得分:0)

如果您只需要选择两个目录并运行脚本,那么GUI可能对此类内容有些过分。如果你想让它变得非常简单,我建议放弃用户界面并将你的脚本改为:

  1. 要求用户选择目录1
  2. 要求用户选择目录2
  3. 在选择目录1和目录2后自动运行脚本
  4. 您可以使用patthoyts提到的tkFileDialog.askdirectory()来完成此操作。简化版:

    import tkFileDialog
    
    def your_script(dir1, dir2):
        *your script goes here with dir1 and dir2 as inputs for processing*
    
    dir1 = tkFileDialog.askdirectory()  
    dir2 = tkFileDialog.askdirectory()
    
    your_script(dir1,dir2)
    

    如果您想让最终用户更轻松,请查看将脚本转换为应用程序(如果他们使用Mac)或exe(如果他们使用Windows)。 py2app或py2exe将成功。 Mac预装了python而Windows没有,所以如果你的团队在没有python的Windows上运行你的团队将无法运行你的脚本期。 py2whatever模块可以生成一个预先打包python的可执行文件,这样在他们的机器上没有python的人仍然可以运行你的脚本。