别再手动查颜色代码了!用Python+Pandas一键生成你的专属颜色对照表(附完整源码)
2026/5/7 21:17:30 网站建设 项目流程

用Python+Pandas打造智能颜色管理工具:从数据整理到可视化应用

在设计和开发工作中,颜色管理往往成为消耗时间的隐形杀手。每当需要确保品牌色彩一致性、创建数据可视化配色方案或设计用户界面时,开发者、设计师和数据分析师们不得不反复查阅颜色代码表,手动转换格式,甚至为同一个颜色在不同系统中的呈现差异而头疼。传统解决方案要么依赖零散的在线工具,要么使用静态的Excel表格,缺乏灵活性和可扩展性。

Python生态中的Pandas库为此类问题提供了优雅的解决方案。我们将构建一个完整的颜色管理系统,不仅能自动处理16进制、RGB、CMYK和HSV等格式的相互转换,还能实现智能查询、动态筛选和可视化预览功能。这个工具将彻底改变你处理颜色数据的方式——从被动查阅转变为主动管理。

1. 构建颜色数据库:结构化存储与智能解析

颜色管理的核心是建立统一的数据源。我们从创建一个可扩展的颜色数据库开始,这个数据库将作为所有后续操作的基础。

import pandas as pd import numpy as np from colormath.color_objects import sRGBColor, CMYKColor, HSVColor from colormath.color_conversions import convert_color # 初始化颜色数据库DataFrame color_db = pd.DataFrame(columns=[ 'id', 'name_cn', 'name_en', 'hex', 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'h', 's', 'v', 'category' ])

关键数据结构设计

  • 每个颜色条目包含完整的跨格式表示(16进制、RGB、CMYK、HSV)
  • 保留中英文名称便于国际化场景使用
  • 添加分类标签实现多维组织

实际项目中,建议将这部分数据持久化到SQLite或MongoDB中,这里我们先用DataFrame演示核心逻辑。

1.1 自动化数据录入与格式校验

手动输入颜色数据容易出错,我们创建自动化校验流程:

def add_color(df, name_cn, name_en, hex_code, r, g, b, category): """添加新颜色并自动计算所有格式""" try: # 创建RGB颜色对象 rgb = sRGBColor(r/255, g/255, b/255) # 自动计算CMYK和HSV cmyk = convert_color(rgb, CMYKColor) hsv = convert_color(rgb, HSVColor) # 构造新记录 new_record = { 'id': len(df) + 1, 'name_cn': name_cn, 'name_en': name_en, 'hex': hex_code.upper(), 'r': r, 'g': g, 'b': b, 'c': round(cmyk.cyan * 100), 'm': round(cmyk.magenta * 100), 'y': round(cmyk.yellow * 100), 'k': round(cmyk.black * 100), 'h': round(hsv.hsv_h), 's': round(hsv.hsv_s * 100), 'v': round(hsv.hsv_v * 100), 'category': category } return pd.concat([df, pd.DataFrame([new_record])], ignore_index=True) except Exception as e: print(f"添加颜色失败: {e}") return df

使用方法示例

color_db = add_color(color_db, "乌贼墨色", "Sepia", "#704214", 112, 66, 20, "棕色系") color_db = add_color(color_db, "巧克力色", "Chocolate", "#D2691E", 210, 105, 30, "棕色系")

注意:实际项目中应考虑添加重复颜色检测、边界值处理等健壮性功能

2. 高级查询系统:多维度智能检索

静态颜色表的局限性在于只能被动查阅。我们开发动态查询系统,支持多种智能检索方式。

2.1 基于自然语言的模糊查询

def search_colors(df, query): """支持中英文名称、色号、分类的多字段模糊查询""" query = str(query).lower() mask = ( df['name_cn'].str.lower().str.contains(query) | df['name_en'].str.lower().str.contains(query) | df['hex'].str.lower().str.contains(query) | df['category'].str.lower().str.contains(query) ) return df[mask].copy()

扩展功能:颜色相似度搜索

