【发布时间】:2016-08-20 19:58:48
【问题描述】:
在控制台成功制作进度条后,我考虑将程序升级到GUI。
这是我的代码:
from tkinter import *
class Progress(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.value = 1
self.endvalue = 100
self.bar_length = 20
self.label1 = Label(self)
self.label1.grid()
self.button1 = Button(self, text = "Start", command = self.startprogress())
self.button.grid()
def startprogress(self):
while self.value <= self.endvalue:
root.after(100, self.updateprogress)
def updateprogress(self):
percent = float(self.value) / self.endvalue
arrow = '|' * int(round(percent * self.bar_length)-1) + '|'
spaces = ' ' * (self.bar_length - len(arrow))
self.label1.configure( text = "Percent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100))) )
self.value+=1
root = Tk()
root.title("Progress")
app = Progress(root)
root.mainloop()
当我启动程序时,它什么也不做;没有错误,没有窗口上升。
我开始调试它,试图了解问题所在。如果我删除__init__ 函数下的所有代码,窗口就会上升。为此,我认为while 循环可能是这里的问题。
谁能告诉我这个程序有什么问题?
【问题讨论】:
-
不要调用您尝试连接到事件处理程序的函数,以防万一。也许一千年后人们最终会理解这个概念......
command = self.startprogress()->command = self.startprogress. -
做到了。窗口出现了,但是当我按开始时,整个程序就冻结了
-
您的
startprogress函数在self.value递增之前将一万亿self.updateprogress与root.after(100, self.updateprogress)排队。摆脱循环,只需在updateprogress的底部执行root.after(100, self.updateprogress)。 -
但我需要循环来完成进度
-
成功了。谢谢!