2016-12-08 9 views
0

나는 tkinter에 OptionMenu를 가지고 있습니다. 메뉴의 옵션은 사전의 키입니다. 각 키의 값은 4 개의 항목을 포함하는 목록입니다.tkinter OptionMenu의 사전 값 (사전 값은 목록)에 액세스하여 변수에 저장

선택한 메뉴 옵션을 사용하여 4 개의 항목을 개별 변수에 할당하려면 어떻게합니까?

from tkinter import * 

root = Tk() 

options = {'option 1' : ['list item 1' , 'list item 2' , 'list item 3' , 'list item 4'] , 'option 2' : ['list item w' , 'list item x' , 'list item y' , 'list item z']} 

options = sorted(options) 

var = StringVar(root) 
var.set('Choose an option') 

option = OptionMenu(root, var, *options) 
option.pack() 

selection = StringVar() 

def changeOption(*args): 
    newSelection = options[var.get()] 
    selection.set(newSelection) 

var.trace('w', changeOption) 

variable1 = # if option 1 was selected from the menu then this variable would contain list item 1 
variable2 = # if option 1 was selected from the menu then this variable would contain list item 2 
variable3 = # if option 1 was selected from the menu then this variable would contain list item 3 
variable4 = # if option 1 was selected from the menu then this variable would contain list item 4 

root.mainloop() 
+0

문제의 코드를 작업, 간단한 표시 - 그래서 모두가 그것을 테스트하고 당신을 위해 예제를 만들 수 있습니다. – furas

+0

확인. 코드가 추가되었습니다. – Paulo19

답변

2

주요 부분이 아닌 change_option 기능에서 수행해야합니다.

주요 부품 만 windows/GUI를 만들고 mainloop()을 시작합니다. 그런 다음 mainloop()은 모든 것을 제어합니다. OptionMenu에서 옵션을 변경하면 기능 change_option이 실행됩니다.

var.get() 또는 첫 번째 인수 인 command=을 사용하여 키를 얻은 다음 사전에서 데이터를 가져올 수 있습니다.

sorted()options으로 할당 할 수 없습니다. sorted()은 정렬 된 키 목록 만 반환하고 사용자는 oryginal 사전에 대한 액세스가 느슨하기 때문입니다.

keys = sorted(options) 

전체 코드 :

from tkinter import * 

# --- functions --- 

def change_option(*args): 

    # selected element 

    print('  args:', args) 
    print('var.get():', var.get()) 

    # get list from dictionary `options` 

    data = options[var.get()] 
    data = options[args[0]] 

    print('  data:', data[0], data[1], data[2], data[3]) 

    # if you really need in separated varaibles 

    variable1 = data[0] 
    variable2 = data[1] 
    variable3 = data[2] 
    variable4 = data[3] 

    print('variables:', variable1, variable2, variable3, variable4) 

    print('---') 

# --- main --- 

root = Tk() 

options = { 
    'option 1': ['list item 1', 'list item 2', 'list item 3', 'list item 4'], 
    'option 2': ['list item w', 'list item x', 'list item y', 'list item z'] 
} 

keys = sorted(options) # don't overwrite `options` - sorted() returns only keys from dictionary. 

var = StringVar(root) 
var.set('Choose an option') 

option = OptionMenu(root, var, *keys, command=change_option) 
option.pack() 

root.mainloop() 

결과 :

 args: ('option 1',) 
var.get(): option 1 
    data: list item 1 list item 2 list item 3 list item 4 
variables: list item 1 list item 2 list item 3 list item 4 
--- 
    args: ('option 2',) 
var.get(): option 2 
    data: list item w list item x list item y list item z 
variables: list item w list item x list item y list item z 
--- 
1

OptionMenu 옵션 command을 사용할 수 있습니다. 이 명령은 드롭 다운에서 옵션을 선택할 때마다 실행됩니다.

from tkinter import * 

root = Tk() 

def change_vars(e): 
    for i in range(len(options[var.get()])): 
     vars[i].set(options[var.get()][i]) 

    #these two prints added for debugging purposes 
    #to see if we are getting and setting right values 
    print(options[var.get()])  
    for item in vars: 
     print(item.get()) 

options = {'option 1':['list item 1','list item 2','list item 3','list item 4'] , 'option 2':['list item w','list item x','list item y','list item z']} 

var = StringVar(root) 
var.set('Choose an option') 

option = OptionMenu(root, var, *options, command=change_vars) 
option.pack() 
vars = [StringVar() for _ in range(len(options[0]))] #creates a list of 4 stringvars 
root.mainloop() 

여기에서 모든 변수를 하드 코딩하는 대신 루프로 작성하여 목록에 저장했습니다.