如何使用Tkinter在Python画布上引用绘制事件?

如何使用Tkinter在Python画布上引用绘制事件?,python,canvas,tkinter,tk,Python,Canvas,Tkinter,Tk,我知道这可能是有史以来最简单的问题。然而,我正在开始学习Tkinter,我不知道如何在GUI上单击鼠标时引用该事件 我想在单击画布时绘制一些点。我无法在paint函数中引用画布变量 这段代码基于中的问题 每当我尝试这个例子时,我都会在paint函数中得到一个错误 NameError:未定义名称“canvas” def main(): master=Tk() #屏幕右侧/img支架 右框=框(主框,宽度=500,高度=500,光标=“点”) 右机架组件(侧=左) #检索图像 image=image

我知道这可能是有史以来最简单的问题。然而,我正在开始学习Tkinter,我不知道如何在GUI上单击鼠标时引用该事件

我想在单击画布时绘制一些点。我无法在paint函数中引用画布变量

这段代码基于中的问题

每当我尝试这个例子时,我都会在paint函数中得到一个错误

NameError:未定义名称“canvas”

def main():
master=Tk()
#屏幕右侧/img支架
右框=框(主框,宽度=500,高度=500,光标=“点”)
右机架组件(侧=左)
#检索图像
image=image.open(“./image/demo.JPG”)
image=image.resize((800700),image.ANTIALIAS)
photo=ImageTk.PhotoImage(图像)
#创建画布
画布=画布(右边框,宽度=800,高度=700)
canvas.create_image(0,0,image=photo,anchor=“nw”)
canvas.pack()
canvas.bind(“,paint)
message=标签(右框,text=“按下鼠标绘制”)
消息包(侧面=底部)
mainloop()
def油漆(事件):
python_green=“#476042”
x1,y1=(事件x-1),(事件y-1)
x2,y2=(事件x+1),(事件y+1)
canvas.create_oval(x1,y1,x2,y2,fill=python_green)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

这是python范围规则的一个简单错误。在函数中创建的变量不能在该函数之外使用

>>> def func():
...   a = 42
... 
>>> func()
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
from tkinter import *
from functools import partial

def main():
    master = Tk()
    # Right side of the screen / img holder
    right_frame = Frame(master, width=500, height=500, cursor="dot")
    right_frame.pack(side=LEFT)

    # Create canvas
    canvas = Canvas(right_frame, width=800, height=700)
    canvas.create_image(0, 0, image=photo, anchor="nw")
    canvas.pack()
    canvas.bind("<B1-Motion>", partial(paint, canvas))
    message = Label(right_frame, text="Press the mouse to draw")
    message.pack(side=BOTTOM)

    mainloop()

def paint(canvas, event):
    python_green = "#476042"
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    canvas.create_oval(x1, y1, x2, y2, fill=python_green)

if __name__ == "__main__":
    main()

您真的应该为这类程序考虑一个类结构,这样您就可以使变量对其他方法可用

这是python范围规则的一个简单错误。在函数中创建的变量不能在该函数之外使用

>>> def func():
...   a = 42
... 
>>> func()
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
from tkinter import *
from functools import partial

def main():
    master = Tk()
    # Right side of the screen / img holder
    right_frame = Frame(master, width=500, height=500, cursor="dot")
    right_frame.pack(side=LEFT)

    # Create canvas
    canvas = Canvas(right_frame, width=800, height=700)
    canvas.create_image(0, 0, image=photo, anchor="nw")
    canvas.pack()
    canvas.bind("<B1-Motion>", partial(paint, canvas))
    message = Label(right_frame, text="Press the mouse to draw")
    message.pack(side=BOTTOM)

    mainloop()

def paint(canvas, event):
    python_green = "#476042"
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    canvas.create_oval(x1, y1, x2, y2, fill=python_green)

if __name__ == "__main__":
    main()

您真的应该为这类程序考虑一个类结构,这样您就可以使变量对其他方法可用

看不到熊猫标签的用途,因此将其替换为更相关的标签。Ups谢谢,我在提交问题时没有看到它被选中。看不到熊猫标签的用途,因此将其替换为更相关的标签。Ups谢谢,我在提交问题时没有看到它被选中。非常感谢。我现在创建了一个类结构。非常感谢。我现在已经创建了一个类结构。