【问题标题】:ARC on tkinter canvas glitches when zoomed缩放时 tkinter 画布上的 ARC 出现故障
【发布时间】:2018-09-02 18:13:27
【问题描述】:

我遇到了在 tkinter 画布上渲染弧线的问题。 (我正在为画布使用scalingscrolling 的推荐方法,请参阅我的代码...)

代码在画布上创建一个圆弧,其样式为'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 的限制?感谢您的帮助。

【问题讨论】:

    标签: python-3.x tkinter tkinter-canvas


    【解决方案1】:

    这是一个部分答案,可以衡量缩放似乎崩溃的极限:

    添加一个变量来记录scaling_factor,在观察OP描述的现象之前,我可以达到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()
    

    【讨论】:

    • 我尝试将弧线放大两倍,然后问题出现在一半 scale_factor... cnv.create_arc(20, 20, 500, 500, start=0, extent=30)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多