【问题标题】:Python Tkinter with Pyscreenshot script doesn't run after compiling with Pyinstaller使用 Pyinstaller 编译后,带有 Pyscreenshot 脚本的 Python Tkinter 无法运行
【发布时间】:2025-12-18 23:45:01
【问题描述】:

我的脚本运行顺利。然而,在使用 Pyinstaller 编译、启动 .exe 并单击开始按钮后,GUI 再次打开并崩溃。

def grabberfunc(*args):
    im = ImageGrab.grab()
    savedir=str(mappa)
    savefile="Screenshot_"+str("{:%Y_%m_%d-%H_%M_%S}".format(datetime.datetime.now()))+".png"
    savedirfile=join(savedir,savefile)
    im.save(str(savedirfile))

def scanning():
    interval=deftimeInput.get()
    if running:
        grabberfunc()
    root.after(int(interval)*1000, scanning)

if __name__=='__main__':
    root = tkinter.Tk()
    ...

有一个带有 2 个按钮的基本 GUI:“开始”设置“运行”变量“真”,“停止”反之亦然。 如果脚本运行,则 GUI 不会再次打开并按我想要的方式运行。

【问题讨论】:

  • 你能从命令行运行 .exe 吗?这将使窗口保持打开状态,您将能够看到任何错误。
  • 不幸的是没有错误和警告。 exe 从命令行运行,出现下一个提示。当我单击“开始”按钮时,GUI 再次出现,但没有警告。
  • 如果我在调试中运行 exe,当 GUI 再次打开时,我在命令行中得到完全相同的消息。可能与“扫描”函数中的递归调用有关?
  • 问题不在于递归,而在于调用pyscreenshot的grab()方法的那一行。如果省略此行,exe 运行良好。然而,如果没有这个功能,程序的目的就无法实现。

标签: python tkinter screenshot pyinstaller


【解决方案1】:

终于找到解决办法了。

应该从PIL 导入ImageGrab 模块,而不是导入pyscreenshot 模块

所以正确的导入是:

from PIL import ImageGrab

pyinstaller编译脚本后,exe运行正常。

【讨论】:

  • 哇,谢谢,我遇到了完全相同的问题(python tk + pyscreenshot + pyinstaller),这解决了。
最近更新 更多