2012-03-15 58 views
0

我剛剛開始學習tkinter,並想知道是否可以在ttk.Label中動態調用textvariable=text=中的變量。爲了演示,看哪,我這兩個數相乘,顯示產品:tkinter:使用文本變量在tk.Label中操作變量

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改變了我可以更新的結果巧妙的計算器程序。每當num1num2通過綁定到<KeyPress><KeyRelease>而更改時,我可以更新product。到現在爲止還挺好。

我想知道的是是否可以有另一個ttk.Label顯示我的變量,但以某種方式操縱。比方說,我想做一些瘋狂的喜歡把我的產品,並通過2

乘它,我知道我可以簡單地創建一個新的變量:

newvariable = DoubleVar() 

則正是如此更新我multiply功能:

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) 

,解決這個問題很好。我有一個新標籤,顯示了我的原始產品* 2,並且隨着我的條目發生更改,它也隨時更新。這正是我想要的。

但是在我的實際項目中,我需要用不同的參數來完成這個過程。如果我不需要,添加大量新變量似乎很乏味。

我想什麼,能夠做的是一樣的東西:

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

這給了我「類型錯誤:不支持的操作類型爲*:‘DoubleVar’和‘廉政’我走這意味着textvariable只想要1個變量,不希望它操縱

我也試過:。

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

一個不失敗,但它也不會自動更新(這就是整個reas我們需要textvariable在第一個地方,對嗎?)

是否有可能做到這一點,而不是創建一個新的變量爲每個不同的實例,我想操縱我的原始變量?

感謝您的幫助!

回答

1

您不能將函數或表達式與標籤關聯。然而,你可以做的是在你的其他變量上添加一些痕跡。跟蹤將在變量發生變化時調用函數。在這個函數中,你可以做任何你想要的計算,然後設置你的標籤變量的值。

有關痕跡的更多信息,請參閱http://epydoc.sourceforge.net/stdlib/Tkinter.Variable-class.html#trace等地。

+0

無論哪種方式,它似乎我被迫創建一個新的變量顯示在標籤。例如,在上面的例子中,如果我有num1 = 2和num2 = 3,那麼product = 6。如果我想同時在一個標籤中顯示'product',在另一個標籤中同時顯示'product * 5',我不能這樣做而不需要創建一個新的變量來表示'product * 5'。 – Floydius 2012-03-16 16:26:44

+0

@Floydius:你是對的,你必須創建一個新的變量。您無法將窗口小部件與表達式關聯,只能將窗口小部件與變量相關聯。 – 2012-03-17 01:41:04

+0

我一直希望自己錯了,但至少我可以停止嘗試谷歌我的方式...非常感謝您的幫助! – Floydius 2012-03-19 17:21:22