这是我从0开始学习wxPython时边学边写的笔记,主要是对于wxPython的初步认识。
下面讲的是官方文档中的第一个案例,参考的是这位大佬的文章:
https://blog.csdn.net/hekaiyou/article/details/107360100
安装wxPython
通过pip命令来安装:
pip install wxPython
创建最简单的窗口
import wx
# 创建一个应用程序对象
app = wx.App()
# 创建一个框架,框架就是一个窗口,其大小和位置(通常)可以由用户更改。
frm = wx.Frame(None,title="Hello World") # 用title指定窗口名
# 展示框架(窗口)
frm.Show()
# 启动事件循环,将程序暂停在此处,而不会因代码执行完毕而停止
app.MainLoop()
wx.App() 的作用是:
- 引导 wxPython 系统并初始化底层 GUI 工具包
- 设置和获取应用程序范围的属性
- 实现原生窗口系统主消息或事件循环,并将事件分发给窗口实例
每个 wx 应用程序都必须有一个单独的 wx.App 实例,并且所有 UI 对象的创建都应该在创建 wx.App 对象之后,以确保 GUI 平台和 wxWidgets 具有已完全初始化。
wx.Frame的详细参数见此处:https://my.oschina.net/mutour/blog/33063?fromerr=rlll4KZ8
封装自定义框架(窗口)
添加面板
面板是用来存放控件的,如:按钮、文本框等。
import wx
class HelloWorld(wx.Frame):
"""
自定义的HelloWorld框架
"""
def __init__(self, *args, **kw):
# 调用父类的 __init__ 方法
super().__init__(*args, **kw)
# 在框架中创建一个面板
pnl = wx.Panel(self)
if __name__ == '__main__':
app = wx.App()
# 调用自定义框架
frm = HelloWorld(None, title='Hello World')
frm.Show()
app.MainLoop()
效果如图:
添加控件
def __init__(self, *args, **kw):
# 调用父类的 __init__ 方法
super().__init__(*args, **kw)
# 在框架中创建一个面板
pnl = wx.Panel(self)
# 在面板上放一个静态文本
st = wx.StaticText(pnl, label="Hello World") # StaticText()用于显示一行或多行只读文本,并作为一个控件返回
font = st.GetFont() # 获取控件字体
font.PointSize += 10 # 字体增加10, 默认为9
font = font.Bold() # 字体加粗,接收返回值
st.SetFont(font) # 设置控件字体,否则将不会生效
wxpython之StaticText最全介绍参考此处https://blog.csdn.net/qq_41639829/article/details/106075448
创建调整器
调整器(sizer)可用来管理控件的布局,sizer可以进行嵌套,如同HTML中的<div>
标签。
def __init__(self, *args, **kw):
…… ……
# 创建一个调整器(sizer)来管理控件的布局
sizer = wx.BoxSizer(wx.VERTICAL) # 参数用来指定sizer中子控件的排列方向,(垂直方向)wx.VERTICAL 或(水平方向) wx.HORIZONTAL
sizer.Add(st, wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25)) # 将静态文本控件加入sizer并设置布局
pnl.SetSizer(sizer) # 将sizer加入面板
关于wx.BoxSizer() 的详细使用参见https://blog.csdn.net/igolang/article/details/9397175
添加菜单栏和状态栏 并 绑定事件
def __init__(self, *args, **kw):
…… ……
# 创建菜单栏
self.make_menu_bar()
# 创建状态栏
self.CreateStatusBar() # 在框架底部创建一个状态栏。
self.SetStatusText("状态栏") # 设置状态栏文本并更新状态栏显示。
def make_menu_bar(self):
"""
菜单栏由菜单组成,菜单由 菜单项 组成。
此方法将构建一组菜单,并绑定选择菜单项时要调用的处理函数。
"""
# 制作菜单
# 1、添加包含 "Hello" 和 "退出" 项目(菜单项)的 "文件" 菜单
file_menu = wx.Menu()
# 使用语法 "\t..." 定义一个快捷键
hello_item = file_menu.Append(-1, "&Hello\tCtrl-H", "此菜单项在状态栏中显示的帮助信息")
file_menu.AppendSeparator() # 在菜单末尾添加分隔符。
# 可以使用 Stock ID 快速创建菜单项,并且无需指定菜单项的标签名
# Stock ID: https://docs.wxpython.org/stock_items.html
exit_item = file_menu.Append(wx.ID_EXIT)
# 2、添加只有一个 "关于" 项目 的 "帮助" 菜单
help_menu = wx.Menu()
about_item = help_menu.Append(wx.ID_ABOUT)
# 制作菜单栏,然后向其中添加两个菜单
menu_bar = wx.MenuBar()
menu_bar.Append(file_menu, "&文件")
menu_bar.Append(help_menu, "&帮助")
# 将菜单栏移至框架
self.SetMenuBar(menu_bar)
# 将每个菜单项的处理函数与 EVT_MENU 事件关联
self.Bind(wx.EVT_MENU, self.on_hello, hello_item)
self.Bind(wx.EVT_MENU, self.on_exit, exit_item)
self.Bind(wx.EVT_MENU, self.on_about, about_item)
def on_exit(self, event):
"""关闭框架,终止应用程序。"""
self.Close(True)
def on_hello(self, event):
"""显示Hello对话框。"""
wx.MessageBox("Hello World!")
def on_about(self, event):
"""显示关于对话框"""
wx.MessageBox("这是一个wxPython的演示Demo", "关于Hello World", wx.OK | wx.ICON_INFORMATION)
整体代码
import wx
class HelloWorld(wx.Frame):
"""
自定义的HelloWorld框架
"""
def __init__(self, *args, **kw):
# 调用父类的 __init__ 方法
super().__init__(*args, **kw)
# 在框架中创建一个面板
pnl = wx.Panel(self)
# 在面板上放一个静态文本
st = wx.StaticText(pnl, label="Hello World") # 用于显示一行或多行只读文本,并作为一个控件返回
font = st.GetFont() # 获取控件字体
font.PointSize += 10 # 字体增加10, 默认为9
font = font.Bold() # 设置字体为加粗
st.SetFont(font) # 设置控件字体,否则将不会生效
# 创建一个调整器来管理控件的布局
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(st, wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25))
pnl.SetSizer(sizer)
# 创建菜单栏
self.make_menu_bar()
# 创建状态栏
self.CreateStatusBar() # 在框架底部创建一个状态栏。
self.SetStatusText("状态栏") # 设置状态栏文本并更新状态栏显示。
def make_menu_bar(self):
"""
菜单栏由菜单组成,菜单由 菜单项 组成。此方法将构建一组菜单,并绑定选择菜单项时要调用的处理函数。
"""
# 制作菜单
# 1、使用 "Hello" 和 "退出" 项目(菜单项)创建 "文件" 菜单
file_menu = wx.Menu()
# 使用语法 "\t..." 定义一个快捷键
hello_item = file_menu.Append(-1, "&Hello\tCtrl-H", "此菜单项在状态栏中显示的帮助信息")
file_menu.AppendSeparator() # 在菜单末尾添加分隔符。
# 可以使用 Stock ID 快速创建菜单项,并且无需指定菜单项的标签名
# Stock ID: https://docs.wxpython.org/stock_items.html
exit_item = file_menu.Append(wx.ID_EXIT)
# 2、添加只有一个 "关于" 项目的 "帮助" 菜单
help_menu = wx.Menu()
about_item = help_menu.Append(wx.ID_ABOUT)
# 制作菜单栏,然后向其中添加两个菜单
menu_bar = wx.MenuBar()
menu_bar.Append(file_menu, "&文件")
menu_bar.Append(help_menu, "&帮助")
# 将菜单栏移至框架
self.SetMenuBar(menu_bar)
# 将每个菜单项的处理函数与 EVT_MENU 事件关联
self.Bind(wx.EVT_MENU, self.on_hello, hello_item)
self.Bind(wx.EVT_MENU, self.on_exit, exit_item)
self.Bind(wx.EVT_MENU, self.on_about, about_item)
def on_exit(self, event):
"""关闭框架,终止应用程序。"""
self.Close(True)
def on_hello(self, event):
"""显示Hello对话框。"""
wx.MessageBox("Hello World!")
def on_about(self, event):
"""显示关于对话框"""
wx.MessageBox("这是一个wxPython的演示Demo", "关于Hello World", wx.OK | wx.ICON_INFORMATION)
if __name__ == '__main__':
app = wx.App()
frm = HelloWorld(None, title='Hello World')
frm.Show()
app.MainLoop()