Я использую пример, который я нашел в Интернете, где у меня есть несколько фреймов, созданных объектно-ориентированным способом. Теперь я также хочу добавить индикатор выполнения в мои действия с кнопками, но он не работает, см. Ниже о том, что я пытался сделать. Я в настоящее время получаю сообщение об ошибке "бар" не определено. как я могу заставить его запускать функцию, где он перебирает список с индикаторами выполнения. я еще нубский программист, и это я пытаюсь выучить OOP.
import tkinter as tk
import tkinter.filedialog as filedialog
from tkinter import ttk
import time
import os
LARGE_FONT = ("Verdana", 12)
class PreProcessApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
#self.bar()
self._frame = None
self.switch_frame(CheckFiles)
self.title("PreProcessing")
def switch_frame(self, frame_class):
"""Destroys current frame and replaces it with a new one."""
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.grid(row = 0, column = 0, sticky = 'nsew')
class StartPage(tk.Frame):
#not important
pass
# not sure if this is the right way to handle this I am new to "oop"
class Progression(tk.Frame):
def __init__(self, *args):
tk.Frame.__init__(self, *args)
self.label =tk.Label(self, text="Running", font = LARGE_FONT)
self.label.grid(pady=10, padx=10)
self.prog_bar = ttk.Progressbar(self, orient='horizontal', length = 286, mode ='determinate')
self.prog_bar.grid(column=0, row=3, sticky="nesw", pady=2, padx=5)
class CheckFiles(tk.Frame):
prog_bar = None
def __init__(self, master):
tk.Frame.__init__(self, master)
label = tk.Label(self, text="Checking Files", font = LARGE_FONT)
label.grid(pady=10, padx=10)
#depending on the action buttons are handled differently
#function for switching frames is created on line 30
button1 = tk.Button(self, text = "Back", command=lambda: master.switch_frame(StartPage))
button1.grid(column=1, row=5, sticky="ew", pady=2, padx=5)
#actions must be passed through lambda otherwise all actions tied to functions get executed when the frame is called
button2 = tk.Button(self, bg="green" , fg="white", text = "Yes", command=lambda:self.handle_yes(master))
button2.grid(column=2, row=5, sticky="ew", pady=2, padx=5)
#this button is not a function so it does not need to be passed through lambda
button3 = tk.Button(self, bg="red" , fg="white",text = "No", command=self.master.destroy)#tie to terminate app
button3.grid(column=3, row=5, sticky="ew", pady=2, padx=5)
def run_bar(self, prog_bar):
self.prog_bar["maximum"] = 100
self.prog_bar.start()
for x in list_of_files:
time.sleep(0.05)
self.prog_bar['value']=x
self.prog_bar.update()
self.prog_bar["value"] = 0
im
def handle_yes(self, master):
master.switch_frame(Progression)
Progression().__init__(self.run_bar(None))
master.switch_frame(ExtraFiles)
class ExtraFiles(tk.Frame):
#not important
pass
app=PreProcessApp()
app.mainloop()