如何在不更改对象

时间:2015-10-02 03:17:25

标签: python canvas tkinter

如何缩放Tkinter画布本身。我正在创建一个应用程序,如果我可以用工程单位(英寸)在tkinter画布上绘制东西并简单地将画布缩放到窗口,那么它将更加优雅(也就是说更具可读性)。所附的代码完全简化了我想要的内容,但我相信它可以解决问题。我想应用比例因子一次,而不是每次我将一个对象添加到画布。我希望画布代表36英寸(或其他)并缩放,使36英寸宽1800像素(或任何窗口宽度)。一旦建立,这个比例因子就不会改变。 (我知道如果self.canvas.coords(thing)[2]> canvaswidth也必须改变。)

我已经看到过不同形式的问题,但我没有找到一个不涉及在画布上缩放所有widgits的答案。我认为拥有一个全局比例因子并将其洒在我使用画布坐标的任何地方都会相当优雅。

#AP moving machine
from Tkinter import *
MagicNumber=0.3125
MN=MagicNumber*7
PunchPositions=([MN*1,2],[MN*2,4],[MN*3,2],[MN*4,4])
PiercePositions=([MN*5,2],[MN*6,4],[MN*7,2],[MN*8,4])
class mover():
    def __init__(self,root,canvas,things):
        self.things=things
        self.canvas=canvas
        self.root=root
        self.root.after(100,self.move)
        self.counter=0
    def addoval(self,x,y):
        r=0.125
        self.things.append(canvas.create_oval(x-r,y-r,x+r,y+r,fill='green'))
    def addpierce(self,x,y):
        r=0.0625
        self.things.append(canvas.create_oval(x-r,y-r,x+r,y+r,fill='Black'))

    def move(self):
        for thing in self.things:
            canvas.move(thing,1.250)
        canvaswidth=canvas.winfo_width()
        for thing in self.things:
            if self.canvas.coords(thing)[2]>canvaswidth :
                self.canvas.delete(thing)
                self.things.remove(thing)
        root.after(100,self.move)
        self.counter=self.counter+1
        for x,y in PunchPositions:
            self.addoval(x,y)
        for x,y in PiercePositions:
            self.addpierce(x,y)
#
root =Tk()
canvas=Canvas(root,width=1800,height=200)
parts=[]

def AddPierce(x,y):
    radius=0.125
    x1=x-radius
    x2=x+radius
    y1=y-radius
    y2=y+radius
    return canvas.create_oval(x1,y1,x2,y2,fill='Black')
def AddPunch(x,y):
    radius=0.250
    x1=x-radius
    x2=x+radius
    y1=y-radius
    y2=y+radius
    return canvas.create_oval(x1,y1,x2,y2,fill='Blue')

for x,y in PunchPositions:
    AddPunch(x,y)
for x,y in PiercePositions:
    AddPierce(x,y)

for l in range(1,12):
    canvas.create_line(l*MagicNumber*4,0,l*MagicNumber*4,6)

canvas.pack(fill=BOTH)
mover(root,canvas,parts)
root.mainloop()

1 个答案:

答案 0 :(得分:1)

如果不修改对象本身,则无法在画布中缩放项目。画布提供的唯一功能是scale方法,但它可以通过更改项目的实际坐标来实现。

相关问题