python图形化编程wx_python【第十二篇】 图形界面编程之wxPython

GUI开发工具包

这些工具包较为突出的有: Tkinter、 PyQt 和 wxPython。

1. Tkinter

2. PyQt

3. wxPython

TKinter过于底层,PyQt过于庞大

wxPython 安装

1、 Windows 和 macOS 平台安装:

pip install -U wxPython

其中 install 是按照软件包, -U 是将指定软件包升级到最新版本。

2、 Linux 平台下使用 pip 安装有点麻烦,例如在 Ubuntu 16.04 安装,打开终端输入

如下指令:

pip install -U \

-f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-16.04 \

wxPython

3、下载 wxPython 帮助文档和案例。

https://extras.wxpython.org/wxPython4/extras

wxPython 基础

作为图形用户界面开发工具包 wxPython,主要提供了如下 GUI 内容:

1. 窗口。

2. 控件。

3. 事件处理。

4. 布局管理。

wxPython 类层次结构

795445-20200531111724870-438025064.png

795445-20200531112343377-990930729.png

第一个gui程序

795445-20200531110503409-114903234.png

语法一

# coding=utf-8

import wx

# 创建应用程序对象

app = wx.App()

# 创建窗口对象

frm = wx.Frame(None, title="第一个GUI程序!", size=(400, 300), pos=(100, 100))

# Frame类的源码 def __init__(self, parent=None, id=None, title=None, pos=None, size=None, style=None, name=None):

frm.Show() # 显示窗口

app.MainLoop() # 进入主事件循环

语法二

import wx

# 自定义窗口类MyFrame

class MyFrame(wx.Frame):

def __init__(self):

super().__init__(parent=None, title="第一个GUI程序!", size=(400, 300), pos=(100, 100))

# TODO

class App(wx.App):

def OnInit(self):

# 创建窗口对象

frame = MyFrame()

frame.Show()

return True

def OnExit(self):

print('应用程序退出')

return 0

if __name__ == '__main__':

app = App()

app.MainLoop() # 进入主事件循环

界面构建层次

795445-20200531113758060-1255122476.png

795445-20200531113822545-183332398.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title="第一个GUI程序!", size=(400, 300))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)

statictext= wx.StaticText(parent=panel, label='Hello World!', pos=(10, 10))classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

demo01

795445-20200531113939676-1322072289.png

事件处理

简介

在事件处理的过程中涉及 4 个要素:

1. 事件。

2. 事件类型。

3. 事件源。

4. 事件处理者。

绑定是通过事件处理类的 Bind()方法实现, Bind()方法语法如下:

Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)

自定义事件

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='一对一事件处理', size=(300, 180))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)

self.statictext= wx.StaticText(parent=panel, pos=(110, 20))

b= wx.Button(parent=panel, label='OK', pos=(100, 50))

self.Bind(wx.EVT_BUTTON, self.on_click, b)defon_click(self, event):print(type(event)) #

self.statictext.SetLabelText('Hello, world.')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

一对一

795445-20200531115040322-1852299810.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='一对一事件处理', size=(300, 180))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)

self.statictext= wx.StaticText(parent=panel, pos=(110, 15))

b1= wx.Button(parent=panel, id=10, label='Button1', pos=(100, 45))

b2= wx.Button(parent=panel, id=12, label='Button2', pos=(100, 85))#self.Bind(wx.EVT_BUTTON, self.on_click, b1)

#self.Bind(wx.EVT_BUTTON, self.on_click, id=11)

self.Bind(wx.EVT_BUTTON, self.on_click, id=10, id2=20) #id在[10,20]的触发self.on_click方法

defon_click(self, event):

event_id=event.GetId()print(event_id)if event_id == 10:

self.statictext.SetLabelText('Button1单击')else:

self.statictext.SetLabelText('Button2单击')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

一对多

795445-20200531115859383-1093989462.png

内置事件

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title="鼠标事件处理", size=(400, 300))

self.Centre()#设置窗口居中

self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down)

self.Bind(wx.EVT_LEFT_UP, self.on_left_up)

self.Bind(wx.EVT_MOTION, self.on_mouse_move)defon_left_down(self, evt):print('鼠标按下')defon_left_up(self, evt):print('鼠标释放')defon_mouse_move(self, event):if event.Dragging() andevent.LeftIsDown():

pos=event.GetPosition()print(pos)classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

鼠标事件

