鱼C论坛

 找回密码
 立即注册
查看: 7335|回复: 9

[已解决]tkinter 如何区分鼠标双击和单击?

[复制链接]
发表于 2016-7-5 12:04:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
tkinter 如何区分鼠标双击和单击?
import tkinter as tk 

root=tk.Tk()
l=tk.Label(root,text='鼠标按键测试',width=15,height=5)
l.pack()

n=0
def 单击(event):
    global n
    n+=1
    print('单击',n)

d=0
def 双击(event):
    global d
    d+=1
    print('双击',d)
    
l.bind("<Button-1>",单击)
l.bind("<Double-Button-1>",双击)
root.mainloop()

问题是:在对lable双击鼠标时,总是先触发一次单击,再触发双击事件。

我想要的效果是,双击时只触发 双击事件。如何严格把单双击事件分开?
最佳答案
2016-7-12 23:27:48
7天无人能解~
自己想了个办法
用一个 过滤线程 把多次按键动作分辨出来~
import tkinter as tk  
import time
import threading  as thd

ClkCnt=[0,0,0]
lock = thd.Lock()
lcClk = thd.local()

def 过滤器线程(clk):
    lcClk.clk=clk       
    slp=time.sleep
    tm=time.time
    t=tm()
    while tm()-t<0.3: #按键间隔
        lock.acquire()
        if ClkCnt[lcClk.clk-1]==0 :
            lock.release()
            return
        if max(ClkCnt)> lcClk.clk :
            ClkCnt[lcClk.clk-1]=0
            lock.release()
            return
        
        lock.release()
        slp(0.01)

    print('单双叁'[lcClk.clk-1],'击')
    ClkCnt[lcClk.clk-1]=0
    return

    
def 单(event):
    if ClkCnt[0]==0 :
        ClkCnt[0]=1
        thd.Thread(target=过滤器线程,args=(1,)).start()    

def 双(event):
    if ClkCnt[1]==0 :
        ClkCnt[1]=2
        thd.Thread(target=过滤器线程,args=(2,)).start()
    
def 叁(event):
    if ClkCnt[2]==0 :
        ClkCnt[2]=3
        thd.Thread(target=过滤器线程,args=(3,)).start()    


##------------------
root=tk.Tk()
l=tk.Label(root,text='鼠标按键测试',width=15,height=5)
l.pack()
l.bind("<Button-1>",单)
l.bind("<Double-Button-1>",双)
l.bind("<Triple-Button-1>",叁)
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-5 12:07:29 | 显示全部楼层
版本是 python 3.4.3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-5 18:16:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-6 23:45:36 | 显示全部楼层
ding~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-7 13:12:08 | 显示全部楼层
坛里无人啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 14:04:58 | 显示全部楼层
定义函数原来还能用中文,真是涨姿势,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 14:13:36 | 显示全部楼层
cwag2323 发表于 2016-7-7 14:04
定义函数原来还能用中文,真是涨姿势,,,,

不仅函数,其他的如变量,对象、模块等都可以用中文。
>>> 中文 = 99
>>> print(中文)
99
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-7 15:17:06 | 显示全部楼层
cwag2323 发表于 2016-7-7 14:04
定义函数原来还能用中文,真是涨姿势,,,,

只要是支持unicode的编程工具,都可以用中文表达算法。没什么稀奇的。

中英文只是字符集的区别而已,

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-8 07:36:45 | 显示全部楼层
此题无解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-12 23:27:48 | 显示全部楼层    本楼为最佳答案   
7天无人能解~
自己想了个办法
用一个 过滤线程 把多次按键动作分辨出来~
import tkinter as tk  
import time
import threading  as thd

ClkCnt=[0,0,0]
lock = thd.Lock()
lcClk = thd.local()

def 过滤器线程(clk):
    lcClk.clk=clk       
    slp=time.sleep
    tm=time.time
    t=tm()
    while tm()-t<0.3: #按键间隔
        lock.acquire()
        if ClkCnt[lcClk.clk-1]==0 :
            lock.release()
            return
        if max(ClkCnt)> lcClk.clk :
            ClkCnt[lcClk.clk-1]=0
            lock.release()
            return
        
        lock.release()
        slp(0.01)

    print('单双叁'[lcClk.clk-1],'击')
    ClkCnt[lcClk.clk-1]=0
    return

    
def 单(event):
    if ClkCnt[0]==0 :
        ClkCnt[0]=1
        thd.Thread(target=过滤器线程,args=(1,)).start()    

def 双(event):
    if ClkCnt[1]==0 :
        ClkCnt[1]=2
        thd.Thread(target=过滤器线程,args=(2,)).start()
    
def 叁(event):
    if ClkCnt[2]==0 :
        ClkCnt[2]=3
        thd.Thread(target=过滤器线程,args=(3,)).start()    


##------------------
root=tk.Tk()
l=tk.Label(root,text='鼠标按键测试',width=15,height=5)
l.pack()
l.bind("<Button-1>",单)
l.bind("<Double-Button-1>",双)
l.bind("<Triple-Button-1>",叁)
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 05:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表