3

以下のコードでは、行self.dmenu1.bind("<Button-1>", self.branches)で問題が発生しています。誰かが私を正しい方向に設定していただければ、本当に感謝しています。

ドロップダウンメニューでオプションを選択すると、その下のリストボックス内の並べ替えが変更されることを期待しています。
ただし、実際に起こっていることは、選択を行った後、並べ替えが有効になる前にドロップダウン ボックスをもう一度クリックする必要があるということです。

これは、ユーザーがドロップダウン メニューの動作を期待する方法ではありません。ご覧のとおり、完全なコードを投稿しました。私はすべてに慣れていませんが、学ぶのは素晴らしい挑戦です:)

よろしくお願いします。
よろしく、

from tkinter import *

ALL = N+S+W+E

users = ['Fred Asus','Tom Yahoo','Jessy Samsung','Jermain Sony','Nikki Nikon',
        'Ian IBM','Elena Google','Rob Braun','Tammy Tonika','James Intel',
        'Murphy Richards','Daniel Denon']

branchlst = {138:'Driving - St Albans', 170:'Brighton', 271:'Driving - Birmingham',
           330:'Leeds', 680:'Edinburgh'}

class Application(Frame):

    def __init__(self, master=None):
        #initiate the primary window.
        Frame.__init__(self, master)
        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        self.rowconfigure(0, weight=0)
        self.rowconfigure(1, weight=0)
        self.rowconfigure(2, weight=3)
        self.columnconfigure(0, weight=0)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        self.grid(sticky=ALL)
        self.frameset()

    def frameset(self):
        #define and setup frames with columns and rows for widgets
        #Colours added to framesets to help designing layout. delete them
        self.Frame1 = Frame(self)   # D
        self.Frame2 = Frame(self, bg='blue')  # E
        self.Frame3 = Frame(self)              # L
        self.Frame4 = Frame(self, bg='blue')  # E
        self.Frame5 = Frame(self) # T
        self.Frame6 = Frame(self) # E colours

        self.Frame1.rowconfigure(0,weight=0)
        self.Frame2.rowconfigure(0,weight=0)
        self.Frame3.rowconfigure(0,weight=1)
        self.Frame4.rowconfigure(0,weight=1)
        self.Frame5.rowconfigure(0,weight=1)
        self.Frame6.rowconfigure(0,weight=1)

        self.Frame1.columnconfigure(0,weight=0)
        self.Frame2.columnconfigure(0,weight=0)
        self.Frame3.columnconfigure(0,weight=1)
        self.Frame4.columnconfigure(0,weight=1)
        self.Frame5.columnconfigure(0,weight=1)
        self.Frame6.columnconfigure(0,weight=1)

        self.Frame1.grid(row=0, column=0, rowspan=1, columnspan=1, sticky=ALL)
        self.Frame2.grid(row=0, column=1, columnspan=2, sticky=ALL)
        self.Frame3.grid(row=1, column=0, rowspan=2, sticky=ALL)
        self.Frame4.grid(row=1, column=1, columnspan=2, sticky=ALL)
        self.Frame5.grid(row=2, column=1, rowspan=1, columnspan=1, sticky=ALL)
        self.Frame6.grid(row=2, column=2, sticky=ALL)


        label4a = Label(self.Frame4, text='table1', bg='orange')
        label4b = Label(self.Frame4, text='table2', bg='yellow')
        label4a.pack(side=LEFT)
        label4b.pack(side=RIGHT)

        self.objects()

    def objects(self):
        var = StringVar()
        var.set('Name')
        self.dmenu1 = OptionMenu(self.Frame1, var,'Costcode','Name')
        self.dmenu1.pack(side=TOP, fill=BOTH)
        self.dmenu1.bind("<Button-1>", self.branches)

        self.f3ListBox = Listbox(self.Frame3, selectmode='single')
        #self.branches()
        self.f3ListBox.grid(sticky=ALL)
        self.f3ListBox.bind("<Button-3>", self.f1handler1)

        f5ListBox = Listbox(self.Frame5, selectmode='single')
        n = 0
        for item in users:
            f5ListBox.insert(n,item)
            n += 1
        f5ListBox.grid(sticky=ALL)

        f6ListBox = Listbox(self.Frame6, selectmode='single')
        f6ListBox.insert(1,'S123456') # DELETE
        f6ListBox.insert(2,'S313414') # DELETE
        f6ListBox.insert(3,'S573343') # DELETE
        f6ListBox.grid(sticky=ALL)    


    def f1handler1(self, event):
        """Creates a popup menu for the alternative mouse button.
        Edit this to add more options to that popup"""
        select = lambda: self.f3ListBox.delete(ACTIVE)
        popup = Menu(self, tearoff=0)
        popup.add_command(label='Quit',command=self.quit)
        popup.add_command(label='delete',command=select) #add more of these for more options


        try:
            popup.post(event.x_root, event.y_root)
        except:
            pass
    def branches(self, event):
        self.f3ListBox.delete(0,END)
        n = 0
        if self.dmenu1.cget('text') == 'Costcode':
            cc = sorted(list(branchlst.keys()))
            for item in cc:
                self.f3ListBox.insert(n,str(item)+' '+branchlst[item])
                n += 1
        elif self.dmenu1.cget('text') == 'Name':
            bb = sorted(list(branchlst.values()))
            for item in bb:
                for name,val in branchlst.items():
                    if item == val:
                        self.f3ListBox.insert(n,item+' '+str(name))

root = Tk()
app = Application(master=root)
app.mainloop()
4

2 に答える 2

5

問題を理解して解決するルートが好きなので、それを見ていきましょう。あなたのコードにはself.dmenu1.bind("<Button-1>", self.branches)

このイベントが実際に発生したのはいつですか。をクリックすると発生しますOptionMenu。これは、現在のオプションが使用されることを意味します。したがって、オプション「a」がアクティブで、オプション「b」に変更したとします。この選択の変更はButton-1イベントを発生させませんが、OptionMenuもう一度クリックすると発生し、ウィジェットには現在のオプションとして「b」が表示されます。

実際にコードに含まれているのは次のとおりです。

self.dmenu1 = OptionMenu(self.Frame1, var,'Costcode','Name',
                         command=self.branches)

そして、前述のバインディングは安全に排除できます。追加したばかりのcommandオプションは、で選択が行われるたびに特定の関数を呼び出しますOptionMenu。この変更に加えて、プログラムの起動時にリストボックスの下にリストボックスを追加することもできます。そのためには、self.branches(None)を定義した後に呼び出しますself.f3ListBox

于 2012-12-20T16:30:36.487 に答える
2

StringVar クラスにはtrace、コールバック関数をアタッチできるメソッドがあります。この関数は、変数の値が変更されたときに呼び出されます。

コードで、この行をメソッドのvar.set('Name')行のすぐ下に追加します。objects

var.trace('w', self.branches)

これにより、変更self.branchesされるたびに呼び出されvarます。3 つの引数で呼び出されるため、ブランチの定義を次のように変更する必要があります。

def branches(self, name, index, mode):

self.dmenu1.bind("<Button-1>", self.branches)冗長になっているため、この行も削除する必要があります。

于 2012-12-20T16:07:50.673 に答える