前面几篇的学习笔记中,对 wx.Frame 已经有了一个大概的了解,wx.Frame 就是一个窗体框架,他有标题栏、有客户绘制区、有菜单条、有工具条、有状态栏、可以最大最小化、可以改变尺寸等等。
但是,这个 wx.Frame 窗体和 VB 、Delphi 、WinForm 等等的窗体有一点不一样的地方:一般情况下我们并不直接在窗体上放置控件。
如果你直接将控件放置在 wx.Frame 上,则控件的大小和位置设置都将不起作用,控件将充满整个 Frame 的客户区域,如果你放置两个按钮,则这两个按钮将共同填充整个客户区域。
所以,一般情况下,我们会先放置一个 wx.Panel 面板在 Frame 上面,同样的,Panel 将会充满整个框架,然后我们再将按钮、文本框等控件放置在 Panel 上,这样就可以设置位置和大小了。
当然,如果我们要为每一个控件设置位置和大小是一件很繁琐的事情,所以 wxPython 还提供了另外一种方法,就是现在 Frame 放置布局管理器,布局管理器可以构造出很复杂的界面。 |
那么我们如何将放置到窗体上呢?wxPython 所有窗口对象构造函数的第一个参数总是一个指向父窗口的引用。前面我们说过,Frame 如果是顶层窗口,则第一个可以传入一个 None,代表没有父窗口。
如果要在 Frame 上面放置一个 Panel ,则 Panel 的第一个参数传入 Frame ,说明 Frame 是 Panel 的父窗口,那么 Panel 就会出现在 Frame 上面了。
同样,如果要在 Panel 上面放置一个 Button ,则 Button 的第一个参数传入 Panel ,那么 Button 就会出现在 Panel 上面了。
下面看看 Panel 的构造函数:
__init__(self, parent, id=-1, pos=DefaultPosition, size=DefaultSize, style=wxTAB_TRAVERSAL|wxNO_BORDER, name=PanelNameStr)
我们看到,除了第一个参数 parent ,其他参数都有默认值,就像上面说过的,如果放置在 Frame 上面,大小和尺寸我们设定了也没用。
下面再看看 Button 的构造函数:
__init__(self, parent, id=-1, label=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, validator=DefaultValidator,name=ButtonNameStr)
同 Panel 一样,除了第一个参数 parent ,其他参数都有默认值。
下面的代码在 Frame 上加入了 Panel Button 和 StaticText 三个组件
代码如下:

2 # -*- coding: GBK -*-
3
4 import wx
5
6 """
7 在窗体中添加其他部件
8 """
9
10 class MyFrame(wx.Frame):
11
12 def __init__(self):
13 wx.Frame.__init__(self,parent=None,id=wx.ID_ANY,title="Hello wxPython",size=(200,160))
14 #添加一个面板
15 #第一个参数 self ,代表父窗体为 MyFrame 的一个对象实例
16 panel=wx.Panel(self)
17
18 #添加一个按钮
19 #第一个参数 panel ,代表父窗体为 panel ,按钮将出现在 panel 之上
20 wx.Button(panel,wx.ID_ANY,"Button",pos=(10,10),size=(80,40))
21
22 #添加一个文本标签
23 #第一个参数 panel ,代表父窗体为 panel ,文本标签将出现在 panel 之上
24 wx.StaticText(panel,-1,"This is the first line.\nThis is the second line.",pos=(10,80),size=(160,50))
25 #居中
26 self.Center()
27 #显示
28 self.Show()
29
30 if __name__=='__main__':
31 #初始化程序
32 app=wx.App()
33 #创建窗体
34 MyFrame()
35 #开始消息循环
36 app.MainLoop()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!