布局管理

使用绝对布局会有如下问题:

1. 子窗口(或控件)位置和大小不会随着父窗口的变化而变化。

2. 在不同平台上显示效果可能差别很大。

3. 在不同分辨率下显示效果可能差别很大。

4. 字体的变化也会对显示效果有影响。

5. 动态添加或删除子窗口(或控件)界面布局需要重新设计

布局分类

795445-20200531120804039-1051514415.png

Box布局

简介

795445-20200531124557934-1499861434.png

ContractedBlock.gif

ExpandedBlockStart.gif

def Add(self, *__args): #real signature unknown; restored from __doc__ with multiple overloads

"""Add(window, flags) -> SizerItem

Add(window, proportion=0, flag=0, border=0, userData=None) -> SizerItem

Add(sizer, flags) -> SizerItem

Add(sizer, proportion=0, flag=0, border=0, userData=None) -> SizerItem

Add(width, height, proportion=0, flag=0, border=0, userData=None) -> SizerItem

Add(width, height, flags) -> SizerItem

Add(item) -> SizerItem

Add(size, proportion=0, flag=0, border=0, /Transfer/=None) -> SizerItem

Add(size, flags) -> SizerItem

Appends a child to the sizer."""

return SizerItem

Add方法分类

flag参数

795445-20200531124922054-936325973.png

795445-20200531124939830-1430099175.png

795445-20200531125008687-1221399264.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='Box布局', size=(300, 120))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)#创建垂直方向Box布局管理器对象

vbox =wx.BoxSizer(wx.VERTICAL)

self.statictext= wx.StaticText(parent=panel, label='Button1单击')#添加静态文本到Box布局管理器

vbox.Add(self.statictext, proportion=2, flag=wx.FIXED_MINSIZE | wx.TOP | wx.CENTER, border=10)

b1= wx.Button(parent=panel, id=10, label='Button1')

b2= wx.Button(parent=panel, id=11, label='Button2')

self.Bind(wx.EVT_BUTTON, self.on_click, id=10, id2=20)#创建水平方向的Box布局管理器对象

hbox =wx.BoxSizer(wx.HORIZONTAL)#添加b1到水平Box布局管理

hbox.Add(b1, 0, wx.EXPAND | wx.BOTTOM, 5)#添加b2到水平Box布局管理

hbox.Add(b2, 0, wx.EXPAND | wx.BOTTOM, 5)#将水平Box布局管理器到垂直Box布局管理器

vbox.Add(hbox, proportion=1, flag=wx.CENTER)

panel.SetSizer(vbox)defon_click(self, event):

event_id=event.GetId()print(event_id)if event_id == 10:

self.statictext.SetLabelText('Button1单击')else:

self.statictext.SetLabelText('Button2单击')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

Box布局器demo

解析:1.statictext添加到vbox,2.button添加到hbox, 3.hbox添加到vbox. 4.vbox添加到panel

795445-20200531124032931-1706867375.png

StaticBox布局

简介

795445-20200531125148571-1680325706.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='StaticBox布局', size=(300, 120))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)#创建垂直方向的Box布局管理器对象

vbox =wx.BoxSizer(wx.VERTICAL)

self.statictext= wx.StaticText(parent=panel, label='Button1单击')#添加静态文本到Box布局管理器

vbox.Add(self.statictext, proportion=2, flag=wx.FIXED_MINSIZE | wx.TOP | wx.CENTER, border=10)

b1= wx.Button(parent=panel, id=10, label='Button1')

b2= wx.Button(parent=panel, id=11, label='Button2')

self.Bind(wx.EVT_BUTTON, self.on_click, id=10, id2=20)#创建静态框对象

sb = wx.StaticBox(panel, label="按钮框")#创建水平方向的StaticBox布局管理器

hsbox =wx.StaticBoxSizer(sb, wx.HORIZONTAL)#添加b1到水平StaticBox布局管理

hsbox.Add(b1, 0, wx.EXPAND | wx.BOTTOM, 5)#添加b2到水平StaticBox布局管理

hsbox.Add(b2, 0, wx.EXPAND | wx.BOTTOM, 5)#添加hbox到vbox

vbox.Add(hsbox, proportion=1, flag=wx.CENTER)

panel.SetSizer(vbox)defon_click(self, event):

event_id=event.GetId()print(event_id)if event_id == 10:

self.statictext.SetLabelText('Button1单击')else:

