如何使用python图形化界面wxPython
GUI库主要有三类:tkinter,wxPython和PyQt5,下面主要是针对wxPython的使用说明。
下面的操作均在win10 + pycharm上进行
wxPython的安装:
pip install wxPython
同时还安装了两个依赖包:six和pillow
简单使用:
变量app就是我们的程序。其次一定要注意大小写,尤其是Show的S
import wx
app = wx.App()
frame = wx.Frame(None, title = "Hello,world!")
frame.Show()
app.MainLoop()
运行后的界面如下所示:

进一步,我们可以添加一个按钮:
通过定义一个MyFrame类来实现,这个类继承自wx.Frame类。import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.button = wx.Button(self, label = "hello") app = wx.App()
frame = MyFrame(None, title = "Hello,world!")
frame.Show()
app.MainLoop()
运行后的界面如下所示:

但有一个问题,这个按钮太大了,布满了整个界面,所以我们可以进一步设置按钮的大小和布局:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.btn1 = wx.Button(self, label="hello1", pos=(10, 50), size=(100, 50))
self.btn2 = wx.Button(self, label="hello2", pos=(120, 50), size=(100, 50)) app = wx.App()
frame = MyFrame(None, title="Hello,world!")
frame.Show()
app.MainLoop()
其中,pos是位置参数,第一个表示与左边界的为距离,第二个表示与上边界的距离;size是按钮的大小参数,第一个表示宽度,第二个表示高度。
有一点需要注意,这个按钮是绝对布局下的按钮,也就是说无论你把窗口变多大多小,按钮都不会随着窗口的大小变化
我们虽然有按钮了,此时还需要加入焦点:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
panel = wx.Panel(self)
self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50)) app = wx.App()
frame = MyFrame(None, title="Hello,world!")
frame.Show()
app.MainLoop()
运行后的界面如下所示:

我们通过加入了wx.Panel从而可以使用鼠标点击对应按钮,或者使用Tab键来移动到下一个按钮。现在点击也可以了,但是没有反应还不行,所以我们将按钮和对应的事件进行绑定,也就是响应按钮事件:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
panel = wx.Panel(self)
self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50))
self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
def OnButton1(self, event):
print("Hello,world!")
def OnButton2(self, event):
print("Hello,world!Hello,world!") app = wx.App()
frame = MyFrame(None, title="Hello,world!")
frame.Show()
app.MainLoop()
运行后的界面如下所示:

下面介绍一些控件的使用:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
panel = wx.Panel(self) self.static_text = wx.StaticText(panel, label="静态文本", pos=(10, 10)) self.text_1 = wx.TextCtrl(panel, value="文本框", pos=(10, 40))
self.text_2 = wx.TextCtrl(panel, value="密码框", style=wx.TE_PASSWORD, pos=(10, 70))
self.text_3 = wx.TextCtrl(panel, value="只读文本框", style=wx.TE_READONLY, pos=(10, 100))
self.text_4 = wx.TextCtrl(panel, value="多行\n文本框", style=wx.TE_MULTILINE, pos=(10, 130)) self.btn1 = wx.Button(panel, label="修改窗口标题", pos=(200, 10))
self.btn2 = wx.Button(panel, label="修改静态文本内容", pos=(200, 40))
self.btn3 = wx.Button(panel, label="修改文本框内容", pos=(200, 70))
self.btn4 = wx.Button(panel, label="修改只读文本框内容", pos=(200, 100)) self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
self.Bind(wx.EVT_BUTTON, self.OnButton3, self.btn3)
self.Bind(wx.EVT_BUTTON, self.OnText1, self.btn4) def OnButton1(self, event):
self.Title += 'Hello'
def OnButton2(self, event):
self.static_text.Label += 'Hi'
def OnButton3(self, event):
self.text_1.Value = 'Good'
self.text_2.Value = 'GOOD'
self.text_3.Value = 'Good\nbetter\nbest'
self.text_4.Value = 'GOOD\nBetter\nBest'
def OnText1(self, event):
self.text_3.Value = self.text_1.Value app = wx.App()
frame = MyFrame(None, title="Multi_Text", size=(500, 300))
frame.Show()
app.MainLoop()
运行后的界面如下所示:

接下来我们看一下加入图片控件的使用:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.bitmap = wx.StaticBitmap(self, pos=(10, 10))
self.btn1 = wx.Button(self, label="001", pos=(300, 10))
self.btn2 = wx.Button(self, label='002', pos=(300, 40))
self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2) def OnButton1(self, event):
self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
def OnButton2(self, event):
self.bitmap.Bitmap = wx.Bitmap('001.jpg') app = wx.App()
frame = MyFrame(None, title="Images", size=(500, 290))
frame.Show()
app.MainLoop()
运行后的界面如下所示:

接下来我们解决相对布局的问题,首先可以使用BoxSizer来使缩小窗口时不会遮挡按钮:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.bitmap = wx.StaticBitmap(self, bitmap=wx.Bitmap('001.jpg'))
self.btn1 = wx.Button(self, label="001")
self.btn2 = wx.Button(self, label='002')
self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
sizer.Add(self.btn1)
sizer.Add(self.btn2)
sizer.Add(self.bitmap)
self.SetSizerAndFit(sizer) def OnButton1(self, event):
self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
def OnButton2(self, event):
self.bitmap.Bitmap = wx.Bitmap('001.jpg') app = wx.App()
frame = MyFrame(None, title="Images", size=(500, 290))
frame.Show()
app.MainLoop()
运行后的界面如下所示:

