У меня возникла проблема при построении индикатора выполнения и использовании объектно-ориентированного подхода. Следующий код создает главное окно с индикатором выполнения и тремя кнопками, а также еще одну. Почему код создает это второе окно?
Кроме того, индикатор выполнения не показывает реального прогресса. Кнопки настроены на увеличение значения индикатора выполнения с помощью метода 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()
Отступ не правильный. Снимите все скобки в command=self.increment
, command=self.display
и command=self.button_clicked
.
self.frame = Frame(root)
должно быть self.frame = Frame(master)
Оно работает. Всем спасибо за ответ, он мне очень помог, в том числе и для понимания происходящего.
Почему бы не ответить на свой вопрос? Также отредактируйте код для правильного отступа.
Вот код, который работает.
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()
Определение класса
Window
создало три бесполезные кнопки — это произошло до того, как вы вызвалиTk()
для создания корневого окна — поэтому окно было автоматически создано для их хранения. (Вы никогда не вызывали.pack()
или что-то подобное на этих кнопках, поэтому они на самом деле не видны). Настоящие кнопки не работают, потому что вы сами вызываете командные функции и передаете их возвращаемое значение (которое равно None) в качестве действия, выполняемого при нажатии кнопки. Вы хотите, например, простоcommand=self.increment
- без скобок после него.