Интерактивный мастер в wxpython (Феникс) - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь разработать интерактивный мастер в wxPython 4.0 (Phoenix) с Python 3.7.В основном мастер имеет 4 страницы (этапы).Каждый раз, когда я нажимаю Next, он должен запускать другой скрипт Python, принимая аргументы на странице.Мне нужно отобразить ход выполнения скрипта на странице мастера.

Я уже разработал базовый интерфейс для мастера на 4 страницы.Теперь мне нужна помощь по 1. Как передать аргументы со страницы в скрипт Python?2. Как вызывать разные скрипты Python каждый раз, когда я нажимаю кнопку «Далее» на 4 страницах мастера?(Я думаю, что мне нужно написать код вокруг события ON_PAGE_CHANGING, но мне не ясно, как каждый раз вызывать другой скрипт Python при нажатии кнопки NExt) 3. Как отобразить индикатор выполнения каждого скрипта в мастере?

Я прилагаю код для моего основного интерфейса мастера.Я новичок в WxPython, любая помощь по вышеуказанным 3 пунктам очень ценится.

    #!/usr/bin/env python
import wx
import wx.adv
from wx.adv import Wizard as wizmod
#import images
from wx.adv import WizardPage, WizardPageSimple
import os.path
padding = 5

class wizard_page(wx.adv.WizardPage):
    ''' An extended panel obj with a few methods to keep track of its siblings.  
        This should be modified and added to the wizard.  Season to taste.'''
    def __init__(self, parent, title):
        WizardPage.__init__(self, parent)
        self.next = self.prev = None
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        title = wx.StaticText(self, -1, title)
        title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.sizer.Add(title, 0, wx.ALIGN_LEFT|wx.ALL, padding)
        self.sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, padding)
        self.SetSizer(self.sizer)

    def add_stuff(self, stuff):
        '''Add aditional widgets to the bottom of the page'''
        self.sizer.Add(stuff, 0, wx.EXPAND|wx.ALL, padding)

    def SetNext(self, next):
        '''Set the next page'''
        self.next = next

    def SetPrev(self, prev):
        '''Set the previous page'''
        self.prev = prev

    def GetNext(self):
        '''Return the next page'''
        return self.next

    def GetPrev(self):
        '''Return the previous page'''
        return self.prev        


class wizard(wx.adv.Wizard):
    '''Add pages to this wizard object to make it useful.'''
    def __init__(self, title, img_filename=""):
        # img could be replaced by a py string of bytes
        if img_filename and os.path.exists(img_filename):
                img = wx.Bitmap(img_filename)
        else:   img = wx.NullBitmap
        wx.adv.Wizard.__init__(self, None, -1, title, img)
        self.pages = []
        # Lets catch the events
        self.Bind(wx.adv.EVT_WIZARD_PAGE_CHANGED, self.on_page_changed)
        self.Bind(wx.adv.EVT_WIZARD_PAGE_CHANGING, self.on_page_changing)
        self.Bind(wx.adv.EVT_WIZARD_CANCEL, self.on_cancel)
        self.Bind(wx.adv.EVT_WIZARD_FINISHED, self.on_finished)

    def add_page(self, page):
        '''Add a wizard page to the list.'''
        if self.pages:  
            previous_page = self.pages[-1]
            page.SetPrev(previous_page)
            previous_page.SetNext(page)
        self.pages.append(page)

    def run(self):
        self.RunWizard(self.pages[0])

    def on_page_changed(self, evt):
        '''Executed after the page has changed.'''
        if evt.GetDirection():  dir = "forward"
        else:                   dir = "backward"
        page = evt.GetPage()
        print ("page_changed: %s, %s\n" % (dir, page.__class__))

    def on_page_changing(self, evt):
        '''Executed before the page changes, so we might veto it.'''
        if evt.GetDirection():  dir = "forward"
        else:                   dir = "backward"
        page = evt.GetPage()
        print ("page_changing: %s, %s\n" % (dir, page.__class__))

    def on_cancel(self, evt):
        '''Cancel button has been pressed.  Clean up and exit without continuing.''' 
        page = evt.GetPage()
        print ("on_cancel: %s\n" % page.__class__)

        # Prevent cancelling of the wizard.
        if page is self.pages[0]:
            wx.MessageBox("Cancelling on the first page has been prevented.", "Sorry")
            evt.Veto()

    def on_finished(self, evt):
        '''Finish button has been pressed.  Clean up and exit.''' 
        print ("OnWizFinished\n")


if __name__ == '__main__':

    app = wx.App()  # Start the application

    # Create wizard and add any kind pages you'd like
    mywiz = wizard('Simple Wizard', img_filename='wiz.png')
    page1 = wizard_page(mywiz, 'Stage 1')  # Create a first page
    #page1.add_stuff(wx.StaticText(page1, -1, 'Hola'))
    page1.add_stuff(wx.CheckBox(page1,-1,'Argument1',(35,40),(150,20)))
    page1.add_stuff(wx.CheckBox(page1,-1,'Argument2',(35,60),(150,20)))
    page1.add_stuff(wx.CheckBox(page1,-1,'Argument3',(35,80),(150,20)))
    mywiz.add_page(page1)

    # Add some more pages
    mywiz.add_page( wizard_page(mywiz, 'Stage 2') )
    mywiz.add_page( wizard_page(mywiz, 'Stage 3') )
    mywiz.add_page( wizard_page(mywiz, 'Stage 4') )

    mywiz.run() # Show the main window

    # Cleanup
    mywiz.Destroy()
    #del app
    app.MainLoop()
    del app
...