在tkinter GUI中检测同时的左键和右键点击
我尝试搜索了一下,但没找到答案。如果之前有人问过这个问题,请告诉我那个帖子在哪里。
我在Python中有一个按钮,我想把这个按钮绑定到左键点击、右键点击和同时点击两个按钮的功能上。这里的同时点击是指同时按下和/或释放鼠标的左键和右键。
我该怎么实现同时点击呢?
另外,还要绑定一下,确保在同时点击的时候不会触发左键点击和/或右键点击。
注意:这和在扫雷游戏中左键点击、右键点击以及同时点击两个鼠标按钮是类似的。
3 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。
比如,有人可能在使用某个特定的功能时,发现它并没有按照预期工作。这时候,我们就需要去查找解决方案,看看有没有其他人遇到过类似的问题,以及他们是如何解决的。
在这种情况下,StackOverflow是一个很好的资源。这里有很多程序员分享他们的经验和解决方案。你可以在这里找到很多问题的答案,或者向大家提问,寻求帮助。
总之,遇到问题时,不要气馁,去寻找答案,利用好社区的力量,慢慢你就会变得更加熟练。
self.bind("<Button-3>", lambda e:self.func())
你可以这样来实现这个功能。
使用两个变量,分别叫做 left_mouse_pressed
和 right_mouse_pressed
。
当这两个变量同时为 True
时,说明左右鼠标键都被按下了。
当松开鼠标时,把这两个变量的状态重置为 False
。
import Tkinter
class App:
def __init__(self, root):
self.root = root
self.left_mouse_pressed = False
self.right_mouse_pressed = False
f = Tkinter.Frame(width=100, height=100, background="cyan")
f.pack()
f.bind("<Button-1>", self.onAnyofTwoPressed)
f.bind("<Button-3>", self.onAnyofTwoPressed)
f.bind("<ButtonRelease-1>", self.resetPressedState)
f.bind("<ButtonRelease-3>", self.resetPressedState)
def onAnyofTwoPressed(self, event):
if event.num==1:
self.left_mouse_pressed = True
if event.num==3:
self.right_mouse_pressed = True
if (self.left_mouse_pressed and self.right_mouse_pressed):
print 'yay both pressed'
def resetPressedState(self, event):
self.left_mouse_pressed = False
self.right_mouse_pressed = False
root=Tkinter.Tk()
app = App(root)
root.mainloop()
这只是对tao例子的一个修改。
它会在鼠标按钮释放时打印出 left pressed
(左键按下)、right pressed
(右键按下)和 both pressed
(两个键都按下)
有时候只在释放的时候打印就足够了。
import Tkinter
import time
class App:
def __init__(self, root):
self.root = root
self.left_mouse_pressed = False
self.right_mouse_pressed = False
f = Tkinter.Frame(width=100, height=100, background="cyan")
f.pack()
f.bind("<Button-1>", self.onAnyofTwoPressed)
f.bind("<Button-3>", self.onAnyofTwoPressed)
f.bind("<ButtonRelease-1>", self.resetPressedState)
f.bind("<ButtonRelease-3>", self.resetPressedState)
def onAnyofTwoPressed(self, event):
if self.left_mouse_pressed and self.left_mouse_pressed <= time.time():
self.left_mouse_pressed = False
if self.right_mouse_pressed and self.right_mouse_pressed <= time.time():
self.right_mouse_pressed = False
if event.num==1:
self.left_mouse_pressed = time.time() + 500
if event.num==3:
self.right_mouse_pressed = time.time() + 500
def resetPressedState(self, event):
if self.left_mouse_pressed and self.right_mouse_pressed:
print 'both pressed'
elif self.left_mouse_pressed:
print 'left pressed'
elif self.right_mouse_pressed:
print 'rigth pressed'
self.left_mouse_pressed = False
self.right_mouse_pressed = False
root=Tkinter.Tk()
app = App(root)
root.mainloop()
编辑:这是我用 after()
方法的版本 - 它会在鼠标按钮按下时打印。
在 after()
中的300是指“反应时间”。
import Tkinter as tk
import time
root = tk.Tk()
left_pressed = False
rigth_pressed = False
def on_left_click(event):
global left_pressed, rigth_pressed
if rigth_pressed:
rigth_pressed = False
else:
left_pressed = True
root.after(300, on_left_later)
def on_left_later():
global left_pressed
if left_pressed:
left_pressed = False
print "left pressed"
else:
print "both pressed"
def on_right_click(event):
global left_pressed, rigth_pressed
if left_pressed:
left_pressed = False
else:
rigth_pressed = True
root.after(300, on_right_later)
def on_right_later():
global rigth_pressed
if rigth_pressed:
rigth_pressed = False
print "rigth pressed"
# else:
# print "(right_do_nothing)"
button = tk.Button(root, text="Clik me! - left, right, both")
button.pack()
button.bind('<Button-1>',on_left_click)
button.bind('<Button-3>',on_right_click)
tk.mainloop()