簡體   English   中英

用於命令行腳本的Cookbook GUI界面

[英]Cookbook GUI interface for a command-line script

我有一個命令行Python腳本,可以很好地將一種文件轉換為另一種給定的參數,現在可以將其部署到一些可能不知道命令行是什么的同事身上。

我可以工作幾個小時試圖確定哪個Python GUI工具包是“最好的”,然后學習如何做我需要的東西,但似乎這之前就已經完成了。

GUIify我的程序有相對的烹飪書方法嗎? 指向某種課程/教程或現有的,有文檔記錄的簡明程序的方向非常好。

只是一個快速而簡單的例子,可以教你足夠的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()

有幾個答案主張wxpython。 但是, 任何工具包都適用於此項目。 Tkinter具有額外的好處,您和您的同事已安裝它並且它非常易於使用。

話雖這么說,其他工具包或多或少同樣易於使用,但你可能不得不跳過一兩圈來安裝它們。 如果安裝不是問題,那么選擇哪一個並不重要。

不幸的是,告訴你如何“GUIfy”你的程序很難,因為我們對你的應用程序一無所知。 可能它所涉及的只是放置一些標簽和輸入小部件,然后創建一個收集所有數據的按鈕,然后使用子進程模塊運行程序。

基本上,您只需要確定哪些小部件可以保存您想要的最佳數據。 我懷疑你可以使用幾個組合框來保存不同的擴展集。 或者您可以使用路徑名字符串來計算出來。 點擊一個按鈕並運行轉換過程,可能在另一個線程中,因此GUI保持響應。

我對wxPython有偏見。 但是,最好還是看看他們的演示和文檔,看看哪種GUI工具包最適合您的大腦。

這主要取決於您的需求。 如果您的需求很簡單,您可以使用與python本身捆綁在一起的tkinter。 如果您使用此功能,則不會依賴第三方庫來實現GUI。 由於您希望為同事提供此功能,因此使用py2exe或其他類似的東西編譯可能更容易,如果您使用第三方庫進行GUI,這可能會很棘手。 但是,如果要為GUI添加更多功能,wxpython / pyqt / pyGTK是要查找的GUI工具包。 就個人而言,我贊成wxpython,因為它具有跨平台性質,但就我所聽到的而言,pyqt和pyGTK也同樣出色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM