2011-11-01 83 views
1

我正在研究一個收集和檢查用戶輸入的簡單程序。除了在用戶提供的輸入未通過檢查時顯示消息框 之外,我還想在輸入字段的右側添加提示 ,告訴用戶需要什麼類型的數據。要做到這一點,我已經創建了一個單行FlexGridSizer包括以下內容:wxPython:使用Show()和Hide()

[(wx.StaticText, 「姓名」),(wx.TextCtrl, 「在這裏用戶輸入」),(wx.StaticText ,「Input Guidance」)]

初始化時,「Input Guidance」小部件被隱藏。如果用戶沒有在提供的字段中輸入任何內容,然後點擊確定按鈕,我想三件事情發生

  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迴應的代碼有點兒是狗的早餐。爲了使我的目標更清晰,儘管這確實意味着Mike的代碼與新改進的問題無關 –

回答

3

編輯:對於新的問題(S),我會用發佈 - 訂閱解決這個問題。將偵聽器放入MyDialog類的init,然後在另一個類中運行Validate方法時向其發佈消息。在理論上在MyDialog中創建的消息處理程序中,您需要顯示其他小部件並在對話框中調用Layout()。這應該會導致它適當調整大小。

你可以閱讀發佈訂閱教程這裏: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提示非常感謝。現在按預期工作。 –