2010-11-24 57 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