可滚动的静态文本 Canvas

Static Text on Scrollable Canvas

我想在可滚动的 tkinter canvas 上保留一些文本静态或锚定。它不应随滚动条一起移动。

我该怎么做?

from tkinter import *
root=Tk()
frame=Frame(root,width=300,height=300)
frame.grid(row=0,column=0)
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
hbar=Scrollbar(frame,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(frame,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)

canvas.create_text(10, 10, text='Static Text # 1', anchor = NW, fill = 'red')
canvas.create_text(10, 100, text='Static Text # 2', anchor = NW, fill = 'red')
canvas.create_text(150, 10, text='Scrollable Text # 1', anchor = NW)
canvas.create_text(150, 100, text='Scrollable Text # 2', anchor = NW)

root.mainloop()

如果不需要文本框透明,最简单的做法就是不把文字放在上canvas,而是放置一个Label 超过 canvas。

import tkinter as tk
root = tk.Tk()

c = tk.Canvas(root)
c.place(x=0, y=0)
r = c.create_rectangle(100, 100, 200, 200, outline='red',
                       fill='yellow', width=10)
ct = c.create_text(110, 150, text='canvas text', anchor='w')
lt = tk.Label(c, text='label text')
lt.place(x=110, y=110)

如果你确实想要透明度,那么你必须拦截 canvas 和滚动条之间的移动命令,以便也将 'static' 项目移动到 canvas 对应的坐标原始屏幕 (window) 坐标。由于 Scrollbar.set 需要两个分数,所以 canvas 调用 x/yscrollcommand 有两个分数,这使情况变得复杂。同样,移动滚动条滑块会导致滚动条调用它的带有分数的命令 (canvas x/yview),我怀疑它是上或左分数。另一方面,单击滚动条按钮调用带有数字和单位的 x/yview。

我想我要做的是创建一个静态项目 ID 的元组列表,以及项目的 4 canvas.bbox 坐标。接下来将 canvas.xscrollcommandcanvas.yscrollcommandhbar.setvbar.set 替换为名为 xscrollyscrollxset 的包装器, 和 yset。在每个包装器中,调用包装函数。然后调用一个新的 static_set 函数,该函数使用 canvas.canvasx/y(screenx/y, gridspacing=1) 将屏幕坐标转换为新的 canvas 坐标和 canvas.coords(item id, *canvas coords) 放置项目。

我留给你解决细节问题。如果您不熟悉 NMT Tkinter 参考,请学习使用它。这是以上信息的来源。

代码编辑:不要对两个标签都使用名称 t。按照 mcu.

的建议,将 lt 的父级从 root 更改为 canvas c