2012-03-29 39 views
3

我有一個命令行Python腳本,可以很好地將一種文件轉換爲另一種文件,並給出一些參數,現在想將其部署到一些可能不會知道命令行是什麼。用於命令行腳本的Cookbook GUI界面

我可以花幾個小時試圖確定哪個Python GUI工具箱是「最好的」,然後學習如何去做我所需要的,但是看起來好像之前已經完成了。

是否有相對烹飪書的方法來GUIify我的程序?指導某種課程/教程或現有的,有文件記錄的簡明方案的方向將非常出色。

+0

wxPython有很多示例http://www.wxpython.org/download.php#stable。 wxPython或pyQt應該是有用的。 – Fenikso 2012-03-29 14:53:54

回答

0

基本上,你只需要弄清楚哪些小部件將容納你想要的最好的數據。我懷疑你可以使用幾個組合框來保存不同的擴展集。或者你可以使用路徑名字符串來解決這個問題。點擊一個按鈕並運行轉換過程,可能在另一個線程中,以便GUI保持響應。

我偏向於wxPython。但是,最好查看他們的演示和文檔,並查看哪個GUI工具包最適合您的大腦。

0

這主要取決於您的需要。如果你的需求很簡單,你可以使用與python捆綁在一起的tkinter。如果你使用這個,你不會依賴第三方庫來實現你的GUI。既然你想讓你的同事可以使用它,那麼使用py2exe或其他類似的東西來編譯exe文件可能更容易,如果你使用GUI的第三方庫,這可能會非常棘手。但是,如果您想在GUI中添加更多功能,wxpython/pyqt/pyGTK是要查找的GUI工具包。就我個人而言,由於其跨平臺性質,我傾向於使用wxpython,但pyqt和pyGTK也同樣好。

4

就可以教給你足夠的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() 
+0

這就是「快速簡單的例子」所代表的。它可以通過'wx.lib.delayedresult'輕鬆擴展來解決這個問題。 – Fenikso 2012-04-01 08:08:21

1

有幾個主張wxpython的答案。但是,任何工具包都適用於此項目。 Tkinter有額外的好處,你和你的同事已經安裝了它,它使用起來非常簡單。

這就是說,其他工具包或多或少同樣易於使用,但您可能需要跳過一兩個環來安裝它們。如果安裝不是問題,則選擇哪一個並不重要。

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