在tkinter GUI中检测同时的左键和右键点击

0 投票
3 回答
2244 浏览
提问于 2025-04-18 11:26

我尝试搜索了一下,但没找到答案。如果之前有人问过这个问题,请告诉我那个帖子在哪里。

我在Python中有一个按钮,我想把这个按钮绑定到左键点击、右键点击和同时点击两个按钮的功能上。这里的同时点击是指同时按下和/或释放鼠标的左键和右键。

我该怎么实现同时点击呢?

另外,还要绑定一下,确保在同时点击的时候不会触发左键点击和/或右键点击。

注意:这和在扫雷游戏中左键点击、右键点击以及同时点击两个鼠标按钮是类似的。

3 个回答

0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。

比如,有人可能在使用某个特定的功能时,发现它并没有按照预期工作。这时候,我们就需要去查找解决方案,看看有没有其他人遇到过类似的问题,以及他们是如何解决的。

在这种情况下,StackOverflow是一个很好的资源。这里有很多程序员分享他们的经验和解决方案。你可以在这里找到很多问题的答案,或者向大家提问,寻求帮助。

总之,遇到问题时,不要气馁,去寻找答案,利用好社区的力量,慢慢你就会变得更加熟练。

self.bind("<Button-3>", lambda e:self.func())
2

你可以这样来实现这个功能。

使用两个变量,分别叫做 left_mouse_pressedright_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()
1

这只是对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()

撰写回答