首页 > 解决方案 > 有没有办法在画布上滚动时将对象保持在原位?(Tkinter)

问题描述

我想制作在滚动条处于活动状态时保持其位置的拖放对象。到目前为止,它在可见画布的原始范围内运行良好 - 任何改进它的指针也将不胜感激!

当我在可见画布的原始范围之外测试它的响应时,我的测试标记落在画布上更难以预测的位置。

我认为该解决方案与绑定到“标记”小部件的“标记集”功能有关......

import tkinter as tk
from tkinter import*

sx = 90
sy = 50

def on_configure(event):
    # update scrollregion after starting 'mainloop'
    # when all widgets are in canvas
    canvas.configure(scrollregion=canvas.bbox('all'))


def drag_start(event):
    widget = event.widget
    widget.startX = event.x
    widget.startY = event.y

def drag_motion(event):
    widget = event.widget
    sx = widget.winfo_x() - widget.startX + event.x
    sy = widget.winfo_y() - widget.startY + event.y

    canvas.create_window(sx, sy, window=marker)
    print(sx, sy)

def markerset(event):
    widget = event.widget

    widget.startX = event.x
    widget.startY = event.y

    sx = widget.winfo_x() + event.x    
    sy = widget.winfo_y() + event.y   

    canvas.create_window(sx, sy, window=marker)




root = tk.Tk()

# --- canvas with scrollbar ---
canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT)

scrollbar = tk.Scrollbar(root, command=canvas.yview)
scrollbar.pack(side=tk.LEFT, fill='y')

canvas.configure(yscrollcommand = scrollbar.set)
canvas.bind('<Configure>', on_configure)

# --- put frame in canvas ---
frame = tk.Frame(canvas)
canvas.create_window((0,0), width=700, window=frame, anchor='nw')

# --- canvas image ---
img = PhotoImage(file="[PNG]")  #If you are testing this on your own, any larger-sized PNG 
will suffice.
canvas.create_image(20,20, anchor=NW, image=img)

# --- marker widget ---
marker = tk.Label(canvas, height=2, width=3, bg='green')
mCanvas = canvas.create_window(sx, sy, window=marker)


marker.bind("<Button-1>", drag_start)
marker.bind("<B1-Motion>", drag_motion)
marker.bind("<ButtonRelease-1>", markerset)


root.mainloop()

标签: tkinterscrollbar

解决方案


推荐阅读