如何使用python同时按下多个tkinter按钮
我在tkinter窗口中有多个按钮,但在计算机上,我们一次只能在一个位置上有一个鼠标指针,我怎么能像在触摸屏上一样同时按下多个按钮呢 这是我尝试做的一个示例代码如何使用python同时按下多个tkinter按钮,python,button,tkinter,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 rele
#!/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 pressed button2
You released button2
You released button1
有人知道实现这一目标的最佳方法是什么吗?非常感谢。如果您只想调用回调,那么您可以这样做,毕竟它们是普通的Python函数 如果您询问如何创建并分派事件,可以使用
event\u generate
方法。不幸的是,我不知道这方面的任何tkinter文档,因此您必须查看。但基本思想是:
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')
def点击按钮()
按钮1.事件_生成(“”,when='tail')
按钮2.事件生成(“”,when='tail')
按钮2.事件生成(“”,when='tail')
按钮1.事件_生成(“”,when='tail')
when
参数将事件放在事件队列的末尾,而不是立即处理它们,因此它们不会干扰重画或实际的鼠标事件。这在这里并不是必要的;我包含它主要是为了展示如何将其中一个Tcl参数(-when-tail
)映射到tkinter
如果希望通过正常分派而不是直接发送到按钮,可以调用
root.event\u 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()
您正在寻找代码来合成事件吗?或者只是构造它们,而不通过事件循环分派它们?还是直接调用处理程序?或者处理多点触控事件,即使Tkinter不支持它们?或者…?是的,基本上我想处理多点触控事件,即使Tkinter不支持它们。由于使用鼠标,我们一次只能点击一个按钮,所以需要一个解决方案,使我能够处理任何两个按钮按下一起或3个按钮按下一起等。
#!/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()
You pressed button1
You pressed button2
You released button2
You released button1