我试图为我的程序需要的一些软件包建立一个安装程序.我也想有一个状态栏,显示当前的进度


import tkinter as tk
import multiprocessing
from tkinter import messagebox
def installPackages_1(self):
self.t = ""
label = tk.Label(fenster, text="Checking for packages...").place(x=60, y=100)
pb = ttk.Progressbar(fenster, orient='horizontal', mode='determinate', length=280)
pb.place(x=180, y=100)
fenster.update()
packages = ["pandas", "openpyxl", "odfpy"]
for i in packages:
t1 = multiprocessing.Process(target=self.installPackages_2(i))
t1.start()
pb['value'] += 100 / 3
fenster.update()
label1 = tk.Label(fenster, text="Done").place(x=30, y=100, width=450, height=25)
fenster.update()
m_text = "nStatus:n%s" % (self.t)
tk.messagebox.showinfo(message=m_text, title="Installation")
def installPackages_2(self,package):
s = ""
s = str(subprocess.check_output([sys.executable, '-m', 'pip', 'install', package]))[2:12]
if s == "Collecting":
self.t += "Package '%s' installedn" % (package)
else:
self.t += "[OK]: Paket '%s' foundn" % (package)

当我将python程序转换为。exe时,tkinter窗口打开多次,我认为这是因为子进程中断了tkinter窗口的进程。我试图实现某种多处理,但它没有改变任何东西。我通过auto- pto -exe转换。

Pyinstaller已经将这些库与你的可执行文件捆绑在一起,你不需要检查它们。

检查库并安装它们是完全没有必要的(并且不像你想象的那么简单),不要在可执行文件中调用这两个函数,你的应用程序会正常工作,因为你不需要调用它们。

不用说,以这种方式检查它们的存在将失败,并将导致许多不良行为,因为应用程序不再作为脚本上的python可执行文件运行,而是作为嵌入式解释器运行,换句话说,sys.executable不再指向python.exe

检查某个库是否存在的正确方法是使用importlib.util。Find_spec,它应该正确地工作于冻结的应用程序,但同样,您不需要它用于可执行文件,因为pyinstaller已经打包了所有依赖项。

最新更新