我正在尝试使用通过调度程序进程调用的方法来更新标签,但是当我尝试配置标签时,应用程序因分段错误而崩溃
这是我的脚本
class Gui():
def __init__(self):
app = Tk()
self.initialize_user_interface()
def initialize_user_interface(self):
self.title("Title")
self.geometry(f"{1100}x{700}")
self.sidebar_frame = Frame(self)
self.my_label = Label(self.sidebar_frame)
thread = threading.Thread(target=self.start_schedule, daemon=True)
thread.start()
def start_schedule(self):
schedule.every(30).seconds.do(lambda: self.update_label())
def update_label(self):
self.my_label=configure(text="Custom Text")
if __name__ == "__main__":
app = Gui()
app.mainloop()
我尝试使用 self 调用类内部的方法,但我不断收到分段错误的错误
这是一个工作示例,每 3 秒将
Label
小部件的文本更新为随机数。它演示了如何使用 tkinter 的 after
方法来处理此问题,而不是依赖于 threading
和其他模块。
我还解决了阻止
Frame
和 Label
出现的问题,方法是将它们都传递给 pack()
,并且修复了 self.my_label.configure
中的拼写错误
from tkinter import *
from random import randint # for demonstration purposes
class Gui(Tk): # inherit from Tk in your main app class
def __init__(self) -> None:
super().__init__() # initialize tkinter
self.initialize_user_interface()
self.update_label()
def initialize_user_interface(self) -> None:
self.title("Title")
self.geometry(f"{1100}x{700}")
self.sidebar_frame = Frame(self)
self.sidebar_frame.pack()
self.my_label = Label(self.sidebar_frame)
self.my_label.pack()
def update_label(self) -> None:
"""Set the label to a random value for demonstration"""
self.my_label.configure(text=randint(0, 100))
# repeat this function after however many mS
self.after(3000, self.update_label)
if __name__ == "__main__":
app = Gui()
app.mainloop()
顺便说一句,您通常希望避免“明星”导入,例如
from tkinter import *
,因为它们可能导致称为“命名空间污染”的问题(想想如果您正在使用的其他模块也有一个类,会发生什么命名为Label
)。通常,您会看到 import tkinter as tk
,然后使用 tk
作为前缀实例化任何相关类,例如 tk.Label
、tk.Button
等。