나는 PyWizardPage를 사용하여 만든 마법사가 있습니다. 그것은 메인 페이지로 시작하고, 사용자는 입력 정보를 요구하는 두 페이지를 더 가져다줍니다. 이 페이지 중 하나는 사용자에게 두 개의 파일을 선택하도록 요청하는 두 개의 찾아보기 버튼을 만들었습니다. 이제이 페이지에서 사용자가 파일을 선택할 때까지 [다음] 단추를 사용할 수 없도록 설정합니다.어떻게 wxPython 마법사 페이지의 "다음"버튼을 비활성화합니까?
이 사이트와 Google에서 답변을 구하고 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
기능 받고있다 다음 단추를 사용하지 않으려면 두 개의 찾아보기 단추가 채워지는 코드를 입력하십시오.
이 마법사의 모든 다음 버튼을 비활성화 하 :
wizard.FindWizardById(wx.ID_FORWARD).Disable()
하면이 또한 마법사의 모든 다음 버튼을 비활성화 하 :
for o in wizard.GetChildren():
if 'Button' in str(type(o)) and o.GetLabel() == "&Next >" and x1.GetValue() == "" and x2.GetValue() == "":
o.Disable()
어떤 도움을 주시면 감사하겠습니다.
는 편집 :
좋아, 그래서 좀 더이 함께 만지작 내 코드는 다음과 마이크 드리스콜의 대답은 비슷합니다. 여기에 내 설정입니다. 세 개의 클래스가 있습니다 : WizardPage
일반 페이지를 만들고, 첫 번째 페이지를 만들고과 동일한 WizardPageDisabled
을 만들고 연결하는 도우미 함수를 호출하는 MyWizard
입니다.하지만 소개 한 타이머가 있습니다. 다음 버튼을 비활성화하십시오. 이 마지막 클래스를 추가 한 이유는이 기능이 마법사의 첫 페이지가 아닌 페이지에 필요할 수 있기 때문입니다.
이제는 문제가 생겼을 때 일부러 왔습니다. WizardPage
은 PyWizardPage
생성자를 사용하고 MyWizard
은 wx.Wizard
생성자를 사용합니다.PyWizardPage
생성자를 사용하여 WizardPageDisabled
을 만들면 forwardBtn.Disable()
줄에 NoneType has no attribute Disable
오류가 반환됩니다. wx.Wizard
생성자를 사용하면 페이지가 전혀 표시되지 않습니다.
위의 문제점 외에도 다른 명확한 질문이 있습니다. PyWizardPage
과 wx.Wizard
의 차이점은 무엇입니까?
당신이'page1.GetNext() 안()'를 시도은? –
@ 조란 비즐리 : 아니에요. 그냥 시도하고 다음 단추 대신 전체 페이지를 사용할 수 없게합니다. 그리고 나서'page1.GetNext(). FindWindowById (wx.ID_FORWARD) .Disable()'을 시도하고,'NoneType 객체에는 속성이 없습니다. Disable' – noblerare
:/그 모듈을 가지고있는 wx 버전을 사용하지 마라. –