串口调试助手LgxSerialAssistant - wxpython可视化GUI工具 wxFormBuilder 使用
1、wxFormBuilder 是什么?
通过手动编码创建一个好看的 GUI 通常是一个非常乏味、痛苦的过程,所以实际开发中,这项工作都是由可视化 GUI 设计器工具完成。
wxFormBuilder 就是一款功能强大的开源图形用户界面设计工具,专门用于 wxWidgets(wxpython)框架的应用程序开发。作为 wxWidgets 生态系统中的重要组成部分,它能够显著提高 GUI 开发的效率和质量。通过可视化拖拽的方式,开发者可以在不编写任何代码的情况下完成界面设计,并实时预览窗口效果。这种所见即所得的设计方式极大简化了传统 GUI 开发中反复修改代码、编译运行的繁琐过程。
2、wxFormBuilder 正确使用“姿势”
本文不详细介绍如何使用 wxFormBuilder 完成图形界面设计的过程以及各种控件的使用方法,只介绍 wxFormBuilder 的使用逻辑:
- 从设计上实现 GUI 界面与业务逻辑的分离;
- 代码生成后只继承不修改(不用怀疑你可能修改界面的次数);
- 通过类继承补充完善事件处理方法;
- 通过使用继承自控件的子类扩展标准控件的功能;
2.1 通过继承完善事件处理逻辑:
wxFormBuilder 不仅仅能用于界面生成与调整,还能在 Events 中为控件添加事件处理方法,如下图所示:

添加事件处理方法后,可以看到生成事件处理方法的 python 代码如下:
# Virtual event handlers, override them in your derived class
def on_button_insert( self, event ):
event.Skip()
生成的事件处理方法是虚函数,没有任何实际动作。
这里不能直接修改生成的代码来补充事件处理动作,可以继承生成的类,并在子类中重载事件处理方法,并添加真正的事件处理动作:
# 插入按钮点击
def on_button_insert(self, event):
if self.generate_state == 0:
wx.MessageBox(_(u"Modbus command has not generated!"), _(u"Warning"), wx.OK)
else:
evt = ModbusCmdTransEvent(frame=self.frame) # 向主窗口发送消息,并传送生成命令字节
wx.PostEvent(self, evt)
self.EndModal(1)
return super().on_button_insert(event)
2.2 使用控件子类扩展标准控件功能
当标准控件功能不能满足需求时,wxFormBuilder 还可以使用控件的子类:

如上图所示在 subclass 中填写子类名称和头文件就可以使用继承自标准控件的子类,以实现控件功能的扩展。
生成的 python 代码自动从头文件导入子类,并使用子类构造控件:
from lgxintegertextctrl import LgxIntegerTextCtrl
。。。
self.text_addr = LgxIntegerTextCtrl( self.panel, wx.ID_ANY, _(u"1"), wx.DefaultPosition, wx.DefaultSize, 0 )
在实际项目中,创建对应的继承子类和头文件,扩展标准控件不具备的特殊功能。
下面例子是为 wx.TextCtrl 控件增加输入和粘贴时过滤数字键的功能,避免用户输入非数字字符:
import wx
class LgxIntegerTextCtrl(wx.TextCtrl):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.Bind(wx.EVT_CHAR, self.on_char)
self.Bind(wx.EVT_TEXT_PASTE, self.on_paste)
# 键盘输入,过滤数字键
def on_char(self, event: wx.KeyEvent):
key = event.GetKeyCode()
if key < wx.WXK_SPACE or key == wx.WXK_DELETE or chr(key).isdigit():
event.Skip()
# 复制粘贴,过滤数字键
def on_paste(self, event):
if wx.TheClipboard.Open():
data = wx.TextDataObject()
if wx.TheClipboard.GetData(data):
text = "".join(c for c in data.GetText() if c.isdigit())
self.WriteText(text)
wx.TheClipboard.Close()
3、wxFormBuilder 使用方法总结
简单总结 wxFormBuilder 使用逻辑和流程:
- 按实际需求设计 GUI 界面,添加需要的控件;
- 为控件添加事件处理方法;
- 为需要特殊功能的控件添加子类和头文件;
- 继承生成代码,并添加真正的事件处理动作;
- 为自定义控件添加继承类,增加特殊功能;

浙公网安备 33010602011771号