self.statictext.SetLabelText('Button2单击')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

StaticBox布局demo

解析: 把Box布中,hbox换成staticbox即可

795445-20200531130452192-1157515836.png

Grid 布局

简介

795445-20200531130917206-2080225190.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='Grid布局', size=(300, 300))

self.Centre()#设置窗口居中

panel =wx.Panel(self)

btn1= wx.Button(panel, label='1')

btn2= wx.Button(panel, label='2')

btn3= wx.Button(panel, label='3')

btn4= wx.Button(panel, label='4')

btn5= wx.Button(panel, label='5')

btn6= wx.Button(panel, label='6')

btn7= wx.Button(panel, label='7')

btn8= wx.Button(panel, label='8')

btn9= wx.Button(panel, label='9')

grid= wx.GridSizer(cols=3, rows=3, vgap=0, hgap=0)#grid.AddMany([

#(btn1, 0, wx.EXPAND),

#(btn2, 0, wx.EXPAND),

#(btn3, 0, wx.EXPAND),

#(btn4, 0, wx.EXPAND),

#(btn5, 0, wx.EXPAND),

#(btn6, 0, wx.EXPAND),

#(btn7, 0, wx.EXPAND),

#(btn8, 0, wx.EXPAND),

#(btn9, 0, wx.EXPAND)

#])

grid.Add(btn1, 0, wx.EXPAND)

grid.Add(btn2, 0, wx.EXPAND)

grid.Add(btn3, 0, wx.EXPAND)

grid.Add(btn4, 0, wx.EXPAND)

grid.Add(btn5, 0, wx.EXPAND)

grid.Add(btn6, 0, wx.EXPAND)

grid.Add(btn7, 0, wx.EXPAND)

grid.Add(btn8, 0, wx.EXPAND)

grid.Add(btn9, 0, wx.EXPAND)

panel.SetSizer(grid)classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

Grid布局demo

795445-20200531131222158-73183463.png

FlexGrid布局

795445-20200531133555867-1155045857.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='FlexGrid布局', size=(400, 200))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)

fgs= wx.FlexGridSizer(3, 2, 10, 10)

title= wx.StaticText(panel, label="标题:")

author= wx.StaticText(panel, label="作者名:")

review= wx.StaticText(panel, label="内容:")

tc1=wx.TextCtrl(panel)

tc2=wx.TextCtrl(panel)

tc3= wx.TextCtrl(panel, style=wx.TE_MULTILINE)

fgs.AddMany([title, (tc1,1, wx.EXPAND),

author, (tc2,1, wx.EXPAND),

review, (tc3,1, wx.EXPAND)])

fgs.AddGrowableRow(0,1)

fgs.AddGrowableRow(1, 1)

fgs.AddGrowableRow(2, 3)

fgs.AddGrowableCol(0,1)

fgs.AddGrowableCol(1, 2)

hbox= wx.BoxSizer(wx.HORIZONTAL) #hbox用于设置边框

hbox.Add(fgs, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)

panel.SetSizer(hbox)classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

FlexGrid布局demo

795445-20200531134511923-1606720788.png

控件

静态文本和按钮

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='静态文本和按钮', size=(300, 200))

self.Centre()#设置窗口居中

panel = wx.Panel(parent=self)#创建垂直方向的Box布局管理器

vbox =wx.BoxSizer(wx.VERTICAL)

self.statictext= wx.StaticText(parent=panel, label='StaticText1', style=wx.ALIGN_CENTRE_HORIZONTAL)

b1= wx.Button(parent=panel, label='OK')

self.Bind(wx.EVT_BUTTON, self.on_click, b1)

b2= wx.ToggleButton(panel, -1, 'ToggleButton')

self.Bind(wx.EVT_BUTTON, self.on_click, b2)

bmp= wx.Bitmap('icon/1.png', wx.BITMAP_TYPE_PNG)

b3= wx.BitmapButton(panel, -1, bmp)

self.Bind(wx.EVT_BUTTON, self.on_click, b3)#添加静态文本和按钮到Box布局管理器

vbox.Add(100, 10, proportion=1, flag=wx.CENTER | wx.FIXED_MINSIZE) #添加空白空间

vbox.Add(self.statictext, proportion=1, flag=wx.CENTER |wx.FIXED_MINSIZE)

vbox.Add(b1, proportion=1, flag=wx.CENTER |wx.EXPAND)

