如何将Tkinter变量作为字符串的一部分打印?

时间:2015-02-04 07:32:52

标签: python tkinter

在常规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"

我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

  

当我按下它时,打印的值仍为“我有14个项目”而不是更改为“我有15个项目”。

不,不应该。您将按钮的文本定义为一个字符串,其中包含items当时的编号。您没有在任何地方告诉文本更新。 texttextvariable属性执行的操作非常不同,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()