2012-03-15 5 views
0

방금 ​​tkinter를 배우기 시작했으며 ttk.Label의 변수를 textvariable= 또는 text=으로 즉시 조작 할 수 있는지 알고 싶습니다. 설명하기 위해, 두 숫자를 곱하고 제품 :tkinter : textvariable을 사용하는 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() 

producttextvariable=product를 사용하여 변경 될 때마다 나는 결과를 업데이트 할 수 있습니다 표시 내 독창적 인 계산기 프로그램을 보라. num1 또는 num2을 각각 <KeyPress><KeyRelease>에 바인딩하여 변경하면 product을 업데이트 할 수 있습니다. 여태까지는 그런대로 잘됐다.

내가 알고 싶은 것은 ttk.Label이 내 변수를 표시하지만 어떤 식 으로든 조작 할 수 있는지 여부입니다.

newvariable = DoubleVar() 

다음 thusly 히 내 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) 

을 해결해 그건를 문제는 멋지게. 내 원래 제품 * 2을 보여주는 새 레이블이 있으며 항목이 변경되면 즉시 업데이트됩니다. 그게 내가 원하는거야.

그러나 실제 프로젝트에서는 다른 인수를 사용하여이 작업을 여러 번 수행해야합니다. 필요하지 않으면 새로운 변수를 추가하는 것은 지루한 것처럼 보입니다. *에 대한 지원되지 않는 피연산자 유형 (들) : : 저를 제공

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

"형식 오류 :. 'DoubleVar'와 'INT'내가 가지고 내가 할 수 있도록하고 싶습니다 무엇

뭔가처럼 그하면 textVariable 만 1 개 변수를 원하고 그것을 조작하지 않는 것을 의미합니다

나는 또한 시도 :..

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

하나가 실패하지 않는, 그러나 또한 자동으로 업데이트되지 않습니다 (즉,이다 전체적으로 우리는 원래 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

+0

@Floydius : 정확합니다. 새 변수를 만들어야합니다. 위젯을 표현식에 연결할 수 없으며 위젯 만 변수와 연결할 수 있습니다. –

+0

나는 그것에 대해 틀렸다는 희망을 갖고 있었지만, 적어도 내 주위에 구글 방식으로 노력하는 것을 그만 둘 수 있었다. 도움에 너무 감사한다. – Floydius