2013-06-12 2 views
3

Я новичок в python, обычно, если я хочу добавить в мое меню дополнительное меню, я бы сделал что-то вроде этого.Более сжатый способ настройки меню опций tkinter?

from Tkinter import* 
root=Tk() 

mylist=['a','b','c'] 
var=StringVar(root) 
var.set("Select status") 
mymenu=OptionMenu(root,var,*mylist) 
mymenu.pack() 
mymenu.config(font=('calibri',(10)),bg='white',width=12) 
mymenu['menu'].config(font=('calibri',(10)),bg='white') 

root.mainloop() 

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

EDIT: Кто-то указал на создание функции, которая будет генерировать меню опций. Так что я попытался это,

from Tkinter import* 

def Dropmenu(mylist,status): 
    var=StringVar(root) 
    var.set(status) 
    mymenu=OptionMenu(root,var,*mylist) 
    mymenu.pack(side=LEFT) 
    mymenu.config(font=('calibri',(10)),bg='white',width=12) 
    mymenu['menu'].config(font=('calibri',(10)),bg='white') 

root=Tk() 

Dropmenu(['a','b','c'],'Select') 

root.mainloop() 

Но теперь, как я решить «вар», так что я могу извлечь все значения, которые выбрал пользователь? Согласно моему примеру, все меню параметров будет иметь одно и то же значение «var», поэтому у меня нет способа получить выбор, который пользователь сделал для другого меню опций.

Чтобы сделать вещи более ясно, скажем, если у меня есть 2 меню опций

Dropmenu(['a','b','c'],'Select') 
Dropmenu(['c','d','e'],'Select') 

Если я использую

myvalue=var.get() 

Поскольку обе опции меню имеют такое же имя, Var, как я принести оба значения?

+1

Каждый раз, когда у вас есть повторяющаяся задача, ваша первая мысль должна быть «Могу ли я определить функцию, чтобы упростить это?» – mgilson

ответ

6

Если вы собираетесь создать несколько меню с той же конфигурацией, я бы подкласс OptionMenu вместо определения функции:

from Tkinter import* 

class MyOptionMenu(OptionMenu): 
    def __init__(self, master, status, *options): 
     self.var = StringVar(master) 
     self.var.set(status) 
     OptionMenu.__init__(self, master, self.var, *options) 
     self.config(font=('calibri',(10)),bg='white',width=12) 
     self['menu'].config(font=('calibri',(10)),bg='white') 

root = Tk() 
mymenu1 = MyOptionMenu(root, 'Select status', 'a','b','c') 
mymenu2 = MyOptionMenu(root, 'Select another status', 'd','e','f') 
mymenu1.pack() 
mymenu2.pack() 
root.mainloop() 

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

+0

удалось получить разные значения var «(mymenu1.var) .get()/(mymenu2.var) .get()« Большое спасибо за вашу помощь –

+0

Привет, любая идея о том, как сделать _options_ в виде, например. список? Вместо того, чтобы просто писать их явно? @ A.Rodas – gussilago

+0

@A. Rodas Возможно ли иметь вход _options_ как список, вместо того, чтобы дать их отдельно? – gussilago

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

  • Нет связанных вопросов^_^