当拉动窗口时,按钮将一直保持相同比例跟随其变化:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.btn1 = wx.Button(self, label="button1")
self.btn2 = wx.Button(self, label='button2')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.btn1, 1)
sizer.Add(self.btn2, 3)
self.SetSizerAndFit(sizer) app = wx.App()
frame = MyFrame(None, title="vertical")
frame.Show()
app.MainLoop()
运行后的界面如下所示:

当然,也可以添加位置信息:
sizer.Add(self.btn1, 1, wx.ALIGN_LEFT)
sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT)
sizer.Add(self.btn2, 3, wx.EXPAND)
也可以加边框距离:
sizer.Add(self.btn1, 1, wx.ALIGN_LEFT|wx.ALL, 10)
sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT|wx.LEFT|wx.RIGHT, 300)
sizer.Add(self.btn2, 3, wx.EXPAND)
也可以Add一个块来进行占位:
sizer.Add((50, 60))
还可以设置比例:
sizer.Add(self.btn1, 1, wx.ALL, 30)
sizer.Add(self.btn3, 1, wx.ALL, 30)
sizer.Add(self.btn2, 1, wx.ALL, 30)
sizer.Add((50, 60), 3)
运行后的界面如下所示:

最后来看一个嵌套布局:
import wx class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
self.btn1 = wx.Button(self, label="button1")
self.btn2 = wx.Button(self, label='button2')
self.btn3 = wx.Button(self, label='button3')
self.btn4 = wx.Button(self, label="button4")
self.btn5 = wx.Button(self, label="button5")
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(self.btn1, 0, wx.ALL, 5)
hsizer1.Add(self.btn2, 0, wx.ALL, 5)
hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
hsizer2.Add(self.btn3, 1, wx.ALL, 5)
hsizer2.Add(self.btn4, 1, wx.ALL, 5)
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT)
vsizer1.Add(hsizer2, 0, wx.EXPAND)
vsizer1.Add(self.btn5, 1, wx.EXPAND)
self.SetSizerAndFit(vsizer1) app = wx.App()
frame = MyFrame(None, title="嵌套BoxSizer")
frame.Show()
app.MainLoop()
然后来看运行效果:

如何使用python图形化界面wxPython的更多相关文章
- PySide——Python图形化界面
PySide——Python图形化界面 PySide——Python图形化界面入门教程(四) PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your ...
- PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...
- PySide——Python图形化界面入门教程(六)
PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...
- PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...
- PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
- PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...
- PySide——Python图形化界面入门教程(一)
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-w ...
- python+pycharm+PyQt5 图形化界面安装教程
python图形化界面安装教程 配置环境变量 主目录 pip所在目录,及script目录 更新pip(可选) python -m pip install --upgrade pip ps:更新出错一般 ...
- Git各大平台(win/Linux/Mac)图形化界面客户端大汇总
摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~ 一.TortoiseGit - The coolest Interface to Git V ...
随机推荐
- (四)mybatis缓存、事务、插件的基本知识
mybatis缓存.事务.插件的基础 一.缓存 (一)一级缓存与二级缓存 一级缓存 为了获得更好的性能,最重要的就是一级缓存.每个session对象维持一个一级缓存,session对象创建时缓存创建, ...
- mybatis参数映射
转载地址:http://iyiguo.net/blog/2012/09/27/mybatis-param-mapping-rules/ 规则 非注解参数 当参数未使用@Param注解时,可以通过以下方 ...
- python 通过socket实现ssh功能
功能:实现从客户端向服务端发送cmd指令,服务端将结果返回给客户端的功能. #coding:utf-8 '''服务端''' import socket,os server=socket.socket( ...
- Numpy入门(一):Numpy的安装和创建
在数据分析和机器学习中,大量的使用科学计算,Numpy提供了大型矩阵计算的方式,而这些是python标准库中所缺少的.Numpy也是许多优秀的第三方库的基础,依赖于Numpy的库非常多,后续会慢慢的进 ...
- 微软亚洲研究院研究员获选IEEE Fellow 和ACM Distinguished Member
年末将至,微软亚洲研究院喜讯连连.近日,IEEE(国际电气电子工程师学会)和ACM(美国计算机协会)先后公布了2017年度的院士名单(IEEE Fellow)和2016年度杰出会员名单(ACM D ...
- 程序小白如何快速开发OA办公系统
对于企业开发oa办公系统,成本高,周期长.有些企业花高价购买,购买后受制于软件商,很多功能只能按原来设计需求走,无法升级或者升级慢.这些由于软件商的开发效率低难以及时地响应企业的需求变化,所以就有可能 ...
- 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)
目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...
- python 软件目录规范
软件目录结构规范 软件开发规范 一.为什么要设计好目录结构? 1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快 ...
- 前端H5,点击选择图片控件,图片直接在页面上展示~
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Subsequence POJ - 3061
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22040 Accepted: 9404 Desc ...