gpt4 book ai didi

python - 由 Pyinstaller exe 生成的带有 tkinter GUI 的 Exe 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:04 25 4
gpt4 key购买 nike

我使用 Pyinstaller 将 Python 脚本转换为独立的可执行程序。

当我在spyder中测试我的脚本时,它可以工作,但作为exe文件却不能,我不明白为什么。

计划详情

我的程序由以下部分组成:

  • 由一系列函数组成的处理。它以两个 csv 文件作为输入并返回单行 pandas DataFrame。最后一个函数称为 add_data()

  • test() 函数调用 add_data(),将其结果保存在 csv 文件中,并在执行结束时通知用户

  • 带有 try-except 条件的 execute_test() 函数; try 使用来自 GUI 的用户输入调用 test(), except 显示错误消息框。

  • tkinter GUI 要求用户选择两个 csv 文件 + test() 将保存 csv 结果的目录。

行为

在spyder上,当执行python脚本时,我选择文件和目录,它返回“处理完成”消息框,因此问题不应来自脚本本身。

Pyinstaller 成功构建了 exe 文件。我可以打开它,出现 GUI 和命令提示符;条目和按钮工作正常。

在选择相同的文件和目录后启动处理时,它仅返回错误消息框,这意味着处理由于某种原因没有执行。我从提示中收到的唯一消息是:

C:\Users...\Continuum\miniconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py:627: MatplotlibDeprecationWarning: The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3.

我没有在我的程序中显式导入ma​​tplotlib,而且我之前也没有在我的环境中安装它。我在收到此消息后执行了此操作,但没有任何改变。

包括我的治疗的整个代码太长,但我明确导入的是:pandasgeopandasshapely.geometrytkinter(参见下面的代码)。由于我之前遇到过问题(已解决),因此在使用 geopandas 时似乎也需要 pyproj

Pyinstaller信息

如果需要,我可以提供将脚本转换为 .exe 时得到的完整提示输出。值得一提的是我得到了:

  • 一些排除导入,涉及PySide、PyQt5、gtk、matplotlib、PyQt4、tkinter

  • 警告:71826警告:未找到隐藏导入“PyQt5.sip”!

  • 并且警告指出它没有找到某些DLL:

81853 INFO: Looking for dynamic libraries
81931 WARNING: lib not found: tbb.dll dependency of ...\mkl_tbb_thread.dll
81978 WARNING: lib not found: msmpi.dll dependency of C:\Users\...\bin\mkl_blacs_msmpi_lp64.dll
82509 WARNING: lib not found: pgf90rtl.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82525 WARNING: lib not found: pgc14.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82556 WARNING: lib not found: pgf90.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82587 WARNING: lib not found: msmpi.dll dependency of C:\Users\...\bin\mkl_blacs_msmpi_ilp64.dll
82634 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\...\bin\mkl_blacs_mpich2_lp64.dll
82712 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\...\bin\mkl_blacs_mpich2_ilp64.dll
82869 WARNING: lib not found: impi.dll dependency of C:\Users\...\bin\mkl_blacs_intelmpi_lp64.dll
83025 WARNING: lib not found: impi.dll dependency of C:\Users\...\bin\mkl_blacs_intelmpi_ilp64.dll

配置

我使用 Miniconda 并尽量避免使用 pip。我的环境配置是:

  • Windows 10 / conda 4.7.10 / Python 3.7.3 / spyder 3.3.6
  • pandas 0.25.0 / geopandas 0.5.1 / pyproj 2.2.1 / tk 8.6.9
  • numpy 1.16.4 / matplotlib 3.1.1
  • pyinstaller 3.5 / setuptools 41.0.1 / pywin32 224

还有很多我不太了解的其他包和模块(尽管不是 anaconda)。

我什至不知道到底要放什么标题,因为我不知道错误来自哪里(我的猜测是 tkinter、matplotlib 或者可能是 numpy)。

我还想说,我是一个相当初级的程序员,我在整个包/模块/导入/依赖项/DLL/兼容性方面遇到了困难。仍在研究它,我广泛理解大多数概念,但我可能需要详细解释这个级别上发生的事情才能调试它。有人可以帮忙吗?

我的代码

from tkinter import Tk, Frame, Label, Button, Entry,\
filedialog as fd, messagebox

## Functions that will be called by user interaction with the GUI
def test(file_L, file_T, directory):

df_test = add_data(file_L, file_T) # calls the previous treatment

