可视化wxPython GUI构建工具wxFormBuilder介绍

1、采用python tkinter手工代码布局GUI界面的烦恼

tkinter是python自带的GUI工具包接口模块。但是在linux系统下面安装开发环境相当麻烦。而且每个控件都需要手工布局,相当麻烦,你需要对每个控件的属性与方法精确掌握,才可以构建出GUI界面,而且构建出的GUI界面比较丑陋。已知有这些缺点,对于构建稍微复杂一点的GUI界面,使用tkinter开发起来会比较费劲。基于此原因,重新开始学习wxPython,并基于wxFormBuilder IDE工具开发GUI界面,后者在完成GUI界面布局之后可以自动生成python代码。你只要在生成的python代码基础上,做进一步重构代码,界面实现部分即可轻松完成,剩下的就是实现逻辑功能代码了。

2、wxFormBuilder工具介绍

讲wxFormBuilder之前提一下这个软件的来历,首先要追述到大名鼎鼎的跨平台GUI库wxWidgets,这个库主要是用C++语言实现的;鉴于wxWidgets的流行,Robin Dunn用Python语言对wxWidgets做了一层封装,封装后便成了Python版GUI库wxPython;下面是这两个GUI库的官方主页:

wxWidgets的各种UI控件功能均是通过class来实现的,这个链接 http://docs.wxwidgets.org/3.0/page_class_cat.html 列出了wxWidgets里的所有class,wxPython并没有实现wxWidgets里全部class,但基本实现了大部分常用class,这个链接 https://docs.wxpython.org/wx.1moduleindex.html列出了wxPython里所有的class。

知道了wxPython的class便可以开始设计GUI界面,但手工写代码设计界面太繁琐,因此wxFormBuilder应运而生,这是一款能够可视化设计界面的工具(并不是唯一工具,还有wxGlade、Boa Constructor等),通过该工具设计GUI界面后可自动生成wxPython代码,下面是wxFormBuilder的官方主页:

3、wxFormBuilder快速上手

使用wxFormBuilder去设计GUI界面可以不用掌握wxPython里的各个控件class的具体用法,你只需要在wxFormBuilder软件里添加这些控件即可,下面简介wxFormBuilder的用法:

3.1 软件界面

image.png

3.2 基础布局

首先创建一个GUI基础框架,基础框架包括:Frame(外围轮廓),Sizer(内部控件区)menubar(顶部菜单栏),statusBar(底部状态栏)。

Step 1:添加一个Frame,此为GUI的轮廓基础,其大小size(default为500;300)决定了GUI整体界面的大小。

image.png

Step 2:添加一个Sizer。

image.png

关于Sizer部分需要特别说明一下,wxPython提供的Sizer类型有如下七种:wxBoxSizer、wxWrapSizer、wxStaticBoxSizer、wxGridSizer、wxFlexGridSizer、wxGridBagSizer、wxStdDialogButtonSizer,Sizer的样式决定了后续控件的整体相对位置关系,选定了Sizer即选定了GUI界面样式。关于这七种Sizer的具体样式请见 https://docs.wxpython.org/sizers_overview.html#sizers-overview。如果你觉得单个Sizer里的控件布局太单调,你可以嵌套使用Sizer,这是实现GUI界面控件布局多样化的关键。

Step 3:在Frame顶部添加一个menuBar:

image.png

Step 4:在Frame底部添加一个statusBar:

image.png

3.3 其他控件(略)

3.4 控件属性

添加了所有控件之后,下一步便是分别设置控件的属性,进一步调整控件。

Frame控件的默认属性:


image.png

wxBoxSizer控件的默认属性:


3.5 触发事件

3.6 生成代码

保存项目,选择python语言,然后按F8按键自动生成python代码。

image.png

在项目目录下面,会自动生成noname.py文件。


image.png

拷贝noname.py文件为mywin.py文件。因为后面如果继续修改界面,再自动生成python代码,生成的代码会覆盖noname.py,假如你已经对noname.py代码做过重构,自动生成代码后,重构代码将被覆盖,前面付出的心血将白费!!!

3.7 调试显示wxFormBuilder生成的python代码

新建一个mainWin.py文件,添加下面的代码:

import wx

#导入mywin.py中内容
import mywin

# 创建mainWin类并传入mywin.MyFrame1
class mainWin(mywin.MyFrame1):

   # 实现Button控件的响应函数showMessage
   def showMessage(self, event):
       self.m_textCtrl1.Clear()
       self.m_textCtrl1.SetValue('hello world')

if __name__ == '__main__':
   # 下面是使用wxPython的固定用法
    app = wx.App()
    main_win = mainWin(None)
    main_win.Show()
    app.MainLoop()

3.8 windows 10下面调试此GUI代码,查看显示效果:

调出powershell


image.png

PS C:\wxpython_gui\test0813> ls

目录: C:\wxpython_gui\test0813

Mode LastWriteTime Length Name


-a---- 2019/8/13 21:22 9927 1.fbp
-a---- 2019/8/13 21:32 467 mainWin.py
-a---- 2019/8/13 21:32 1155 mywin.py
-a---- 2019/8/13 21:22 1155 noname.py

PS C:\wxpython_gui\test0813> python .\mainWin.py
C:\wxpython_gui\test0813\mywin.py:22: wxPyDeprecationWarning: Call to deprecated item. Use SetSizeHints instead.
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
Traceback (most recent call last):
File ".\mainWin.py", line 17, in <module>
main_win = mainWin(None)
File "C:\wxpython_gui\test0813\mywin.py", line 32, in init
self.m_statusBar2 = self.CreateStatusBar( 1, wx.ST_SIZEGRIP, wx.ID_ANY )
AttributeError: module 'wx' has no attribute 'ST_SIZEGRIP'
PS C:\wxpython_gui\test0813>

修改mywin.py 22行:
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
改为
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

修改32行:
self.m_statusBar2 = self.CreateStatusBar( 1, wx.ST_SIZEGRIP, wx.ID_ANY )
改为
self.m_statusBar2 = self.CreateStatusBar( 1, 0, wx.ID_ANY )

继续调试:
PS C:\wxpython_gui\test0813> python .\mainWin.py

image.png

OK,一个简单的GUI界面构建完成了,是不是很简单?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 142,811评论 1 300
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,236评论 1 256
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 94,386评论 0 212
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,004评论 0 175
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,779评论 1 255
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,776评论 1 176
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,393评论 2 271
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,161评论 0 166
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 28,979评论 6 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,511评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,296评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,637评论 1 229
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,242评论 0 31
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,121评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,512评论 3 204
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,619评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,013评论 0 167
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,525评论 2 230
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,615评论 2 231

推荐阅读更多精彩内容