2010-11-24 39 views
3

我試圖在顯示內容之前顯示登錄框的wxPython(絕對初學者)中構建一個小應用程序。我創建了一個框架,框架內有一個帶有flexigrid的面板,用於放置登錄表單,但不顯示。如果我啓動應用程序,登錄表單是不可見的。如果我調整登錄框顯示的應用程序的大小。任何想法爲什麼?這裏是我到目前爲止的代碼:wxPython顯示登錄框

import wx 

class AP_App(wx.App): 
    def OnInit(self): 
     frame = AP_MainFrame("Test application", (0, 0), (650, 350)) 
     frame.Show() 
     self.SetTopWindow(frame) 

     loginPanel = AP_LoginPanel(frame) 
     self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 
     return True 

    def OnCloseWindow(self, event): 
     self.Destroy() 


class AP_MainFrame(wx.Frame): 
    def __init__(self, title, pos, size): 
     wx.Frame.__init__(self, None, -1, title, pos, size) 
     self.CreateStatusBar() 


class AP_LoginPanel(wx.Panel): 
    def __init__(self, frame): 
     self.panel = wx.Panel(frame) 
     self.frame = frame 

     self.frame.SetStatusText("Authentification required!") 
     self.showLoginBox() 

    def showLoginBox(self): #Create the sizer 
     sizer = wx.FlexGridSizer(rows = 3, cols = 2, hgap = 5, vgap = 15) 

     # Username 
     self.txt_Username = wx.TextCtrl(self.panel, 1, size = (150, -1)) 
     lbl_Username = wx.StaticText(self.panel, -1, "Username:") 

     sizer.Add(lbl_Username,0, wx.LEFT|wx.TOP| wx.RIGHT, 50) 
     sizer.Add(self.txt_Username,0, wx.TOP| wx.RIGHT, 50) 

     # Password 
     self.txt_Password = wx.TextCtrl(self.panel, 1, size=(150, -1), style=wx.TE_PASSWORD) 
     lbl_Password = wx.StaticText(self.panel, -1, "Password:") 
     sizer.Add(lbl_Password,0, wx.LEFT|wx.RIGHT, 50) 
     sizer.Add(self.txt_Password,0, wx.RIGHT, 50) 

     # Submit button 
     btn_Process = wx.Button(self.panel, -1, "&Login") 
     self.panel.Bind(wx.EVT_BUTTON, self.OnSubmit, btn_Process) 
     sizer.Add(btn_Process,0, wx.LEFT, 50) 

     self.panel.SetSizer(sizer) 

    def OnSubmit(self, event): 
     UserText = self.txt_Username.GetValue() 
     PasswordText = self.txt_Password.GetValue() 


if __name__ == '__main__': 
    app = AP_App() 
    app.MainLoop() 

回答

4

我剛剛發現我打電話frame.Show()太快。 :)

+0

只需注意一下爲什麼會有所作爲:框架將在框架的「EVT_SIZE」處理程序中管理其內容的佈局(通過sizer或通過調整單個小孩的大小以填充框架)。當你調用`Show`時,它會得到它的第一個大小的事件,但是沒有任何內容需要調整大小。然後,當你添加面板時,它只是以一個小的默認大小開始,並保持這種方式,直到幀獲得另一個大小的事件。 – RobinDunn 2016-12-09 19:09:46