在常规Python 3.4中,如果要在字符串中间打印变量,可以执行以下操作:
x = 31
print("The value of x is %s" % (x))
它会打印The value of x is 31
。
在Tkinter中,如果您想要标签读取某个变量,您只需定义标签,如果标签的变量在任何时候发生变化,标签会自动更新(如果它是Tkinter标签)。例如:
var = StringVar()
var.set("Label")
label = Label(main, text=var)
但是,如果我希望字符串的一部分成为Tkinter中的变量......
items = IntVar()
items.set(14)
b = Button(main, text="I have %s items" % (items.get()), command=additem)
def additem():
items.set(items.get() + 1)
...按钮不会更新。当我按下它时,打印的值仍然是"I have 14 items"
,而不是应该更改为"I have 15 items"
。
我该怎么做呢?
答案 0 :(得分:2)
当我按下它时,打印的值仍为“我有14个项目”而不是更改为“我有15个项目”。
不,不应该。您将按钮的文本定义为一个字符串,其中包含items
当时的编号。您没有在任何地方告诉文本更新。 text
和textvariable
属性执行的操作非常不同,text
设置不更新的文本,textvariable
采用StringVar
或其他Tkinter变量并保留文本更新为此变量的内容。另请注意,您的第一个示例是错误的,您必须使用textvariable
属性将StringVar
的内容绑定到按钮,而不是text
。
我认为最好的解决方案是不使用IntVar
,只需使用configure
手动更新文字:
root = Tk()
def additem():
global items
items += 1
b.configure(text="I have %s items" % (items))
items = 14
b = Button(root, text="I have %s items" % (items), command=additem)
b.pack()
root.mainloop()
另一个选择是将标签分成三个标签,并将它们放在一个框架中,如:
root = Tk()
def additem():
items.set(items.get() + 1)
f = Frame(root)
items = IntVar()
items.set(14)
l0 = Label(f, text="I have")
l1 = Label(f, textvariable=items)
l2 = Label(f, text="items")
b = Button(root, text="Add item", command=additem)
l0.pack(side=LEFT)
l1.pack(side=LEFT)
l2.pack(side=LEFT)
f.pack()
b.pack()
root.mainloop()