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

How to print Tkinter variables as part of a string?

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

我应该怎么做?

When I press it, the printed value remains "I have 14 items" instead of changing to "I have 15 items" as it should.

不,不应该。您将按钮的文本定义为带有 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()