鱼C论坛

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

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

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

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

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

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

  1. import tkinter as tk

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

  5. n=0
  6. def 单击(event):
  7.     global n
  8.     n+=1
  9.     print('单击',n)

  10. d=0
  11. def 双击(event):
  12.     global d
  13.     d+=1
  14.     print('双击',d)
  15.    
  16. l.bind("<Button-1>",单击)
  17. l.bind("<Double-Button-1>",双击)
  18. root.mainloop()
复制代码


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

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

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

  7. def 过滤器线程(clk):
  8.     lcClk.clk=clk      
  9.     slp=time.sleep
  10.     tm=time.time
  11.     t=tm()
  12.     while tm()-t<0.3: #按键间隔
  13.         lock.acquire()
  14.         if ClkCnt[lcClk.clk-1]==0 :
  15.             lock.release()
  16.             return
  17.         if max(ClkCnt)> lcClk.clk :
  18.             ClkCnt[lcClk.clk-1]=0
  19.             lock.release()
  20.             return
  21.         
  22.         lock.release()
  23.         slp(0.01)

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

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

  32. def 双(event):
  33.     if ClkCnt[1]==0 :
  34.         ClkCnt[1]=2
  35.         thd.Thread(target=过滤器线程,args=(2,)).start()
  36.    
  37. def 叁(event):
  38.     if ClkCnt[2]==0 :
  39.         ClkCnt[2]=3
  40.         thd.Thread(target=过滤器线程,args=(3,)).start()   


  41. ##------------------
  42. root=tk.Tk()
  43. l=tk.Label(root,text='鼠标按键测试',width=15,height=5)
  44. l.pack()
  45. l.bind("<Button-1>",单)
  46. l.bind("<Double-Button-1>",双)
  47. l.bind("<Triple-Button-1>",叁)
  48. 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
定义函数原来还能用中文,真是涨姿势,,,,

不仅函数,其他的如变量,对象、模块等都可以用中文。
  1. >>> 中文 = 99
  2. >>> print(中文)
  3. 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天无人能解~
自己想了个办法
用一个 过滤线程 把多次按键动作分辨出来~
  1. import tkinter as tk  
  2. import time
  3. import threading  as thd

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

  7. def 过滤器线程(clk):
  8.     lcClk.clk=clk      
  9.     slp=time.sleep
  10.     tm=time.time
  11.     t=tm()
  12.     while tm()-t<0.3: #按键间隔
  13.         lock.acquire()
  14.         if ClkCnt[lcClk.clk-1]==0 :
  15.             lock.release()
  16.             return
  17.         if max(ClkCnt)> lcClk.clk :
  18.             ClkCnt[lcClk.clk-1]=0
  19.             lock.release()
  20.             return
  21.         
  22.         lock.release()
  23.         slp(0.01)

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

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

  32. def 双(event):
  33.     if ClkCnt[1]==0 :
  34.         ClkCnt[1]=2
  35.         thd.Thread(target=过滤器线程,args=(2,)).start()
  36.    
  37. def 叁(event):
  38.     if ClkCnt[2]==0 :
  39.         ClkCnt[2]=3
  40.         thd.Thread(target=过滤器线程,args=(3,)).start()   


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 12:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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