vbox.Add(b2, proportion=1, flag=wx.CENTER |wx.EXPAND)

vbox.Add(b3, proportion=1, flag=wx.CENTER |wx.EXPAND)

panel.SetSizer(vbox)defon_click(self, event):

self.statictext.SetLabelText('Hello, world.')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

文本输入控件

795445-20200531142255710-368139278.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='文本框', size=(400, 200))

self.Centre()#设置窗口居中

panel =wx.Panel(self)

hbox=wx.BoxSizer(wx.HORIZONTAL)

fgs= wx.FlexGridSizer(3, 2, 10, 10)

userid= wx.StaticText(panel, label="用户ID:")

pwd= wx.StaticText(panel, label="密码:")

content= wx.StaticText(panel, label="多行文本:")

tc1=wx.TextCtrl(panel)

tc2= wx.TextCtrl(panel, style=wx.TE_PASSWORD)

tc3= wx.TextCtrl(panel, style=wx.TE_MULTILINE)#设置tc1初始值

tc1.SetValue('tony')#获取tc1值

print('读取用户ID:{0}'.format(tc1.GetValue()))

fgs.AddMany([userid, (tc1,1, wx.EXPAND),

pwd, (tc2,1, wx.EXPAND),

content, (tc3,1, wx.EXPAND)])

fgs.AddGrowableRow(0,1)

fgs.AddGrowableRow(1, 1)

fgs.AddGrowableRow(2, 3)

fgs.AddGrowableCol(0,1)

fgs.AddGrowableCol(1, 2)

hbox.Add(fgs, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)

panel.SetSizer(hbox)classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

795445-20200531143147160-33291286.png

复选框和单选按钮

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='复选框和单选按钮', size=(400, 130))

self.Centre()#设置窗口居中

panel =wx.Panel(self)

hbox1=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择你喜欢的编程语言:')

cb1= wx.CheckBox(panel, 1, 'Python')

cb2= wx.CheckBox(panel, 2, 'Java')

cb2.SetValue(True)

cb3= wx.CheckBox(panel, 3, 'C++')

self.Bind(wx.EVT_CHECKBOX, self.on_checkbox_click, id=1, id2=3)

