tkinter使用canvas实现渐变色

AI 概述
tkinter 使用 canvas 实现渐变色1. 使用 rgb 表示颜色2. tkinter canvas 组件3. 设置渐变3.1 渐变的原理3.2 实例 1 tkinter 使用 canvas 实现渐变色 之前呢,我一直对 GUI 不是很感兴趣,但是呢,最近由于某些特殊原因,导致不得不用 tkinter,需要实现一个渐变色,但是当我翻阅文档的时候,却发现并没...
目录
文章目录隐藏
  1. tkinter 使用 canvas 实现渐变色
  2. 1. 使用 rgb 表示颜色
  3. 2. tkinter canvas 组件
  4. 3. 设置渐变

tkinter 使用 canvas 实现渐变色

之前呢,我一直对 GUI 不是很感兴趣,但是呢,最近由于某些特殊原因,导致不得不用 tkinter,需要实现一个渐变色,但是当我翻阅文档的时候,却发现并没有内置的函数可以实现这个功能,只能自己实现,所以就搜索了一下渐变色得原理,实现了出来

1. 使用 rgb 表示颜色

tkinter 是没有提供使用 rgb 作为参数的函数的,所以就需要将十六进制的值转为 grb 的值,当然方法也很简单,就是对十六进制进行运算。

代码:

def use_rgb(rgb):
    """
    将 rgb 转十六进制
    Args:
        rgb: rgb 颜色
    Returns: 十六进制
    """
    rgb = str(rgb)
    RGB = rgb.replace('(', '').replace(")", '').split(',')  # 将 RGB 格式划分开来
    color = '#'
    for i in RGB:
        num = int(i)
        # 将 R、G、B 分别转化为 16 进制拼接转换并大写  hex() 函数用于将 10 进制整数转换成 16 进制,以字符串形式表示
        color += str(hex(num))[-2:].replace('x', '0')
    return color

因为传入得到 rgb 是元组形式,所以转为字符串,然后再转为十六进制的字符串,记得前面需要加上#

2. tkinter canvas 组件

canvas 组件是 tkinter 库里面作为画东西的,可以画线段,矩形,多边形,圆弧等

使用 canvas 组件需要先创建一个窗口对象来作为 canvas 的父物体:

import tkinter as tk

# 先初始化 tkinter 组件,创建窗口对象
window = tk.Tk()
# 设置窗口的标题,长宽
window.title("title")
window.geometry("800x600")

运行后什么都不会发生,因为还需要将窗口显示:

window.mainloop()

然后就是夜光什么都没有的小框框。

canvas 的创建也是创建类的实例化,可以是无参的,后面再调整,也可以在创建的同时就实例化。

# 使用 canvas
canvas = window.Canvas()

也可以:

# window 是 canvas 的父物体,width 和 height 一看就是 canvas 的宽和高了
canvas = tk.Canvas(window, width=800, height=600)
# 这个方法可以设置布局方式,当然也是显示画布的方法
canvas.pack()

当然此时运行后也是什么都没有的,我们需要在画布上面画东西,然后我们通过 canvas 画一个矩形:

canvas.create_rectangle(100, 100, 300, 300, fill="red")
# 这行代码也可以这么写
canvas.create_rectangle((100, 100, 300, 300), fill="red")

这样就是画了一个红色的矩形

3. 设置渐变

这里面的渐变也不是直接在矩形上面做文章的,而是需要使用线段,每条线段显示一种颜色,然后形成渐变的效果

画线段的方法是:

canvas.create_line()

里面的参数形式和上面线段的差不多,只不过画线段只需要两个坐标

3.1 渐变的原理

简便的的原理就是设置一种颜色从深变浅,然后再变为另一种颜色的浅,再深。

说起来是不是很简单,但是要实现还是有点困难的。

我们的思路是:

  • 循环画线段
  • 计算每个线段的颜色

而我们画线段的时候,只需要计算这三个参数:

  1. 矩形的长度
  2. 线段起点 x 坐标
  3. 线段起点 y 坐标

这里的起点,并不是最开始的点,而是线段的上面的点。我们还需要知道我们需要渐变的两种颜色的 rgb 值。而渐变,我们只需要知道某条线段对于开始的增值,然后再将其与 rgb 结合,就是某条线段的颜色。

3.2 实例 1

将这个红色的矩形变成从左到右的红蓝渐变:

红色 grb 值(255, 0, 0)

蓝色 rgb 值(0, 0, 255)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/12/4 19:44
# @Version: 1.0
import tkinter as tk

RED = (255, 0, 0)
BLUE = (0, 0, 255)


def use_rgb(rgb):
    """
    将 rgb 转十六进制
    Args:
        rgb: rgb 颜色
    Returns: 十六进制
    """
    rgb = str(rgb)
    RGB = rgb.replace('(', '').replace(")", '').split(',')  # 将 RGB 格式划分开来
    color = '#'
    for i in RGB:
        num = int(i)
        # 将 R、G、B 分别转化为 16 进制拼接转换并大写  hex() 函数用于将 10 进制整数转换成 16 进制,以字符串形式表示
        color += str(hex(num))[-2:].replace('x', '0')
    return color


# 先初始化 tkinter 组件,创建窗口对象
window = tk.Tk()
# 设置窗口的标题,长宽
window.title("title")
window.geometry("800x600")
# 使用 canvas
canvas = tk.Canvas(window, width=800, height=600)
canvas.pack()
a1, a2, a3, b1, b2, b3 = RED[0], RED[1], RED[2], BLUE[0], BLUE[1], BLUE[2]
# 相差的 rgb
r, g, b = (b1 - a1), (b2 - a2), (b3 - a3)
print(r, g, b)
h = 200
for i in range(200):
    x1 = 100 + i
    y1 = 100
    t = (x1 - 100) / (300 - 100)
    rgb = (int(a1 + r * t), int(a2 + g * t), int(a3 + b * t))
    print(rgb)
    canvas.create_line((x1, y1), (x1, y1 + h), fill=use_rgb(rgb))
window.mainloop()

最后效果:

tkinter 使用 canvas 实现渐变色

原文:链接

以上关于tkinter使用canvas实现渐变色的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » tkinter使用canvas实现渐变色

发表回复