GUI-интерфейс поваренной книги для сценария командной строки - PullRequest
3 голосов
/ 29 марта 2012

У меня есть сценарий Python для командной строки, который хорошо работает для преобразования одного вида файла в другой с учетом нескольких параметров, и теперь хотел бы развернуть его для некоторых моих коллег, которые могут не знать, что такое командная строка.

Я мог часами работать, пытаясь определить, какой набор инструментов Python GUI «лучший», а потом учиться делать то, что мне нужно, но кажется, что это было бы сделано раньше.

Существует ли сравнительно поваренная книга для GUIify моей программы?Направление к какому-либо уроку / учебнику или к существующей, документированной, сжатой программе было бы превосходным.

Ответы [ 4 ]

5 голосов
/ 29 марта 2012

Простой и быстрый пример, который может научить вас достаточно 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 голос
/ 30 марта 2012

Есть несколько ответов в поддержку wxpython.Тем не менее, любой инструментарий будет работать для этого проекта.Tkinter имеет то преимущество, что вы и ваши коллеги уже установили его, и им очень легко пользоваться.

При этом другие наборы инструментов более или менее одинаково просты в использовании, но вам, возможно, придется прыгнуть через обруч или два, чтобы их установить.Если установка не является проблемой, не имеет значения, какую вы выберете.

К сожалению, сказать вам, как «GUIfy» для вашей программы сложно, поскольку мы ничего не знаем о вашем приложении.Вероятно, все, что для этого потребуется, - это добавить несколько меток и виджетов ввода, затем создать кнопку, которая собирает все данные и затем запускает вашу программу с модулем подпроцесса.

0 голосов
/ 29 марта 2012

Это зависит в основном от ваших потребностей.Если ваша потребность проста, вы можете просто использовать tkinter, который в комплекте с самим питоном.Если вы используете это, вы не будете полагаться на сторонние библиотеки для реализации вашего GUI.Так как вы хотите сделать это доступным для ваших коллег, это может быть легче скомпилировать с помощью py2exe или других подобных программ, которые могут быть сложными, если вы используете стороннюю библиотеку для GUI.Однако, если вы хотите добавить больше функциональности в свой графический интерфейс, wxpython / pyqt / pyGTK - это набор инструментов GUI для поиска.Лично я предпочитаю wxpython из-за его кроссплатформенного характера, но pyqt и pyGTK также одинаково хороши, насколько я слышал.

0 голосов
/ 29 марта 2012

В основном вам просто нужно выяснить, какие виджеты будут хранить данные, которые вы хотите лучше всего.Я подозреваю, что вы можете использовать пару комбинированных полей для хранения различных наборов расширений.Или вы можете просто использовать строки пути, чтобы понять это.Нажмите кнопку и запустите процесс преобразования, возможно, в другом потоке, чтобы графический интерфейс оставался отзывчивым.

Я склонен к wxPython.Тем не менее, вам лучше взглянуть на их демонстрации и документацию и посмотреть, какой инструментарий GUI подходит вашему мозгу проще всего.

...