簡體   English   中英

如何使用python同時按下多個tkinter按鈕

[英]How to press more than one tkinter button simultaneously using python

我在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

有人知道實現此目標的最佳方法是什么嗎? 非常感謝。

如果您只想調用回調,則可以執行此操作-畢竟它們是普通的Python函數。

如果您詢問如何創建事件並調度它,則可以使用event_generate方法。 不幸的是,我對此不了解任何tkinter文檔,因此您必須查看Tcl / Tk文檔 但基本思想是:

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參數,這些參數將在按鈕內部進行命中測試。

好的,我找到了解決方案。 我進行了額外的檢查,如果用戶在單擊按鈕之前按住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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM