Tkinter中使用bind()时,<Button-1>的右键拖拽替代方案是否存在?
使用Tkinter实现右键拖拽功能
当然有对应的替代事件,Tkinter中右键按下的事件是<Button-3>,右键按住拖动过程中的事件是<B3-Motion>,用这两个事件替换左键的<Button-1>和<B1-Motion>,就能实现右键拖拽,同时保留左键用于点击显示/隐藏菜单的功能。
修改后的完整代码
import tkinter as tk from tkinter import * from tkinter import ttk root = Tk() frame = Frame(root,width=500,height=900) frame.place(x=0,y=0) label = Label(frame,text='˃LABEL',fg='green') label.grid(column=0,row=0) label2 = Label(frame,text='˃LABEL2',fg='green') label3 = Label(frame,text='˃LABEL3',fg='green') def change(event): label['text'] = '˅LABEL' label2.grid(column=0,row=1) label3.grid(column=0,row=2) if label['text'] == '˅LABEL': label.bind('<Button-1>', hide) def hide(event): label['text'] = '˃LABEL' label2.grid_forget() label3.grid_forget() if label['text'] == '˃LABEL': label.bind('<Button-1>',change) label.bind('<Button-1>',change) def make_draggable(widget): # 替换为右键相关事件 widget.bind("<Button-3>", on_drag_start) widget.bind("<B3-Motion>", on_drag_motion) def on_drag_start(event): widget = event.widget widget._drag_start_x = event.x widget._drag_start_y = event.y def on_drag_motion(event): widget = event.widget x = widget.winfo_x() - widget._drag_start_x + event.x y = widget.winfo_y() - widget._drag_start_y + event.y widget.place(x=x, y=y) make_draggable(label) root.mainloop()
关键改动说明
- 将拖拽绑定的事件从左键替换为右键:用
<Button-3>记录拖拽起始坐标,<B3-Motion>实时更新控件位置 - 保留原有的
<Button-1>绑定逻辑,确保左键依然正常处理菜单展开/隐藏的交互
这样就实现了左键负责菜单操作、右键负责控件拖拽的分离效果,两者不会互相干扰。
内容的提问来源于stack exchange,提问作者MrTiredVeryTired
相关产品推荐
相关产品推荐