hbox1.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox1.Add(cb1,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox1.Add(cb2,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox1.Add(cb3,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox2=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择性别:')

radio1= wx.RadioButton(panel, 4, '男', style=wx.RB_GROUP)

radio2= wx.RadioButton(panel, 5, '女')

self.Bind(wx.EVT_RADIOBUTTON, self.on_radio1_click, id=4, id2=5)

hbox2.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox2.Add(radio1,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox2.Add(radio2,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox3=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择你最喜欢吃的水果:')

radio3= wx.RadioButton(panel, 6, '苹果', style=wx.RB_GROUP)

radio4= wx.RadioButton(panel, 7, '橘子')

radio5= wx.RadioButton(panel, 8, '香蕉')

self.Bind(wx.EVT_RADIOBUTTON, self.on_radio2_click, id=6, id2=8)

hbox3.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox3.Add(radio3,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox3.Add(radio4,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox3.Add(radio5,1, flag=wx.ALL |wx.FIXED_MINSIZE)

vbox=wx.BoxSizer(wx.VERTICAL)

vbox.Add(hbox1,1, flag=wx.ALL | wx.EXPAND, border=5)

vbox.Add(hbox2,1, flag=wx.ALL | wx.EXPAND, border=5)

vbox.Add(hbox3,1, flag=wx.ALL | wx.EXPAND, border=5)

panel.SetSizer(vbox)defon_checkbox_click(self, event):

cb=event.GetEventObject()print('选择 {0},状态{1}'.format(cb.GetLabel(), event.IsChecked()))defon_radio1_click(self, event):

rb=event.GetEventObject()print('第一组 {0} 被选中'.format(rb.GetLabel()))defon_radio2_click(self, event):

rb=event.GetEventObject()print('第二组 {0} 被选中'.format(rb.GetLabel()))classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

795445-20200531151552272-400683175.png

下拉列表

795445-20200531151655060-2106392328.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='下拉列表', size=(400, 130))

self.Centre()#设置窗口居中

panel =wx.Panel(self)

hbox1=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择你喜欢的编程语言:')

list1= ['Python', 'C++', 'Java']

ch1= wx.ComboBox(panel, -1, value='C', choices=list1, style=wx.CB_SORT) #style=wx.CB_SORT 排序

self.Bind(wx.EVT_COMBOBOX, self.on_combobox, ch1)

hbox1.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox1.Add(ch1,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox2=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择性别:')

list2= ['男', '女']

ch2= wx.Choice(panel, -1, choices=list2)

self.Bind(wx.EVT_CHOICE, self.on_choice, ch2)

hbox2.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox2.Add(ch2,1, flag=wx.ALL |wx.FIXED_MINSIZE)

vbox=wx.BoxSizer(wx.VERTICAL)

vbox.Add(hbox1,1, flag=wx.ALL | wx.EXPAND, border=5)

vbox.Add(hbox2,1, flag=wx.ALL | wx.EXPAND, border=5)

panel.SetSizer(vbox)defon_combobox(self, event):print('选择 {0}'.format(event.GetString()))defon_choice(self, event):print('选择 {0}'.format(event.GetString()))classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

列表

795445-20200531152415947-1447755482.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='下拉列表', size=(350, 180))

self.Centre()#设置窗口居中

panel =wx.Panel(self)

hbox1=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择你喜欢的编程语言:')

list1= ['Python', 'C++', 'Java']

lb1= wx.ListBox(panel, -1, choices=list1, style=wx.LB_SINGLE)

self.Bind(wx.EVT_LISTBOX, self.on_listbox1, lb1)

hbox1.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox1.Add(lb1,1, flag=wx.ALL |wx.FIXED_MINSIZE)

hbox2=wx.BoxSizer(wx.HORIZONTAL)

statictext= wx.StaticText(panel, label='选择你喜欢吃的水果:')

list2= ['苹果', '橘子', '香蕉']

lb2= wx.ListBox(panel, -1, choices=list2, style=wx.LB_EXTENDED)

self.Bind(wx.EVT_LISTBOX, self.on_listbox2, lb2)

hbox2.Add(statictext,1, flag=wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE, border=5)

hbox2.Add(lb2,1, flag=wx.ALL |wx.FIXED_MINSIZE)

vbox=wx.BoxSizer(wx.VERTICAL)

vbox.Add(hbox1,1, flag=wx.ALL | wx.EXPAND, border=5)

vbox.Add(hbox2,1, flag=wx.ALL | wx.EXPAND, border=5)

panel.SetSizer(vbox)defon_listbox1(self, event):

listbox=event.GetEventObject()print('选择 {0}'.format(listbox.GetSelection()))defon_listbox2(self, event):

listbox=event.GetEventObject()print('选择 {0}'.format(listbox.GetSelections()))classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

静态图片控件

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='静态图片控件', size=(300, 300))

self.bmps= [wx.Bitmap('images/bird5.gif', wx.BITMAP_TYPE_GIF),

wx.Bitmap('images/bird4.gif', wx.BITMAP_TYPE_GIF),

wx.Bitmap('images/bird3.gif', wx.BITMAP_TYPE_GIF)]

self.Centre()#设置窗口居中

self.panel = wx.Panel(parent=self)#创建垂直方向的Box布局管理器

vbox =wx.BoxSizer(wx.VERTICAL)

b1= wx.Button(parent=self.panel, id=1, label='Button1')

b2= wx.Button(self.panel, id=2, label='Button2')

self.Bind(wx.EVT_BUTTON, self.on_click, id=1, id2=2)

self.image= wx.StaticBitmap(self.panel, -1, self.bmps[0])#添加标控件到Box布局管理器

vbox.Add(b1, proportion=1, flag=wx.CENTER |wx.EXPAND)

vbox.Add(b2, proportion=1, flag=wx.CENTER |wx.EXPAND)

vbox.Add(self.image, proportion=3, flag=wx.CENTER)

self.panel.SetSizer(vbox)defon_click(self, event):

event_id=event.GetId()if event_id == 1:

self.image.SetBitmap(self.bmps[1])else:

self.image.SetBitmap(self.bmps[2])

self.panel.Layout()classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

高级窗口

分隔窗口

795445-20200531153940509-1332537373.png

wx.SplitterWindow 中一个常用的方法有:

795445-20200531154050546-1401876943.png

ContractedBlock.gif

ExpandedBlockStart.gif

importwx#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='分隔窗口', size=(350, 180))

self.Centre()#设置窗口居中

splitter= wx.SplitterWindow(self, -1)

leftpanel=wx.Panel(splitter)

rightpanel=wx.Panel(splitter)

splitter.SplitVertically(leftpanel, rightpanel,100)

splitter.SetMinimumPaneSize(80)

list2= ['苹果', '橘子', '香蕉']

lb2= wx.ListBox(leftpanel, -1, choices=list2, style=wx.LB_SINGLE)

self.Bind(wx.EVT_LISTBOX, self.on_listbox, lb2)

vbox1=wx.BoxSizer(wx.VERTICAL)

vbox1.Add(lb2,1, flag=wx.ALL | wx.EXPAND, border=5)

leftpanel.SetSizer(vbox1)

vbox2=wx.BoxSizer(wx.VERTICAL)

self.content= wx.StaticText(rightpanel, label='右侧面板')

vbox2.Add(self.content,1, flag=wx.ALL | wx.EXPAND, border=5)

rightpanel.SetSizer(vbox2)defon_listbox(self, event):

s= '选择 {0}'.format(event.GetString())

self.content.SetLabel(s)classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

795445-20200531155102273-1790564033.png

使用树

795445-20200531155328394-19916158.png

使用网格

795445-20200531155927693-1211065032.png

ContractedBlock.gif

ExpandedBlockStart.gif

#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='网格控件', size=(550, 500))

self.Centre()#设置窗口居中

self.grid =self.CreateGrid(self)

self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)defOnLabelLeftClick(self, event):print("RowIdx:{0}".format(event.GetRow()))print("ColIdx:{0}".format(event.GetCol()))print(data[event.GetRow()])

event.Skip()defCreateGrid(self, parent):'表格初始化'grid=wx.grid.Grid(parent)

grid.CreateGrid(len(data), len(data[0]))for row inrange(len(data)):for col inrange(len(data[row])):

grid.SetColLabelValue(col, column_names[col])

grid.SetCellValue(row, col, data[row][col])#设置行和列自定调整

grid.AutoSize()returngridclassApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

语法一

ContractedBlock.gif

ExpandedBlockStart.gif

classMyGridTable(wx.grid.GridTableBase):def __init__(self):

super().__init__()

self.colLabels=column_namesdefGetNumberRows(self):returnlen(data)defGetNumberCols(self):returnlen(data[0])defGetValue(self, row, col):returndata[row][col]defGetColLabelValue(self, col):returnself.colLabels[col]#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='网格控件', size=(550, 500))

self.Centre()#设置窗口居中

self.grid =self.CreateGrid(self)

self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)defOnLabelLeftClick(self, event):print("RowIdx:{0}".format(event.GetRow()))print("ColIdx:{0}".format(event.GetCol()))print(data[event.GetRow()])

event.Skip()defCreateGrid(self, parent):

grid=wx.grid.Grid(parent)

tablebase=MyGridTable()

grid.SetTable(tablebase, True)#设置行和列自定调整

grid.AutoSize()returngridclassApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

语法二

795445-20200531160857451-1576833713.png

菜单栏

ContractedBlock.gif

ExpandedBlockStart.gif

importwximportwx.grid#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='使用菜单', size=(550, 500))

self.Centre()#设置窗口居中

self.text= wx.TextCtrl(self, -1, style=wx.EXPAND |wx.TE_MULTILINE)

vbox=wx.BoxSizer(wx.VERTICAL)

vbox.Add(self.text, proportion=1, flag=wx.EXPAND | wx.ALL, border=1)

self.SetSizer(vbox)

menubar=wx.MenuBar()

file_menu=wx.Menu()

new_item= wx.MenuItem(file_menu, wx.ID_NEW, text="新建", kind=wx.ITEM_NORMAL)

self.Bind(wx.EVT_MENU, self.on_newitem_click, id=wx.ID_NEW)

file_menu.Append(new_item)

file_menu.AppendSeparator()

edit_menu=wx.Menu()

copy_item= wx.MenuItem(edit_menu, 100, text="复制", kind=wx.ITEM_NORMAL)

edit_menu.Append(copy_item)

cut_item= wx.MenuItem(edit_menu, 101, text="剪切", kind=wx.ITEM_NORMAL)

edit_menu.Append(cut_item)

paste_item= wx.MenuItem(edit_menu, 102, text="粘贴", kind=wx.ITEM_NORMAL)

edit_menu.Append(paste_item)

self.Bind(wx.EVT_MENU, self.on_editmenu_click, id=100, id2=102)

file_menu.Append(wx.ID_ANY,"编辑", edit_menu)

menubar.Append(file_menu,'文件')

self.SetMenuBar(menubar)defon_newitem_click(self, event):

self.text.SetLabel('单击【新建】菜单')defon_editmenu_click(self, event):

event_id=event.GetId()if event_id == 100:

self.text.SetLabel('单击【复制】菜单')elif event_id == 101:

self.text.SetLabel('单击【剪切】菜单')else:

self.text.SetLabel('单击【粘贴】菜单')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

795445-20200531164817286-1710393864.png

工具栏

ContractedBlock.gif

ExpandedBlockStart.gif

importwximportwx.grid#自定义窗口类MyFrame

classMyFrame(wx.Frame):def __init__(self):

super().__init__(parent=None, title='使用工具栏', size=(550, 500))

self.Centre()#设置窗口居中

self.Show(True)

self.text= wx.TextCtrl(self, -1, style=wx.EXPAND |wx.TE_MULTILINE)

vbox=wx.BoxSizer(wx.VERTICAL)

vbox.Add(self.text, proportion=1, flag=wx.EXPAND | wx.ALL, border=1)

self.SetSizer(vbox)

menubar=wx.MenuBar()

file_menu=wx.Menu()

new_item= wx.MenuItem(file_menu, wx.ID_NEW, text="新建", kind=wx.ITEM_NORMAL)

file_menu.Append(new_item)

file_menu.AppendSeparator()

edit_menu=wx.Menu()

copy_item= wx.MenuItem(edit_menu, 100, text="复制", kind=wx.ITEM_NORMAL)

edit_menu.Append(copy_item)

cut_item= wx.MenuItem(edit_menu, 101, text="剪切", kind=wx.ITEM_NORMAL)

edit_menu.Append(cut_item)

paste_item= wx.MenuItem(edit_menu, 102, text="粘贴", kind=wx.ITEM_NORMAL)

edit_menu.Append(paste_item)

file_menu.Append(wx.ID_ANY,"编辑", edit_menu)

menubar.Append(file_menu,'文件')

self.SetMenuBar(menubar)#工具栏

#创建工具栏对象

tb =wx.ToolBar(self, wx.ID_ANY)

self.ToolBar=tb

tsize= (24, 24)

new_bmp=wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, tsize)

open_bmp=wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, tsize)

copy_bmp=wx.ArtProvider.GetBitmap(wx.ART_COPY, wx.ART_TOOLBAR, tsize)

paste_bmp=wx.ArtProvider.GetBitmap(wx.ART_PASTE, wx.ART_TOOLBAR, tsize)

tb.AddTool(10, "New", new_bmp, kind=wx.ITEM_NORMAL, shortHelp="New")

tb.AddTool(20, "Open", open_bmp, kind=wx.ITEM_NORMAL, shortHelp="Open")

tb.AddSeparator()

tb.AddTool(30, "Copy", copy_bmp, kind=wx.ITEM_NORMAL, shortHelp="Copy")

tb.AddTool(40, "Paste", paste_bmp, kind=wx.ITEM_NORMAL, shortHelp="Paste")

tb.AddSeparator()

tb.AddTool(201, "back", wx.Bitmap("menu_icon/back.png"), kind=wx.ITEM_NORMAL, shortHelp="Back")

tb.AddTool(202, "forward", wx.Bitmap("menu_icon/forward.png"), kind=wx.ITEM_NORMAL, shortHelp="Forward")

self.Bind(wx.EVT_MENU, self.on_click, id=201, id2=202)

tb.AddSeparator()

tb.Realize()defon_click(self, event):

event_id=event.GetId()if event_id == 201:

self.text.SetLabel('单击【Back】按钮')else:

self.text.SetLabel('单击【Forward】按钮')classApp(wx.App):defOnInit(self):#创建窗口对象

frame =MyFrame()

frame.Show()returnTrueif __name__ == '__main__':

app=App()

app.MainLoop()#进入主事件循环

View Code

795445-20200531170039823-1608934779.png

GUI开发IDE

wxFormBuilder

建议:

1.wxFormBuilder设计界面

2.后端逻辑代码建议用另一个文件继承UI代码的MyFrame类

GUI设计

795445-20200531182805853-1941786315.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值