Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我需要从创建它的函数外部更新一些标签文本_Python_Tkinter - Fatal编程技术网

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

Python 我需要从创建它的函数外部更新一些标签文本,python,tkinter,Python,Tkinter,我有一个tkinter.Label,它是在一个函数中创建的,我需要从代码的一个完全独立的部分更新文本 在过去的一个小时里,我尝试了谷歌提供的几乎所有解决方案,但我无法让它们中的任何一个正常工作,有些出现错误,有些显示空白,有些则什么都做不到 我创建的标签如下 def createWindow(): window = tkinter.Tk() container = tkinter.Frame(window, padx=5, pady=5) summaryFrame = t

我有一个tkinter.Label,它是在一个函数中创建的,我需要从代码的一个完全独立的部分更新文本

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

我创建的标签如下

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。