объектно-ориентированная реализация индикатора выполнения tkinter - PullRequest
0 голосов
/ 30 апреля 2020

Я использую пример, который я нашел в Интернете, где у меня есть несколько фреймов, созданных объектно-ориентированным способом. Теперь я также хочу добавить индикатор выполнения в мои действия с кнопками, но он не работает, см. Ниже о том, что я пытался сделать. Я в настоящее время получаю сообщение об ошибке "бар" не определено. как я могу заставить его запускать функцию, где он перебирает список с индикаторами выполнения. я еще нубский программист, и это я пытаюсь выучить 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...