wnhuiyou 发表于 2020-9-25 13:40:39

PyQt打包成EXE后,无法打开,怎么解决?

本帖最后由 wnhuiyou 于 2020-9-25 13:41 编辑

我在做一个小程序,通过pycharm来运行的时候,是没有问题的,但是通过pyinstaller -F -w xxx.py 命令来打包EXE的时候就出现错误,奇怪的是,我在另外一个小测试中打包EXE却可以正常打开,我先把代码贴出来,是哪里出问题了吗?

这是 tp.py

from PyQt5.Qt import *
import sys
import os
import time
from QT.投屏.tp2 import QpixmapDemo


class TP(QWidget):
    # 开始
    def TKS(self, rr):
      self.rr = rr
      # 发送adb连接命令
      a = 'adb connect ' + self.rr

      # 启动安卓界面
      s = 'scrcpy.exe'

      os.popen(a, 'r')
      time.sleep(1)
      os.popen(s, 'r')

    # 关闭
    def TGB(self):
      c = 'adb disconnect 192.168.0.132:5555'

      os.popen(c, 'r')

    # 当程序关闭时,再次调用 关闭 函数
    def closeEvent(self, event):
      self.TGB()


if __name__ == '__main__':
    a = 'adb connect 192.168.0.132:5555'
    os.popen(a, 'r')
    app = QApplication(sys.argv)
    win = TP()
    win.setWindowTitle("安卓桌面")
    win.resize(300, 200)

    btn = QPushButton(win)
    btn.setText("开始")
    btn.setStyleSheet("font:40px")
    btn.resize(100, 50)
    btn.move(50, 50)
    btn.clicked.connect(lambda: win.TKS('192.168.0.132:5555'))

    btn2 = QPushButton(win)
    btn2.setText("关闭")
    btn2.setStyleSheet("font:40px")
    btn2.resize(100, 50)
    btn2.move(150, 50)
    btn2.clicked.connect(win.TGB)

    ti = QpixmapDemo()
    btn3 = QPushButton(win)
    btn3.setText("帮助")
    btn3.setStyleSheet("font:40px")
    btn3.resize(100, 50)
    btn3.move(50, 100)
    btn3.clicked.connect(ti.show)

    win.show()
    sys.exit(app.exec_())


这是调用另外一个界面 tp2.py
# from PyQt5.QtGui import *
# from PyQt5.QtWidgets import *
from PyQt5.Qt import *


class QpixmapDemo(QWidget):
    def __init__(self, parent=None):
      super(QpixmapDemo, self).__init__(parent)
      self.setWindowTitle('快捷键')
      layout = QVBoxLayout()
      lab1 = QLabel()
      lab1.setPixmap(QPixmap('1.png'))
      layout.addWidget(lab1)
      self.setLayout(layout)


# if __name__ == '__main__':
#   app = QApplication(sys.argv)
#   demo = QpixmapDemo()
#   demo.show()
#   sys.exit(app.exec_())

用pycharm执行是没有问题的,如下:


打包后就提示这个问题:


我把所有文件的路径也截图出来:



是什么问题导致打包后不能正常打开的呀? 我也是百度了好久,说是路径问题,或者是什么编码问题,我都试过了,还是不行。

疾风怪盗 发表于 2020-9-25 14:17:50

用了你的代码,第一段放在test01,第二段放在test02
pyinstaller -F test01.py test02.py
pyinstaller test01.py test02.py
上面两种都可以正常打包,正常执行exe

所以你的问题,可能是你使用了os调用cmd来执行代码,但是打包时又不使用控制台?

wnhuiyou 发表于 2020-9-25 14:37:43

疾风怪盗 发表于 2020-9-25 14:17
用了你的代码,第一段放在test01,第二段放在test02
pyinstaller -F test01.py test02.py
pyinstaller tes ...

我现在把 两个文件合并成一个文件了 可以正常打包 但还是无法正常执行EXE文件提示如下:



打包是用控制台的:

疾风怪盗 发表于 2020-9-25 14:43:23

wnhuiyou 发表于 2020-9-25 14:37
我现在把 两个文件合并成一个文件了 可以正常打包 但还是无法正常执行EXE文件提示如下:




你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的

打包时-w是不使用控制台
你什么参数都不加,默认打包呢?也不能运行么?

wnhuiyou 发表于 2020-9-25 14:44:55

疾风怪盗 发表于 2020-9-25 14:43
你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的


合并的代码:
import os
import sys
import time
from PyQt5.Qt import QWidget, QApplication
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QLabel


class TP(QWidget):
    # 开始
    def TKS(self, rr):
      self.rr = rr
      # 发送adb连接命令
      a = 'adb connect ' + self.rr

      # 启动安卓界面
      s = 'scrcpy.exe'

      os.popen(a, 'r')
      time.sleep(1)
      os.popen(s, 'r')

    # 关闭
    def TGB(self):
      c = 'adb disconnect 192.168.0.132:5555'

      os.popen(c, 'r')

    # 当程序关闭时,再次调用 关闭 函数
    def closeEvent(self, event):
      self.TGB()


class QpixmapDemo(QWidget):
    def __init__(self, parent=None):
      super(QpixmapDemo, self).__init__(parent)
      self.setWindowTitle('快捷键')
      layout = QVBoxLayout()
      lab1 = QLabel()
      lab1.setPixmap(QPixmap('1.png'))
      layout.addWidget(lab1)
      self.setLayout(layout)


if __name__ == '__main__':
    a = 'adb connect 192.168.0.132:5555'
    os.popen(a, 'r')
    app = QApplication(sys.argv)
    win = TP()
    win.setWindowTitle("安卓桌面")
    win.resize(300, 200)

    btn = QPushButton(win)
    btn.setText("开始")
    btn.setStyleSheet("font:40px")
    btn.resize(100, 50)
    btn.move(50, 50)
    btn.clicked.connect(lambda: win.TKS('192.168.0.132:5555'))

    btn2 = QPushButton(win)
    btn2.setText("关闭")
    btn2.setStyleSheet("font:40px")
    btn2.resize(100, 50)
    btn2.move(150, 50)
    btn2.clicked.connect(win.TGB)

    ti = QpixmapDemo()
    btn3 = QPushButton(win)
    btn3.setText("帮助")
    btn3.setStyleSheet("font:40px")
    btn3.resize(100, 50)
    btn3.move(50, 100)
    btn3.clicked.connect(ti.show)

    win.show()
    sys.exit(app.exec_())


我就只加了 -F -w 没有其他的了,我现在试试 什么参数都不加看看。

疾风怪盗 发表于 2020-9-25 14:46:03

wnhuiyou 发表于 2020-9-25 14:44
合并的代码:




那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊

wnhuiyou 发表于 2020-9-25 14:50:11

本帖最后由 wnhuiyou 于 2020-9-25 16:35 编辑

疾风怪盗 发表于 2020-9-25 14:43
你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的


奇怪,不带参数打包,可以正常执行,但是会附带一大堆文件,不知道哪些是没用的,哪些是有用的,而且我不需要带有后台提示,只需要窗口就行了。




wnhuiyou 发表于 2020-9-25 14:51:39

疾风怪盗 发表于 2020-9-25 14:46
那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊

这张图就是不带 -w打包的,黑框一闪而过,我能截图是因为我手速快...

疾风怪盗 发表于 2020-9-25 14:57:42

wnhuiyou 发表于 2020-9-25 14:51
这张图就是不带 -w打包的,黑框一闪而过,我能截图是因为我手速快...

不需要拼手速,在文件的路径下cmd,和cd到文件的效果一样,然后再输入exe文件运行,就能看到报错信息
但是你代码里不是用了cmd来调用参数么?不使用控制台?
打包exe代码:(文件名不能有空格)
-F:打包后只生成单个exe格式文件,适用于小程序,启动速度较慢;
-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件,启动速度快;
-c:默认选项,使用控制台(就是类似cmd的黑框);
-w:不使用控制台;
-p:添加搜索路径,让其找到对应的库;
-i:改变生成程序的icon图标。

wnhuiyou 发表于 2020-9-25 14:58:58

疾风怪盗 发表于 2020-9-25 14:46
那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊

