gpt4 book ai didi

python - 如何使用 tkinter 更新框架?

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:14 25 4
gpt4 key购买 nike

我使用 tkinter 创建了两个框架。在名为 StarterPage 的第一帧中有一个执行功能的按钮:

estrazioneCanzoni(sp, codice_playlist_piaciute, codice_playlist_non_piaciute)

哪里有这个声明:

global scoreDecisionTree, scoreKnn, scoreRandomForest, scoreKmeans

以及我用一些值评估先前变量的地方。我已经检查了全局变量的评估是否可以使用控制台打印它们。

该按钮还打开了 PageOne框架。问题是 PageOne框架显示为 scoreDecisionTree 的值, scoreKnn , scoreRandomForestscoreKmeans : None ,而不是我在控制台中打印它们时可以看到的实际值,而不是使用 tkinter gui。我认为问题在于 PageOne框架是在开始时创建的,从不更新。我该如何解决?

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()

最佳答案

PageOne label.config 调用移动到 PageOne.update_globals 方法中:

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))

并制作一个 StartApp.update_globals 方法,当全局变量发生变化时,它会向所有需要更新的框架发送方法调用:

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

然后让 StartPageparametri 中调用 controller.update_globals():

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

因此,每当按下 Analizza 按钮时,estrazioneCanzoni 都会更改全局变量,controller.update_globals() 处理 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()

关于python - 如何使用 tkinter 更新框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com