[英]I would like to create a tkinter Python button that activates more than one command when I press one button
[英]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
並傳遞x
和y
參數,這些參數將在按鈕內部進行命中測試。
好的,我找到了解決方案。 我進行了額外的檢查,如果用戶在單擊按鈕之前按住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.