关于tinker调用pyqt5之后部分程序无法打包成exe或即使打包后打开exe仍然无法调用图片的完全解决

请在程序最前面加上:

# -*- coding: utf-8 -*-

由于tinker的使用方法简单,但是无法显示图片,在使用我的方法(参:

https://blog.csdn.net/weixin_43390435/article/details/101158379

)后,pyinstaller常规方法无法打包exe,或者即使程控,打开也会报错

打包问题解决(请结合第2个大标题下的内容看,否则你可能会走弯路)

只有输入以下命令才能打包成exe

pyinstaller -F main.py -p py_dir

其中main.py是主py文件,不需要输入额外文件名,但是要保证打包文件在同一目录

(参:

https://blog.csdn.net/maixiaochai/article/details/90052333

)不过,此时生成的exe虽然可以打开但是在使用图片时会报错如图
在这里插入图片描述

打包后调用图片依然报错解决

解决方法(参:

https://www.cnblogs.com/hester/p/11460121.html


我使用的是第一种方法
新建b.py输入

# Fix qt import error
# Include this file before import PyQt5
import os
import sys
import logging
 
 
def _append_run_path():
    if getattr(sys, 'frozen', False):
        pathlist = []
 
        # If the application is run as a bundle, the pyInstaller bootloader
        # extends the sys module by a flag frozen=True and sets the app
        # path into variable _MEIPASS'.
        pathlist.append(sys._MEIPASS)
 
        # the application exe path
        _main_app_path = os.path.dirname(sys.executable)
        pathlist.append(_main_app_path)
 
        # append to system path enviroment
        os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)
 
    logging.error("current PATH: %s", os.environ['PATH'])
 
 
_append_run_path()

生成的文件与主程序,副程序放在同一目录
主程序导入PyQt5相关库之前导入

imoort b.py

保存修改,推出
此时胜利就在前方
保证三个.py文件都在同一目录
还是老方法打开命令行

pyinstaller -F main.py -p py_dir

测试后,已经解决了图片显示问题,exe单独运行没有问题,但是在显示图片的时候会在控制台打印一些无关紧要的东西,不影响运行

后记

解决PyQt5模块的程序打开后无法正常返回tinker模块的问题

在程序最后加上os.folk()即可,经过测试只有这个可以用,虽然会提示一些错误信息:os modle not have attribuate 'folk'诸如此类,但是完美解决在打开图片后,程序被异常终止的问题

至此,tinker调用PyQt5使用资源及后引发的种种问题完全解决

待解决的小BUG

点击‘退出’时显示name 'exit''is not define
打开图片时显示module'os'has no attribuate 'folk'

补充图片证明方法可用性

tk主界面
tinker主界面

调用PyQt5显示收款码
在这里插入图片描述

今天家人过生日,Copy一个小程序加点料(turtle动态绘制哆啦A梦同时播放音乐)送给他

在这里插入图片描述
在这里插入图片描述
使用比上文更简单的打包方法(但是会让程序产生大量依赖文件,很占用空间)

安装pip install cxfreeze

cd到xxx.py目录执行
cxfreeze xxx.py --target-dir dist
xxx.py是要打包的py文件
dist是打包后生成的文件夹
如果用此方法打包
且程序中调用文件
需要在程序中调用文件的地方
改用相对路径(直接打文件名)
并在打包完成后
把相应资源文件(要对应写代码的时候调用的文件的名字)放入dist文件夹根目录中
否则会调用不了文件
而且不能操作dist文件夹中的文件
否则会有未知错误

用这个方法打包,就这样一个小程序占用80多M,打包上文的程序更是直接占用250多M,很不友好,但是方便,一些送给别人的小程序可以这样打包
源码(请忽略PYQT5的部分,本来想用之前的方法整合成1个EXE,后来觉得整合好了估计都要后天了,没意义,所以就做了一点PYQT的就放弃了)

哆啦的代码C自

https://www.2cto.com/kf/201806/753261.html

还有画哆啦A梦的程序虽然是C来的但是他的注释不够明确,我多次测试后添加了一些注释,不过身体颜色问题还是没解决,如果要播放音乐请自行准备文件和更改代码

import threading
def play_music():
        import pygame
        import time
        import b
        filepath = r"勾指起誓.mp3";
        pygame.mixer.init()
        # 加载音乐
        pygame.mixer.music.load(filepath)
        pygame.mixer.music.play(start=0.0)
        #播放时长,没有此设置,音乐不会播放,会一次性加载完
        time.sleep(300)
        pygame.mixer.music.play(loops)

