【问题标题】:Im trying to build an Installer for some packages that my programm needs. I also want to have a Status bar which shows the current progress我正在尝试为我的程序需要的一些包构建一个安装程序。我还想要一个显示当前进度的状态栏
【发布时间】:2022-12-04 09:23:56
【问题描述】:
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' installed\n" % (package)
    else:
        self.t += "[OK]: Paket '%s' found\n" % (package)

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

【问题讨论】:

    标签: python tkinter multiprocessing subprocess


    【解决方案1】:

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

    检查库并安装它们是完全没有必要的(而且并不像您预期​​的那么简单),不要在您的可执行文件中调用任何一个函数,您的应用程序将正常运行,因为您无论如何都不需要调用它们。

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多