求助大神,下面的代码有什么错误,应该怎么改正
本帖最后由 yjx45 于 2020-8-29 09:40 编辑from tkinter import *
from tkinter import colorchooser
root = Tk()
w = Canvas(root, width = 1000, height = 650, background = "yellow")
w.grid(row = 0, columnspan = 2, padx = 5, pady = 5)
#选择颜色
def setcolour():
fileName = colorchooser.askcolor()
return fileName
b1 = Button(root, text = "选择颜色", command = setcolour)
b1.grid(row = 1, column = 1)
i = setcolour()
#判断颜色
if i == (255,255,255):
k = "white"
elif i == (0,0,0):
k = "black"
elif i == (255,0,0):
k = "red"
elif i == (0,255,0):
k = "green"
elif i == (0,0,255):
k = "blue"
elif i == (128,0,128):
k = "purple"
elif i == (255,128,255):
k = "pink"
elif i == (255,128,0):
k = "orange"
elif i == (192,192,192):
k = "silver"
elif i == (128,64,0):
k = "brown"
else:
print("对不起,该程序暂不支持您选择的颜色哦,请重试")
k = None
#删除按键
b2 = Button(text = "DELETE ALL", command = (lambda x = ALL : w.delete(x)))
b2.grid(row = 1)
#绘图
def paint(event, color):
x1,y1 = (event.x - 2),(event.y - 2)
x2,y2 = (event.x + 2),(event.y + 2)
w.create_oval(x1, y1, x2, y2, fill = color, outline = color)
w.bind("<B1-Motion>", paint(color = k))
Label("按住鼠标左键,开始绘画吧").grid(row = 2, columnspan = 2, pady = 5)
mainloop()
也看不懂,只能帮着翻译下了{:10_250:}
本帖最后由 疾风怪盗 于 2020-8-28 23:36 编辑
w.bind("<B1-Motion>", paint(color = k))
三个问题,上面这句话,paint后面代码删掉,定义时直接写color=k
def paint(event, color=k):
然后,你i的判断取色也有问题,i打印出来是这样的((255.99609375, 0.0, 0.0), '#ff0000')那你为什么i不用十六进制的来判断,所以你的判断永远k=None
还有个这个,下面大佬回复后才想起来,这个也是个问题,修改了,但是忘记在这边回帖时说了
Label(root,text="按住鼠标左键,开始绘画吧").grid(row = 2, columnspan = 2, pady = 5)
漏了个参数
把这三个都改了就好了 一共有三处问题
帮你修改了,并做了注释。
from tkinter import *
from tkinter import colorchooser
root = Tk()
w = Canvas(root, width = 1000, height = 650, background = "yellow")
w.grid(row = 0, columnspan = 2, padx = 5, pady = 5)
#选择颜色
def setcolour():
fileName = colorchooser.askcolor()
return fileName
b1 = Button(root, text = "选择颜色", command = setcolour)
b1.grid(row = 1, column = 1)
i = setcolour()
#判断颜色
#错误1:这后面的颜色都需要改,改为十六进制颜色表示
if i == '#ffffff':
k = "white"
elif i == '#000000':
k = "black"
elif i == '#ff0000':
k = "red"
elif i == '#00ff00':
k = "green"
elif i == '#0000ff':
k = "blue"
elif i == '#800080':
k = "purple"
elif i == '#ff80ff':
k = "pink"
elif i == '#ff8000':
k = "orange"
elif i == '#c0c0c0':
k = "silver"
elif i == '#804000':
k = "brown"
else:
print("对不起,该程序暂不支持您选择的颜色哦,请重试")
k = None
#删除按键
b2 = Button(text = "DELETE ALL", command = (lambda x = ALL : w.delete(x)))
b2.grid(row = 1)
#绘图
def paint(event, color):
x1,y1 = (event.x - 2),(event.y - 2)
x2,y2 = (event.x + 2),(event.y + 2)
w.create_oval(x1, y1, x2, y2, fill = color, outline = color)
#错误2:bind绑定,缺少了一个event参数,需要写成下面这种形式
w.bind("<B1-Motion>", lambda event:paint(event,k))
#错误3:Label创建写错了,没有写控件的主体是谁,后面的参数也没有写关键字。
Label(root,text="按住鼠标左键,开始绘画吧").grid(row = 2, columnspan = 2, pady = 5)
mainloop() sunrise085 发表于 2020-8-28 22:39
一共有三处问题
帮你修改了,并做了注释。
对,三个问题,我忘记说label的问题了Label(root,text="按住鼠标左键,开始绘画吧").grid(row = 2, columnspan = 2, pady = 5)
w.bind("<B1-Motion>", lambda event:paint(event,k))
你这个这样写,和我那样写有什么区别么?我没做过TK,尝试下来我那样直接paint也可以啊 疾风怪盗 发表于 2020-8-28 22:59
对,三个问题,我忘记说label的问题了
你那样的话,就不能传参数进去了,他的程序是需要把选择的画笔颜色传递进去 sunrise085 发表于 2020-8-28 23:22
你那样的话,就不能传参数进去了,他的程序是需要把选择的画笔颜色传递进去
有颜色的啊,def paint(event, color=k):这里不是也传入颜色了么 疾风怪盗 发表于 2020-8-28 23:23
有颜色的啊,这里不是也传入颜色了么
你是怎么修改的? sunrise085 发表于 2020-8-28 23:27
你是怎么修改的?
def paint(event, color=k):
就是把定义paint时,传入color=k
在下面w.bind("<B1-Motion>", paint)
用的时候就不需要了,也可以运行的 疾风怪盗 发表于 2020-8-28 23:35
就是把定义paint时,传入color=k
在下面
用的时候就不需要了,也可以运行的
你确定这样写能运行??
感谢,问题已解决 sunrise085 发表于 2020-8-29 09:01
你确定这样写能运行??
def paint(event, color=k):
你这个没改啊
改了确定能运行 既然问题解决了,就设个最佳吧,把求助帖关了
页:
[1]