我需要从创建我的函数外部更新一些标签文本

2024-10-04 03:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个tkinter.标签创建在一个函数内,从我的代码完全分离的一部分,我需要更新文本。你知道吗

在过去的一个小时里,我尝试了谷歌提供的几乎所有解决方案,但我无法让它们中的任何一个正常工作,有些出现错误,有些显示空白,有些只是什么都做不了。你知道吗

我创建的标签如下

def createWindow():
    window = tkinter.Tk()
    container = tkinter.Frame(window, padx=5, pady=5)
    summaryFrame = tkinter.Frame(container, bd=2, relief='groove')
    summaryFrame.pack(side='top', fill='x')
    summaryUser = tkinter.Label(summaryFrame, text='Some text').grid(row=1, column=1, sticky='w')

很久以后,我需要更改这个标签的文本,但是因为我不再使用这个createWindow()函数,所以我无法访问包含文本的summaryUser变量。你知道吗

我尝试过summaryEvent[“text”](错误是因为它不可用),我尝试过使用全局变量并使用textvariable=AGlobalVariable而不是text='Some text'(将标签文本留空)和许多其他google结果都没有成功。你知道吗

这似乎是一种功能,应该比这更容易。。。你知道吗

编辑1

我试过以下方法。。。你知道吗

summaryUserText = 'Some text'

def createWindow():
    global summaryUserText
    window = tkinter.Tk()
    container = tkinter.Frame(window, padx=5, pady=5)
    summaryFrame = tkinter.Frame(container, bd=2, relief='groove')
    summaryFrame.pack(side='top', fill='x')
    summaryUser = tkinter.Label(summaryFrame, textvariable=summaryUserText)
    summaryUser.grid(row=1, column=1, sticky='w')

当我尝试这样做时,标签只是开始空白,而不是变量的内容。你知道吗

编辑2

我也试过以下方法。。。你知道吗

summaryUserText= tkinter.StringVar()
summaryUserText.set('Some text')

def createWindow():
    ...
    summaryUser= tkinter.Label(summaryFrame, textvariable=summaryUserText)

但是一旦python看到第一行,它就会出现以下错误。。。你知道吗

  File "C:\Program Files\Python37\lib\tkinter\__init__.py", line 480, in __init__
    Variable.__init__(self, master, value, name)
  File "C:\Program Files\Python37\lib\tkinter\__init__.py", line 317, in __init__
    self._root = master._root()
AttributeError: 'NoneType' object has no attribute '_root'

编辑3

在一个完整文件中模拟问题的最简单代码

import tkinter

def loadEvent():
    global summaryEventText
    summaryEventText.set('Updated')
    print('Updated')

def createWindow():
    global  summaryEventText
    window = tkinter.Tk()
    summaryEventText = tkinter.StringVar()
    summaryEventText.set('Init')
    summaryEventLabel = tkinter.Label(window, text='Event:').grid(row=0, column=0, sticky='e')
    summaryEvent = tkinter.Label(window, textvariable=summaryEventText).grid(row=0, column=1, sticky='w')
    window.mainloop()

createWindow()
loadEvent()

没有错误,打印('更新')工作,但summaryEventText.set文件('Updated')不执行任何操作。你知道吗


Tags: text文本inittkintercontainerdef错误标签
1条回答
网友
1楼 · 发布于 2024-10-04 03:28:57

简单的回答是:要更改一个对象,必须有对该对象的引用。这不是tkinter独有的,它是编程的一个基本方面。您使用的是局部变量,根据定义,这意味着您不能访问该函数之外的小部件。因此,解决办法是不使用局部变量。你知道吗

正确的解决方案要求您保存另一个函数可以访问的引用,或者提供可以返回引用的函数。让函数返回引用、使用全局变量或使用类变量。你知道吗

对于您的特定示例,最简单的解决方案是使用全局变量。例如:

import tkinter

def loadEvent():
    ...
    summaryEventLabel.configure(text='Updated')
    ...

def createWindow():
    global  summaryEventLabel
    ...
    summaryEventLabel = tkinter.Label(window, text='Event:')
    summaryEventLabel.grid(row=0, column=0, sticky='e')
    ...

createWindow()
loadEvent()

但是您的特定示例将不起作用,因为在销毁窗口或调用其quit方法之前,window.mainloop()不会返回。这意味着createWindow不会返回,因此loadEvent不会被调用。你知道吗

如果要构造程序以避免此问题,例如,调用loadEvent以响应按钮单击或其他事件,则此解决方案将起作用。你知道吗

下面是一个5秒钟后更新标签的工作示例:

import tkinter

def loadEvent():
    summaryEventLabel.configure(text='Updated')
    print('Updated')

def createWindow():
    global  summaryEventLabel
    window = tkinter.Tk()
    summaryEventText = tkinter.StringVar()
    summaryEventText.set('Init')
    summaryEventLabel = tkinter.Label(window, text='Event:')
    summaryEventLabel.grid(row=0, column=0, sticky='e')
    summaryEvent = tkinter.Label(window, textvariable=summaryEventText).grid(row=0, column=1, sticky='w')
    window.after(5000, loadEvent)
    window.mainloop()

createWindow()

相关问题 更多 >