【问题标题】:Windows program not responding issue with tkinter guiWindows 程序没有响应 tkinter gui 的问题
【发布时间】:2019-06-02 15:47:27
【问题描述】:

我创建的程序有问题,我正在尝试制作一个程序来对使用 dism 的驱动器进行映像。当 dism 命令在 cmd 中运行时,它给出了一个完成百分比,所以我试图取这个百分比(使用正则表达式)并将它放在我自己的进度条 gui 中但是当我运行我的程序时,windows 给了我一个程序不是响应错误,我不知道为什么。程序继续在后台运行,完成后错误消失,但进度条不更新。我有一种感觉,这是因为我的 run 函数有自己的循环,所以 tkinter gui 可能在该循环完成之前不会更新。如果有人可以证实这一点或给我其他推理,将不胜感激。另外,如果您对解决此问题有任何想法,我会全力以赴。

import shlex
from tkinter import *
from tkinter import ttk


def run(command):
    progressBar['maximum'] = 100
    process = subprocess.Popen(shlex.split(command), stdin= subprocess.PIPE 
,stdout=subprocess.PIPE)
    while True:
        output = process.stdout.readline().decode()
        if output == '' and process.poll() is not None:
            break
        if output:
            matchObj = re.search(r'\d+\.\d%',output.strip())
            if matchObj:
                percentNum = re.search(r'\d+\.\d',matchObj.group())
                progressBar["value"] = 
round(float(percentNum.__getitem__(0)))
                print(type(progressBar["value"]))
                print(progressBar["value"])
            else:
                print(output.strip())
    rc = process.poll()
    progressBar["value"] = 0
    return rc





root = Tk()
root.title('Progress Bar')
root.geometry("300x100")

buttonFrame = LabelFrame(text="Options")
buttonFrame.grid(column=0,row=0)


backupCmd = 'Dism /Capture-Image /ImageFile:F:\my-windows-partition.wim 
/CaptureDir:"E:" /name:Windows \n'
button1 = Button(master=buttonFrame, text="Backup",command= lambda: 
run(backupCmd))
button1.grid(column = 0, row = 0)

restoreCmd = ''
button2 =Button(master=buttonFrame, text="Restore",command= lambda: 
run(restoreCmd))
button2.grid(column = 50, row = 0)

button3 =Button(master=buttonFrame, text="Exit",command= lambda: exit())
button3.grid(column = 100, row = 0)

progressBar = ttk.Progressbar(root, orient="horizontal", 
length=286,mode="determinate")
progressBar.grid(column = 0, row = 3, pady=10)

root.mainloop()

【问题讨论】:

    标签: python-3.x user-interface tkinter progress-bar


    【解决方案1】:

    我发现了这个问题。对于任何为此苦苦挣扎的人,您需要添加一个调用来更新进度条。对我来说,progressBar.update 在我的运行方法中

    【讨论】:

      【解决方案2】:

      我被这个问题困扰了很长时间,直到我在 stackoverflow 上找到了关于使用多线程的答案。

      Tkinter 窗口显示(没有响应)但代码正在运行你为 sql 查询函数创建一个线程,像这样

      从线程导入线程

      线程(目标 = 运行,参数 =(命令,))。开始()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 2018-02-19
        • 2016-01-18
        相关资源
        最近更新 更多