1
如何縮放Tkinter畫布本身。如果我可以以工程單位(英寸)在tkinter畫布上繪製事物並簡單地將畫布縮放到窗口,我將創建一個應用程序,使其更加優雅(即更可讀)。附件中的代碼相對於我想要的來說相當簡單,但我相信它可以得到滿足。我想一次應用比例因子,而不是每次將對象添加到畫布。我希望畫布代表36英寸(或其他),並且可以縮放,使36英寸寬爲1800像素(或任何窗口寬度)。一旦建立起來,這個比例因子就不會改變 (我知道如果self.canvas.coords(thing)[2]> canvaswidth也必須改變)。如何在不更改對象的情況下縮放tkinter畫布窗口
我已經看到這個問題以不同的形式,但我還沒有找到一個答案,不包括縮放畫布上的所有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()
Drat ...我發佈了一個後續[問題](http://stackoverflow.com/questions/32918230/how-to-clone-a-tkinker-canvas) – Burtski