串口调试助手LgxSerialAssistant - wxpython可视化GUI工具 wxFormBuilder 使用

1、wxFormBuilder 是什么?

通过手动编码创建一个好看的 GUI 通常是一个非常乏味、痛苦的过程,所以实际开发中,这项工作都是由可视化 GUI 设计器工具完成。
wxFormBuilder 就是一款功能强大的开源图形用户界面设计工具,专门用于 wxWidgets(wxpython)框架的应用程序开发。作为 wxWidgets 生态系统中的重要组成部分,它能够显著提高 GUI 开发的效率和质量。通过可视化拖拽的方式,开发者可以在不编写任何代码的情况下完成界面设计,并实时预览窗口效果。这种所见即所得的设计方式极大简化了传统 GUI 开发中反复修改代码、编译运行的繁琐过程。

2、wxFormBuilder 正确使用“姿势”

本文不详细介绍如何使用 wxFormBuilder 完成图形界面设计的过程以及各种控件的使用方法,只介绍 wxFormBuilder 的使用逻辑:

  • 从设计上实现 GUI 界面与业务逻辑的分离;
  • 代码生成后只继承不修改(不用怀疑你可能修改界面的次数);
  • 通过类继承补充完善事件处理方法;
  • 通过使用继承自控件的子类扩展标准控件的功能;

2.1 通过继承完善事件处理逻辑:

wxFormBuilder 不仅仅能用于界面生成与调整,还能在 Events 中为控件添加事件处理方法,如下图所示:
1
添加事件处理方法后,可以看到生成事件处理方法的 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 还可以使用控件的子类:
2
如上图所示在 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 界面,添加需要的控件;
  • 为控件添加事件处理方法;
  • 为需要特殊功能的控件添加子类和头文件;
  • 继承生成代码,并添加真正的事件处理动作;
  • 为自定义控件添加继承类,增加特殊功能;
posted @ 2026-10-29 21:50  芥子的世界  阅读(5)  评论(0)    收藏  举报