【问题标题】:Changing the text on a label更改标签上的文本
【发布时间】:2013-06-15 16:48:43
【问题描述】:

我在使用键绑定更改标签或任何参数的值时遇到问题。 这是我的代码:

from tkinter import*

class MyGUI:
  def __init__(self):
    self.__mainWindow = Tk()
    #self.fram1 = Frame(self.__mainWindow)
    self.labelText = 'Enter amount to deposit'
    self.depositLabel = Label(self.__mainWindow, text = self.labelText)
    self.depositEntry = Entry(self.__mainWindow, width = 10)
    self.depositEntry.bind('<Return>', self.depositCallBack)
    self.depositLabel.pack()
    self.depositEntry.pack()

    mainloop()

  def depositCallBack(self,event):
    self.labelText = 'change the value'
    print(self.labelText)

myGUI = MyGUI()

当我运行它时,我单击输入框并按回车键,希望标签将值更改为“更改值”。但是,虽然它确实打印了该文本,但标签保持不变。

通过查看有关类似问题和问题的其他问题,我已经想出了如何在课堂外处理其中的一些问题,但在课堂内做这件事时遇到了一些困难。

另外,顺便说一句,“大师”在 tkinter 中扮演什么角色?

【问题讨论】:

  • master 是小部件打包到的 GUI。

标签: python python-3.x tkinter


【解决方案1】:
self.labelText = 'change the value'

上面这句话让labelText改变了值,但没有改变depositLabel的文本。

要更改 depositLabel 的文本,请使用以下语句之一:

self.depositLabel['text'] = 'change the value'

self.depositLabel.config(text='change the value')

【讨论】:

  • 对于我得到的第一个建议:self.labelText['text'] = 'change the value' TypeError: 'str' object does not support item assignment
  • 我输入的不是self.labelText['text'],而是self.depositLabel['text']
  • 啊,就是这样。谢谢你。你能帮我理解为什么我的技术不起作用吗?或者什么时候使用 set()
  • 我已经在回答中解释了这一点。由于我的词汇量很差,我无法解释更多。 set type?
【解决方案2】:

您也可以在创建标签时定义textvariable,并更改文本变量以更新标签中的文本。 这是一个例子:

labelText = StringVar()
depositLabel = Label(self, textvariable=labelText)
depositLabel.grid()

def updateDepositLabel(txt) # you may have to use *args in some cases
    labelText.set(txt)

无需手动更新depositLabel 中的文本。 Tk 会为您做到这一点。

【讨论】:

  • 感谢您提供简洁的解决方案。建议将代码注释给初学者理解。
  • 感谢您的回答,我向任何人推荐这种方法,但它是StringVar() 而不是Stringvar()。此外,(也许对某人来说并不那么明显)我记得StringVar() 必须从 tk 导入或像这样使用:tk.StringVar() 如果你写 import tkinter as tk 或类似的东西。再次感谢。
【解决方案3】:

使用config方法改变标签的值:

top = Tk()

l = Label(top)
l.pack()

l.config(text = "Hello World", width = "50")

【讨论】:

  • 这里需要传递width吗?
  • @Wolf:没有,只是文字就可以了。
【解决方案4】:

这是另一个,我想。仅供参考。 让我们将一个变量设置为 StringVar 类的实例

如果您使用 Tcl 语言编写 Tk,您可以要求系统在变量更改时通知您。 Tk 工具包可以使用此功能(称为跟踪)在修改关联变量时更新某些小部件。

没有办法跟踪 Python 变量的变化,但是 Tkinter 允许您创建可以在任何地方使用的变量包装器 Tk 可以使用跟踪的 Tcl 变量。

text = StringVar()
self.depositLabel = Label(self.__mainWindow, text = self.labelText, textvariable = text)
#                                                                   ^^^^^^^^^^^^^^^^^^^
def depositCallBack(self,event):
    text.set('change the value')

【讨论】:

  • 在这种情况下传递text 参数是多余的;对于默认值,最好在之前通过text.set() 初始化text 变量。
【解决方案5】:

我制作了一个小型 tkinter 应用程序,在单击按钮后设置标签

#!/usr/bin/env python
from Tkinter import *
from tkFileDialog import askopenfilename
from tkFileDialog import askdirectory


class Application:
    def __init__(self, master):
        frame = Frame(master,width=200,height=200)
        frame.pack()

        self.log_file_btn = Button(frame, text="Select Log File", command=self.selectLogFile,width=25).grid(row=0)
        self.image_folder_btn = Button(frame, text="Select Image Folder", command=self.selectImageFile,width=25).grid(row=1)
        self.quite_button = Button(frame, text="QUIT", fg="red", command=frame.quit,width=25).grid(row=5)

        self.logFilePath =StringVar()
        self.imageFilePath = StringVar()
        self.labelFolder = Label(frame,textvariable=self.logFilePath).grid(row=0,column=1)
        self.labelImageFile = Label(frame,textvariable = self.imageFilePath).grid(row = 1,column=1)

        def selectLogFile(self):
            filename = askopenfilename()
            self.logFilePath.set(filename)

        def selectImageFile(self):
            imageFolder = askdirectory()
            self.imageFilePath.set(imageFolder)

root = Tk()
root.title("Geo Tagging")
root.geometry("600x100")
app = Application(root)
root.mainloop()

【讨论】:

    【解决方案6】:

    有很多方法可以解决这样的问题。有很多方法可以做到这一点。我将为您提供我所知道的这个问题的最简单的解决方案。当真正改变标签或任何类型的wiget的文本时。我会这样做。

    Name_Of_Label["text"] = "Your New Text"
    

    所以当我将这些知识应用到您的代码时。它看起来像这样。

    from tkinter import*
    
    class MyGUI:
       def __init__(self):
        self.__mainWindow = Tk()
        #self.fram1 = Frame(self.__mainWindow)
        self.labelText = 'Enter amount to deposit'
        self.depositLabel = Label(self.__mainWindow, text = self.labelText)
        self.depositEntry = Entry(self.__mainWindow, width = 10)
        self.depositEntry.bind('<Return>', self.depositCallBack)
        self.depositLabel.pack()
        self.depositEntry.pack()
    
        mainloop()
    
      def depositCallBack(self,event):
        self.labelText["text"] = 'change the value'
        print(self.labelText)
    
    myGUI = MyGUI()
    

    如果这有帮助,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多