Индикатор Tkinter Progress без прогресса

У меня возникла проблема при построении индикатора выполнения и использовании объектно-ориентированного подхода. Следующий код создает главное окно с индикатором выполнения и тремя кнопками, а также еще одну. Почему код создает это второе окно?

Кроме того, индикатор выполнения не показывает реального прогресса. Кнопки настроены на увеличение значения индикатора выполнения с помощью метода step(20).

Я установил максимальное значение, но, похоже, оно не работает.

Примечание. Мне нужно создать переменную progressbar перед методом init, чтобы иметь возможность вызывать ее в команде выполнения кнопки.

class Window(tkinter.Frame):
button1 = Button()
button2 = Button()
button3 = Button()
progressBar = tkinter.ttk.Progressbar()
def __init__(self, master):
    super().__init__(master)

    master.title("Prueba JVS")
    master.geometry("600x600")
    self.frame = Frame(root)
    self.frame.pack()

    leftframe = Frame(master)
    leftframe.pack(side=LEFT)

    rightframe = Frame(master)
    rightframe.pack(side=RIGHT)

    label = Label(self.frame, text = "Genetic JVS App")
    label.pack()

    button1 = Button(leftframe, text = "Botón +", height=5, width=10, command=self.increment())
    button1.pack(padx=30, pady=3)
    button2 = Button(leftframe, text = "Valor", height=5, width=10, command=self.display())
    button2.pack(padx=30, pady=3)
    button3 = Button(rightframe, text = "Generar", height=5, width=10, command=self.button_clicked())
    button3.pack(padx=30, pady=3)

    #self.frame = tkinter.Frame(self.master)
    # Barra de progreso.
    self.progressBar = tkinter.ttk.Progressbar(self.frame, length=500)
    self.progressBar.configure(maximum=200)
    self.progressBar.pack(padx=10, pady=50)

    self.frame.pack(padx=50, pady=5)

def increment(self):
    self.progressBar.step(20)

def decrement(self):
    self.progressBar.step(-20)

def reset(self):
    self.progressBar["value"] = 0

def display(self):
    print(self.progressBar["value"])
    logging.info("Valor: %i", self.progressBar["value"])
def button_clicked(self):
    print('Button clicked')
    logging.info("Botón 3 pulsado.")
    self.progressBar.step(5)

root = Tk()
window = Window(root)
root.mainloop()

Определение класса Window создало три бесполезные кнопки — это произошло до того, как вы вызвали Tk() для создания корневого окна — поэтому окно было автоматически создано для их хранения. (Вы никогда не вызывали .pack() или что-то подобное на этих кнопках, поэтому они на самом деле не видны). Настоящие кнопки не работают, потому что вы сами вызываете командные функции и передаете их возвращаемое значение (которое равно None) в качестве действия, выполняемого при нажатии кнопки. Вы хотите, например, просто command=self.increment - без скобок после него.

jasonharper 02.04.2023 20:39

Отступ не правильный. Снимите все скобки в command=self.increment, command=self.display и command=self.button_clicked.

toyota Supra 02.04.2023 21:48
self.frame = Frame(root) должно быть self.frame = Frame(master)
toyota Supra 02.04.2023 21:49

Оно работает. Всем спасибо за ответ, он мне очень помог, в том числе и для понимания происходящего.

Jorge Vega Sánchez 02.04.2023 23:31

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

relent95 04.04.2023 05:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот код, который работает.

class Window(tkinter.Frame):

def __init__(self, master):
    super().__init__(master)

    master.title("Prueba JVS")
    master.geometry("600x600")
    self.frame = Frame(master)
    self.frame.pack()

    leftframe = Frame(master)
    leftframe.pack(side=LEFT)

    rightframe = Frame(master)
    rightframe.pack(side=RIGHT)

    label = Label(self.frame, text = "Genetic JVS App")
    label.pack()

    button1 = Button(leftframe, text = "Botón +", height=5, width=10, command=self.increment)
    button1.pack(padx=30, pady=3)
    button2 = Button(leftframe, text = "Valor", height=5, width=10, command=self.display)
    button2.pack(padx=30, pady=3)
    button3 = Button(rightframe, text = "Generar", height=5, width=10, command=self.button_clicked)
    button3.pack(padx=30, pady=3)

    #self.frame = tkinter.Frame(self.master)
    # Barra de progreso.
    self.progressBar = tkinter.ttk.Progressbar(self.frame, mode='determinate', length=500)
    self.progressBar.configure(maximum=200)
    self.progressBar.pack(padx=10, pady=50)

    self.frame.pack(padx=50, pady=5)

def increment(self):
    self.progressBar.step(20)

def decrement(self):
    self.progressBar.step(-20)

def reset(self):
    self.progressBar["value"] = 0

def display(self):
    print(self.progressBar["value"])
    logging.info("Valor: %i", self.progressBar["value"])
def button_clicked(self):
    print('Button clicked')
    logging.info("Botón 3 pulsado.")
    self.progressBar.step(5)




root = Tk()
window = Window(root)
root.mainloop()

Другие вопросы по теме