我有一個使用PyWizardPage創建的嚮導。它從一個主頁面開始,然後用戶再通過兩個頁面向他詢問輸入信息。其中一個頁面,我創建了兩個瀏覽按鈕,要求用戶選擇兩個文件。現在,在此頁面上,我希望禁用「下一步」按鈕,直到用戶選擇文件。如何禁用wxPython嚮導頁面的「下一步」按鈕?
我已經搜遍這個網站和谷歌的答案,並已閱讀的東西,如this和this但似乎無法讓我的設置工作。
如何禁用一個按鈕直到這兩個瀏覽按鈕被填滿?
至於我的設置,我有一個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 *
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))
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))
x2 = wx.TextCtrl(...) # the text area where the Browse path is populated
page2.addWidget(b1, ..., ...)
page2.addWidget(b2, ..., ...)
return page2
而且在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)
現在,它是pages.py
的create_page2
功能,我希望把下代碼禁用Next按鈕,直到這兩個瀏覽按鈕被填充。
這樣做禁用嚮導中的所有Next按鈕:
wizard.FindWizardById(wx.ID_FORWARD).Disable()
這樣做也會禁用嚮導中的所有Next按鈕:
for o in wizard.GetChildren():
if 'Button' in str(type(o)) and o.GetLabel() == "&Next >" and x1.GetValue() == "" and x2.GetValue() == "":
o.Disable()
任何幫助將不勝感激。
編輯:
好了,所以我修修補補這個多一點,我的代碼類似於下面邁克Driscoll的答案。這是我的設置。我有三個類:WizardPage
創建一個常規頁面,MyWizard
它創建第一頁並調用輔助函數來創建並鏈接所有後續頁面,WizardPageDisabled
與WizardPage
相同,但具有您引入的計時器禁用下一步按鈕。我添加了最後一個類,因爲這個功能可能需要用於不僅僅是嚮導第一頁的頁面。
現在,當我看到問題時,我已經到了一個地步。 WizardPage
使用PyWizardPage
構造函數,MyWizard
使用wx.Wizard
構造函數。如果我使用PyWizardPage
構造函數創建WizardPageDisabled
,那麼行forwardBtn.Disable()
將返回NoneType has no attribute Disable
錯誤。如果我使用wx.Wizard
構造函數,則頁面根本不顯示。
所以除了我上面的問題,我想另外一個澄清的問題是:PyWizardPage
和wx.Wizard
之間有什麼區別?
你試過'page1.GetNext()禁用()'? –
@Joran Beasley:不,我沒有。剛剛嘗試過,它會禁用整個頁面,而不僅僅是下一步按鈕。然後我嘗試了'page1.GetNext()。FindWindowById(wx.ID_FORWARD).Disable()'並被告知'NoneType對象沒有禁用屬性' – noblerare
:/抱歉我不使用具有該模塊的wx版本... –