from sklearn.metrics.pairwise import euclidean_distances def find_similar_colors(df, target_hex, n=5): """基于RGB空间距离查找相似颜色""" target_rgb = df[df['hex'] == target_hex][['r','g','b']].values if len(target_rgb) == 0: return pd.DataFrame() all_rgb = df[['r','g','b']].values distances = euclidean_distances(target_rgb, all_rgb).flatten() df['similarity'] = 1 / (1 + distances) return df.sort_values('similarity', ascending=False).head(n).drop('similarity', axis=1)

2.2 专业色彩空间筛选

为设计师提供专业级筛选工具:

def filter_by_hsv(df, h_range=(0,360), s_range=(0,100), v_range=(0,100)): """根据HSV范围筛选颜色""" h_mask = (df['h'] >= h_range[0]) & (df['h'] <= h_range[1]) s_mask = (df['s'] >= s_range[0]) & (df['s'] <= s_range[1]) v_mask = (df['v'] >= v_range[0]) & (df['v'] <= v_range[1]) return df[h_mask & s_mask & v_mask].copy() # 示例:查找所有高饱和度的暖色调 warm_high_sat = filter_by_hsv(color_db, h_range=(0,60), s_range=(70,100))

3. 格式转换与批量处理

不同场景需要不同的颜色表示法。我们实现自动化转换和批量处理功能。

3.1 智能格式转换器

def convert_format(df, target_format, color_ids=None): """将选定颜色转换为目标格式""" if color_ids is None: subset = df.copy() else: subset = df[df['id'].isin(color_ids)].copy() if target_format == 'hex': return subset[['id', 'name_cn', 'hex']] elif target_format == 'rgb': subset['rgb'] = subset.apply(lambda x: f"{x['r']},{x['g']},{x['b']}", axis=1) return subset[['id', 'name_cn', 'rgb']] elif target_format == 'cmyk': subset['cmyk'] = subset.apply(lambda x: f"{x['c']}%,{x['m']}%,{x['y']}%,{x['k']}%", axis=1) return subset[['id', 'name_cn', 'cmyk']] elif target_format == 'hsv': subset['hsv'] = subset.apply(lambda x: f"{x['h']}°,{x['s']}%,{x['v']}%", axis=1) return subset[['id', 'name_cn', 'hsv']] else: raise ValueError("不支持的格式")

3.2 批量导出工具

def export_colors(df, file_path, format='csv'): """导出颜色数据到文件""" if format == 'csv': df.to_csv(file_path, index=False) elif format == 'json': df.to_json(file_path, orient='records', force_ascii=False) elif format == 'html': styled = df.style.applymap(lambda x: f"background-color: {x}", subset=['hex']) styled.to_html(file_path) else: raise ValueError("不支持的导出格式")

4. 可视化与实用工具集成

将颜色数据转化为直观可视的界面,提升工作效率。

4.1 动态颜色面板生成

import matplotlib.pyplot as plt from matplotlib.patches import Rectangle def show_color_palette(df, color_ids=None, cols=5): """可视化显示颜色面板""" if color_ids is not None: subset = df[df['id'].isin(color_ids)] else: subset = df colors = subset['hex'].tolist() names = subset['name_cn'].tolist() rows = int(np.ceil(len(colors) / cols)) fig, axes = plt.subplots(rows, cols, figsize=(cols*2, rows*2)) if rows == 1: axes = [axes] for i, (ax, color, name) in enumerate(zip(axes.flatten(), colors, names)): ax.add_patch(Rectangle((0,0), 1, 1, color=color)) ax.text(0.5, 0.5, name, ha='center', va='center', color='white' if np.mean(plt.colors.to_rgb(color)) < 0.5 else 'black') ax.axis('off') plt.tight_layout() return fig

4.2 配色方案生成器

def generate_palette(df, base_color_id, strategy='analogous'): """基于色彩理论生成配色方案""" base_color = df[df['id'] == base_color_id].iloc[0] base_h = base_color['h'] if strategy == 'monochromatic': # 单色系方案:调整饱和度和明度 return filter_by_hsv(df, h_range=(base_h-5, base_h+5), s_range=(40,100), v_range=(30,90)) elif strategy == 'analogous': # 类似色方案:色相环上相邻颜色 h1 = (base_h - 30) % 360 h2 = (base_h + 30) % 360 return filter_by_hsv(df, h_range=(min(h1,h2), max(h1,h2)), s_range=(50,100), v_range=(50,100)) elif strategy == 'complementary': # 互补色方案 comp_h = (base_h + 180) % 360 return filter_by_hsv(df, h_range=(comp_h-15, comp_h+15), s_range=(50,100), v_range=(50,100)) else: raise ValueError("不支持的配色策略")

5. 工程化应用:封装为可重用工具库

将上述功能整合为可pip安装的Python包,方便团队共享使用。

项目结构

colorutils/ ├── __init__.py ├── core.py # 核心功能 ├── cli.py # 命令行接口 ├── webapp/ # 可选Web界面 │ ├── app.py │ └── templates/ └── data/ # 默认颜色数据库 └── colors.csv

setup.py配置示例

from setuptools import setup, find_packages setup( name="colorutils", version="0.1.0", packages=find_packages(), install_requires=[ 'pandas>=1.0', 'numpy', 'colormath', 'matplotlib', 'scikit-learn' ], entry_points={ 'console_scripts': [ 'colorcli=colorutils.cli:main' ] } )

CLI工具实现片段

import click @click.group() def cli(): """颜色管理命令行工具""" pass @cli.command() @click.argument('hex_code') def show(hex_code): """显示指定颜色信息""" db = load_color_db() color = db[db['hex'] == hex_code.upper()] if len(color) == 0: click.echo(f"未找到颜色: {hex_code}") return click.echo(f"中文名: {color['name_cn'].values[0]}") click.echo(f"英文名: {color['name_en'].values[0]}") click.echo(f"RGB: {color['r'].values[0]},{color['g'].values[0]},{color['b'].values[0]}")

6. 实际应用案例:从数据到设计

6.1 数据可视化配色方案

def get_viz_palette(df, n=8, palette_type='qualitative'): """获取适合数据可视化的配色方案""" if palette_type == 'qualitative': # 高对比度的定性配色 return df.sort_values('h').iloc[::len(df)//n][['hex','name_cn']] elif palette_type == 'sequential': # 单色系的顺序配色 base = df.iloc[0] return generate_palette(df, base['id'], 'monochromatic') elif palette_type == 'diverging': # 双色系的发散配色 base1 = df.iloc[0] base2 = df.iloc[len(df)//2] palette1 = generate_palette(df, base1['id'], 'monochromatic').head(n//2) palette2 = generate_palette(df, base2['id'], 'monochromatic').head(n//2) return pd.concat([palette1, palette2])

6.2 品牌色彩管理系统

为企业品牌色彩提供版本控制和一致性管理:

class BrandColors: def __init__(self, db): self.db = db self.versions = {} def add_version(self, version_name, color_ids): """添加新的品牌色彩版本""" self.versions[version_name] = color_ids def get_version(self, version_name): """获取特定版本的品牌色彩""" return self.db[self.db['id'].isin(self.versions.get(version_name, []))] def compare_versions(self, v1, v2): """比较两个版本的色彩差异""" colors_v1 = set(self.versions.get(v1, [])) colors_v2 = set(self.versions.get(v2, [])) return { 'added': colors_v2 - colors_v1, 'removed': colors_v1 - colors_v2, 'common': colors_v1 & colors_v2 }

7. 性能优化与大规模数据处理

当颜色数据库扩展到数千种颜色时,需要考虑查询性能优化。

7.1 建立颜色空间索引

from sklearn.neighbors import KDTree class ColorIndex: def __init__(self, df): self.df = df self.rgb_tree = KDTree(df[['r','g','b']].values) self.hsv_tree = KDTree(df[['h','s','v']].values) def nearest_rgb(self, r, g, b, k=1): """基于RGB空间查找最近颜色""" distances, indices = self.rgb_tree.query([[r,g,b]], k=k) return self.df.iloc[indices.flatten()] def nearest_hsv(self, h, s, v, k=1): """基于HSV空间查找最近颜色""" distances, indices = self.hsv_tree.query([[h,s,v]], k=k) return self.df.iloc[indices.flatten()]

7.2 内存优化技巧

对于超大型颜色数据库:

def optimize_memory(df): """优化DataFrame内存使用""" # 整数类型优化 int_cols = ['r','g','b','c','m','y','k','h','s','v'] df[int_cols] = df[int_cols].apply(pd.to_numeric, downcast='integer') # 分类类型优化 cat_cols = ['name_cn','name_en','category'] df[cat_cols] = df[cat_cols].astype('category') return df

8. 扩展方向与进阶功能

8.1 颜色可访问性检查

def check_contrast(color1_hex, color2_hex): """检查两种颜色的对比度是否符合WCAG标准""" def hex_to_rgb(hex_color): hex_color = hex_color.lstrip('#') return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) rgb1 = np.array(hex_to_rgb(color1_hex)) / 255 rgb2 = np.array(hex_to_rgb(color2_hex)) / 255 # 计算相对亮度 def calc_luminance(rgb): rgb = np.where(rgb <= 0.03928, rgb/12.92, ((rgb+0.055)/1.055)**2.4) return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2] l1 = calc_luminance(rgb1) l2 = calc_luminance(rgb2) contrast = (max(l1, l2) + 0.05) / (min(l1, l2) + 0.05) return { 'contrast_ratio': round(contrast, 2), 'WCAG_AA': contrast >= 4.5, 'WCAG_AAA': contrast >= 7 }

8.2 与设计工具集成

通过API与Figma、Adobe XD等设计工具集成:

import requests class FigmaIntegrator: def __init__(self, api_key): self.api_key = api_key self.base_url = "https://api.figma.com/v1" def create_color_style(self, file_key, name, color_hex): """在Figma中创建颜色样式""" url = f"{self.base_url}/files/{file_key}/styles" headers = {"X-FIGMA-TOKEN": self.api_key} payload = { "name": name, "style_type": "FILL", "description": "Generated by ColorUtils", "paints": [{ "type": "SOLID", "color": self.hex_to_figma(color_hex) }] } response = requests.post(url, json=payload, headers=headers) return response.json() def hex_to_figma(self, hex_color): """16进制颜色转Figma格式""" hex_color = hex_color.lstrip('#') return { "r": int(hex_color[0:2], 16) / 255, "g": int(hex_color[2:4], 16) / 255, "b": int(hex_color[4:6], 16) / 255 }

9. 测试与质量保证

确保颜色转换和处理的准确性:

import unittest class TestColorConversions(unittest.TestCase): @classmethod def setUpClass(cls): cls.db = pd.DataFrame({ 'hex': ['#FF0000', '#00FF00', '#0000FF'], 'r': [255, 0, 0], 'g': [0, 255, 0], 'b': [0, 0, 255] }) def test_rgb_to_hex(self): self.assertEqual(self.db.iloc[0]['hex'], '#FF0000') def test_color_addition(self): new_db = add_color(self.db, "测试红", "Test Red", "#FF0000", 255, 0, 0, "测试") self.assertEqual(len(new_db), len(self.db) + 1) def test_conversion_accuracy(self): color = self.db.iloc[0] cmyk = convert_color( sRGBColor(color['r']/255, color['g']/255, color['b']/255), CMYKColor ) self.assertAlmostEqual(cmyk.cyan, 0, places=1) self.assertAlmostEqual(cmyk.magenta, 1, places=1)

10. 部署与团队协作方案

10.1 Docker容器化部署

FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["gunicorn", "--bind", "0.0.0.0:5000", "webapp.app:app"]

10.2 团队协作工作流

  1. 颜色数据库版本控制

    • 使用Git管理colors.csv的变更历史
    • 通过Pull Request审核新颜色的添加
  2. CI/CD流程

    # .github/workflows/test.yml name: Test on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: '3.9' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run tests run: | python -m unittest discover
  3. 文档自动化

    • 使用Sphinx生成API文档
    • 自动发布到内部Wiki或ReadTheDocs

11. 用户界面扩展

11.1 基于Streamlit的Web界面

