2011-11-01 6 views
1

나는 사용자 입력을 수집하고 검사하는 간단한 프로그램을 만들고 있습니다. 사용자 제공 입력이 검사에 실패한 경우 메시지 상자를 표시하는 것 외에도 입력 필드 오른쪽에 사용자에게 어떤 데이터 유형이 필요한지 알려주는 프롬프트 을 추가하고 싶습니다. wxPython : Show() 및 Hide() 사용

[(wx.StaticText, "이름"), (wx.TextCtrl, "여기에 사용자 입력"), (wx.StaticText을 다음 내가 구성된 단일 행 FlexGridSizer을 만든이 작업을 수행하려면 , "Input Guidance")]

"입력 유도"위젯이 숨겨져 있습니다. 사용자가 제공 한 필드에 아무 것도 입력하지 후 OK 버튼을 명중하면, 나는 세 가지가

  1. 필드 일어날하려는합니다 (문제
  2. "입력 지침"위젯에 사용자에게 경고하는 색상을 변경) 위의 행의 세 번째가 표시되었을
  3. 대화 상자가 자동으로

지금까지 난 단지 (1) 작동시킬 수 있고, 도움을 찾고 지금 눈에 보이는 위젯을 고려 크기가 조정됩니다

  • (2) 및 (3).


    import wx 
    
    
    class Not_Empty(wx.PyValidator): 
    
        def __init__(self): 
         wx.PyValidator.__init__(self) 
    
        def Clone(self): 
    
         return Not_Empty() 
    
        ################################################################################ 
        def Validate(self, win): 
         """""" 
         evt_location = self.GetWindow() 
         val = evt_location.GetValue() 
    
         if val == "": 
          evt_location.SetBackgroundColour(wx.Color(250,200,230)) 
          MyDialog().nameWarning_ST.Show(True) 
          return False 
    
         else: 
          return True 
        ################################################################################ 
    
        def TransferToWindow(self): 
         return True 
    
        def TransferFromWindow(self): 
         return True 
    
    class MyDialog(wx.Dialog): 
        def __init__(self): 
         wx.Dialog.__init__(self, parent=None, id=-1, title="Getting Input", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) 
    
    
         # Create field labels 
         name = wx.StaticText(self, -1, "Name") 
    
         # Create user-input widgets 
         name_TC = wx.TextCtrl(self, validator=Not_Empty()) 
    
         # Create and hide warning boxes 
         self.nameWarning_ST = wx.StaticText(self, label="Field cannot be left empty", name="emptyAlert") 
    
         # to see what I want the dialog to look like AFTER the user has entered an 
         # empty string change 'False' to 'True' in the line below. 
         self.nameWarning_ST.Show(False) 
    
         # Create accept/cancel buttons 
         btns = self.CreateButtonSizer(flags=wx.OK|wx.CANCEL) 
    
         self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
    
         fgs = wx.FlexGridSizer(cols = 3, rows = 1) 
    
         fgs.AddMany([(name, -1, wx.ALL, 5), (name_TC, -1, wx.ALL, 5), (self.nameWarning_ST, -1, wx.ALL, 5)]) 
    
         self.mainSizer.AddMany([(fgs, 1, wx.ALL, 0), (btns, 1, wx.ALL|wx.EXPAND, 5)]) 
    
         self.SetSizer(self.mainSizer)  
         self.mainSizer.Fit(self) 
    
    if __name__ == '__main__': 
    
        app = wx.App() 
        dlg = MyDialog() 
        dlg.Center() 
        dlg.ShowModal() 
        dlg.Destroy() 
    
        app.MainLoop() 
    
  • +0

    아래의 마이크의 응답을 얻은 코드는 개가 제공하는 아침 식사 중 일부입니다. Mike의 코드가 새롭고 개선 된 질문과 관련이 없다는 것을 의미하지만, 목표를 명확하게하기 위해 코드를 크게 수정했습니다. –

    답변

    3

    편집 : 새 질문 (들), 나는이 문제를 해결하기 위해 pubsub을 사용에 대한. Listener에 MyDialog 클래스의 init을 추가 한 다음 Validate 메서드가 다른 클래스에서 실행될 때 메시지를 게시합니다. 이론적으로 MyDialog에서 생성하는 메시지 핸들러에서 다른 위젯 표시 및 대화 상자의 Layout() 호출을 원할 것입니다. 그게 적절하게 크기를 조정해야합니다.

    현재 pubsub에 대한 자습서를 읽을 수

    : http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/ 다음은 원래의 질문에 대한했다

    :

    적 화재, 그래서 당신의 검증 및 OnChar 방법을 재 배열하지 않습니다 유효성 검사 방법 다음과 같이 보입니다 :

    import string 
    def Validate(self, win): 
        """ 
        Enter your code here... 
        """ 
        return True 
    
    
    def OnChar(self, event): 
        txtObj = event.GetEventObject() 
        txt = txtObj.GetValue() 
        if txt == "": txt = '0' 
        key = chr(event.GetKeyCode()) 
    
        if key in string.digits: 
         if int(txt+str(key)) < 150: 
          event.Skip() 
         else: 
          msg = "You have entered an age greater than 150!" 
          wx.MessageBox(msg, "Improbable entry", style=wx.OK|wx.ICON_ERROR) 
    
          # PROBLEM ARISES HERE 
          # =================== 
          MyDialog().ageWarning_ST.Show() 
          MyDialog().mainSizer.Fit(MyDialog()) 
    
          return False 
    
        key = event.GetKeyCode() 
        if key in(wx.WXK_RETURN, wx.WXK_DELETE, wx.WXK_BACK): 
         event.Skip() 
    
        elif (chr(key)).isdigit(): 
         event.Skip() 
        else: 
         return 
    

    또한 약간의 작업을 쉽게하기 위해 문자열 모듈을 가져 왔습니다. 코드는 정리가 필요하지만 내 컴퓨터에서 작동합니다.

    +0

    Mike에서 코드를 숨긴 적이 있지만 여전히 원하는 동작을 얻지 못합니다. 바로 StaticText 위젯의 .Show() 및 .Hide()입니다. 코드를 짧게하고 목표를 분명하게하기 위해 제 질문을 편집했습니다. 고마워, 폴. –

    +1

    Pubsub 팁 많이 감사하겠습니다. 지금 의도대로 작업. –