可滚动画布上的静态文本

时间:2016-03-06 00:17:22

标签: python scroll tkinter tkinter-canvas

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

我该怎么做?

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()

1 个答案:

答案 0 :(得分:1)

如果您不需要文本框是透明的,最简单的方法是不将文本放在画布上,而是将Label 放在上画布。

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)

如果你想要透明度,那么你必须在画布和滚动条之间截取移动命令,以便移动“静态”。画布坐标中与原始屏幕(窗口)坐标对应的项目。由于Scrollbar.set需要两个分数,因此画布调用带有两个分数的x / yscrollcommand这一事实使事情变得复杂。类似地,移动滚动条滑块会导致滚动条调用其命令(画布x / yview),其中有一个分数,我怀疑它是上部或左部分。另一方面,单击滚动条按钮会使用数字和单位调用x / yview。

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

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

代码编辑:不要对两个标签使用名称t。根据 mcu 的建议,将lt的父级从root更改为广告c