Python GUI: wxpython wxFormBuilder

一:简介

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

  1. 设置代码生成的语言,这里选择Python
    在这里插入图片描述
  2. 选择Designer, 然后选择Forms -> Frame 添加主窗体
    在这里插入图片描述
  3. 添加布局 Layout -> wxBoxSizer
    在这里插入图片描述
  4. 添加基本组件wxStaticText、wxTextCtrl、wxButton
    在这里插入图片描述
  5. 分别设置wxStaticText、wxTextCtrl、wxButton居中
    在这里插入图片描述
  6. 分别设置wxTextCtrl、wxButton拉伸扩充
    在这里插入图片描述
  7. 为按钮wxButton添加事件
    在这里插入图片描述
  8. 按F8生成代码
  9. 将Python中的代码拷贝出来,放到demo.py文件中
  10. 使用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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值