加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python TKinter下拉菜单问题

发布时间:2020-12-20 11:24:21 所属栏目:Python 来源:网络整理
导读:在下面的代码中我遇到了self.dmenu1.bind(“ Button-1”,self.branches)行的问题,如果有人可以请我指出正确的方向,我真的很感激. 我希望在下拉菜单中选择一个选项,它会更改它下面的列表框内的排序. 然而实际发生的是,在我做出选择之后,我必须再次单击下拉框,
在下面的代码中我遇到了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,rowspan=2,sticky=ALL)
        self.Frame4.grid(row=1,sticky=ALL)
        self.Frame5.grid(row=2,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()

解决方法

我更喜欢理解问题和解决问题的路线,所以让我们来看看.在您的代码中,您有self.dmenu1.bind(“< Button-1>”,self.branches).

你有没有问自己这个事件什么时候被解雇了?单击OptionMenu时会触发它.这意味着当前选项将是使用的选项.因此,假设选项“a”处于活动状态,您更改为选项“b”.此选择更改不会触发Button-1事件,但是当您再次单击OptionMenu时,它将触发,然后窗口小部件将具有“b”作为当前选项.

你的代码实际上是:

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

并且可以安全地消除前面提到的绑定.只要在OptionMenu上进行选择,刚添加的命令选项就会调用某个函数.除了这个更改,您可能还希望在程序启动时填充列表框.为此,在定义self.f3ListBox之后调用self.branches(None).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读