【问题标题】:Drop and drag several widgets together?一起拖放多个小部件?
【发布时间】:2020-10-09 22:45:18
【问题描述】:

我需要一起添加几个小部件,然后将它们拖放到一起。我想的第一种方法是将所有小部件放在一个框架中,然后拖放并拖动框架。但是有一个问题是frame在widgets下面,不能被选中。

【问题讨论】:

    标签: tkinter menu drag-and-drop widget frame


    【解决方案1】:
    from tkinter import *
    WIDTH, HEIGTH = 300, 300
    
    
    
    
    
    
    
    root = Tk()
    
    def do_popup(event):
        try:
            m.tk_popup(event.x_root, event.y_root)
        finally:
            m.grab_release()
    
    root.geometry('{}x{}'.format(WIDTH, HEIGTH))
    f1=Frame(root)
    
    def make_draggable(widgets):
        for widget in widgets:
            widget.bind("<Button-1>", lambda event, arg=widgets: on_drag_start(event, arg))
            widget.bind("<B1-Motion>", on_drag_motion)
            widget.bind("<ButtonRelease-1>", lambda event, arg=widgets: disaable_bind(event, arg))
    
    def on_drag_start(event,widgets):
        widget = event.widget
        widget = f1
        widget._drag_start_x = event.x
        widget._drag_start_y = event.y
    
        # for widget in widgets:
        #     widget.bind("<ButtonRelease-1>", disaable_bind(widgets))
    
    def on_drag_motion(event):
        widget = event.widget
        widget = f1
        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)
    
    def disaable_bind(event,widgets):
        print('disaable_bind')
        for widget in widgets:
            widget.unbind("<Button-1>")
            widget.unbind("<B1-Motion>")
            widget.unbind("<ButtonRelease-1>")
    
    m = Menu(root, tearoff=0)
    m.add_command(label="drop and drag", command= lambda: make_draggable([b1,l1]))
    m.add_command(label="Copy")
    m.add_command(label="Paste")
    m.add_command(label="Reload")
    m.add_separator()
    m.add_command(label="Rename")
    
    l1 = Entry(f1)
    b1 = Listbox(f1)
    b1.bind("<Button-3>", do_popup)
    # b1.place(bordermode=OUTSIDE)
    b1.grid(row = 0,column = 0)
    l1.grid(row = 1,column = 0)
    
    
    f1.grid(row = 0,column = 0)
    # make_draggable(f1)
    
    root.mainloop()
    

    【讨论】:

    • 这应该是一个答案吗?它似乎对我不起作用。
    • 在你的答案中加入解释总是很好的,无论是通过代码上的 cmets 还是文本
    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多