Python 我需要从创建它的函数外部更新一些标签文本
我有一个tkinter.Label,它是在一个函数中创建的,我需要从代码的一个完全独立的部分更新文本 在过去的一个小时里,我尝试了谷歌提供的几乎所有解决方案,但我无法让它们中的任何一个正常工作,有些出现错误,有些显示空白,有些则什么都做不到 我创建的标签如下Python 我需要从创建它的函数外部更新一些标签文本,python,tkinter,Python,Tkinter,我有一个tkinter.Label,它是在一个函数中创建的,我需要从代码的一个完全独立的部分更新文本 在过去的一个小时里,我尝试了谷歌提供的几乎所有解决方案,但我无法让它们中的任何一个正常工作,有些出现错误,有些显示空白,有些则什么都做不到 我创建的标签如下 def createWindow(): window = tkinter.Tk() container = tkinter.Frame(window, padx=5, pady=5) summaryFrame = t
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')
summaryUserText= tkinter.StringVar()
summaryUserText.set('Some text')
def createWindow():
...
summaryUser= tkinter.Label(summaryFrame, textvariable=summaryUserText)
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'
当我尝试这样做时,标签开始是空白的,而不是变量的内容
编辑2
我也试过以下方法
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')
summaryUserText= tkinter.StringVar()
summaryUserText.set('Some text')
def createWindow():
...
summaryUser= tkinter.Label(summaryFrame, textvariable=summaryUserText)
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'
但是一旦python看到第一行,它就会出现以下错误
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')
summaryUserText= tkinter.StringVar()
summaryUserText.set('Some text')
def createWindow():
...
summaryUser= tkinter.Label(summaryFrame, textvariable=summaryUserText)
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独有的,它是编程的一个基本方面。您使用的是局部变量,根据定义,这意味着您无法访问该函数之外的小部件。因此,解决方案是不使用局部变量 正确的解决方案要求您保存其他函数可以访问的引用,或者提供可以返回引用的函数。让函数返回引用、使用全局变量或使用类变量 对于您的特定示例,最简单的解决方案是使用全局变量。例如:
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()
您需要使summaryUser作为全局变量或实例变量全局可用,最有可能的情况是,稍后调用summaryUser['text']='new text',或者使用textvariable=选项引用全局可用的StringVar并调用。稍后在该var上设置“新文本”。是否尝试返回值?只有特定的Tkinter var类型适用于textvariable=选项,其中StringVar最有可能是标签的选择。因此,尝试summaryUserText=StringVar;summaryUserText.set'Some text'。我也尝试过,但是当我使用summaryUserText=tkinter.StringVar时,我得到了以下错误。。。AttributeError:“NoneType”对象没有属性“\u root”看起来像是在调用Tk初始化之前尝试创建StringVar。