tkinter selectmode列表框

时间:2017-07-21 20:23:07

标签: python tkinter listbox

我有一个列表框我想只选择一个项目,如果我双击它,并在项目单击时使用多个选择模式。这可能吗?

下面的代码并不能完全满足我的要求,因为在调用双击事件时它会调用单击事件。理想情况下,我希望在两者之间放弃。

from tkinter import *

class Message:
    def __init__(self, root):
        self.list_item = StringVar()
        self.listBoxObj = Listbox(root, listvariable=self.list_item, selectmode='multiple')
        listItems = ['Jane', 'Kate', 'Dani']
        self.listBoxObj.pack()
        self.listBoxObj.bind('<Double-Button-1>', self.on_double_click)
        self.listBoxObj.bind('<ButtonRelease-1>', self.on_single_click)
        for item in listItems:
            self.listBoxObj.insert(END, item)

    def on_double_click(self, event):
         widget = event.widget
         selection = widget.curselection()
         value = widget.get(selection[0])
         popup = Tk()
         popup.geometry('300x200')
         listBox2 = Listbox(popup)
         listBox2.insert(END, str(value))
         listBox2.pack()
         popup.mainloop()

    def on_single_click(self,event):
        print('do something different here')

if __name__ == '__main__':
    root = Tk()
    cMessageObj = Message(root)
    root.mainloop()

2 个答案:

答案 0 :(得分:1)

当用户双击时,Tkinter将始终发送单击和双击事件。可以这样想:当您单击一次时,计算机不知道您是否要再次单击,因此它会发送单击事件。

如果再次单击,tkinter会将时间戳与上一次点击事件进行比较,如果它低于阈值,则会注册双击。此时,它无法撤消单击事件。

如果您需要区分这两者,则需要对其进行设置,以便将来短时间内发生任何单击操作(通过after)。然后,如果双击,则可以取消单击操作。

从可用性的角度来看,我不建议这样做。在大多数情况下,单击应始终执行某些操作,双击将对单击执行添加

答案 1 :(得分:0)

为了区分单击和双击之间的操作,请将对鼠标操作的调用延迟一段时间以允许设置双击标记。见下面的例子:

from tkinter import *

def mouse_click(event):
    '''  delay mouse action to allow for double click to occur
    '''
    aw.after(300, mouse_action, event)

def double_click(event):
    '''  set the double click status flag
    '''
    global double_click_flag
    double_click_flag = True

def mouse_action(event):
    global double_click_flag
    if double_click_flag:
        print('double mouse click event')
        double_click_flag = False
    else:
        print('single mouse click event')

root = Tk()
aw = Canvas(root, width=200, height=100, bg='grey')
aw.place(x=0, y=0)

double_click_flag = False
aw.bind('<Button-1>', mouse_click) # bind left mouse click
aw.bind('<Double-1>', double_click) # bind double left clicks
aw.mainloop()