有没有一种方法可以在tkinter中使用可拖动的标尺?

时间:2019-10-14 19:03:35

标签: python tkinter

有可能吗?

只需将其放置在窗口上的任何位置并将其拖动到我想要的任何位置即可。

以下是我希望通过HTML实现的可拖动项目的示例(我知道,它与html无关):How TO - Create a Draggable HTML Element

这是一个我所说的尺子的例子。像这样的尺子:

image showing horizontal and vertical rulers at top-left of a rectangle

它仅用于显示目的,不计算任何内容。

在这种情况下,我将使用网格管理器。

我将很高兴看到任何示例!

1 个答案:

答案 0 :(得分:1)

标准模块tkinterttk没有标尺,我不知道tkinter的任何带有标尺的外部模块。


使用Canvas,我可以创建用数字画线的小部件。

enter image description here

但是它仍然是原始的窗口小部件,它不调整大小,不滚动行和数字,不重新缩放并且不显示鼠标位置。

编辑:现在,规则使用红线显示鼠标位置。但是,如果没有Canvas,则他们必须知道偏移量-它们距窗口的左上角有多远。

enter image description here

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