如何使用python同时按下多个tkinter按钮

时间:2018-04-18 03:40:41

标签: python button tkinter

我在tkinter窗口中有多个按钮,但在计算机上我们一次只能在一个位置使用一个鼠标指针,如何在触摸屏上同时多按按钮?

以下是我正在尝试做的示例代码,

#!/usr/bin/python
import Tkinter as Tk

def button_pressed_cb(event):
    print("You pressed " + event.widget['text'])

def button_release_cb(event):
    print("You released " + event.widget['text'])

root = Tk.Tk()
button1 = Tk.Button(root, text="button1")
button1.pack()
button2 = Tk.Button(root, text="button2")
button2.pack()

button1.bind("<ButtonPress>", button_pressed_cb)
button1.bind("<ButtonRelease>", button_release_cb)
button2.bind("<ButtonPress>", button_pressed_cb)
button2.bind("<ButtonRelease>", button_release_cb)

root.mainloop()

执行此操作后,我得到类似这样的示例输出

You pressed button1
You released button1
You pressed button2
You released button2

我想要实现的是能够生成按此顺序发生的事件,

You pressed button1
You pressed button2
You released button2
You released button1

有谁知道实现这一目标的最佳方法是什么?非常感谢你。

2 个答案:

答案 0 :(得分:2)

如果你只是想调用回调函数,你可以这样做 - 毕竟它们是普通的Python函数。

如果您询问如何创建事件并发送事件,则可以使用event_generate方法。不幸的是,我不知道任何针对此的tkinter文档,因此您必须查看Tcl/Tk docs。但基本的想法是:

def hit_the_buttons():
    button1.event_generate('<ButtonPress>', when='tail')
    button2.event_generate('<ButtonPress>', when='tail')
    button2.event_generate('<ButtonRelease>', when='tail')
    button1.event_generate('<ButtonRelease>', when='tail')

when参数将事件放在事件队列的末尾而不是立即处理它们,因此它们不会干扰重绘或实际鼠标事件等事情。这不是必要的;我把它包括在内主要是为了展示如何将其中一个Tcl参数(-when tail)映射到tkinter。

如果您希望通过正常发送而不是直接发送到按钮,则可以调用root.event_generate并传递xy个参数,这些参数将在的按钮。

答案 1 :(得分:0)

好的,我找到了解决方案。我进行了额外的检查,如果用户在单击按钮之前按下并按住 ctrl ,该按钮将锁定到该按下状态。然后用户可以点击其他按钮等。用户可以再次单击该按钮将其解锁。

我还为用户添加了一个悬停消息,告诉用户他们可以使用 ctrl 来锁定按钮并实现多键按下。

这是新代码,

#!/usr/bin/python
import Tkinter as Tk

class HoverInfo(Tk.Menu):
    def __init__(self, parent, text):
        Tk.Menu.__init__(self, parent, tearoff=0, 
                         background='light goldenrod yellow')

        self.__displayed = False
        for line in text.split('\n'):
            self.add_command(label=line)

        parent.bind("<Enter>", self.__display)
        parent.bind("<Leave>", self.__remove)

    def __display(self, event):
        if event.widget['state'] == Tk.NORMAL:
            if not self.__displayed:
                self.__displayed = True
                self.post(event.x_root+5, event.y_root+5)

    def __remove(self, event):
        if self.__displayed:
            self.__displayed = False
            self.unpost()

CONTROL = 4

def button_pressed_cb(event):
    if event.widget['state'] != Tk.DISABLED:
        print("You pressed " + event.widget['text'])
        if (event.state & CONTROL) == CONTROL:
            event.widget.config(state=Tk.DISABLED)
            event.widget.config(relief=Tk.SUNKEN)

def button_release_cb(event):
    if (event.state & CONTROL) != CONTROL:
        print("You released " + event.widget['text'])
        event.widget.config(state=Tk.NORMAL)
        event.widget.config(relief=Tk.RAISED)


root = Tk.Tk()
button1 = Tk.Button(root, text="button1")
button1.pack()
button2 = Tk.Button(root, text="button2")
button2.pack()

button1.bind("<ButtonPress>", button_pressed_cb)
button1.bind("<ButtonRelease>", button_release_cb)
button2.bind("<ButtonPress>", button_pressed_cb)
button2.bind("<ButtonRelease>", button_release_cb)

HoverInfo(button1, "Hint:\nYou can hold Ctrl key before\nclicking a button to latch it.")

root.mainloop()

现在,这是悬停消息的外观, https://ibb.co/dEb6Bn

当用户按住ctrl键并单击按钮1然后按钮2时,这就是它的外观, https://ibb.co/eVzRBn

现在,我可以很容易地生成这一系列事件,

You pressed button1
You pressed button2
You released button2
You released button1