Более краткий способ настроить меню параметров tkinter?

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

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 строк кода. Мне нужно создать несколько меню опций, поэтому я ищу правильный и более короткий способ сделать это.

РЕДАКТИРОВАТЬ: кто-то указал на создание функции, которая будет генерировать меню параметров. Итак, я попробовал это,

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», чтобы я мог получить все значения, которые выбрал пользователь? Согласно моему примеру, все меню опций будут иметь одинаковое значение «var», поэтому у меня нет возможности получить выбор, сделанный пользователем для другого меню опций.

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

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

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

myvalue=var.get()

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


person Chris Aung    schedule 12.06.2013    source источник
comment
Каждый раз, когда у вас возникает повторяющаяся задача, вашей первой мыслью должно быть «Могу ли я определить функцию, чтобы упростить ее?»   -  person mgilson    schedule 12.06.2013


Ответы (1)


Если вы собираетесь создать несколько меню с одинаковой конфигурацией, я бы создал подкласс 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__.

person A. Rodas    schedule 12.06.2013
comment
удалось получить разные значения var с помощью (mymenu1.var).get()/(mymenu2.var).get() Большое спасибо за вашу помощь - person Chris Aung; 12.06.2013
comment
Привет, любая идея о том, как превратить options в, например. список? Вместо того, чтобы просто написать их явно? @А.Родас - person gussilago; 24.04.2014
comment
@А. Rodas Можно ли вводить options в виде списка, вместо того, чтобы задавать их отдельно? - person gussilago; 24.04.2014