python - 如何在 wxPython PyWizardPage 向导的页面之间传递信息?

标签 python wxpython wizard

我有一个使用 PyWizardPage 创建的向导。它从一个主页开始,然后用户会浏览几个页面,要求他输入信息。在其中一个页面上,我创建了一个浏览按钮,要求用户选择一个文件。然后,在下一页上,我有一个“验证详细信息”,它显示一个包含用户通过向导选择的所有输入的框,并要求他在继续之前确保信息正确。

我的问题是,我无法将之前页面上的任何用户输入传递到我的“验证详细信息”页面。

对于我的设置,我有一个 WizardPage 类,我调用它来创建向导中的每个页面。

mywizard.py

import wx
import wx.wizard

class WizardPage(wx.wizard.PyWizardPage):
    def __init__(self, parent, title):
        wx.wizard.PyWizardPage.__init__(self, parent)
        self.next = None
        self.prev = None
        self.initializeUI(title)

    def initializeUI(self, title):      
        # create grid layout manager    
        self.sizer = wx.GridBagSizer()
        self.SetSizerAndFit(self.sizer)

    def addWidget(self, widget, pos, span): 
        self.sizer.Add(widget, pos, span, wx.EXPAND)

    # getters and setters 
    def SetPrev(self, prev):
        self.prev = prev

    def SetNext(self, next):
        self.next = next

    def GetPrev(self):
        return self.prev

    def GetNext(self):
        return self.next

然后,在一个单独的文件中,我有一个创建每个页面的函数。第一页的函数调用函数来创建其他页面。我还使用名为“browse1”和“browse2”的辅助函数来打开 wx.FileDialog 等。

pages.py

import wx
from mywizard import * 

