Gooey使用python打包后,print不能输出到GUI的命令行窗口内的问题解决

本文介绍了一种解决使用PyInstaller打包后Gooey GUI程序中print语句无法正常显示的方法,并探讨了Python print语句在Windows控制台下的编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  为了给自己的图片接口站api.horosama.com补充图片,写了个壁纸爬虫程序,同时用Gooey做了个简单的GUI,然而,程序在vscode里直接运行的时候,是可以print函数输出到GUI的命令行窗口的,用pyinstaller打包之后就不行了。
  搜了一下github上Gooey的issue发现有大佬给出了解决方法,在代码前加入如下几行

import codecs
import sys

if sys.stdout.encoding != 'UTF-8':
    sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, 'strict')
if sys.stderr.encoding != 'UTF-8':
    sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, 'strict')
    

  然后记得print函数加入参数flush=True,再打包一次就可以啦~
  这行代码之所以能起作用,我推测应该还是和python的print编码以及windows的控制台编码的问题,可以参考下这篇博文python,window控制台下编码问题

  引用下这篇文章的开头部分如下:

  Python 的 print 语句有一个很奇怪的 bug。它的功能是向控制台输出字符,这本身不是问题。但是 Python 内部是支持 Unicode 字符串的,而 Unicode 字符串在用 print 输出时 print 要进行一次从 Unicode 到 ANSI/MBCS 编码的编码,编码后才会以 8-bit 流输出结果。
  编码就编码吧,这也是很正常的。对于控制台程序来说,输出可能被重定向到文本文件。如果不指定编码,重定向时就不知道以何种 8-bit 字节流写入文本文件,所以,输出到控制台的东西理论上也应该是经过编码的 8-bit 流。综上所述,确实有必要进行一次 WCHAR 到 char 的转码。
  但是问题在于,Python 的 print 语句在转码时,居然用的是 strict 规则。即,待输出字符串若含有当前代码页之外的字符,就会在转码过程中出现不可转码的文字,从而抛出 exception。print 语句又不处理这个 exception,导致一个平平常常 print 语句竟然会引起 Python 程序的异常!这简直是不可思议。

<think>嗯,用户想用PythonGooey库创建一个带GUI的四则运算计算器。首先,我需要回忆一下Gooey的基本用法,它是不是基于wxPython的那个库?记得Gooey可以通过装饰器快速把命令行程序转换成GUI界面,这样用户不需要写太多前端代码。 首先,用户需要安装Gooey库,对吧?用pip install Gooey应该就可以。然后,可能需要导入必要的模块,比如从gooey导入Gooey, GooeyParser。接下来,定义一个函数,用@Gooey装饰器来启动GUI界面。 然后,需要设置GUI的组件,比如输入数字的文本框和选择运算符的下拉菜单。GooeyParser和ArgumentParser类似,可以添加各种输入控件。用户可能需要两个数字输入,num1和num2,类型应该是float,这样支持小数运算。运算符的话,可以用下拉选项,choices参数里放加减乘除四个选项。 接下来是处理计算的部分。需要根据运算符执行相应的运算,注意除法的时候要处理除以零的情况,这时候可能需要try-except块来捕获异常,提示错误信息。最后,把结果显示在GUI里,可能需要用print或者某种方式输出结果,Gooey应该会自动捕获输出并显示。 然后,测试一下代码,比如运行后输入两个数字,选择运算符,看看结果是否正确。特别是除法的情况,比如除以零时是否有错误提示。另外,检查界面布局是否合理,有没有需要的组件,比如数字输入框、下拉菜单和计算按钮。 可能用户会遇到的问题,比如Gooey安装失败,这时候可能需要确认Python版本和依赖库是否兼容。另外,GUI的布局可能需要调整,比如分组不同的输入项,让界面更美观。Gooey支持面板和分组,可以优化布局结构。 代码示例方面,应该先导入库,定义装饰器,设置解析器,添加输入参数,然后解析参数,进行计算,处理异常,最后输出结果。这样用户就能得到一个基本的计算器界面了。可能还需要考虑扩展功能,比如支持更多运算符或者历史记录,但用户当前的需求是四则运算,所以先满足基本需求。 总之,步骤大概是安装Gooey,编写带装饰器的函数,设置输入组件,处理运算逻辑,异常处理,然后测试运行。确保代码结构清晰,注释明确,方便用户理解和修改。</think>### 如何用Gooey创建Python四则运算计算器 #### 1. 环境准备 首先安装Gooey库: ```bash pip install Gooey ``` #### 2. 基础代码框架 ```python from gooey import Gooey, GooeyParser @Gooey(program_name="四则运算计算器", language='chinese') def main(): parser = GooeyParser(description="支持加减乘除的基础计算器") # 输入参数配置 parser.add_argument('num1', widget="TextField", help="第一个操作数", type=float) parser.add_argument('operator', widget="Dropdown", choices=['+', '-', '×', '÷'], help="选择运算符") parser.add_argument('num2', widget="TextField", help="第二个操作数", type=float) args = parser.parse_args() # 执行计算 try: if args.operator == '+': result = args.num1 + args.num2 elif args.operator == '-': result = args.num1 - args.num2 elif args.operator == '×': result = args.num1 * args.num2 elif args.operator == '÷': if args.num2 == 0: raise ZeroDivisionError("除数不能为零") result = args.num1 / args.num2 print(f"结果:{result}") except Exception as e: print(f"错误:{str(e)}") if __name__ == "__main__": main() ``` #### 3. 关键功能说明 - 使用`@Gooey`装饰器实现GUI自动生成 - `widget="TextField"`指定数字输入框 - `widget="Dropdown"`创建运算符下拉菜单 - 类型验证自动处理输入格式错误 - 除法运算包含除零保护机制 #### 4. 界面优化建议 ```python @Gooey( program_name="增强版计算器", language='chinese', tabbed_groups=True, # 启用选项卡式分组 header_bg_color="#4B0082", # 界面主题颜色 navigation="TABBED" ) def main(): parser = GooeyParser() with parser.add_argument_group("运算参数"): # 在原参数基础上添加更详细的help提示 parser.add_argument('num1', help="输入整数或小数") parser.add_argument('operator', help="选择基本运算符") parser.add_argument('num2', help="输入整数或小数") ``` #### 5. 运行效果 程序将生成包含以下元素的窗口: 1. 两个数字输入文本框 2. 带四种运算符的下拉菜单 3. 显眼的「开始」按钮 4. 独立的结果显示区域
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

萌萌哒赫萝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值