Дуги на холсте ткинтер глюки при увеличении - PullRequest
0 голосов
/ 02 сентября 2018

Я столкнулся с проблемой рендеринга дуги на холсте tkinter. (Я использую рекомендуемые методы для масштабирования и прокрутки холста, см. Мой код ...)

Код создает дугу на холсте, его стиль - 'pieslice'. Сначала кажется, что все работает хорошо, но когда я продолжаю увеличивать масштаб до изогнутого края фигуры, в какой-то момент он начинает не соответствовать другим краям, и в конечном итоге он исчезает ...

Если я продолжу увеличивать масштаб, исчезнут и другие края ...

from tkinter import *

root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
cnv = Canvas(root)
cnv.grid(row=0, column=0, sticky='nswe')
cnv.create_arc(20, 20, 250, 250, start=0, extent=30)


def scroll_start(event):
    cnv.configure(cursor='fleur')
    cnv.scan_mark(event.x, event.y)


def scroll_move(event):
    cnv.scan_dragto(event.x, event.y, 1)


def scroll_end(event):
    cnv.configure(cursor='arrow')


def zoom(event):
    if event.delta > 0:
        cnv.scale('all', cnv.canvasx(event.x), cnv.canvasy(event.y), 1.1, 1.1)
    else:
        cnv.scale('all', cnv.canvasx(event.x), cnv.canvasy(event.y), 0.9, 0.9)


cnv.bind('<Button-3>', scroll_start)
cnv.bind('<B3-Motion>', scroll_move)
cnv.bind('<ButtonRelease-3>', scroll_end)
cnv.bind('<MouseWheel>', zoom)

root.mainloop()

Есть ли способ исправить это или я попал в ограничения tkinter? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 03 сентября 2018

Это частичный ответ, который дает меру предела, в котором масштабирование кажется сломанным:

Добавляя переменную для записи scaling_factor, я могу достичь увеличения в 336 раз, прежде чем наблюдать за явлениями, описанными в ОП. Я предполагаю, что это может быть проблема точности с плавающей точкой, или ограничение размера холста, или какая-то другая причина?

from tkinter import *

root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
cnv = Canvas(root)
cnv.grid(row=0, column=0, sticky='nswe')
cnv.create_arc(20, 20, 250, 250, start=0, extent=30)

scaling_factor = 1


def scroll_start(event):
    cnv.configure(cursor='fleur')
    cnv.scan_mark(event.x, event.y)


def scroll_move(event):
    cnv.scan_dragto(event.x, event.y, 1)


def scroll_end(event):
    cnv.configure(cursor='arrow')


def zoom(event):
    global scaling_factor
    if event.delta > 0:
        cnv.scale('all', cnv.canvasx(event.x), cnv.canvasy(event.y), 1.1, 1.1)
        scaling_factor *= 1.1
        print(scaling_factor)
    else:
        cnv.scale('all', cnv.canvasx(event.x), cnv.canvasy(event.y), 1/1.1, 1/1.1)
        scaling_factor *= .9
        print(scaling_factor)

cnv.bind('<Button-3>', scroll_start)
cnv.bind('<B3-Motion>', scroll_move)
cnv.bind('<ButtonRelease-3>', scroll_end)
cnv.bind('<MouseWheel>', zoom)

root.mainloop()
...