我创建的程序遇到问题,我正在尝试制作一个对驱动器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()
答案 0 :(得分:0)
我发现了问题。对于任何为此苦苦挣扎的人,您都需要添加呼叫以更新进度栏。对我来说,我在运行methon时说了progressBar.update
答案 1 :(得分:0)
我一直困扰着这个问题很长时间,直到找到关于使用多线程的stackoverflow答案。
Tkinter窗口说(不响应),但是代码正在运行。您要为sql查询函数创建一个线程,像这样
从线程导入线程
线程(目标=运行,参数=(命令,))。 Start()