2014-12-08 59 views
0

我已經有一個10X10的正方形網格,我想在點擊時在網格中的正方形上繪製另一個正方形。用Tkinter點擊畫圖

現在,我有函數繪製一個框架中的網格和函數來確定正方形的座標(左上角和右下角)。

我遇到麻煩是

canvas=Canvas() 
    for row in range(10): 
     for column in range(10): 
      canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue') 
    self.bind('<Button-1>',self.changeBlock)  

的一部分,其中

def changeBlock(self,event): 
    self.canvas.create_rectangle(upperX(event),upperY(event),lowerX(event),lowerY(event),fill='red') 

upperX,upperY,lowerX,洛厄裏都是函數來確定方形鼠標在座標

我不知道爲什麼當我點擊畫布上的東西時changeBlock不運行。

全:

class MainFrame(Frame): 
def __init__(self,parent): 
    Frame.__init__(self,parent,background="blue") 
    self.parent=parent 
    self.parent.title("simple") 
    self.parent.geometry("600x600") 
    self.parent.resizable(0,0) 
    self.pack(fill=BOTH,expand=1) 
    canvas=Canvas() 
    for row in range(10): 
     for column in range(10): 
      canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue') 
    self.bind('<Button-1>',self.changeClickBlock) 
    canvas.pack(fill=BOTH, expand=1) 

回答

1

此代碼的工作,你的一個輕微的修改。你沒有提供足夠的信息相當,但它足以看到的東西......應該工作。我正在運行python3 - 在python2中,您將從「Tkinter」導入。

重要的問題

  • 什麼是 「自我」 - 你定義什麼課?如果自我不衍生 某種tkinter小部件,那麼綁定到它不會有很大的好處。 綁定是否拋出異常?

    您也沒有保存對畫布的引用,那麼您如何知道 什麼是self.canvas?很混亂,但我認爲你只是 沒有發佈整個代碼。

可能的問題

  • 我主要的猜測是,你沒有綁定到畫布上,而是介於 人。確保事件在您想要的小部件上觸發。

    我的第二個猜測是,你忘了打包/網格/將畫布放在tkinter頂層的 。簡單地使這是不夠的,還需要 將其添加到現場莫名其妙

    from tkinter import * 
    
    root = Tk() 
    canvas=Canvas() # where did you save this? It's very important to keep it! 
    
    def changeBlock(event=None): 
         # Here, I'm just making a rectangle of size 10. Make it as big as you want 
         # notice though that you're "self.canvas" will need to reference the 
         # the right thing 
         canvas.create_rectangle(event.x,event.y,event.x+10,event.y+10,fill='red') 
    
    for row in range(10): 
        for column in range(10): 
         canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue') 
    
    # Here, I'm binding to the Canvas. Bind to the widget where the event occurs 
    canvas.bind('<Button-1>',changeBlock) 
    
    # make sure you add the widget somehow, or else it won't appear 
    canvas.grid() 
    
    root.mainloop() 
    

其他建議

Effobt對Tkinter的一個偉大的教程。這是尋求基本的例子

在畫布上的物品的好地方: http://effbot.org/tkinterbook/canvas.htm

上的事件: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

+0

似乎並非是我有問題。當我運行我的代碼並單擊任何方塊時,它根本不會調用changeBlock。我把打印語句放在changeBlock中,當我點擊時它們不會運行。 – 2014-12-08 05:01:36

+0

運行我剛剛給你的代碼,它的工作原理。你爲什麼要約束自我?你應該綁定到畫布。畫布不能自我展現,除非自我延伸非常非正統的Tk。那有意義嗎? – 2014-12-08 05:02:50

+0

好問題是我將按鈕綁定到自己而不是畫布。現在它工作。謝謝! – 2014-12-08 05:07:57