Что-то идет не так, когда я делаю мой индикатор в графическом интерфейсе

python tkinter

46 просмотра

1 ответ

После того, как мне удалось создать индикатор выполнения в консоли, я подумал об обновлении программы до графического интерфейса.

Это мой код:

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петля является проблемой здесь.

Может кто-нибудь сказать мне, в чем проблема в этой программе?

Автор: Daniel Engel Источник Размещён: 08.11.2019 11:15

Ответы (1)


2 плюса

Решение

Посмотрите на этот код:

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)
Автор: Aran-Fey Размещён: 20.08.2016 11:58
Вопросы из категории :
32x32