|
10鱼币
from tkinter import *
def paint(event):
x1, y1 = (event.x - 2), (event.y - 2)
x2, y2 = (event.x + 2), (event.y + 2)
w.create_oval(x1, y1, x2, y2, fill=colour,outline='')
colour='black'
root = Tk()
root.title('画图')
m=Menu(root)
f=Menu(m)
f.add_command(label='red',command=(lambda colour='red':colour))
f.add_command(label='green',command=(lambda colour='green':colour))
f.add_command(label='black',command=(lambda colour='green':colour))
f.add_command(label='blue',command=(lambda colour='green':colour))
f.add_command(label='pink',command=(lambda colour='green':colour))
m.add_cascade(label='颜色',menu=f)
root.config(menu=m)
w = Canvas(root, width=400, height=200)
w.pack()
w.bind("<B1-Motion>", paint)
Button(root,text='清除',command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
我想换颜色可是点完之后还是原来的颜色 求助
本帖最后由 isdkz 于 2022-2-20 12:23 编辑
那是因为 lambda colour='red':colour 这里的colour是lambda函数里面的局部变量,
然后这个lambda函数返回了局部变量 colour 的值,并没有改变全局变量 colour,
画笔的颜色使用的是全局变量 colour ,所以画笔的颜色就没有发生改变,
你想在 lambda 函数里面修改全局变量的值可以用到 globals() 函数,这个函数返回全局命名空间的字典,
这个字典的键是全局命名空间里面的名称(比如函数名,类名,变量名),值是相应的变量、函数或类的值,
可以通过修改这个字典相对应变量名的值来影响全局变量,故对你的代码修改如下: (当然,你也可以再定义一个函数来声明全局变量,然后对这个全局变量进行修改,因为lamda函数里面是不能用global来声明全局变量的)
from tkinter import *
def paint(event):
x1, y1 = (event.x - 2), (event.y - 2)
x2, y2 = (event.x + 2), (event.y + 2)
w.create_oval(x1, y1, x2, y2, fill=colour,outline='')
colour='black'
root = Tk()
root.title('画图')
m=Menu(root)
f=Menu(m)
f.add_command(label='red',command=(lambda :globals().update({'colour': 'red'}))) # 修改了command
f.add_command(label='green',command=(lambda :globals().update({'colour': 'green'}))) # 修改了command
f.add_command(label='black',command=(lambda :globals().update({'colour': 'black'}))) # 修改了command
f.add_command(label='blue',command=(lambda :globals().update({'colour': 'blue'}))) # 修改了command
f.add_command(label='pink',command=(lambda :globals().update({'colour': 'pink'}))) # 修改了command
m.add_cascade(label='颜色',menu=f)
root.config(menu=m)
w = Canvas(root, width=400, height=200)
w.pack()
w.bind("<B1-Motion>", paint)
Button(root,text='清除',command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
|
最佳答案
查看完整内容
那是因为 lambda colour='red':colour 这里的colour是lambda函数里面的局部变量,
然后这个lambda函数返回了局部变量 colour 的值,并没有改变全局变量 colour,
画笔的颜色使用的是全局变量 colour ,所以画笔的颜色就没有发生改变,
你想在 lambda 函数里面修改全局变量的值可以用到 globals() 函数,这个函数返回全局命名空间的字典,
这个字典的键是全局命名空间里面的名称(比如函数名,类名,变量名),值是相应 ...
|