4

私は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行のコードが必要になるため、同じ結果を達成するためのより短い方法があるかどうか疑問に思っています. いくつかのオプションメニューを作成する必要があるため、適切で短い方法を探しています。

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」に対処するにはどうすればよいですか? 私の例によると、すべてのオプション メニューは同じ「var」値を持つため、ユーザーが別のオプション メニューに対して行った選択を取得する方法がありません。

より明確にするために、2 つのオプション メニューがあるとします。

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

私が使用する場合

myvalue=var.get()

両方のオプション メニューに同じ var 名があるため、両方の値を取得するにはどうすればよいですか?

4

1 に答える 1

7

同じ構成で複数のメニューを作成する場合は、関数を定義する代わりに 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__メソッドに追加するだけで済みます。

于 2013-06-12T01:32:53.923 に答える