现在的位置: 首页 > 综合 > 正文

wxPython Textctrl跟随Frame变化调节size

2012年09月30日 ⁄ 综合 ⁄ 共 2196字 ⁄ 字号 评论关闭

wxPython中sizer的管理对于初学者来说是一个比较难理解的地方。我在学习过程中遇到的问题记录下来,同时以供参考和查阅。

在添加textctrl时遇到一个问题,Muti-line text控件总是无法随着Frame变化,并且显示不完整。原始的code思路:创建一个Frame, 在Frame中添加panel控件。并创建一个Boxsizer, 与panel相关联。 新建Textctrl控件、两个button控件,并依次添加到Sizer中管理。实现代码如下:

 1 import wx
2
3 class mainFrame(wx.Frame):
4 def __init__(self):
5 wx.Frame.__init__(self,None,-1,"xDeskTopCalander",size=(100,200))
6 mb = self.createMenuBar()
7 self.SetMenuBar(mb)
8 self.CreateStatusBar()
9 self.createPanel()
10
11 def createMenuBar(self):
12 mb = wx.MenuBar()
13
14 menuFile = wx.Menu()
15 mb.Append(menuFile,"&File")
16 menuFile.Append(-1,"&Open")
17 menuFile.Append(-1,"&Close")
18
19 menuEdit = wx.Menu()
20 mb.Append(menuEdit,"&Edit")
21 menuEdit.Append(-1,"&Redo")
22 menuEdit.Append(-1,"&Undo")
23
24 menuHelp = wx.Menu()
25 mb.Append(menuHelp,"&Help")
26 menuHelp.Append(-1,"A&bout me")
27 return mb
28
29 def createPanel(self):
30 """create panel container"""
31 panel = wx.Panel(self,-1)
32 panel.SetBackgroundColour("white")
33
34 sizer = wx.BoxSizer(wx.VERTICAL)
35
36 text = wx.StaticText(panel,-1,"muti-line test")
37 #text.SetInsertionPoint(0)
38
39 ok = wx.Button(self, 20, "OK", (20, 80))     //不可用self, 否则不会添加进panel container中
40 canel = wx.Button(self, 20, "CANEL", (30, 80)) //导致Sizer layout管理不正确. 将self --> panel即可正常显示
41
42 sizer.Add(text,1,flag=wx.LEFT|wx.RIGHT|wx.EXPAND,border=1)
43 sizer.Add(canel,0)
44 sizer.Add(ok,0)
45 panel.SetSizer(sizer)
46
47 if __name__ == "__main__":
48 app = wx.PySimpleApp()
49 window = mainFrame()
50 window.Show()
51 app.MainLoop()

但是运行结果却并不是我想像的那样. Textctrl没有显示完整,Button也只显示了一个。查看了半天,不明就理。

后经过参考其它,修改如下后,终于是我想要的显示了:

 1 import wx
2
3 class sizerFrame(wx.Frame):
4 def __init__(self):
5 wx.Frame.__init__(self,None,title="Sizer Test Frame")
6 panel = wx.Panel(self,-1)
7 panel.SetBackgroundColour("black")
8
9 sizer = wx.BoxSizer(wx.VERTICAL)
10
11 box1 = wx.BoxSizer(wx.HORIZONTAL)
12 text = wx.TextCtrl(panel,-1,"Muti line text test",style=wx.TE_MULTILINE)
13 box1.Add(text,proportion=1,flag=wx.EXPAND)
14 sizer.Add(box1,proportion=1,flag=wx.LEFT|wx.RIGHT|wx.EXPAND,border=2)
15
16 ok_button = wx.Button(panel,wx.ID_ABORT,"OK")
17 canel_button = wx.Button(panel,wx.ID_APPLY,"Canel")
18
19 sizer.Add(ok_button,flag=wx.EXPAND)
20 sizer.Add(canel_button,flag=wx.EXPAND)
21
22 panel.SetSizer(sizer)
23
24
25 if __name__ == "__main__":
26 app = wx.PySimpleApp()
27 window = sizerFrame()
28 window.Show()
29 app.MainLoop()

抱歉!评论已关闭.