首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要从创建它的函数外部更新一些标签文本。

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

Stack Overflow用户
提问于 2019-09-16 16:53:49
回答 1查看 394关注 0票数 0

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

在过去的一个小时里,我已经尝试过google提供的几乎所有的解决方案,但是我无法让他们中的任何一个工作起来,一些错误,一些显示空白,有些只是做不到任何事情。

我创建的标签如下

代码语言:javascript
运行
复制
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代替textvariable=AGlobalVariable=‘Some’(将标签文本保留为空白)和许多其他谷歌结果都没有成功。

这似乎是比这更容易的功能.

编辑1

我试过以下方法..。

代码语言:javascript
运行
复制
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

我也试过以下几点..。

代码语言:javascript
运行
复制
summaryUserText= tkinter.StringVar()
summaryUserText.set('Some text')

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

但是一旦python看到第一行,它就会出现以下错误.

代码语言:javascript
运行
复制
  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

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

代码语言:javascript
运行
复制
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(‘更新’)什么也不做。

EN

回答 1

Stack Overflow用户

发布于 2019-09-17 22:19:38

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

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

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

代码语言:javascript
运行
复制
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秒后更新标签的示例:

代码语言:javascript
运行
复制
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()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57961305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档