2015-07-06 3 views
3

Я сделал несколько вариантовMenu в Tkinter в python, я хочу получить значение, которое было выбрано пользователем. Я использовал var.get() в методе, который вызывается при нажатии элемента, но я не получаю правильное значение. Я продолжаю получать «статус», который является значением, которое я первоначально назначил для var, используя var.set(). Элементы в моем меню инициализируются после нажатия кнопки обзора, поэтому я заполнил список в методе, называемом браузером. в атрибуте команды каждого элемента, который я назвал justamethod, чтобы напечатать значение. Вот мой код:Получение значения выбранного элемента в опцииMenu Tkinter

 self.varLoc= StringVar(master) 
     self.varLoc.set("status") 

     self.varColumn= StringVar(master) 
     self.varColumn.set("") 

     self.locationColumn= Label(master,text="Select a column as a location indicator", font=("Helvetica", 12)) 
     self.columnLabel= Label(master,text="Select a column to process", font=("Helvetica", 12)) 

     global locationOption 
     global columnOption 
     columnOption= OptionMenu (master, self.varColumn,"",*columnList) 
     locationOption= OptionMenu (master, self.varLoc,"",*columnList) 

     self.locationColumn.grid (row=5, column=1, pady=(20,0), sticky=W, padx=(5,0)) 
     locationOption.grid (row=5, column=3, pady=(20,0)) 

def browser (selft): 
      filename = askopenfilename() 
      #open_file(filename) 
      t=threading.Thread (target=open_file, args=(filename,)) 
      #t=thread.start_new_thread (open_file,(filename,)) # create a new thread to handle the process of opening the file. 
      # we must then send the file name to the function that reads it somehow. 
      t.start() 
      t.join() #I use join because if I didn't,next lines will execute before open_file is completed, this will make columnList empty and the code will not execute. 
      opt=columnOption.children ['menu'] 
      optLoc= locationOption.children ['menu'] 
      optLoc.entryconfig (0,label= columnList [0], command=selft.justamethod) 
      opt.entryconfig (0, label= columnList [0], command=selft.justamethod) 
      for i in range(1,len (columnList)): 
       opt.add_command (label=columnList[i], command=selft.justamethod) 
       optLoc.add_command (label=columnList[i], command=selft.justamethod) 

    def justamethod (self): 
     print("method is called") 
     print(self.varLoc.get()) 

window= Tk() #main window. 
starter= Interface (window) 


window.mainloop() #keep the window open until the user decides to close it. 

Может ли кто-нибудь сказать мне, как получить значение выбранного элемента?

Спасибо.

+1

Если вы указали пример своей работы, то это будет намного проще понять. Вы должны попытаться извлечь проблемный код в минимальном примере, чтобы облегчить воспроизведение мной и другими людьми, которые хотят помочь. – Tupteq

+0

Привет, Tupteq, спасибо за ваше предложение, я всегда буду пытаться предоставить простой пример для кода. Ответ на maccartm хорош. – Dania

ответ

1

justamethod функция не будет печатать ничего, кроме инициализируется значением varLoc, потому что вы не делать ничего с ним.

Поскольку параметры меню не могут принимать аргумент variable, вместо того, чтобы пытаться обновить значение одной переменной для всех параметров меню, как пропустить какое-либо произвольное значение для каждой из кнопок меню?

Пример:

from Tkinter import * 
root = Tk() 

def callback(var): 
    print ("%d" %var) 

menubar = Menu(root) 

# create a pulldown menu, and add it to the menu bar 
filemenu = Menu(menubar, tearoff=0) 
filemenu.add("command", label="Open", command=lambda: callback(1)) 
filemenu.add("command", label="Save", command=lambda: callback(2)) 
filemenu.add_separator() 
filemenu.add_command(label="Exit", command=root.quit) 
menubar.add_cascade(label="File", menu=filemenu) 

# create more pulldown menus 
editmenu = Menu(menubar, tearoff=0) 
editmenu.add("command", label="Cut", command=lambda: callback(3)) 
editmenu.add("command", label="Copy", command=lambda: callback(4)) 
editmenu.add("command", label="Paste", command=lambda: callback(5)) 
menubar.add_cascade(label="Edit", menu=editmenu) 

helpmenu = Menu(menubar, tearoff=0) 
helpmenu.add("command", label="About", command=lambda: callback(6)) 
menubar.add_cascade(label="Help", menu=helpmenu) 

# display the menu 
root.config(menu=menubar) 

root.mainloop() 

(. Пример взят непосредственно из this tutorial)

В случае вашего кода, так как вы делаете кнопки меню в пределах for цикла с использованием счетчика i, вы могли бы просто сделайте что-нибудь вроде command = lambda: self.justamethod(i), а затем в пределах justamethod распечатайте аргумент i, который передается, чтобы увидеть, что я имею в виду.

Я надеюсь, что это поможет вам решить вашу проблему, так как я не могу изменить ваш предоставленный код, чтобы предложить решение, поскольку оно непригодно.

+1

Отличный ответ mccartm, спасибо большое. – Dania

Смежные вопросы