2 votes

Comment mettre à jour le cadre en utilisant tkinter ?

J'ai créé deux cadres en utilisant tkinter. Dans le premier cadre nommé StarterPage il y a un bouton qui exécute la fonction :

estrazioneCanzoni(sp, codice_playlist_piaciute, codice_playlist_non_piaciute)

où il y a cette déclaration :

global scoreDecisionTree, scoreKnn, scoreRandomForest, scoreKmeans

et où j'évalue les variables précédentes avec certaines valeurs. J'ai vérifié que l'évaluation des variables globales fonctionne en les imprimant à l'aide de la console.

Le bouton permet également d'ouvrir le PageOne cadre. Le problème est que PageOne cadre montre comme valeur pour scoreDecisionTree , scoreKnn , scoreRandomForest y scoreKmeans : None au lieu des valeurs réelles que je peux voir lorsque je les imprime dans la console, sans utiliser le gui de tkinter. Je pense que le problème est que PageOne Le cadre est créé au départ et n'est jamais mis à jour. Comment puis-je le résoudre ?

scoreDecisionTree=None
scoreKnn=None
scoreRandomForest=None
scoreKmeans=None

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        self.frames["StartPage"] = StartPage(parent=container, controller=self)
        self.frames["PageOne"] = PageOne(parent=container, controller=self)

        self.frames["StartPage"].grid(row=0, column=0, sticky="nsew")
        self.frames["PageOne"].grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        sp=login()
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="ID playlist canzoni piaciute", font = "Times 15")
        label.pack(side="top", fill="x", pady=10)

        self.entry1 = tk.Entry(self, width=30)
        self.entry1.pack(side="top", fill="x", pady=10)

        label = tk.Label(self, text="ID playlist canzoni non piaciute",font = "Times 15")
        label.pack(side="top", fill="x", pady=10)

        self.entry2 = tk.Entry(self, width=30)
        self.entry2.pack(side="top", fill="x", pady=10)

        def parametri():
            estrazioneCanzoni(sp, self.entry1.get(), self.entry2.get())
            controller.show_frame("PageOne")

        button1 = tk.Button(self, text="Analizza",
                            command= lambda: parametri())

        button1.pack()

class PageOne(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="Accuratezza", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        label1 = tk.Label(self, font="Times 12" )
        label1.pack(side="top", fill="x", pady=10)
        label1.config(text = "Decision tree: {}".format(scoreDecisionTree))
        label2 = tk.Label(self, font="Times 12" )
        label2.pack(side="top", fill="x", pady=10)
        label2.config(text = "Knn: {}".format(scoreKnn))
        label3 = tk.Label(self, font="Times 12" )
        label3.pack(side="top", fill="x", pady=10)
        label3.config(text = "Random forest: {}".format(scoreRandomForest))
        label4 = tk.Label(self, font="Times 12" )
        label4.pack(side="top", fill="x", pady=10)
        label4.config(text = "Kmeans: {}".format(scoreKmeans))

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

1voto

unutbu Points 222216

Déplacez le PageOne label.config dans un PageOne.update_globals méthode :

def update_globals(self):
    self.label1.config(text="Decision tree: {}".format(scoreDecisionTree))
    self.label2.config(text="Knn: {}".format(scoreKnn))
    self.label3.config(text="Random forest: {}".format(scoreRandomForest))
    self.label4.config(text="Kmeans: {}".format(scoreKmeans))

et faire un StartApp.update_globals qui envoie des appels de méthode à tous les cadres qui doivent être mis à jour lorsque les globaux changent :

def update_globals(self):
    frame = self.frames["PageOne"]
    frame.update_globals()

Alors ayez StartPage appelez controller.update_globals() à l'intérieur de parametri :

def parametri():
    estrazioneCanzoni(sp, self.entry1.get(), self.entry2.get())
    controller.update_globals()
    controller.show_frame("PageOne")

Ainsi, chaque fois que le Analizza est appuyée, estrazioneCanzoni change les globales, et controller.update_globals() gère la mise en place des étiquettes dans PageOne .


import tkinter as tk
from tkinter import font as tkfont

scoreDecisionTree = None
scoreKnn = None
scoreRandomForest = None
scoreKmeans = None

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(
            family='Helvetica', size=18, weight="bold", slant="italic")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        self.frames["StartPage"] = StartPage(parent=container, controller=self)
        self.frames["PageOne"] = PageOne(parent=container, controller=self)

        self.frames["StartPage"].grid(row=0, column=0, sticky="nsew")
        self.frames["PageOne"].grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

    def update_globals(self):
        frame = self.frames["PageOne"]
        frame.update_globals()

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        sp = login()
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(
            self, text="ID playlist canzoni piaciute", font="Times 15")
        label.pack(side="top", fill="x", pady=10)

        self.entry1 = tk.Entry(self, width=30)
        self.entry1.pack(side="top", fill="x", pady=10)

        label = tk.Label(
            self, text="ID playlist canzoni non piaciute", font="Times 15")
        label.pack(side="top", fill="x", pady=10)

        self.entry2 = tk.Entry(self, width=30)
        self.entry2.pack(side="top", fill="x", pady=10)

        def parametri():
            estrazioneCanzoni(sp, self.entry1.get(), self.entry2.get())
            controller.update_globals()
            controller.show_frame("PageOne")

        button1 = tk.Button(self, text="Analizza", command=lambda: parametri())

        button1.pack()

class PageOne(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        label = tk.Label(self, text="Accuratezza", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        self.label1 = tk.Label(self, font="Times 12")
        self.label1.pack(side="top", fill="x", pady=10)
        self.label2 = tk.Label(self, font="Times 12")
        self.label2.pack(side="top", fill="x", pady=10)
        self.label3 = tk.Label(self, font="Times 12")
        self.label3.pack(side="top", fill="x", pady=10)
        self.label4 = tk.Label(self, font="Times 12")
        self.label4.pack(side="top", fill="x", pady=10)

    def update_globals(self):
        self.label1.config(text="Decision tree: {}".format(scoreDecisionTree))
        self.label2.config(text="Knn: {}".format(scoreKnn))
        self.label3.config(text="Random forest: {}".format(scoreRandomForest))
        self.label4.config(text="Kmeans: {}".format(scoreKmeans))

def login():
    # just a simple example to allow the program to run
    return 10

def estrazioneCanzoni(sp, a, b):
    # just a simple example to allow the program to run
    global scoreDecisionTree, scoreKnn, scoreRandomForest, scoreKmeans
    scoreDecisionTree, scoreKnn, scoreRandomForest, scoreKmeans = sp, a, b, a+b

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X