Windows程序不响应Tkinter GUI的问题

时间:2019-01-07 23:58:48

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

我创建的程序遇到问题,我正在尝试制作一个对驱动器usind dism进行映像的程序。当在cmd中运行dism命令时,它给出了一定百分比的完成率,因此,我尝试采用该百分比(使用正则表达式)并将其放在自己的进度条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()

2 个答案:

答案 0 :(得分:0)

我发现了问题。对于任何为此苦苦挣扎的人,您都需要添加呼叫以更新进度栏。对我来说,我在运行methon时说了progressBar.update

答案 1 :(得分:0)

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

Tkinter窗口说(不响应),但是代码正在运行。您要为sql查询函数创建一个线程,像这样

从线程导入线程

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