老师您好,我想实现视频中颜色渐变的功能,按下c键后颜色开始渐变。但是我的代码并没有实现颜色渐变,老师您看看是哪里的问题。我把self.fgcolor从字符串转为10进制的数,再加1,再转换为颜色对应的字符串。我发现range如果设置太大会显示超过颜色表示的范围。
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *
#encoding=utf-8
win_width=900
win_height=450
class Application(Frame):
def __init__(self, master=None,bgcolor="#000000"):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.bgcolor=bgcolor
self.x=0
self.y=0
self.fgcolor="#ff0000"
self.startDrawFlag=False
self.lastDraw=0 #表示最后绘制图形的id
self.pack()
self.createWidget()
def createWidget(self):
#创建画图区
self.drawpad=Canvas(root,width=win_width,height=win_height*0.9,bg=self.bgcolor)
self.drawpad.pack()
#创建按钮
btn_start = Button(root, text="开始", name="start")
btn_start.pack(side="left",padx="10")
btn_pen = Button(root, text="画笔", name="pen")
btn_pen.pack(side="left", padx="10")
btn_rect = Button(root, text="矩形", name="rect")
btn_rect.pack(side="left", padx="10")
btn_clear = Button(root, text="清屏", name="clear")
btn_clear.pack(side="left", padx="10")
btn_eraser = Button(root, text="橡皮擦", name="eraser")
btn_eraser.pack(side="left", padx="10")
btn_line = Button(root, text="直线", name="line")
btn_line.pack(side="left", padx="10")
btn_lineArrow = Button(root, text="箭头直线", name="lineArrow")
btn_lineArrow.pack(side="left", padx="10")
btn_color = Button(root, text="颜色", name="color")
btn_color.pack(side="left", padx="10")
#事件处理
btn_pen.bind_class("Button","<1>",self.eventManager)
self.drawpad.bind("<ButtonRelease-1>",self.stopDraw)
# bind_class 同类事件的统一绑定,这里是Button按键类的事件绑定-鼠标左键条件
# self.drawpad.bind("")
#增加颜色切换的快捷键处理
root.bind("<KeyPress-r>", self.kuaijiejian)
root.bind("<KeyPress-g>", self.kuaijiejian)
root.bind("<KeyPress-b>", self.kuaijiejian)
root.bind("<KeyPress-y>", self.kuaijiejian)
root.bind("<KeyPress-c>", self.GradualColor) #按c键实现颜色渐变
def eventManager(self,event):
name=event.widget.winfo_name()
print(name)
if name=="line":
self.drawpad.bind("<B1-Motion>",self.myline)
elif name=="lineArrow":
self.drawpad.bind("<B1-Motion>", self.mylineArrow)
elif name=="rect":
self.drawpad.bind("<B1-Motion>",self.myrect)
elif name=="pen":
self.drawpad.bind("<B1-Motion>",self.mypen)
elif name=="eraser":
self.drawpad.bind("<B1-Motion>",self.myeraser)
elif name=="clear":
self.drawpad.delete("all")
elif name=="color":
c=askcolor(color=self.fgcolor,title="选择画笔颜色")
#返回的是[(255,0,0),"#ff0000"]
self.fgcolor=c[1]
def stopDraw(self,event):
self.startDrawFlag=False
self.lastDraw=0 #防止画完线后不消失 delete(0)相当于不删除
def startDraw(self,event):
self.drawpad.delete(self.lastDraw)
if not self.startDrawFlag:
self.startDrawFlag = True
self.x = event.x
self.y = event.y
def myline(self,event):
self.startDraw(event)
self.lastDraw=self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)
def mylineArrow(self,event):
self.startDraw(event)
self.lastDraw=self.drawpad.create_line(self.x,self.y,event.x,event.y,arrow=LAST,fill=self.fgcolor)
def myrect(self,event):
self.startDraw(event)
self.lastDraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)
def mypen(self,event): #将后一个直线段的终点变为下一个段的起点
self.startDraw(event)
self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)
self.x=event.x
self.y=event.y
def myeraser(self,event): #将后一个直线段的终点变为下一个段的起点
self.startDraw(event)
self.drawpad.create_rectangle(event.x-4,event.y-4,event.x+4,event.y+4,fill=self.bgcolor)
self.x=event.x
self.y=event.y
def kuaijiejian(self,event):
if event.char=="r":
self.fgcolor="#ff0000"
self.GradualColor(event)
elif event.char=="g":
self.fgcolor="#00ff00"
elif event.char=="b":
self.fgcolor="#0000ff"
elif event.char=="y":
self.fgcolor="#ffff00"
def GradualColor(self,event): #颜色渐变
if event.char=="c":
for i in range(100):
i +=1
read_color=self.fgcolor[1:] #读取颜色字符,注意#不读取
hex_color=hex(int(read_color, 16)+i) #+1后转化为十六进制数
a=str(hex_color)[2:] #转化为16进制字符串,去掉自带的0x
c=''.join(['#',a]) #与'#'号拼接形成颜色样式
self.fgcolor=c #赋值给self.color
if __name__ == '__main__':
root = Tk()
root.geometry(str(win_width)+"x"+str(win_height)+"+200+300")
root.title("画图小工具")
app = Application(master=root)
root.mainloop()