一:简介
wxpython是Python中一个GUI库。wxFormBuilder是wxpython其中一个可视化的IDE,支持拖拉控件和生成多种语言(Python、C++等)对应的代码。可通过pip来安装wxpython pip install wxpython
二:示例
1. HelloWorld示例
import wx
def window_close(event):
print("主窗口要关闭了")
event.Skip()
# 定义一个应用程序
app = wx.App()
# 创建一个主窗体,顶层窗口(类似于html中的body),所有的控件都放在主窗体之上,title表示窗口标题,size表示窗口宽高
window = wx.Frame(None, title='wxpython', size=(400, 300))
# 给主窗口绑定一个关闭事件
window.Bind(wx.EVT_CLOSE, window_close)
# 创建一个面板容器(类似于HTML中div),通常放在wx.Frame中(类似于在body中放个div)
panel = wx.Panel(window)
# 在面板上放置一个静态文本组件
# 可以将控件直接放在wx.Frame中,但那样布局Layout不好管理,一般放到Panel中便于管理子控件的布局
label = wx.StaticText(panel, label='Hello World', pos=(100, 100))
# 显示窗体
window.Show(True)
# 启动主窗口主事件循环
app.MainLoop()
wx.Frame(parent=None, id=None, title=None, pos=None, size=None, style=None, name=None)
window = wx.Frame(None, -1, 'Frame Title', pos=(10, 30), size=(300, 200), style=wx.DEFAULT_FRAME_STYLE, name="frame")
- parent: 父窗口
- id:窗口标识。通常使用wx.ID_ANY=-1为了让标识符自动生成
- title: 窗体标题
- pos: 窗体位置(坐标),默认wx.DefaultPosition表示由操作系统决定
- size:窗体大小(宽高)
- style:窗体样式, 可以使用管道符号使用多个样式。style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL
- name:对象的内部名称
所有的窗体都直接或者间接的继承自Window类。wxPython设置值一般调用SetXxx方法,获取值一般使用GetXxx方法
三:wxFormBuilder
- 设置代码生成的语言,这里选择Python
- 选择Designer, 然后选择Forms -> Frame 添加主窗体
- 添加布局 Layout -> wxBoxSizer
- 添加基本组件wxStaticText、wxTextCtrl、wxButton
- 分别设置wxStaticText、wxTextCtrl、wxButton居中
- 分别设置wxTextCtrl、wxButton拉伸扩充
- 为按钮wxButton添加事件
- 按F8生成代码
- 将Python中的代码拷贝出来,放到demo.py文件中
- 使用wxFormBuilder生成的代码,创建App
在使用wxFormBuilder首先是要考虑好布局Layout,然后将各个小组件放到每个布局里。
示例1:求平方
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
###########################################################################
## Class MyFrame1
###########################################################################
class MyFrame1(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"平方计算", pos=wx.DefaultPosition, size=wx.Size(300, 200),
style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
bSizer1 = wx.BoxSizer(wx.VERTICAL)
self.m_staticText1 = wx.StaticText(self, wx.ID_ANY, u"Enter a number", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText1.Wrap(-1)
bSizer1.Add(self.m_staticText1, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, u"11", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer1.Add(self.m_textCtrl1, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5)
self.m_button1 = wx.Button(self, wx.ID_ANY, u"Click to find Square", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer1.Add(self.m_button1, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5)
self.m_textCtrl2 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer1.Add(self.m_textCtrl2, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5)
self.SetSizer(bSizer1)
self.Layout()
self.Centre(wx.BOTH)
# Connect Events
self.m_button1.Bind(wx.EVT_BUTTON, self.findsquare)
def __del__(self):
pass
# Virtual event handlers, overide them in your derived class
def findsquare(self, event):
event.Skip()
import demo
import wx
class CalcFrame(demo.MyFrame1):
def __init__(self, parent):
demo.MyFrame1.__init__(self, parent)
def findsquare(self, event):
num = int(self.m_textCtrl1.GetValue())
self.m_textCtrl2.SetValue(str(num * num))
app = wx.App(False)
frame = CalcFrame(None)
frame.Show(True)
app.MainLoop()
示例2:Layout示例
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
###########################################################################
## Class MyFrame2
###########################################################################
class MyFrame2 ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,650 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
wSizer8 = wx.WrapSizer( wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
wSizer14 = wx.WrapSizer( wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS )
fgSizer6 = wx.FlexGridSizer( 0, 2, 0, 0 )
fgSizer6.SetFlexibleDirection( wx.BOTH )
fgSizer6.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
self.m_staticText26 = wx.StaticText( self, wx.ID_ANY, u"请选择文件路径:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText26.Wrap( -1 )
fgSizer6.Add( self.m_staticText26, 0, wx.ALL, 5 )
self.m_filePicker19 = wx.FilePickerCtrl( self, wx.ID_ANY, wx.EmptyString, u"选择文件", u"*.*", wx.DefaultPosition, wx.Size( 350,-1 ), wx.FLP_USE_TEXTCTRL )
fgSizer6.Add( self.m_filePicker19, 0, wx.ALL, 5 )
self.m_staticText27 = wx.StaticText( self, wx.ID_ANY, u"请选择浏览器路径:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText27.Wrap( -1 )
fgSizer6.Add( self.m_staticText27, 0, wx.ALL, 5 )
self.m_filePicker20 = wx.FilePickerCtrl( self, wx.ID_ANY, wx.EmptyString, u"选择浏览器", u"*.*", wx.DefaultPosition, wx.Size( 350,-1 ), wx.FLP_DEFAULT_STYLE )
fgSizer6.Add( self.m_filePicker20, 0, wx.ALL, 5 )
wSizer14.Add( fgSizer6, 1, wx.EXPAND, 5 )
bSizer7 = wx.BoxSizer( wx.VERTICAL )
m_listBox7Choices = [ u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", u"https://www.baidu.com", wx.EmptyString, wx.EmptyString ]
self.m_listBox7 = wx.ListBox( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( 500,400 ), m_listBox7Choices, 0 )
bSizer7.Add( self.m_listBox7, 0, wx.ALL|wx.EXPAND, 5 )
wSizer14.Add( bSizer7, 1, wx.EXPAND, 5 )
bSizer1.Add( wSizer14, 1, wx.EXPAND, 5 )
wSizer8 = wx.WrapSizer( wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS )
self.m_button149 = wx.Button( self, wx.ID_ANY, u"A", wx.DefaultPosition, wx.Size( -1,40 ), 0 )
wSizer8.Add( self.m_button149, 0, wx.ALL, 5 )
self.m_button150 = wx.Button( self, wx.ID_ANY, u"B", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button150.SetMinSize( wx.Size( -1,40 ) )
wSizer8.Add( self.m_button150, 0, wx.ALL, 5 )
self.m_button151 = wx.Button( self, wx.ID_ANY, u"C", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button151.SetMinSize( wx.Size( -1,40 ) )
wSizer8.Add( self.m_button151, 0, wx.ALL, 5 )
self.m_button152 = wx.Button( self, wx.ID_ANY, u"D", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button152.SetMinSize( wx.Size( -1,40 ) )
wSizer8.Add( self.m_button152, 0, wx.ALL, 5 )
self.m_button153 = wx.Button( self, wx.ID_ANY, u"E", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button153.SetMinSize( wx.Size( -1,40 ) )
wSizer8.Add( self.m_button153, 0, wx.ALL, 5 )
self.m_button154 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer8.Add( self.m_button154, 0, wx.ALL, 5 )
self.m_button155 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer8.Add( self.m_button155, 0, wx.ALL, 5 )
self.m_button156 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer8.Add( self.m_button156, 0, wx.ALL, 5 )
self.m_button157 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer8.Add( self.m_button157, 0, wx.ALL, 5 )
self.m_button158 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer8.Add( self.m_button158, 0, wx.ALL, 5 )
bSizer1.Add( wSizer8, 1, wx.EXPAND, 5 )
self.m_staticText21 = wx.StaticText( self, wx.ID_ANY, u"提示:任务保存后,必须点击保存!", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText21.Wrap( -1 )
bSizer1.Add( self.m_staticText21, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
wSizer9 = wx.WrapSizer( wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS )
self.m_button160 = wx.Button( self, wx.ID_ANY, u"清除日志", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button160.SetMinSize( wx.Size( 150,-1 ) )
wSizer9.Add( self.m_button160, 0, wx.ALL, 5 )
self.m_button161 = wx.Button( self, wx.ID_ANY, u"保存", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_button161.SetMinSize( wx.Size( 300,-1 ) )
wSizer9.Add( self.m_button161, 0, wx.ALL, 5 )
bSizer1.Add( wSizer9, 1, wx.EXPAND, 5 )
wSizer8.Add( bSizer1, 1, wx.EXPAND, 5 )
self.SetSizer( wSizer8 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass