如何缩放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()
答案 0 :(得分:1)
如果不修改对象本身,则无法在画布中缩放项目。画布提供的唯一功能是scale
方法,但它可以通过更改项目的实际坐标来实现。