import streamlit as st def main(): st.title("智能颜色管理系统") # 加载颜色数据库 df = load_color_db() # 搜索功能 search_term = st.text_input("搜索颜色") if search_term: results = search_colors(df, search_term) st.dataframe(results[['name_cn', 'hex']]) # 颜色展示 selected = st.selectbox("选择颜色", df['name_cn']) color = df[df['name_cn'] == selected].iloc[0] col1, col2 = st.columns(2) with col1: st.color_picker("颜色选择器", color['hex']) with col2: st.write(f"**RGB**: {color['r']}, {color['g']}, {color['b']}") st.write(f"**CMYK**: {color['c']}%, {color['m']}%, {color['y']}%, {color['k']}%") # 生成配色方案 if st.button("生成类似色方案"): palette = generate_palette(df, color['id']) fig = show_color_palette(palette) st.pyplot(fig) if __name__ == '__main__': main()

11.2 Jupyter Notebook集成

为数据分析师提供Notebook工具集:

from IPython.display import display, HTML def show_color_notebook(df, color_hex): """在Notebook中显示颜色详情""" color = df[df['hex'] == color_hex.upper()].iloc[0] html = f""" <div style="display:flex; align-items:center;"> <div style="width:100px; height:100px; background:{color['hex']}; border:1px solid #ccc; margin-right:20px;"></div> <div> <h3>{color['name_cn']} ({color['name_en']})</h3> <p><strong>HEX:</strong> {color['hex']}</p> <p><strong>RGB:</strong> {color['r']}, {color['g']}, {color['b']}</p> <p><strong>CMYK:</strong> {color['c']}%, {color['m']}%, {color['y']}%, {color['k']}%</p> </div> </div> """ display(HTML(html))

12. 行业应用场景深度解析

12.1 电商平台的色彩规范化管理

大型电商平台往往有数千种商品颜色描述,通过此系统可以实现:

  1. 自动标准化:将供应商提供的各种颜色描述统一为标准名称和代码
  2. 视觉一致性:确保同一颜色在不同终端显示一致
  3. 智能推荐:根据用户偏好推荐配色方案
