Yun*_*Gun 3 python tkinter python-3.x
在使用Python 3.7的tkinter中,事件绑定的默认行为是在释放鼠标之后单击鼠标后不会触发"<Enter>"事件.我打算实现一个可滚动的表,以便检测"<Button-1>"(鼠标左键单击)和"<ButtonRelease-1>"(鼠标左键单击)事件以及每个表行的窗口小部件"<Enter>"事件绑定以检测鼠标指针何时进入不同的表行.通过这种方式,我可以通过单击一行并在表格中拖动来滚动我的表格.我的假设是,即使按住鼠标按钮也会触发"<Enter>"事件,这是不正确的.所以,我的整个滚动实现都碰壁了.我需要在鼠标停止时触发这些事件,否则它将无法工作.我做的事情如下:
from tkinter import *
class App:
def __init__(self):
self.root = Tk()
# The name kwarg is used to infer the index of the row in the event handlers.
self.labels = [Label(text=f"Label #{i}", name=f"row-{i}") for i in range(5)]
for row, label in enumerate(self.labels):
label.bind("<Button-1>", self.mouse_down)
label.bind("<ButtonRelease-1>", self.mouse_up)
label.bind("<Enter>", self.mouse_enter)
label.grid(row=row, column=0)
mainloop()
def mouse_up(self, event):
idx = self.index_from_event(event)
# Do some with the row with the passed index
def mouse_down(self, event):
idx = self.index_from_event(event)
# Do some with the row with the passed index
def mouse_enter(self, event):
# I would like for this to be triggered even when the mouse is pressed down.
# However, by default tkinter doesn't allow this.
pass
def index_from_event(self, event):
# Get the index of the row from the labels name string.
return str(event.widget).split('-')[-1]
Run Code Online (Sandbox Code Playgroud)
在tkinter中按住鼠标按钮1的同时启用鼠标输入事件的任何方法?关于effbot的所有文档(http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm)都说输入事件是:
<Enter>
The mouse pointer entered the widget (this event doesn’t mean that the user pressed the Enter key!).
Run Code Online (Sandbox Code Playgroud)
不,当按钮关闭时,没有直接的方法绑定到进入和离开事件,除了首先获得点击的小部件.然而,添加这种能力相当容易
您可以绑定<B1-Motion>到所有小部件,只要鼠标移动就会调用该小部件.然后,您可以使用该winfo_containing方法确定光标下的窗口小部件.使用该信息,您可以生成可以绑定的虚拟事件(或者您可以跳过虚拟事件并在运动事件的处理程序中添加代码).
这是一个人为的例子.当您单击并移动鼠标时,show_info将被调用.它跟踪当前窗口小部件并将其与光标下的窗口小部件进行比较.如果它不同,它会生成<<B1-Leave>>前一个窗口小部件和<<B1-Enter>>新窗口小部件.那些绑定将显示"Hello,cursor!" 当光标在标签上时.
import tkinter as tk
current_widget = None
def show_info(event):
global current_widget
widget = event.widget.winfo_containing(event.x_root, event.y_root)
if current_widget != widget:
if current_widget:
current_widget.event_generate("<<B1-Leave>>")
current_widget = widget
current_widget.event_generate("<<B1-Enter>>")
def on_enter(event):
event.widget.configure(text="Hello, cursor!")
def on_leave(event):
event.widget.configure(text="")
root = tk.Tk()
label = tk.Label(root, bd=1, relief="raised")
l1 = tk.Label(root, text="", width=20, bd=1, relief="raised")
l2 = tk.Label(root, text="", width=20, bd=1, relief="raised")
label.pack(side="top", fill="x")
l1.pack(fill="both", expand=True, padx=20, pady=20)
l2.pack(fill="both", expand=True, padx=20, pady=20)
root.bind_all("<B1-Motion>", show_info)
l1.bind("<<B1-Enter>>", on_enter)
l1.bind("<<B1-Leave>>", on_leave)
l2.bind("<<B1-Enter>>", on_enter)
l2.bind("<<B1-Leave>>", on_leave)
tk.mainloop()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |