2014-12-08 58 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