2013-09-06 10 views
0

OptionMenu 위젯에서 선택된 함수를 호출하는 동적 버튼을 만드는 방법을 알고 싶습니다.OptionMenu 위젯에서 선택된 함수를 호출하는 Tkinter 동적 버튼

마지막 두 번째 줄 [-2]에서 "command = var"로 "command = daily_return"을 대체했지만 작동하지 않습니다.

제안 사항? 최고의

작동 코드

from Tkinter import * 
import Tkinter 
import tkMessageBox 


master = Tk() 

myvar_1 = IntVar() 
myvar_2 = IntVar() 
myvar_3 = StringVar() 
myvar_4 = IntVar() 
myvar_5 = IntVar() 
myvar_6 = IntVar() 
myvar_7 = IntVar() 
# 



def daily_return(*args): 
    print "The start date is ", var.get(), "+", myvar_1.get(),"-", myvar_4.get(), "-", myvar_6.get(), "and the end date is", myvar_2.get(),"-", myvar_5.get(), "-", myvar_7.get(), " for the stock ticker:", myvar_3.get(), "." 


def cumulative_return(*args): 
    print "The start date is ", myvar_1.get(), "the cumulative return." 

def value_at_risk(*args): 
    print "The start date is ", myvar_1.get(), "the value at risk." 



Label(master, text="Start Date (DD-MM-YYYY)").grid(row=0) 
Label(master, text="End Date (DD-MM-YYYY)").grid(row=1) 
Label(master, text="Stock Ticker").grid(row=2) 

## 
text_entry_1 = Entry(master, textvariable=myvar_1) 
text_entry_1.pack() 

text_entry_2 = Entry(master, textvariable=myvar_2) 
text_entry_2.pack() 

text_entry_3 = Entry(master, textvariable=myvar_3) 
text_entry_3.pack() 

text_entry_4 = Entry(master, textvariable=myvar_4) 
text_entry_4.pack() 

text_entry_5 = Entry(master, textvariable=myvar_5) 
text_entry_5.pack() 

text_entry_6 = Entry(master, textvariable=myvar_6) 
text_entry_6.pack() 

text_entry_7 = Entry(master, textvariable=myvar_7) 
text_entry_7.pack() 

# 
var = StringVar() 
var.set('Choose function') 
choices = ['cumulative_return', 'daily_return', 'value_at_risk'] 
option = OptionMenu(master, var, *choices) 
option.pack() 


## 
text_entry_1.grid(row=0, column=1) 
text_entry_2.grid(row=1, column=1) 
text_entry_3.grid(row=2, column=1) 
text_entry_4.grid(row=0, column=2) 
text_entry_5.grid(row=1, column=2) 
text_entry_6.grid(row=0, column=3) 
text_entry_7.grid(row=1, column=3) 
option.grid(row=4, column=0) 
sf = "Quant Program" 

# 
def quit(): 
    global root 
    master.destroy() 


# 
master.title("Quant Program") 

Button(master, text='Quit', command=quit).grid(row=4, column=4, sticky=W, pady=4) 
Button(master, text='Show', command=daily_return).grid(row=4, column=1, sticky=W, pady=4) 

mainloop() 
+0

잘 입니다 것을 직접 부름을 받았다. 따라서'command = foo'를 실행하면 Tkinter는 콜백이 트리거 될 때마다'foo()'를 호출합니다. 그래서'command = var'를 할 때, 콜백이 트리거 될 때 Tkinter가'var()'을하도록 말하고있는 것입니다. 이 문맥에서'var() '를 호출하는 것조차 무엇을 의미합니까? –

+0

var() 호출이 잘못되었음을 이해합니다. 10 가지 다른 기능을 호출 할 수있는 10 가지 단추가있는 것을 피할 수있는 방법이 있습니까? 어쩌면 하나의 위젯이 함수를 선택하고 다른 하나는 그것을 호출 할 것입니까? 감사합니다 – Pedro9

답변

1

때로는 간단한 해결책은 충분 :

def do_something(): 
    # define a mapping from the choice value to a function name 
    func_map = { 
     "daily_choices": daily_choices, 
     "value_at_risk": value_at_risk, 
     "cumulative_return": cumulative_return, 
    } 
    # using the map, get the function 
    function = func_map[var.get()] 

    # call the function 
    function() 

...   
Button(..., command=do_something) 
가`명령의 값이 =`, 거기에 많은 문제가 있지만 첫 번째 문제가
+0

자막은 이것을 피하는 것이라고 말했지만 저항 할 수는 없습니다. +1 감사합니다. – Pedro9

관련 문제