我有一個命令行Python腳本,可以很好地將一種文件轉換爲另一種文件,並給出一些參數,現在想將其部署到一些可能不會知道命令行是什麼。用於命令行腳本的Cookbook GUI界面
我可以花幾個小時試圖確定哪個Python GUI工具箱是「最好的」,然後學習如何去做我所需要的,但是看起來好像之前已經完成了。
是否有相對烹飪書的方法來GUIify我的程序?指導某種課程/教程或現有的,有文件記錄的簡明方案的方向將非常出色。
我有一個命令行Python腳本,可以很好地將一種文件轉換爲另一種文件,並給出一些參數,現在想將其部署到一些可能不會知道命令行是什麼。用於命令行腳本的Cookbook GUI界面
我可以花幾個小時試圖確定哪個Python GUI工具箱是「最好的」,然後學習如何去做我所需要的,但是看起來好像之前已經完成了。
是否有相對烹飪書的方法來GUIify我的程序?指導某種課程/教程或現有的,有文件記錄的簡明方案的方向將非常出色。
基本上,你只需要弄清楚哪些小部件將容納你想要的最好的數據。我懷疑你可以使用幾個組合框來保存不同的擴展集。或者你可以使用路徑名字符串來解決這個問題。點擊一個按鈕並運行轉換過程,可能在另一個線程中,以便GUI保持響應。
我偏向於wxPython。但是,最好查看他們的演示和文檔,並查看哪個GUI工具包最適合您的大腦。
這主要取決於您的需要。如果你的需求很簡單,你可以使用與python捆綁在一起的tkinter。如果你使用這個,你不會依賴第三方庫來實現你的GUI。既然你想讓你的同事可以使用它,那麼使用py2exe或其他類似的東西來編譯exe文件可能更容易,如果你使用GUI的第三方庫,這可能會非常棘手。但是,如果您想在GUI中添加更多功能,wxpython/pyqt/pyGTK是要查找的GUI工具包。就我個人而言,由於其跨平臺性質,我傾向於使用wxpython,但pyqt和pyGTK也同樣好。
就可以教給你足夠的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()
這就是「快速簡單的例子」所代表的。它可以通過'wx.lib.delayedresult'輕鬆擴展來解決這個問題。 – Fenikso 2012-04-01 08:08:21
有幾個主張wxpython的答案。但是,任何工具包都適用於此項目。 Tkinter有額外的好處,你和你的同事已經安裝了它,它使用起來非常簡單。
這就是說,其他工具包或多或少同樣易於使用,但您可能需要跳過一兩個環來安裝它們。如果安裝不是問題,則選擇哪一個並不重要。
不幸的是,告訴你如何「GUIfy」你的程序很難,因爲我們對你的應用一無所知。可能它只涉及一些標籤和輸入小部件,然後創建一個按鈕來收集所有的數據,然後用子進程模塊運行你的程序。
wxPython有很多示例http://www.wxpython.org/download.php#stable。 wxPython或pyQt應該是有用的。 – Fenikso 2012-03-29 14:53:54