path=str(directory)+'/'+'test_result.csv'
df_test.to_csv(path, encoding='utf-8', index=False)

messagebox.showinfo("End", "The treatment is done")

def execute_test(inputL, inputT, inputD):
try:
return test(inputL.filedir.get(),
inputT.filedir.get(),
inputD.selecdir.get())
except:
messagebox.showerror("Error", "The program failed to launch.\n"\
"Either the inputs are not correct, or an "\
"intern error occured.")

# Class Button + Entry to select a csv file
class Selection:
def __init__(self, master):
self.filedir = Entry(master, bd=2)
self.load_button = Button(master, text="...", bg='yellow',
command=self.loadFile)

def loadFile(self):
self.filename = fd.askopenfilename(
filetypes = (("csv files","*.csv"),("all files","*.*"))
)

self.filedir.delete(0,"end")
self.filedir.insert(0, self.filename)

# Class Button + Entry to select a directory
class Directory:
def __init__(self, master):
self.selecdir = Entry(master, bd=2)
self.load_button = Button(master, text="...", bg='yellow',
command=self.loadDir)

def loadDir(self):
self.dirname = fd.askdirectory()
self.selecdir.delete(0,"end")
self.selecdir.insert(0, self.dirname)

# GUI itself
if __name__=='__main__':

from functools import partial

#-----Defining the root
root = Tk()
root.geometry("+800+400")

#-----Defining the Frames
f2 = Frame(root)
f2.grid_columnconfigure(0, weight=2)
f2.grid_columnconfigure(1, weight=1)
f2.grid_rowconfigure(0, weight=1)
f2.grid_rowconfigure(1, weight=1)
f2.grid_rowconfigure(2, weight=1)
f2.grid_rowconfigure(3, weight=1)
f2.grid_rowconfigure(4, weight=1)
f2.grid_rowconfigure(5, weight=1)

f3 = Frame(root)

#-----Defining the widgets
TextL = Label(f2, text="Please select file L :")
L = Selection(f2)

TextT = Label(f2, text="Please select file T :")
T = Selection(f2)

TextD = Label(f2, text="Please select the directory in which the result "\
"will be saved as a csv :")
D = Directory(f2)


b_validate = Button(f3, text="Execute", bg='cyan',
command = partial(execute_test, L, T, D))
b_exit = Button(f3, text="Exit", bg='red', command = root.destroy)

#-----Geometry managers
f2.pack(expand=True)
f3.pack(side='right')

TextL.grid(row=0)
L.filedir.grid(row=1, column=0, sticky='ew')
L.load_button.grid(row=1, column=1, sticky='w')

TextT.grid(row=2)
T.filedir.grid(row=3, column=0, sticky='ew')
T.load_button.grid(row=3, column=1, sticky='w')

TextD.grid(row=4)
D.selecdir.grid(row=5, column=0, sticky='ew')
D.load_button.grid(row=5, column=1, sticky='w')

b_validate.pack(side='left')
b_exit.pack(side='left')


root.mainloop()

最佳答案

关注@M.R.回答这个问题的建议和有用的陈述是:

  • 可以忽略警告
  • 由于我在命令提示符中没有收到错误回溯,似乎阻止的不是我发布的代码,而是之前

我按功能检查了治疗功能的详细信息。看来(至少)有一个功能使整个事情不起作用。

这是一个调用 geopandas 和 shapely 的函数,之前曾出现过有关 pyproj 的错误;如果我自己调试失败,我可能会专门针对此事提出一个新问题(这与我在这里提出的问题相同:现在我的 python 脚本可以工作,我不明白为什么作为一个 exe突然就没有了)。在这种情况下,我将在此处链接下一个问题。

如果它可以帮助其他绝望的程序员,那么在调试过程中也对我有帮助的是:

  • 事实上我的函数已经分离(这使得生成单独的 exe 更容易)

  • 拥有一个最小的 GUI 将每个函数附带的可执行文件非常有用。如果有人遇到暗示用户输入的类似问题,请随意使用我发布的 GUI 代码作为布局(如果它可以节省您的时间)。您只需在开头添加您的函数,并更改您在 test() 部分中调用的内容(我在其中调用 add_data()

  • 我还遵循了 How to debug small programs 的建议。这需要时间,但这是值得的。

关于python - 由 Pyinstaller exe 生成的带有 tkinter GUI 的 Exe 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com