Какой самый простой способ закрепить виджет холста Tkinter? - PullRequest
0 голосов
/ 29 января 2011

У меня есть виджет холста Tkinter, и я хотел бы создать на нем шаблон с рисунком.Я знаю, что мог бы сделать это вручную, используя метод create_line .Тем не менее, я думаю, что, казалось бы, есть лучший способ.Любая помощь приветствуется.

С чем я сейчас работаю.(нажмите Alt-F4 для выхода из программы)

import Tkinter, re

class StippleCanvas(Tkinter.Tk):
    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)


        self.overrideredirect(1)
        self.resizable(False,False)
        self.wm_attributes("-topmost", 1)
        self.attributes("-alpha", 0.9)

        w = 90
        h = 90

        self.Ca = Tkinter.Canvas(self, width=w, height=h, highlightthickness=0, bd=0, bg='grey25')
        self.Ca.grid(column=0, row=0)
        self.bind('<Button-1>', self.relative_mouse_position)
        self.bind('<ButtonRelease-1>', self.wid_unbind)

        i0 = 0
        while i0 < w:
            i1 = 0
            while i1 < h:
                self.Ca.create_line(i1, i0, i1+1, i0, fill='grey20', width=1)
                i1 = i1 + 2
            i0 = i0 + 2

    def geom_grab (self):
        Cursorgfltr = re.compile(r"(\d+), (\d+)")
        CursorPos = self.winfo_pointerxy()
        CursorPosGr = Cursorgfltr.search(str(CursorPos))
        self.CursorX = int(CursorPosGr.group(1))
        self.CursorY = int(CursorPosGr.group(2))

        gfltr = re.compile(r"(\d+)?x?(\d+)?([+-])(\d+)([+-])(\d+)")

        gf = gfltr.search(self.wm_geometry())
        self.X = int(gf.group(4))
        self.Y = int(gf.group(6))

    def relative_mouse_position (self, event):
        self.geom_grab()

        RelX = self.CursorX - self.X
        RelY = self.CursorY - self.Y

        self.Ca.bind( "<Motion>", lambda event: self.wid_drag(event, RelX, RelY) )

    def wid_drag (self, event, RelX, RelY):


        self.geom_grab()

        X = self.CursorX - RelX
        Y = self.CursorY - RelY

        if X < 0:
            X = 0

        if Y < 0:
            Y = 0

        self.wm_geometry('+' + str(X) + '+' + str(Y))


    def wid_unbind (self, event):
        self.Ca.unbind("<Motion>")

def run():
    StippleCanvas(None).mainloop()
if __name__ == '__main__':
    run()

1 Ответ

0 голосов
/ 30 января 2011

Самый простой? Это зависит от вашего определения «простой». Один из способов - использовать программу для рисования, чтобы создать нужное изображение для фона, а затем поместить его на холст. Это предполагает, что вы знаете размер холста раньше времени. Нет ничего проще, чем вставить одно изображение на холст.

Вариантом этой темы является создание небольшой плитки и использование обработки изображений tkinter для создания нового изображения соответствующего размера с исходным изображением, выложенным плиткой в ​​новом изображении. Это можно сделать каждый раз, когда размер холста изменяется. Некоторые примеры этого можно увидеть по следующей ссылке, хотя они в Tcl, а не в Python (преобразовать его в python очень просто, так что пусть это вас не пугает):

http://wiki.tcl.tk/4389

Хотя, честно говоря, для простой штуковины то, что вы сделали, это хорошо. Я бы переместил рисование в функцию, чтобы его можно было повторно запускать всякий раз, когда холст меняет размер (т.е. когда он получает событие <Configure>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...