tkinter:使用textvariable操作tk.Label中的变量

时间:2012-03-15 17:03:13

标签: python-3.x tkinter

我刚刚开始学习tkinter,并且想知道是否可以使用ttk.Labeltextvariable=动态操作text=中的变量。为了演示,看看我巧妙的计算器程序,它将两个数字相乘并显示产品。:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Multiplier")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

## Calculation

def multiply(*args):
    try:
       product.set(round(float(num1.get())*float(num2.get()),2))
    except ValueError:
        pass

## variables

num1 = StringVar()
num2 = StringVar()
product = DoubleVar()

## first number

ttk.Label(mainframe, text="First Number:").grid(column = 1, row = 1)
num1_entry = ttk.Entry(mainframe, width=4, textvariable=num1)
num1_entry.grid(column = 2, row = 1)
num1_entry.bind('<KeyPress>', multiply)
num1_entry.bind('<KeyRelease>', multiply)

## second number

ttk.Label(mainframe, text="Second Number:").grid(column = 1, row = 2)
num2_entry = ttk.Entry(mainframe, width=4, textvariable=num2)
num2_entry.grid(column = 2, row = 2)
num2_entry.bind('<KeyPress>',multiply)
num2_entry.bind('<KeyRelease>',multiply)

## display results

ttk.Label(mainframe, text = "Product:").grid(column = 1, row = 3)
ttk.Label(mainframe, textvariable=product).grid(column = 2, row = 3)

root.mainloop()

我可以使用product更改textvariable=product时更新结果。通过将每个productnum1绑定到num2<KeyPress>,我可以在更新<KeyRelease>ttk.Label时更新newvariable = DoubleVar() 。到目前为止,非常好。

我想知道的是,是否可以让另一个multiply显示我的变量,但是以某种方式进行操作。假设我想做一些疯狂的事情,比如拿我的产品并乘以2。

我知道我可以简单地创建一个新变量:

def multiply(*args):
    try:
       product.set(round(float(num1.get())*float(num2.get()),2))
       newvariable.set(round(product.get()*2),2))
    except ValueError:
        pass

然后更新我的ttk.Label(mainframe, textvariable=newvariable).grid(column=1, row = 5) 功能:

ttk.Label(mainframe, textvariable=product*2).grid(column=1, row = 5)

并添加我的新标签:

ttk.Label(mainframe, text=(product.get()*2)).grid(column=1, row = 5)

很好地解决了这个问题。我有一个新的标签,显示我的原始产品* 2,并在我的条目更改时也随时更新。这正是我想要的。

但是,在我的实际项目中,我需要使用不同的参数多次完成此操作。如果我不需要,添加大量新变量似乎很乏味。

我希望能够做的是:

textvariable

这给了我“TypeError:不支持的操作数类型*:'DoubleVar'和'int'。我认为这意味着textvariable只需要1个变量而不想操纵它。

我也尝试过:

{{1}}

那个没有失败,但它也不会自动更新。 (这就是我们首先需要{{1}}的全部原因,对吗?)

是否可以在不为我想要操作原始变量的每个不同实例创建新变量的情况下这样做?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您无法将函数或表达式与标签相关联。但是,您可以做的是对您的其他变量进行跟踪。只要变量发生变化,跟踪就会调用一个函数。在该功能中,您可以进行任何所需的计算,然后设置标签变量的值。

有关跟踪的更多信息,请参阅http://epydoc.sourceforge.net/stdlib/Tkinter.Variable-class.html#trace以及其他地方。