大家好,欢迎来到IT知识分享网。
实战wxPython系列-50
在我们启动一个GUI程序后,经常会遇到在一个窗口中需要动态添加或者删除一些控件,使用wxPython开发的GUI应用也不例外。在本文中我们将创建一个程序来演示如何在应用中允许用户添加或者删除按钮。
一、代码演示
import wx class MyPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) self.number_of_buttons = 0 self.frame = parent self.mainSizer = wx.BoxSizer(wx.VERTICAL) controlSizer = wx.BoxSizer(wx.HORIZONTAL) self.widgetSizer = wx.BoxSizer(wx.VERTICAL) self.btnAdd = wx.Button(self, label="添加") self.btnAdd.Bind(wx.EVT_BUTTON, self.OnAddWidget) controlSizer.Add(self.btnAdd, 0, wx.CENTER|wx.ALL, 5) self.btnRemove = wx.Button(self, label="删除") self.btnRemove.Bind(wx.EVT_BUTTON, self.OnRemoveWidget) controlSizer.Add(self.btnRemove, 0, wx.CENTER|wx.ALL, 5) self.mainSizer.Add(controlSizer, 0, wx.CENTER) self.mainSizer.Add(self.widgetSizer, 0, wx.CENTER|wx.ALL, 10) self.SetSizer(self.mainSizer) def OnAddWidget(self, e): self.number_of_buttons += 1 label = "按钮 %s" % self.number_of_buttons name = "button%s" % self.number_of_buttons new_button = wx.Button(self, label = label, name = name) self.widgetSizer.Add(new_button, 0, wx.ALL, 5) self.frame.fSizer.Layout() self.frame.Fit() def OnRemoveWidget(self, e): if self.widgetSizer.GetChildren(): sizer_item = self.widgetSizer.GetItem(self.number_of_buttons - 1) widget = sizer_item.GetWindow() self.widgetSizer.Hide(widget) widget.Destroy() self.number_of_buttons -= 1 self.frame.fSizer.Layout() self.frame.Fit() class SampleAddDelWidget(wx.Frame): def __init__(self, *args, **kw): super(SampleAddDelWidget, self).__init__(*args, **kw) self.InitUi() def InitUi(self): self.SetTitle("实战wxPython: 动态添加删除控件演示") self.SetMinSize((400, 240)) self.fSizer = wx.BoxSizer(wx.VERTICAL) panel = MyPanel(self) self.fSizer.Add(panel, 1, wx.EXPAND) self.SetSizer(self.fSizer) self.Fit() self.Centre() def main(): app = wx.App() sample = SampleAddDelWidget(None) sample.Show() app.MainLoop() if __name__ == "__main__": main()
运行上面的代码,窗口如图1所示:
点击”添加”按钮,添加一些按钮后,然后再点击”删除”按钮,删除一些添加到窗口中的按钮,经过这些操作后,窗口可能如图2所示:
二、分析
现在我们对上面的代码进行简要的分析。我们创建类MyPanel,它继承自wx.Panel,它可以动态添加和删除按钮。
self.number_of_buttons = 0
首先我们声明一个变量number_of_buttons,它用来统计我们当前在窗口中已添加的按钮数,每添加一个按钮number_of_buttons将加1,如果number_of_buttons大于0的话,按每删除一个按钮,number_of_buttons将减1。
self.mainSizer = wx.BoxSizer(wx.VERTICAL) controlSizer = wx.BoxSizer(wx.HORIZONTAL) self.widgetSizer = wx.BoxSizer(wx.VERTICAL)
创建三个调节器mainSizer, controlSizer和widgetSizer, 其中mainSizer为面板的主调节器,垂直布局。controlSizer用来容纳”添加”和”删除”按钮,水平布局。widgetSizer用来容纳我们新添加的按钮,垂直布局。
def OnAddWidget(self, e): self.number_of_buttons += 1 label = "按钮 %s" % self.number_of_buttons name = "button%s" % self.number_of_buttons new_button = wx.Button(self, label = label, name = name) self.widgetSizer.Add(new_button, 0, wx.ALL, 5) self.frame.fSizer.Layout() self.frame.Fit()
OnAddWidget响应按钮”添加”的点击事件,当我们生成一个新的按钮后,将其添加到widgetSizer中,然后调用父窗口中的调节器的Layout()方法, 刷新布局,再调用父窗口的Fit()方法来调整窗口大小,以最合适窗口大小来显示所用控件。
def OnRemoveWidget(self, e): if self.widgetSizer.GetChildren(): sizer_item = self.widgetSizer.GetItem(self.number_of_buttons - 1) widget = sizer_item.GetWindow() self.widgetSizer.Hide(widget) widget.Destroy() self.number_of_buttons -= 1 self.frame.fSizer.Layout() self.frame.Fit()
OnAddWidget响应按钮” 删除”的点击事件, 如果widgetSizer中有控件,则删除最后一个控件。然后调用父窗口中的调节器的Layout()方法, 刷新布局,再调用父窗口的Fit()方法来调整窗口大小,以最合适窗口大小来显示所用控件。
三、本文知识点
- 掌握如何在应用中允许用户添加和删除一个控件。
- 使用wx.Sizer的Layout方法。
- 使用wx.Frame的Fit方法。
- 使用wx.Frame的SetMinSize方法设置窗口的最小尺寸。
前一篇:wxPython – 实现一个登录窗口
欢迎关注,评论,收藏,点赞,和转发。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/52565.html