鱼C论坛

 找回密码
 立即注册
查看: 1161|回复: 2

[已解决]tkinter 里面的Meun

[复制链接]
发表于 2022-2-19 21:30:23 | 显示全部楼层 |阅读模式
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()


我想换颜色可是点完之后还是原来的颜色 求助
最佳答案
2022-2-19 21:30:24
本帖最后由 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() 函数,这个函数返回全局命名空间的字典, 这个字典的键是全局命名空间里面的名称(比如函数名,类名,变量名),值是相应 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-19 21:30:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-19 22:44:55 | 显示全部楼层
from tkinter import *

colour='black'

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='')
    
def change(c):
        global colour       
        colour = c
        
root = Tk()
root.title('画图')
m=Menu(root)
f=Menu(m)
f.add_command(label='red',command=lambda:change('red'))
f.add_command(label='green',command=lambda:change('green'))
f.add_command(label='black',command=lambda:change('black'))
f.add_command(label='blue',command=lambda:change('blue'))
f.add_command(label='pink',command=lambda:change('pink'))
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 05:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表