2013-06-12 45 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行代碼。我必須創建幾個選項菜單,所以我正在尋找一個合適的和更短的方式來做到這一點。

編輯: 有人指出創建功能,將生成選項菜單。所以我試過,

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() 

因爲這兩個選項的菜單具有相同的變量名稱,我怎麼取兩個值?

+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() 

在我的例子中,我假設是不會改變的唯一事情就是選項,但是如果每個實例都有自己的背景顏色或字體,則只需將其添加爲方法的參數即可。

+0

設法通過「(mymenu1.var).get()/(mymenu2.var).get()獲取不同的var值」非常感謝您的幫助 –

+0

嗨,關於如何使_options_變爲例如一個列表?而不是直接寫出來呢? @ A.Rodas – gussilago

+0

@A。 Rodas 是否有可能將_options_輸入作爲列表,而不是讓它們分離? – gussilago