我有一个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')不执行任何操作。你知道吗
简单的回答是:要更改一个对象,必须有对该对象的引用。这不是tkinter独有的,它是编程的一个基本方面。您使用的是局部变量,根据定义,这意味着您不能访问该函数之外的小部件。因此,解决办法是不使用局部变量。你知道吗
正确的解决方案要求您保存另一个函数可以访问的引用,或者提供可以返回引用的函数。让函数返回引用、使用全局变量或使用类变量。你知道吗
对于您的特定示例,最简单的解决方案是使用全局变量。例如:
但是您的特定示例将不起作用,因为在销毁窗口或调用其
quit
方法之前,window.mainloop()
不会返回。这意味着createWindow
不会返回,因此loadEvent
不会被调用。你知道吗如果要构造程序以避免此问题,例如,调用
loadEvent
以响应按钮单击或其他事件,则此解决方案将起作用。你知道吗下面是一个5秒钟后更新标签的工作示例:
相关问题 更多 >
编程相关推荐