#下面是画哆啦的所有代码
def painting():
    import turtle as t
    def my_goto(x,y):
        t.penup()
        t.goto(x,y)
        t.pendown()
    def eyes():
        t.tracer(False)
        a=2.5
        for i in range(120):
            if 0 <=i<30 or 60<=i<90:
                a-=0.05
                t.lt(3)
                t.fd(a)
            else:
                a+=0.05
                t.lt(3)
                t.fd(a)
        t.tracer(True)

    t.title('哆啦A梦—祝你生日快乐')
    t.pensize(3)
    t.penup()
    t.circle(150,40)
    t.pendown()
    t.fillcolor("#00a0de")#头颜色
    t.begin_fill()
    t.circle(150,280)
    t.end_fill()

    t.fillcolor("#e70010")#项圈颜色
    t.begin_fill()
    t.seth(0)
    t.fd(200)
    t.circle(-5,90)
    t.fd(10)
    t.circle(-5,90)
    t.fd(207)
    t.circle(-5,90)
    t.fd(10)
    t.circle(-5,90)
    t.end_fill()

    #脸
    t.fd(183)
    t.fillcolor('#ffffff')#脸颜色
    t.begin_fill()
    t.lt(45)
    t.circle(120,100)
    t.seth(90)
    eyes()
    t.penup()
    t.seth(180)
    t.fd(60)
    t.pendown()
    t.seth(90)
    eyes()
    t.penup()
    t.seth(180)
    t.fd(60)
    t.pendown()
    t.seth(215)
    t.circle(120,100)
    t.end_fill()
    my_goto(-10,158)
    t.fillcolor('#e70010')#鼻子
    t.begin_fill()
    t.circle(20)
    t.end_fill()
    my_goto(5,148)
    t.seth(270)
    t.fd(100)
    t.seth(0)
    t.circle(120,50)
    t.seth(230)
    t.circle(-120,100)
    #胡须
    my_goto(-37,135)
    t.seth(165)
    t.fd(60)
    my_goto(-37,125)
    t.seth(180)
    t.fd(60)
    my_goto(-37,115)
    t.seth(193)
    t.fd(60)
    my_goto(37,135)
    t.seth(15)
    t.fd(60)
    my_goto(37,125)
    t.seth(0)
    t.fd(60)
    my_goto(37,115)
    t.seth(-13)
    t.fd(60)
    my_goto(0,0)
    t.seth(0)
    t.penup()
    t.circle(150,50)
    t.pendown()

    #身躯
    t.fillcolor('#ffffff')#肚兜和肚子
    t.begin_fill()
    t.seth(30)
    t.end_fill()

    t.fillcolor('#00a0de')#右边胳膊
    t.begin_fill()
    t.fd(40)
    t.seth(70)
    t.circle(-30,270)
    t.seth(230)
    t.fd(80)
    t.end_fill()

    t.seth(-89)
    t.circle(-1000,10)
    t.seth(180)
    t.fd(70)
    t.seth(90)
    t.circle(30,180)
    t.seth(180)
    t.fd(70)
    t.seth(100)
    t.circle(-1000,9)
    t.seth(240)
    t.fillcolor('#00a0de')#左边胳膊
    t.begin_fill()
    t.fd(40)
    t.circle(-30,250)
    t.seth(50)
    t.fd(70)
    t.end_fill()

    my_goto(103.74,-197.59)
    t.fillcolor('#ffffff')#右脚
    t.begin_fill()
    t.seth(0)
    t.fd(15)
    t.circle(-15,180)
    t.fd(90)
    t.circle(-15,180)
    t.fd(10)
    t.end_fill()

    my_goto(-96.26,-197.59)
    t.seth(180)
    t.fillcolor('#ffffff')#左脚
    t.begin_fill()
    t.fd(15)
    t.circle(15,180)
    t.fd(90)
    t.circle(15,180)
    t.fd(10)
    t.end_fill()

    my_goto(-103.42,15.09)
    t.seth(0)
    t.fd(38)
    t.seth(230)
    t.fillcolor('#ffffff')#肚子
    t.begin_fill()
    t.circle(90,260)
    t.end_fill()

    my_goto(5,-40)
    t.seth(0)
    t.fillcolor('#ffffff')#百宝袋
    t.begin_fill()
    t.fd(70)
    t.seth(-90)
    t.circle(-70,180)
    t.seth(0)
    t.fd(70)
    t.end_fill()


    my_goto(-103.42,15.09)
    t.fd(90)
    t.seth(70)
    t.fillcolor('#ffd200')#铃铛颜色
    t.begin_fill()
    t.circle(-20)
    t.end_fill()
    t.goto(-13.42,15.09)
    t.seth(250)
    t.circle(20,110)
    t.seth(90)
    t.fd(15)
    t.dot(10)
    my_goto(0,-150)
    t.seth(0)
    my_goto(-20,195)
    t.fillcolor('#000000')#眼睛颜色
    t.begin_fill()
    t.circle(13)
    t.end_fill()
    t.pensize(6)
    my_goto(20,205)
    t.seth(75)
    t.circle(-10,150)
    t.pensize(3)
    my_goto(-17,200)
    t.seth(0)
    t.fillcolor('#ffffff')#眼睛里的光颜色
    t.begin_fill()
    t.circle(5)
    t.end_fill()
    my_goto(0,0)
    t.mainloop()
threads = []
threads.append(threading.Thread(target=play_music))
threads.append(threading.Thread(target=painting))
if __name__ == '__main__':
    for t in threads:
        t.start()
'''
t.seth(240)
t.fd(40)
#t.goto(-170,-40)
#t.goto(100,100)
t.fillcolor('#ffffff')#左手
t.begin_fill()
t.circle(30,250)
t.end_fill()
'''

5小时后更新
折腾了几个小时完全修复了空白,完美播放音乐,可以打包成有依赖的exe文件,这是送给家人的生日礼物,太累了在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值