有没有可能创建一个使用字符串和变量作为文本的TkInter标签呢?
例如:
例如:
name = "bob"
Label(root, text="hello, my name is "+name)
但是,不仅在标签创建时使标签文本向上移动,而且在“名称”更改时更新文本,而无需引用标签实例本身。
有人知道这是否可能吗?
text
的StringVar
文本变量,您可以使用text.set()
随时更改它。change
会告诉标签更改为新值(此处简化为两个值,old
和new
)。from Tkinter import Tk, Checkbutton, Label
from Tkinter import StringVar, IntVar
root = Tk()
text = StringVar()
text.set('old')
status = IntVar()
def change():
if status.get() == 1: # if clicked
text.set('new')
else:
text.set('old')
cb = Checkbutton(root, variable=status, command=change)
lb = Label(root, textvariable=text)
cb.pack()
lb.pack()
root.mainloop()
StringVar
的实例分配给 Label
widget 的 textvariable
属性。这样做,任何对变量的更新都会更新标签。然而,你最终需要调用一个函数来更新变量,所以你并没有真正从直接调用一个函数来更新标签中得到什么好处。StringVar
的实例--一个用于标签,另一个用于名称。您可以在名称变量上设置跟踪,这样当它改变时,您自动用静态字符串和名称变量的值更新另一个变量,这将导致标签自动更新。然而,再次强调,你必须调用一个函数来启动一切。有一个Tkinter StringVar()
(类似的还有IntVar()
、DoubleVar()
、BoolVar()
)对象构造器,它准备了一个智能对象,可以在Tkinter小部件中随后用于此目的。
您可以使用.set()
/ .get()
方法来操纵这种对象的值。
name = StringVar() # this creates a Tkinter object
name.set( "bob" ) # .set() assigns / .get() retrieves
L = Label( root, textvariable = name ) # makes the <name> used in Label Widget
name.set( "alice" ) # .set() assigns a new value -> promoted
print L['text'] # show, a value has been promoted in L
您可能还想了解一些更高级的Tkinter变量工具。与Tkinter变量相关联的还有更强大的工具,称为trace
-er(s),它们将Tkinter系统设置为“监视”对“追踪”变量的任何更改,并且这可以关联进一步的自动响应活动,在追踪事件类型发生时自动启动。
aWriteTraceID = name.trace_variable( "w", f2CallOnWriteAccessToTracedVariable )
aRead_TraceID = name.trace_variable( "r", f2CallOnRead_AccessToTracedVariable )
aDel__TraceID = name.trace_variable( "u", f2CallOnDel__AccessToTracedVariable )
name.trace_vinfo() # show all associated <<Tracers>>
>>> name.trace_vinfo()
[('u', '12945528f2CallOnDel__AccessToTracedVariable'),
('r', '12251384f2CallOnRead_AccessToTracedVariable'),
('w', '12760924f2CallOnWriteAccessToTracedVariable')
]
name.trace_vdelete( aRead_TraceID ) # delete an identified <<Tracer>>
name.trace_vdelete( aWriteTraceID ) # delete an identified <<Tracer>>
del( name ) # del() makes name undefined
# so this will "auto-launch" the last, still active <<Tracer>>
# you assigned above -- the function f2CallOnDel__AccessToTracedVariable()
Tkinter.mainloop()
调度程序下进行监督。name = StringVar() # a pure name holder
show = StringVar() # a post-processed text
L = Label( root, textvariable = show ) # L will display a post-processed string
L.pack() # L goes into GUI framework's geometry manager
# # prepare the <<Handler>> function
def autoProcessAndPropagateOnNameVarCHANGE( p1, p2, p3, p4 = name, p5 = show ):
# # this function will get called
# # upon WRITE-ACCESS <<Tracer>>
#
# .set( a post-processed value ) into [show], that is connected to GUI[Label]
p5.set( "Hello, " + p4.get() )
# # Always be carefull not to fire
# # an unstoppable chain-reaction ;)
# # of <<Tracer>>-related events
# # as more <<Tracer>>-s get used
# # create <<Tracer>> / <<Handler>> pair
aWriteTraceID = name.trace_variable( "w", autoProcessAndPropagateOnNameVarCHANGE )
# -------------------------------------------------------------------------------
# test <<Tracer>>:
name.set( "Craig" ) # <<Tracer>>-watched WRITE-ACCESS
# test <<Tracer>> result: GUI Label L shall show "Hello, Craig" -----------------
# -------------------------------------------------------------------------------
# erase all <<Tracer>>-s assigned:
name.trace_vinfo() # initial state of <<Tracer>>-s
for aTracerRECORD in name.trace_vinfo():
name.trace_vdelete( aTracerRECORD[0], aTracerRECORD[1] )
# erase [[[DONE]]] --------------------------------------------------------------
name.trace_vinfo() # final state of <<Tracer>>-s
StringVar
而不是普通变量”...但既然现在展示了如何使用该StringVar
以一种可能完全合理的方式来近似OP所希望的内容,我不知道这是否是一个问题。 - abarnert
label = Label(root, text="hello, my name is "+name)
,然后通过name = 'whatever'
更改名字变量,最后使用label.set("hello, my name is "+name)
设置 label 标签的内容。但是这个答案在没有代码示例的情况下相对隐晦。 - questionto42