2015-10-02 46 views
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() 

回答

1

您不能在不修改對象本身的情況下縮放畫布中的項目。畫布提供的唯一功能是scale方法,但它通過更改項目的實際座標來工作。

+0

Drat ...我發佈了一個後續[問題](http://stackoverflow.com/questions/32918230/how-to-clone-a-tkinker-canvas) – Burtski

相關問題