1

我已经有一个 10X10 的正方形网格,当单击它时,我想在网格中的一个正方形上绘制另一个正方形。

现在,我有在框架中绘制网格的函数和确定正方形坐标(左上角和右下角)的函数。

我遇到问题的部分是

    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,lowerY 都是确定鼠标所在方格坐标的函数。

我不知道为什么当我单击画布上的某些内容时 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)
4

1 回答 1

1

此代码有效,对您的代码稍作修改。您没有提供足够的信息,但足以看出事情......应该工作。我正在运行 python3 - 在 python2 中,您将从“Tkinter”导入。

重要问题

  • 什么是“自我”——你定义了什么类?如果 self 没有派生某种 tkinter 小部件,那么绑定到它不会有多大好处。bind 会抛出异常吗?

    你也没有保存对画布的引用,那么你怎么知道 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

于 2014-12-08T04:54:29.940 回答