我有一个列表框我想只选择一个项目,如果我双击它,并在项目单击时使用多个选择模式。这可能吗?
下面的代码并不能完全满足我的要求,因为在调用双击事件时它会调用单击事件。理想情况下,我希望在两者之间放弃。
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()
答案 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()