首页 / 资讯中心 / 文章详情

PySimpleGUI 4.60.5:最后一个免费版的安装与避坑

PySimpleGUI 4.60.5:最后一个免费版的安装与避坑 ★ FEATURED ARTICLE
简介PySimpleGUI 4.60.5 免授权安装包专门解决 pip 默认安装 5.0 收费版及 .exe 打开弹出 30 天试用提示的痛点。它基于 Tkinter、PyQt 等底层框架的统一封装适合数据可视化、数据录入、系统监控、桌面小工具等场景开发者可直接调用高层 API 快速搭建窗口、按钮和布局无需深入了解底层 GUI 细节。整个 RAR 压缩包只有 1.81MB共 13 个文件以 5 个 py 源码、4 个 txt 说明为主另有 setup.py、setup.cfg 与 egg/pkg-info 等配置及元数据结构紧凑支持通过 pip 指向本地目录离线安装。目前已有 1391 人学习下载尤其适合规避版权费用的 Python 爱好者既可用于个人学习和课后项目也可嵌入内部工具避开新版本试用限制。附带简明安装说明可大幅减少环境搭建时间同时 4.60.5 版本稳定性高、API 与新版接近后期若需升级迁移也较为平滑。1. PySimpleGUI 4.60.5最后一个免费老版本还够你用吗A同学给某办公室做一款录入小工具直接pip install pysimplegui装到的版本启动后弹 license折腾一小时最后降级到 PySimpleGUI 4.60.5 才收工。这应该是近期 GUI 入门者最容易踩到的一个版本变化5.0 开始收费4.60.5 仍是 PyPI 上可下的老版本而且 API 完全够开发内部工具。这篇照着装就行同时把验证和锁版本也一并说了。它能解决的问题很明确你不想折腾商业授权又想要一个能用 Tkinter 的图形界面你希望把版本锁在 4.60.5让同事 clone 项目后一条命令装完。不适合拿来对新版某个特性做尝鲜也别指望它切换到 Qt 后端后4.x 的旧 API 会继续提供所有能力。看完第 3 章你就能把窗口跑起来第 4 章帮你避开安装阶段最常见的四个坑第 5 章教你怎么确认没装错第 6 章给一个写长任务界面时用得上的小技巧。2. 5.0 收费之后4.60.5 凭什么还值得装版本演进与选型理由2.1 从开源免费到商业订阅5.0 改了什么PySimpleGUI 的核心理念是“让你用声明式的二维列表描述窗口而不是写 Tkinter 的 pack/grid”。在 4.60.5 这批老版本里一个窗口就是 Python 列表套列表内层列表对应窗口里的一行再把 layout 传给sg.Window()。开发体验接近前端写 HTML但没有浏览器和 node_modules只要 Python 能跑它就能跑。5.0 的收费变化不是把界面 API 全部推翻而是官方把项目从完全免费转向商业订阅新版安装后会在启动阶段检查许可证没有授权就弹提示或直接退出。对内部工具来说这种依赖就有合规风险所以把项目固定到 4.60.5不是为了“省那点钱”而是为了安装行为和运行行为可预期。更实际的原因我在某公司给后勤部门做盘点工具时遇到过所有机器都有 Python 3.9但没装任何 GUI 依赖。如果直接用 5.0要么补齐授权要么就要告诉同事“这个工具会弹收费提示”体验直接崩。降级到 4.60.5 后py 文件拷过去、安装一行命令窗口正常弹出来后来这件事成了团队内部的标准做法。在选定版本前有一个硬前置条件目标机器必须能运行 Tkinter。建议先执行下面的检查确认 Python 和 Tk 都正常python -c import sys; print(sys.version) python -c import tkinter; tkinter._test()第一条用来确认解释器版本。第二条会弹出一个 Tk 自带的小窗口如果直接报No module named tkinter是 Python 缺少 Tk 支持Linux 最常见Windows 大多数已内置。这个时候装 PySimpleGUI 一定失败或运行时不显示先解决这个再进入下一步。我第一次在服务器上装完PySimpleGUI后运行窗口报的就是TclError: no display name后来才意识到不是包的问题而是 Linux 环境根本没有图形会话。2.2 4.60.5 的功能边界做一个桌面小工具的最低要求4.60.5 提供的元素数量虽然没有后来新版本那么多但桌面小工具最常用的部分都在。我列一下自己长期依赖的清单表单类Input、Combo、Checkbox、Radio、Multiline展示类Text、Table、Listbox、Image布局类Column、Frame、Tab反馈类Button、Popup、ProgressBar辅助类theme、元素内 padding、window 的 finalize 和 timeout 读事件这已经覆盖了约 90% 的内部工具场景。比如一个批量改名工具左边 Listbox 列出文件中间 Input 输入规则右边 Button 执行下面 Multiline 输出结果全程不碰底层 Tk也不会涉及 Web 前端。4.60.5 的事件循环只围绕一个方法window.read()。它返回(event, values)第一个是用户点击控件的 key 或窗口关闭事件第二个是所有输入控件的值字典。要判断某个功能在 4.60.5 里是否可用有一个笨但有效的办法确认搜索到的资料附带代码里的 PySimpleGUI 版本是否 ≤4.60.5如果教程只写“新版推荐”那老版本多半会报 TypeError。这种版本错位比安装失败更隐蔽第 4 章我会单独说。最后给一张选型对比表对比项4.60.55.0授权费用免费商业订阅许可证校验无有启动阶段触发API 文档年代4.x 资料新版资料安装命令需要精确指定版本直接 pip 安装会拉到新版适合场景内部工具 / 个人脚本采购授权的正式项目我的建议是没有采购计划的团队直接按 4.60.5 写如果已经买授权用新版就好。别抱着“老版本一定不够用”的顾虑你的表单、弹窗、事件循环老版本都有。做内部工具最关键的是能交付、能维护而不是追着许可证换 API。3. 安装 4.60.5 的完整三条路pip 指定版本、镜像源与 venv 隔离3.1 先建 venv把老版本关进独立环境为什么先建 venv最直接的理由如果你机器上已经装了 5.x运行pip install --upgrade PySimpleGUI反而升级到更新的 5.x如果你从来没装过裸 pip install 默认版本也可能直接装成新版。venv 像一个独立盒子项目依赖都放在自己的目录里卸载、重装、锁版本都不会影响到全局系统。mkdir mygui cd mygui python3 -m venv venv source venv/bin/activate # 激活虚拟环境Windows 下是 venv\Scripts\activate参数说明python3 -m venv venv第一个 venv 是模块名第二个 venv 是环境目录名可改成任何名称。source venv/bin/activate进入环境后命令提示符前会出现(venv)这时候 pip 安装的目标就从全局变成本地环境。Windows 下如果python3不存在用py -3 -m venv venv激活脚本位置在venv\Scripts\activate.bat。这一步不一定要做但我强烈建议做。它能在后面帮你省掉“咦我明明装了怎么还是 ModuleNotFoundError”的血泪时间。如果你用的是 Conda也可以建一个干净的 Python 3.9 环境效果是一样的只是 venv 对纯 pip 流程更轻不需要额外装包管理器。我一般会在项目根目录把 venv 放在.venv目录下然后给.gitignore加一行.venv/这样别人 clone 后自己重建环境不会把一整套依赖提交到代码库。3.2 用精确版本号安装两条最常用的 pip 命令进入 venv 后执行pip install PySimpleGUI4.60.5这行命令的是明确版本匹配pip 会去 PyPI 找对应版本号只要该版本还存在就能下载。为了兼容国内网络可以追加镜像源pip install PySimpleGUI4.60.5 -i https://pypi.tuna.tsinghua.edu.cn/simple-i参数只是更换索引地址包内容与源无关。我一般不会直接pip install pysimplegui因为没法确保装到哪个版本等以后需要升级时再显式决定。如果你的 pip 版本较旧可以先把 pip 升级到最新python -m pip install --upgrade pip这不是必选项但旧 pip 解析安装有时会忽略精确匹配或给出奇怪提示升一下能少踩几个无关坑。另外提醒包名大小写不敏感为了统一我在 requirements 里用PySimpleGUI和官方大小写保持一致。如果你在安装前已经装过别的版本我建议先卸载干净再装老版本pip uninstall -y PySimpleGUI pip install PySimpleGUI4.60.5卸载那一步不是必须的但能避免两个版本的残留文件叠加。尤其当你之前用源码方式安装过某版import时可能读的是旧路径pip 的提示又不会告诉你。卸载后重新安装路径一定是新写入的后面排查起来更干净。3.3 跑通第一个窗口验证已经装进 4.60.5安装完成不打开窗口不算数。写一个最小确认脚本import PySimpleGUI as sg layout [ [sg.Text(4.60.5 正常工作了)], [sg.Button(退出)] ] window sg.Window(安装验证, layout) while True: event, values window.read() if event sg.WIN_CLOSED or event 退出: break window.close()保存为demo.py在 venv 里执行python demo.py能弹出窗口恭喜。逻辑说明layout是一个二维列表内层[sg.Text(...), sg.Button(...)]表示窗口同一行中的两个控件。sg.Window(title, layout)创建窗口但此时还没有显示真正显示和交互发生在window.read()。read()会阻塞程序直到用户点击按钮或关闭窗口。返回值里event是触发事件的元素标识默认是按钮文字values是输入控件内容字典这里没有输入控件。当事件等于sg.WIN_CLOSED时说明用户点了右上角 X等于“退出”时说明点击了按钮。两种情况都跳出循环并关闭窗口。这是 PySimpleGUI 4.60.5 最基本的事件循环写法后续所有工具都基于这个骨架。虽然values在这个例子里没有被用到但每个read()都会返回它这是为了让你随时能拿到输入框、复选框的当前值。如果想把版本号也打到标题上可以这样改sg.theme(DarkBlue) window sg.Window(fPySimpleGUI {sg.__version__}, layout)把sg.__version__拼进窗口标题一运行就能看到当前导入的是不是 4.60.5。如果这里打印的是 5.x说明你的环境没锁住回到第 3.2 节重新指定版本。sg.theme只负责切换配色主题换成Default、LightGreen都能跑不会影响布局逻辑。4. 装 4.60.5 的四个避坑现场pip 变成新版、import 不到、TclError、API 不兼容4.1 现象pip install 一行命令跑完实际装成 5.0原因很多教程和旧习惯直接执行pip install PySimpleGUIpip 默认选择该包的最新发布版本。而现在最新版是 5.x带有商业许可启动时会弹授权提示。现象就是窗口还没弹出来终端里先出现 license 相关提示或者运行后直接退出。解决还原到 4.60.5 并锁定。在虚拟环境里执行pip uninstall -y PySimpleGUI pip install PySimpleGUI4.60.5之后再用pip show PySimpleGUI确认Version: 4.60.5。我自己的习惯是凡涉及 PySimpleGUI 的项目requirements 里永不写裸包名必须带4.60.5避免同事在一个月后装上不可用的新版本。你还需要注意一个细节PyPI 对包名大小写不敏感但卸载时如果用pip uninstall pysimplegui也可能卸载不到因为有些平台记录的是原始包名PySimpleGUI。最保险的做法是python -m pip list看输出里的准确名称再按那个名字卸载。4.2 现象pip list 里有 PySimpleGUIimport 却报 ModuleNotFoundError原因最常见的是 shell 里敲pip和运行python demo.py用的解释器不是同一个环境。比如在 venv 激活状态下pip 可能指向全局个别安装的 pip 脚本问题或者你在 IDE 里选了另一个解释器。我在 VSCode 里遇到过一次终端显示的 venv 没问题但右下角解释器还指向系统 Python结果python demo.py去的是全局目录当然找不到包。解决统一使用python -m pip不要用裸pippython -m pip install PySimpleGUI4.60.5 python -c import PySimpleGUI as sg; print(sg.__version__)python -m pip明确指定“当前解释器的 pip”从根源避开环境混杂。如果还不能 import执行which python和which pip看路径是否指向同一个 venv。在 Windows 上用where python和where pip。如果 IDE 里已经选了 venv还要确认python前面没有套一层别的前缀。检查完环境之后再执行python -c import PySimpleGUI; print(PySimpleGUI.__file__)这行会打印包的实际路径看这个路径是否落在你期望的 venv 目录里。如果落在全局 site-packages说明当前命令行的解释器就没激活 venv问题在环境切换而不是包本身。4.3 现象窗口闪不出来报 TclError: no display name原因PySimpleGUI 4.60.5 在 Linux/Unix 上依赖 Tk 的 X11 显示环境如果在纯命令行服务器或没有图形会话的环境里Tk 无法初始化。错误信息通常长这样_tkinter.TclError: no display name and no $DISPLAY environment variable。它不代表 PySimpleGUI 没装好而是当前会话没有可用的图形输出。解决要么在带图形界面的机器上运行要么为服务器加 X11 转发在 Linux 上还需要确认系统装有python3-tk。缺 Tk 时import tkinter会报ModuleNotFoundError安装后仍然可能失败sudo apt update sudo apt install -y python3-tk备注Windows/macOS 桌面版用户一般不会遇到这个如果遇到“突然弹不出窗口”先检查是不是通过 SSH 或无桌面远程连接到了 Linux。还有一种情况是 WSL 环境WSL 里跑的 Linux 默认没有 GUI 会话除非你配了 WSLg 或转发了 DISPLAY否则同样报 TclError。解决办法不是去改代码而是把程序放到有图形会话的机器上运行或者临时跑一个 Xvfb 虚拟屏幕但那种做法更适合自动化测试不适合给用户真实使用。4.4 现象从新教程抄代码老版本运行报 TypeError / AttributeError原因网上很容易搜到 5.0 的新 API 或不再兼容的写法而 4.60.5 没有这些签名。比如某些控件的新参数、窗口的某种 read 选项在新版本里存在在老版本里会直接抛错。即使同一个控件新版本改了默认值老版本也需要显式传参抄代码时不注意就翻车。解决写代码时只使用 4.60.5 的老文档接口。判断方法很直观执行python -m pip show PySimpleGUI看到Version: 4.60.5后凡是看到 “5.0 新功能”、“仅新版本支持” 的代码可以先不用。把布局、事件循环、Popup 这三类内容在本地跑通基本就能避开 90% 的兼容问题。如果想知道某个方法支持哪些参数直接查当前包的签名python -c import PySimpleGUI as sg; help(sg.Window)help()输出会列出当前版本里Window构造函数能接受的所有参数比网上搜到的解析来得准确。我通常不会盲抄网上代码而是先用help()或dir()确认方法存在再套进自己的布局。如果真的很想用新特性那只能换到已购买授权的新版环境不能依赖老版本硬顶上。把老版本代码升级到新版也不是简单地改版本号因为 API 签名可能有变化需要按官方迁移说明走。5. 验证安装真没踩到收费版本版本号、license 标记与 requirements 锁定5.1 用 pip show 和version双重确认安装完别只看窗口能弹要确认解释器读到的确实是同一个包。用命令python -m pip show PySimpleGUI python -c import PySimpleGUI as sg; print(sg.__version__)第一行里检查Version: 4.60.5第二行直接输出当前解释器里导入包的版本号。如果两条结果不一致说明 import 走的路径不对回到第 4.2 节。如果版本号是 5.x 或出现 license 字样说明包被升级到了新版或存在多个版本残留需要卸载后重装。注意有些版本的包可能没有暴露__version__那以pip show为准如果pip show显示的版本没问题但__version__报错你照样可以用只是这个包没有提供该属性不影响功能。5.2 用 requirements.txt 锁死版本随手可以交付项目根目录建requirements.txt内容写好PySimpleGUI4.60.5然后在 venv 内执行pip install -r requirements.txt这样不管同事什么时候拉代码安装的都是同一个版本。为了生成更完整的依赖清单还可以pip freeze requirements.txt但pip freeze会把所有依赖都写进去如果项目很干净也可以如果只需要 PySimpleGUI 一个依赖手写一行更清晰。我一般这样区分供自己快速搭建的环境用手写精简清单要可复现一套完整体验环境才用pip freeze。requirements 文件本身就是安装说明书比口头说“帮我装老版本”可靠得多。新人拿到后执行python -m venv venv、激活、pip install -r requirements.txt三分钟就能把环境搭起来。配合 requirements 还可以加一个README.md片段写清楚“为什么锁 4.60.5”避免三个月后有人把版本号改成新版然后又陷入 license 提示。这种文档内容不需要长两三句就行重点是把版本原因讲明白而不是简单地写死版本号。我见过太多因为版本号被随手升级而导致的兼容事故锁版本不是给别人添麻烦是给自己省沟通成本。5.3 老版本运行时的三个验证点窗口、事件、输入值为了避免把“能弹窗”当成“完全可用”需要再跑一个带输入控件的验证脚本import PySimpleGUI as sg layout [ [sg.Text(输入内容)], [sg.Input(key-TEXT-)], [sg.Button(读取)], ] window sg.Window(验证, layout) while True: event, values window.read() if event sg.WIN_CLOSED: break if event 读取: sg.popup(你输入了:, values[-TEXT-]) break window.close()这个脚本验证三件事窗口能否正常创建并显示window sg.Window(...)事件能不能被读出来按钮点击后event等于按钮文字输入值能不能从values里取到通过key标识-TEXT-不依赖控件列表下标这三点是 PySimpleGUI 4.60.5 所有小工具的地基跑通后基本可以放心开发。如果要交给不熟悉 Python 的同事可以把脚本改名成app.py让他们只用python app.py启动。用 key 而不是下标来取输入值是一个好习惯因为布局里增删控件时控件的列表位置会变而下标值不会跟着语义走。比如你在第一行加了一个说明文本输入框从values[0]变成了values[1]一旦忘记改取用代码数据就错位了。用-TEXT-这种具名 key布局怎么调整都不会影响取用。6. 把 4.60.5 用透的最后一个技巧用 timeout 循环避免长任务卡死窗口很多新手在按钮事件里直接写耗时操作比如读取大文件、请求接口、跑批量计算结果窗口卡成“无响应”。这是因为window.read()在等待事件时同一线程必须处理 UI 消息如果事件处理函数里塞了个time.sleep(5)整个窗口就冻结了。4.60.5 里没有新版那套异步脚手架但可以用window.read(timeout100)做定时轮询再配合线程把结果传回来。import queue import threading import time import PySimpleGUI as sg q queue.Queue() def long_task(text): time.sleep(3) # 模拟耗时操作 q.put(完成: text) layout [ [sg.Input(key-IN-)], [sg.Button(开始)], [sg.Text(key-OUT-, size(40, 1))] ] window sg.Window(长任务, layout) while True: event, values window.read(timeout100) # 最多阻塞 100ms if event sg.WIN_CLOSED: break if event 开始: threading.Thread( targetlong_task, args(values[-IN-],), daemonTrue ).start() try: while True: result q.get_nowait() window[-OUT-].update(result) except queue.Empty: pass window.refresh() window.close()这段代码的关键有两点timeout100让read()每 100ms 返回一次哪怕没有任何事件线程完成long_task后把结果放进queue主循环每次都去队列里取取到就更新-OUT-文本。这样窗口在等待期间仍然能正常响应用户操作不会像睡死在事件函数里一样。我在实际项目里用这个模板写过一个小型查询工具左边输入订单号右边点查询后台线程去查数据库查完后把结果写进页面。整个过程界面始终能拖动、点按钮用户不会以为程序死了。后来这个模板被我固化进所有老版本 GUI 项目里只要是耗时操作一律不让它碰主事件循环。如果你用的是 Windowstime.sleep换成真正的 IO 操作也同理。耗时不长但需要频繁刷新的可以把timeout调小到 50ms如果耗时很长可以调大到 200ms 减少 CPU 占用。这算是我在 4.60.5 上最值得分享的一个技巧希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站