用于命令行脚本的Cookbook GUI界面

时间:2012-03-29 14:48:04

标签: python user-interface wxpython pyqt tkinter

我有一个命令行Python脚本,可以很好地将一种文件转换为另一种文件给定一些参数,现在可以将其部署到一些可能不知道命令行的同事。

我可以工作几个小时试图确定哪个Python GUI工具包是“最好的”,然后学习如何做我需要的东西,但似乎以前就已经完成了。

是否有一个相对的烹饪书方法来GUIify我的程序?对某种课程/教程或现有的,有文档记录的简明程序的指导非常好。

4 个答案:

答案 0 :(得分:5)

这是一个快速而简单的例子,可以教你足够的wxPython开始:

import wx
from subprocess import Popen, PIPE

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.button = wx.Button(self.panel, label="Run!")
        self.command = wx.TextCtrl(self.panel)
        self.result = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.command, 0, wx.EXPAND)
        self.sizer.Add(self.button, 0, wx.EXPAND)
        self.sizer.Add(self.result, 1, wx.EXPAND)

        self.command.SetValue("dir")
        self.button.Bind(wx.EVT_BUTTON, self.CallCommand)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

    def CallCommand(self, e):
        p = Popen(self.command.GetValue(), shell=True, 
                  stdin=PIPE, stdout=PIPE, stderr=PIPE)
        r = p.communicate()
        self.result.SetValue(r[0])

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

要完成该示例,以下代码在另一个线程中运行命令行并逐行显示结果:

import wx
from wx.lib.delayedresult import startWorker 
from subprocess import Popen, PIPE

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.button = wx.Button(self.panel, label="Run!")
        self.command = wx.TextCtrl(self.panel)
        self.result = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.command, 0, wx.EXPAND)
        self.sizer.Add(self.button, 0, wx.EXPAND)
        self.sizer.Add(self.result, 1, wx.EXPAND)

        self.command.SetValue("dir")
        self.button.Bind(wx.EVT_BUTTON, self.CallCommand)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

    def CallCommand(self, e):
        startWorker(self.WorkCommandDone, self.WorkCommand)

    def WorkCommand(self):
        self.button.Disable()
        p = Popen(self.command.GetValue(), shell=True, 
                  stdin=PIPE, stdout=PIPE, stderr=PIPE)
        while True:
            line = p.stdout.readline()
            if line != '':
                wx.CallAfter(self.result.AppendText, line)
            else:
                break

    def WorkCommandDone(self, result):
        self.button.Enable()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

答案 1 :(得分:1)

有一些提倡wxpython的答案。但是,任何工具包都适用于此项目。 Tkinter具有额外的好处,您和您的同事已安装它并且它非常易于使用。

话虽这么说,其他工具包或多或少同样易于使用,但你可能不得不跳过一两圈来安装它们。如果安装不是问题,那么选择哪一个都无关紧要。

不幸的是,告诉你如何“GUIfy”你的程序很难,因为我们对你的应用程序一无所知。可能它所涉及的只是放置一些标签和输入小部件,然后创建一个收集所有数据的按钮,然后使用子进程模块运行程序。

答案 2 :(得分:0)

基本上,您只需要确定哪些小部件可以保存您想要的最佳数据。我怀疑你可以使用几个组合框来保存不同的扩展集。或者您可以使用路径名字符串来计算出来。点击一个按钮并运行转换过程,可能在另一个线程中,以便GUI保持响应。

我对wxPython有偏见。但是,最好还是看看他们的演示和文档,看看哪种GUI工具包最适合你的大脑。

答案 3 :(得分:0)

这主要取决于您的需要。如果您的需求很简单,您可以使用与python本身捆绑在一起的tkinter。如果您使用此功能,则不会依赖第三方库来实现GUI。由于您希望为同事提供此功能,因此使用py2exe或其他类似的东西编译可能更容易,如果您使用第三方库进行GUI,这可能会很棘手。但是,如果要为GUI添加更多功能,wxpython / pyqt / pyGTK是要查找的GUI工具包。就个人而言,我赞成wxpython,因为它具有跨平台性质,但就我所听到的而言,pyqt和pyGTK也同样出色。