还想请教你一个问题,为什么直接用pycharm去运行,程序启动很快, 但是生产EXE后,去执行,打开好慢呀。。   

wnhuiyou 发表于 2020-9-25 15:01:07

疾风怪盗 发表于 2020-9-25 14:57
不需要拼手速,在文件的路径下cmd,和cd到文件的效果一样,然后再输入exe文件运行,就能看到报错信息
...

对,是用CMD调用参数,难道一定要带有控制台显示? 有没有其他办法可以不显示控制台?

疾风怪盗 发表于 2020-9-25 15:02:54

wnhuiyou 发表于 2020-9-25 14:58
还想请教你一个问题,为什么直接用pycharm去运行,程序启动很快, 但是生产EXE后,去执行,打开好慢呀 ...

你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运行你的窗口界面,所以,就是因为你代码用了cmd,但是又不要控制台打包,引起的问题

启动速度,不知道,python打包后就是这样的,启动速度慢
如果要快一点,可以用-D产生大量文件的方式打包,会稍微快一点

wnhuiyou 发表于 2020-9-25 15:07:36

疾风怪盗 发表于 2020-9-25 15:02
你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运 ...

还真的是,看来只能带控制台了,真的非常感谢你!!!谢谢!

上图生成的那一大堆文件,一个都不能删除吗? 我想简单一点做个压缩包 到时候给我同事直接解压缩就可以了,但是文件太多了。

最后在请教一个问题,我做这个小程序,前提是要配好 adb环境我尝试用批处理去 新增 path 可以成功,但是基于我这段代码 要怎么写呢?

wnhuiyou 发表于 2020-9-25 15:13:18

疾风怪盗 发表于 2020-9-25 15:02
你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运 ...

发现了一个BUG,就是 帮助 这个按钮我是做了一个新窗口 来把一些快捷键的信息图片展示出来
现在我一点 就成这样了什么情况 放大也是什么都没有



疾风怪盗 发表于 2020-9-25 15:13:55

你百度一下应该就有,我笔记里就这段代码,但是没实际用过,可以试试看
import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'#注意修改你的路径

不要控制台的方法,我是不知道,你也可以网上找找看

生成的文件不要删,都是有用的吧,你可以把文件都放在D盘,做一个exe的快捷方式放桌面,不就看不到这么多文件了么

疾风怪盗 发表于 2020-9-25 15:19:50

本帖最后由 疾风怪盗 于 2020-9-25 15:24 编辑

wnhuiyou 发表于 2020-9-25 15:13
发现了一个BUG,就是 帮助 这个按钮我是做了一个新窗口 来把一些快捷键的信息图片展示出来
现在我一点 ...

对了,你的图片没有放到exe同级目录吧?因为你写的是相对路径

wnhuiyou 发表于 2020-9-25 15:32:39

疾风怪盗 发表于 2020-9-25 15:19
对了,你的图片没有放到exe同级目录吧?因为你写的是相对路径

{:5_95:}是的,我把图片放到同级目录就好了,谢谢你! 爱你! 可以添加你为好友吗?


不过我有个疑问,为什么打包的时候不自动打包过去?

疾风怪盗 发表于 2020-9-25 15:40:19

wnhuiyou 发表于 2020-9-25 15:32
是的,我把图片放到同级目录就好了,谢谢你! 爱你! 可以添加你为好友吗?




打包是不会打包图片资源的,所以我一般专门一个source文件夹,所有用到的图片什么都放进去,然后再放到打包好的文件夹里,这样也不会乱,容易找到

wnhuiyou 发表于 2020-9-25 16:52:02

疾风怪盗 发表于 2020-9-25 15:40
打包是不会打包图片资源的,所以我一般专门一个source文件夹,所有用到的图片什么都放进去,然后再放到打 ...

再请教一个问题,我启动后,原本点击 投屏的窗口 然后键盘上按组合键 比如 ATL + F是全屏我想把他做成按钮式 在 帮助 按钮旁边我该怎么发送组合快捷键呀?
页: [1]
查看完整版本: PyQt打包成EXE后,无法打开,怎么解决?