class EcommerceColorSystem: def __init__(self, df): self.db = df self.vendor_mapping = self._load_vendor_mapping() def _load_vendor_mapping(self): """加载供应商颜色名称映射表""" return { '红酒色': 'Burgundy', '香槟金': 'Champagne Gold', # ...其他映射规则 } def standardize_color(self, vendor_name): """将供应商颜色名称标准化""" en_name = self.vendor_mapping.get(vendor_name, vendor_name) return search_colors(self.db, en_name)

12.2 数据可视化中的自动化配色

def auto_chart_colors(df, chart_type, n_colors): """根据图表类型自动生成配色方案""" if chart_type == 'pie': return get_viz_palette(df, n_colors, 'qualitative') elif chart_type == 'line': base_color = df.iloc[0]['id'] return generate_palette(df, base_color, 'monochromatic').head(n_colors) elif chart_type == 'bar': return get_viz_palette(df, n_colors, 'diverging') else: return get_viz_palette(df, n_colors)

13. 维护与更新策略

13.1 颜色数据库更新机制

def update_from_external(source_url, db): """从外部源更新颜色数据库""" try: new_data = pd.read_csv(source_url) # 数据清洗和转换 new_data = new_data.drop_duplicates(subset=['hex']) new_data = new_data[~new_data['hex'].isin(db['hex'])] # 格式标准化 new_data['hex'] = new_data['hex'].str.upper() return pd.concat([db, new_data], ignore_index=True) except Exception as e: print(f"更新失败: {e}") return db

13.2 废弃颜色处理

def deprecate_colors(db, color_ids, reason='', alternative_id=None): """标记颜色为废弃状态""" if 'deprecated' not in db.columns: db['deprecated'] = False db['deprecation_reason'] = '' db['alternative'] = None db.loc[db['id'].isin(color_ids), 'deprecated'] = True db.loc[db['id'].isin(color_ids), 'deprecation_reason'] = reason if alternative_id: db.loc[db['id'].isin(color_ids), 'alternative'] = alternative_id return db

14. 性能监控与优化

import time import functools def monitor_performance(func): """装饰器:监控函数执行性能""" @functools.wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} 执行时间: {end - start:.4f}秒") return result return wrapper @monitor_performance def search_colors_optimized(df, query): """优化后的颜色搜索函数""" # 实现略 pass

15. 安全与权限控制

class ColorAccessControl: def __init__(self, db): self.db = db self.roles = { 'viewer': ['search', 'export'], 'editor': ['add', 'modify'], 'admin': ['delete', 'deprecate'] } def check_permission(self, user_role, action): """检查用户是否有执行操作的权限""" return action in self.roles.get(user_role, []) def add_color(self, user_role, color_data): """带权限检查的颜色添加""" if not self.check_permission(user_role, 'add'): raise PermissionError("无添加颜色的权限") return add_color(self.db, **color_data)

16. 异常处理与用户反馈

class ColorError(Exception): """自定义颜色异常基类""" pass class ColorNotFoundError(ColorError): """颜色未找到异常""" def __init__(self, color_id): self.color_id = color_id super().__init__(f"未找到ID为 {color_id} 的颜色") def get_color_by_id(df, color_id): """根据ID获取颜色,未找到时抛出异常""" result = df[df['id'] == color_id] if len(result) == 0: raise ColorNotFoundError(color_id) return result.iloc[0]

17. 国际化支持

class ColorI18N: def __init__(self, db): self.db = db self.translations = { 'en': { 'search': 'Search Colors', 'hex': 'HEX Code' }, 'zh': { 'search': '搜索颜色', 'hex': '16进制代码' } # 其他语言... } def get_ui_text(self, lang, key): """获取界面文本翻译""" return self.translations.get(lang, {}).get(key, key) def search_localized(self, query, lang='en'): """支持多语言的搜索""" if lang == 'en': return search_colors(self.db, query) else: # 中文等非英语搜索 return self.db[ self.db['name_cn'].str.contains(query) | self.db['hex'].str.contains(query) ]

18. 历史版本与变更追踪

class ColorHistory: def __init__(self, db): self.db = db self.history = [] def take_snapshot(self, description=''): """记录当前数据库状态快照""" snapshot = { 'timestamp': pd.Timestamp.now(), 'description': description, 'data': self.db.copy() } self.history.append(snapshot) def restore_snapshot(self, index=-1): """恢复到指定历史版本""" if not self.history: return self.db self.db = self.history[index]['data'].copy() return self.db def get_changes(self, index1, index2): """比较两个版本之间的差异""" old = self.history[index1]['data'] new = self.history[index2]['data'] added = new[~new['hex'].isin(old['hex'])] removed = old[~old['hex'].isin(new['hex'])] changed = pd.concat([ old[old['hex'].isin(new['hex'])], new[new['hex'].isin(old['hex'])] ]).drop_duplicates(keep=False) return { 'added': added, 'removed': removed, 'changed': changed }

19. 机器学习增强功能

19.1 颜色趋势预测

from sklearn.linear_model import LinearRegression class ColorTrendAnalyzer: def __init__(self, db): self.db = db self.model = LinearRegression() def prepare_training_data(self): """准备颜色流行度时序数据""" # 实现略 pass def train(self): """训练趋势预测模型""" X, y = self.prepare_training_data() self.model.fit(X, y) def predict_trend(self, color_id, periods=12): """预测颜色未来流行趋势""" # 实现略 pass

19.2 自动颜色命名

from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB class ColorNamer: def __init__(self): self.vectorizer = TfidfVectorizer() self.model = MultinomialNB() def train(self, df): """训练颜色命名模型""" # 使用现有颜色数据训练 X = self.vectorizer.fit_transform( df.apply(lambda x: f"{x['r']} {x['g']} {x['b']}", axis=1) ) self.model.fit(X, df['name_en']) def predict_name(self, r, g, b): """根据RGB值预测颜色名称""" X_new = self.vectorizer.transform([f"{r} {g} {b}"]) return self.model.predict(X_new)[0]

20. 硬件集成与物联网应用

import serial class ColorHardwareController: def __init__(self, port): self.ser = serial.Serial(port, 9600) def set_color(self, hex_code): """通过串口控制硬件显示指定颜色""" r, g, b = self.hex_to_rgb(hex_code) command = f"COLOR {r} {g} {b}\n".encode() self.ser.write(command) def hex_to_rgb(self, hex_code): """16进制颜色转RGB""" hex_code = hex_code.lstrip('#') return ( int(hex_code[0:2], 16), int(hex_code[2:4], 16), int(hex_code[4:6], 16) ) def close(self): """关闭串口连接""" self.ser.close()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询