tkinter - 有没有办法在画布上滚动时将对象保持在原位?(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()
解决方案
推荐阅读
- android-mediaplayer - MediaPlayer.seekTo 不使用 webm 音频搜索
- c# - Azure 计划 WebJob 设置
- java - 抛出异常的构造函数中的 Unreachable Statement
- java - 唯一 IPs Java 问题 如何改进它?
- javascript - 如何将 http JSON 响应映射到 Angular/Typescript 中的接口?
- javascript - Nuxt 在源属性上使用 require 时不让我返回
- rust - 如何解决此错误:错误[E0277]:不满足特征绑定`SocketStream:std :: io :: Read`?
- python - 在 Mac 上设置 nbopen 以通过双击打开 Jupyter Notebook 文件
- spring-boot - 如何将具有多个值的axios的GET请求传递给Spring
- node.js - 尝试运行strapi会导致模块解析错误