【问题标题】:Something going wrong while making my progress bar in GUI在 GUI 中制作进度条时出现问题
【发布时间】: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.updateprogressroot.after(100, self.updateprogress) 排队。摆脱循环,只需在updateprogress 的底部执行root.after(100, self.updateprogress)
  • 但我需要循环来完成进度
  • 成功了。谢谢!

标签: python tkinter


【解决方案1】:

看看这段代码:

def startprogress(self):
    while self.value <= self.endvalue:
        root.after(100, self.updateprogress)

这是一个无限循环。我希望我不需要解释为什么。

你可能想做的是:

def startprogress(self):
    # queue ONE call to self.updateprogress
    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

    # now that self.value has been incremented, queue ANOTHER call
    if self.value <= self.endvalue:
        root.after(100, self.updateprogress)

【讨论】:

  • 正是我所做的。谢谢
  • 它不仅是一个无限循环,它还是一个无限循环,它会创建无限循环。
  • command = self.startprogress() 是原始问题的一部分也可以解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多