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

  为了给自己的图片接口站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 程序的异常!这简直是不可思议。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
GooeyPython 库,可以将命令行程序转换为 GUI 程序。以下是使用 Gooey 的基本步骤: 1. 安装 Gooey:可以使用 pip 命令安装,命令为 pip install gooey。 2. 导入 Gooey 库:在 Python 程序中导入 Gooey 库,命令为 from gooey import Gooey。 3. 使用 Gooey 装饰器:在命令行程序的主函数上使用 Gooey 装饰器,命令为 @Gooey。 4. 定义参数:使用 argparse 库定义命令行参数。 5. 使用 GooeyParser:使用 GooeyParser 替换 argparse.ArgumentParser。 6. 添加 GUI 元素:使用 GooeyParser 添加 GUI 元素,例如文本框、下拉框等。 7. 运行程序:运行程序,将会弹出 GUI 窗口。 以下是一个简单的例子,演示如何使用 Gooey: ``` from gooey import Gooey, GooeyParser @Gooey def main(): parser = GooeyParser(description="This is a demo program.") parser.add_argument("input_file", metavar="Input file", widget="FileChooser") parser.add_argument("output_file", metavar="Output file", widget="FileChooser") parser.add_argument("-r", "--recursive", action="store_true", help="Recursive mode") args = parser.parse_args() print(f"Input file: {args.input_file}") print(f"Output file: {args.output_file}") print(f"Recursive mode: {args.recursive}") if __name__ == "__main__": main() ``` 在这个例子中,我们使用 Gooey 装饰器将 main 函数转换为 GUI 程序。然后,我们使用 GooeyParser 定义参数,并添加了两个文件选择器和一个复选框。最后,我们打印了参数的值。 注意,使用 Gooey 的程序只能在 GUI 环境下运行,不能命令行下运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

萌萌哒赫萝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值