有可能吗?
只需将其放置在窗口上的任何位置并将其拖动到我想要的任何位置即可。
以下是我希望通过HTML实现的可拖动项目的示例(我知道,它与html无关):How TO - Create a Draggable HTML Element。
这是一个我所说的尺子的例子。像这样的尺子:
它仅用于显示目的,不计算任何内容。
在这种情况下,我将使用网格管理器。
我将很高兴看到任何示例!
答案 0 :(得分:1)
标准模块tkinter
和ttk
没有标尺,我不知道tkinter
的任何带有标尺的外部模块。
使用Canvas
,我可以创建用数字画线的小部件。
但是它仍然是原始的窗口小部件,它不调整大小,不滚动行和数字,不重新缩放并且不显示鼠标位置。
编辑:现在,规则使用红线显示鼠标位置。但是,如果没有Canvas
,则他们必须知道偏移量-它们距窗口的左上角有多远。
import tkinter as tk
class VRuler(tk.Canvas):
'''Vertical Ruler'''
def __init__(self, master, width, height, offset=0):
super().__init__(master, width=width, height=height)
self.offset = offset
step = 10
# start at `step` to skip line for `0`
for y in range(step, height, step):
if y % 50 == 0:
# draw longer line with text
self.create_line(0, y, 13, y, width=2)
self.create_text(20, y, text=str(y), angle=90)
else:
self.create_line(2, y, 7, y)
self.position = self.create_line(0, 0, 50, 0, fill='red', width=2)
def set_mouse_position(self, y):
y -= self.offset
self.coords(self.position, 0, y, 50, y)
class HRuler(tk.Canvas):
'''Horizontal Ruler'''
def __init__(self, master, width, height, offset=0):
super().__init__(master, width=width, height=height)
self.offset = offset
step = 10
# start at `step` to skip line for `0`
for x in range(step, width, step):
if x % 50 == 0:
# draw longer line with text
self.create_line(x, 0, x, 13, width=2)
self.create_text(x, 20, text=str(x))
else:
self.create_line((x, 2), (x, 7))
self.position = self.create_line(0, 0, 0, 50, fill='red', width=2)
def set_mouse_position(self, x):
x -= self.offset
self.coords(self.position, x, 0, x, 50)
def motion(event):
x, y = event.x, event.y
hr.set_mouse_position(x)
vr.set_mouse_position(y)
def click(event):
print(event.x, event.y)
root = tk.Tk()
root['bg'] = 'black'
vr = VRuler(root, 25, 250)#, offset=25)
vr.place(x=0, y=28)
hr = HRuler(root, 250, 25)#, offset=25)
hr.place(x=28, y=0)
c = tk.Canvas(root, width=250, height=250)
c.place(x=28, y=28)
#root.bind('<Motion>', motion) # it needs offset=28 if there is no Canvas
#root.bind('<Button-1>', click)
c.bind('<Motion>', motion)
c.bind('<Button-1>', click)
root.mainloop()