#### HELPER FUNCTIONS ####
def browse1(event, parent_page):
    wildcards = ...
    dlg = wx.FileDialog(parent_page, "Blahblah", "", "",
                            wildcards, wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

    if dlg.ShowModal() == wx.ID_OK:
        global x1
        global bro1
        x1.SetValue(dlg.GetDirectory() + "\\" + dlg.GetFilename())
        bro1 = x1.GetValue()

def browse2(event, parent_page):
    wildcards = ...
    dlg = wx.FileDialog(parent_page, "Select new certificate", "", "",
                            wildcards, wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

    if dlg.ShowModal() == wx.ID_OK:
        global x2
        global bro2
        x2.SetValue(dlg.GetDirectory() + "\\" + dlg.GetFilename())
        bro2 = x2.GetValue()

#### END HELPER FUNCTIONS ####

def create_page1(wizard):
    page1 = WizardPage(wizard, "Page 1")
    d = wx.StaticText(...)
    page1.addWidget(d, (2, 1), (1,5))

    page2 = create_update_certs_page2(wizard)
    page3 = create_update_certs_page3(wizard)

    # Set links
    page2.SetPrev(page1)
    page1.SetNext(page2)
    page3.SetPrev(page2)
    page2.SetNext(page3)

    return page1

def create_page2(wizard):
    page2 = WizardPage(wizard, "Page 2")

    b1 = wx.Button(page2, -1, "Browse...", wx.DefaultPosition, (85, 23))
    b1.Bind(wx.EVT_BUTTON, lambda evt: browse1(evt, page2)) 

    global x1
    x1 = wx.TextCtrl(...) # the text area where the Browse path is populated

    b2 = wx.Button(page2, -1, "Browse...", wx.DefaultPosition, (85, 23))
    b2.Bind(wx.EVT_BUTTON, lambda evt: browse2(evt, page2)) 

    global x2
    x2 = wx.TextCtrl(...) # the text area where the Browse path is populated

    page2.addWidget(b1, ..., ...)
    page2.addWidget(b2, ..., ...)
    page2.addWidget(x1, ..., ...)
    page2.addWidget(x2, ..., ...)

    return page2

def create_page3(wizard):
    print "bro1 is" + bro1 # these print empty strings
    print "bro2 is" + bro2 # not, the browse path and file that should be populated

基本上,x1x2 引用了我将其设为全局的 wx.TextCtrl 小部件,以便我可以将它们填充到 browser1browse2 函数。现在,我想在 create_page3 函数的 bro1bro2 变量中访问它们的填充值,但没有显示任何内容。

pages.py中的主要代码是:

app = wx.App(redirect = False)
wizard = wx.wizard.Wizard(None, -1, "Some Title")
wizard.SetPageSize((500, 350))

mypage1 = create_page1(wizard)

# Let's go!
wizard.RunWizard(mypage1)

任何帮助将不胜感激。

最佳答案

您可以按照 msvalkon 提到的方式传递值。不过我认为子类化 wx.wizard.Wizard 会更简单。然后,您可以在类中创建各种小部件,并将它们的父级创建到不同的页面。这使您可以轻松地跨页面访问变量。这是我给您的答案的扩展 last question :

import wx
import wx.wizard

class WizardPage(wx.wizard.PyWizardPage):
    def __init__(self, parent, title):
        wx.wizard.PyWizardPage.__init__(self, parent)
        self.next = None
        self.prev = None
        self.initializeUI(title)

    def initializeUI(self, title):      
        # create grid layout manager    
        self.sizer = wx.GridBagSizer()
        self.SetSizerAndFit(self.sizer)

    def addWidget(self, widget, pos, span): 
        self.sizer.Add(widget, pos, span, wx.EXPAND)

    # getters and setters 
    def SetPrev(self, prev):
        self.prev = prev

    def SetNext(self, next):
        self.next = next

    def GetPrev(self):
        return self.prev

    def GetNext(self):
        return self.next

########################################################################
class MyWizard(wx.wizard.Wizard):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.wizard.Wizard.__init__(self, None, -1, "Some Title")
        self.SetPageSize((500, 350))

        mypage1 = self.create_page1()

        forward_btn = self.FindWindowById(wx.ID_FORWARD) 
        forward_btn.Disable()

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.onUpdate, self.timer)
        self.timer.Start(1)

        self.RunWizard(mypage1)

    #----------------------------------------------------------------------
    def create_page1(self):
        page1 = WizardPage(self, "Page 1")
        d = wx.StaticText(page1, label="test")
        page1.addWidget(d, (2, 1), (1,5))

        self.text1 = wx.TextCtrl(page1)
        page1.addWidget(self.text1, (3,1), (1,5))

        self.text2 = wx.TextCtrl(page1)
        page1.addWidget(self.text2, (4,1), (1,5))

        page2 = WizardPage(self, "Page 2")
        page2.SetName("page2")
        self.text3 = wx.TextCtrl(page2)
        self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGED, self.onPageChanged)
        page3 = WizardPage(self, "Page 3")

        # Set links
        page2.SetPrev(page1)
        page1.SetNext(page2)
        page3.SetPrev(page2)
        page2.SetNext(page3)

        return page1

    #----------------------------------------------------------------------
    def onPageChanged(self, event):
        """"""
        page = event.GetPage()
        print
        if page.GetName() == "page2":
            self.text3.SetValue(self.text2.GetValue())

    #----------------------------------------------------------------------
    def onUpdate(self, event):
        """
        Enables the Next button if both text controls have values
        """
        value_one = self.text1.GetValue()
        value_two = self.text2.GetValue()
        if value_one and value_two:
            forward_btn = self.FindWindowById(wx.ID_FORWARD) 
            forward_btn.Enable()
            self.timer.Stop()

#----------------------------------------------------------------------
def main():
    """"""
    wizard = MyWizard()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    main()
    app.MainLoop()

这里的想法是给每个页面一个唯一的名称,然后捕获 EVT_WIZARD_PAGE_CHANGED。在处理程序中,您可以检查您所在的页面并相应地更新其内容。

关于python - 如何在 wxPython PyWizardPage 向导的页面之间传递信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766289/

相关文章:

python - 寻找一个 wxpython 小部件,它可以让用户像在表格中一样填写数据

JavaScript:动态执行跟踪代码

javascript - 验证 FORM 内 DIV(可见向导步骤)内的 HTML 输入元素?

java - 在 Android 上创 build 置向导

python - Django 中用户定义的派生数据

python - Django 。通过 include 标签将数组传递给子模板

python - 对话框中的 wx.DatePickerCtrl 忽略在 wxGTK 上按回车键后输入的值

macos - 如何使用 wx 在 mac osx 上设置菜单栏图标

python - pandas.concat 和 numpy.append 的大数据集内存错误

python - 将推文创建时间转换为 UTC