【问题标题】:Python 2.7 Tkinter Change Label text on button eventPython 2.7 Tkinter 在按钮事件上更改标签文本
【发布时间】:2013-03-12 20:55:40
【问题描述】:

我对 Python(2.7) 非常陌生,我正在学习 GUI 设计 (Tkinter),并且在尝试实现简单的标签文本更改时不断遇到不同的语法/没有 调用 方法/全局名称未定义错误从按钮单击时的条目对象。有人可以告诉我该操作的正确语法吗

from Tkinter import *
class Part3:

def __init__(self, parent):

    GUIFrame =Frame(parent,width= 300, height=200)
    GUIFrame.pack(expand = False, anchor = CENTER)
    entry = Entry(text="enter your choice")
    entry.place(x=65, y = 10)
    self.test = StringVar()
    self.test.set('''Hi, I'm a Label :)''')
    self.Label1 = Label(parent, textvariable = self.test)
    self.Label1.place(x = 85, y = 100)
    self.Button2 = Button(parent, text='edit',command=self.LabelChange)
    self.Button2.place(x= 80, y = 60)
    self.Button3 = Button(parent, text='exit', command= parent.quit)
    self.Button3.place(x= 160, y = 60)


def LabelChange(self):

    test = self.entry.get()
    self.Label1(test)


root = Tk()
MainFrame =Part3(root)
root.title('Input Test')
root.mainloop()

Idea 在“编辑”(按钮2)上单击,Label1 的文本更改为条目的文本。

【问题讨论】:

  • 您需要修复示例代码的缩进。此外,我鼓励您不要从使用place 开始——使用这将创建具有不良调整大小行为的 GUI。花一两个小时来学习 packgrid - 学习曲线很短,但你的 GUI 会更好。

标签: user-interface button python-2.7 tkinter


【解决方案1】:

试试:

self.entry = Entry(text="enter your choice")
...
test = self.entry.get()
self.test.set(test)

我知道大多数教程都提供了使用文本变量的示例,但在大多数情况下您不需要它们。您可以在不使用 textvariable 的情况下获取和设置小部件中的值。文本变量主要用于对变量进行跟踪。变量跟踪是一种您很少需要的高级技术。

【讨论】:

  • test = self.entry.get() AttributeError: Part3 instance has no attribute 'entry'
  • @GeorgeDay:对此感到抱歉。我没有意识到您没有保存对条目小部件的引用。我已经更新了我的答案。
  • 没有更多错误抛出,但是新代码对 Label1 没有影响
  • @GeorgeDay:对不起,我的错。我很少使用文本变量,以至于忘记了它们会覆盖text 属性。我已经更新了我的答案。您需要在 textvariable 上调用 set,并为其提供条目小部件中的值。
【解决方案2】:
from Tkinter import *
class Part3:

def __init__(self, parent):

    GUIFrame =Frame(parent,width= 300, height=200)
    GUIFrame.pack(expand = False, anchor = CENTER)
    self.entry = Entry(text="enter your choice")    # this needs to be in self
    self.entry.place(x=65, y = 10)
    self.test = StringVar()
    self.test.set('''Hi, I'm a Label :)''')
    self.Label1 = Label(parent, textvariable = self.test)
    self.Label1.place(x = 85, y = 100)
    self.Button2 = Button(parent, text='edit',command=self.LabelChange)
    self.Button2.place(x= 80, y = 60)
    self.Button3 = Button(parent, text='exit', command= parent.quit)
    self.Button3.place(x= 160, y = 60)


def LabelChange(self):
    self.test.set(self.entry.get())

root = Tk()
MainFrame =Part3(root)
root.title('Input Test')
root.mainloop()
root.destroy()

【讨论】:

    【解决方案3】:

    使用可以使用 .after 命令。例如:

         Lbl = Label(text='Hi')
         def change():
             Lbl.after(3000, lambda: Lbl.config(text="hola")
             # Or you can use the one below to remove delay.
             Lbl.config(text='hola')
            return change
         Btn = Button(command=change ())
         Lbl.pack()
         Btn.pack()
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多