第一百零一次闯荡江湖的无名游侠 - Python
type: channel
link: http://diyibailingyici.chuangdangjianghudewumingyouxia.cn/tag/Python/
items: 多张图片拼接成一张长图
items: tk+python 实现的图片水印生成
items: 图片转gif、gif分解成图片小工具 使用python+tkinter实现
items: socketio.exceptions.ConnectionError: OPEN packet not returned by server
items: Python必备的62个内置函数
items: python+tkinter实现按照农历/阴历生日推送消息提醒到钉钉群机器人的程序
items: SSL: CERTIFICATE_VERIFY_FAILED 证书验证失败问题
items: python 检查ssl证书是否过期（https）
items: [python+tkinter]实现选择目录将目录下多个文件夹内的文件复制到一个文件夹中
items: python unicode标点范围不同语言Unicode的编码范围

多张图片拼接成一张长图
type: item
date: 2025-11-28T11:17:44+08:00
description: 多张图片拼接成一张长图介绍tk+python实现多张图片拼接到同一张长图片中地址：https://gitee.com/cx-a/splice_long_image预览图

tk+python 实现的图片水印生成
type: item
date: 2025-11-27T15:06:25+08:00
description: 图片水印生成介绍tk+python 实现的图片水印生成地址：https://gitee.com/cx-a/image-watermark-generation预览图

图片转gif、gif分解成图片小工具 使用python+tkinter实现
type: item
date: 2025-09-24T11:24:13+08:00
description: 介绍图片转gif、gif分解成图片小工具 使用python+tkinter实现地址：https://gitee.com/cx-a/image-to-gif

socketio.exceptions.ConnectionError: OPEN packet not returned by server
type: item
date: 2024-12-09T11:23:40+08:00
description: 报错信息 Exception in thread Thread-3: Traceback (most recent call last): File "/home/comz/anaconda3/envs/arcface/lib/python3.7/threading.py", line 926, in _bootstrap_inner self.run() File "/home/comz/anaconda3/envs/arcface/lib/python3.7/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "usb_camera.py", line 140, in <lambda> Process(target=lambda: asyncio.run(upload_loop())).start() File "/home/comz/anaconda3/envs/arcface/lib/python3.7/asyncio/runners.py", line 43, in run return loop.run_until_complete(main) File "/home/comz/anaconda3/envs/arcface/lib/python3.7/asyncio/base_events.py", line 587, in run_until_complete return future.result() File "usb_camera.py", line 51, in upload_loop await sio.connect(url) File "/home/comz/anaconda3/envs/arcface/lib/python3.7/site-packages/socketio/asyncio_client.py", line 117, in connect raise exceptions.ConnectionError(exc.args[0]) from None socketio.exceptions.ConnectionError: OPEN packet not returned by server解决办法：pip install python-engineio==3.14.2 python-socketio==4.6.0来源：https://blog.csdn.net/qq_41251963/article/details/122049787

Python必备的62个内置函数
type: item
date: 2024-11-14T09:18:00+08:00
description: Python必备的62个内置函数

python+tkinter实现按照农历/阴历生日推送消息提醒到钉钉群机器人的程序
type: item
date: 2024-11-11T14:32:00+08:00
description: 更新：2024.12.111.日志可以直接查看2.配置可以直接修改2024.12.031.修改界面2.修复之前的bug3.列表可以进行增删改功能：1.计算农历/阴历生日并且推送消息提醒到钉钉群机器人的程序。2.一个定时访问一个链接。使用说明：生日需要修改sql数据库文件time_config.ini文件字段说明dingding_url #钉钉群机器人链接birthday_day #天 提前多少天提醒birthday_timea #开始计算的时间birthday_timeb #超过此次时间就不进行计算birthday_timec #清空时间区间abirthday_timed #清空时间区间breport_url #定时访问一个链接的地址user_agent #get的浏览器请求头，可不修改report_frequency #秒 多少秒计算和访问链接一次运行图：下载地址：gitee在发行版中选择打包好的成品。python打包使用的是Pyinstaller打包。链接：https://gitee.com/cx-a/birthday-dingtalk-remind

SSL: CERTIFICATE_VERIFY_FAILED 证书验证失败问题
type: item
date: 2024-09-02T18:50:36+08:00
description: Python 报 “SSL: CERTIFICATE_VERIFY_FAILED" 错误Linuxexport SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt以上方式在 CentOS 中验证 OK。更新 certifi 包手动安装模块 pyperclip

python 检查ssl证书是否过期（https）
type: item
date: 2024-09-02T16:52:00+08:00
description: 导入相关模块import ssl import socket import time from datetime import datetime首先我们创建一个 domain.txt 用来存放要检查的域名和对应的 IP 地址www.baidu.com:180.101.50.242,180.101.50.188 www.bing.com:202.89.233.101,202.89.233.100我们读取该文件，把里面的域名和对应的每个 ip 取出来，并存放到字典 domains 里面domains = { } with open('domain.txt', 'r', encoding='utf-8') as file: for line in file: domain, ip_pool = line.strip().split(':') domains[domain] = ip_pool.split(',')取出来之后我们循环遍历字典，去获取每个域名对应的证书信息（ssl_connect 函数）def ssl_connect(domain, ip): # 设置socket的超时时间为5秒 socket.setdefaulttimeout(5) # 创建默认的SSL上下文 context = ssl.create_default_context() # 创建一个SSL套接字 skt = context.wrap_socket(socket.socket(), server_hostname=domain) try: # 建立SSL连接 skt.connect((ip, 443)) # 获取证书过期时间 end_date = skt.getpeercert()['notAfter'].strip(' GMT') # 创建一个字典，存储本次连接中的域名、IP 地址和证书过期时间信息 skt_info = { 'domain': domain, 'ip': ip, 'end_date': end_date} except ssl.CertificateError as e: cert = e except socket.timeout: cert = 'Connect refused' except ConnectionResetError as e: cert = 'Connect reset' + str(e) except socket.gaierror as e: cert = 'Connnect gaierror' finally: # 关闭SSL套接字 skt.close() return skt_infossl_connect 函数返回一个字典 skt_info，包含当前连接的域名、ip 地址和证书过期时间# skt_info 内容 { 'domain': 'www.baidu.com', 'ip': '180.101.50.242', 'end_date': 'Aug 6 01:51:05 2024'} { 'domain': 'www.baidu.com', 'ip': '180.101.50.188', 'end_date': 'Aug 6 01:51:05 2024'} { 'domain': 'www.bing.com', 'ip': '202.89.233.101', 'end_date': 'Aug 16 03:47:45 2023'} { 'domain': 'www.bing.com', 'ip': '202.89.233.100', 'end_date': 'Aug 16 03:47:45 2023'}然后我们调用 check_cert_time 函数进行证书有效期检查和提示info = [ssl_connect(domain, ip) for domain, ip_pool in domains.items() for ip in ip_pool] [check_cert_time(i) for i in info]check_cert_time 函数内容如下：def check_cert_time(info): # 获取当前时间戳 current_timestamp = int(time.time()) # 将证书过期时间转换成时间戳 date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y") end_timestamp = int(date_object.timestamp()) # 计算剩余天数 remain_day = (end_timestamp - current_timestamp) / 86400 # 打…

[python+tkinter]实现选择目录将目录下多个文件夹内的文件复制到一个文件夹中
type: item
date: 2024-08-27T16:38:00+08:00
description: 缘由：朋友有一个这样的需求，有三个文件夹，文件夹A内含有很多txt文件，文件夹B中也内含有很多txt文件，文件夹C中还是含有很多txt文件。需要把txt文件复制到同个文件夹中功能：选择目录将目录下多个文件夹内的文件复制到一个文件夹中运行图：下载地址：包含打包好的成品和源代码。python打包使用的是Pyinstaller打包。链接：https://ide.lanzouv.com/b0foqio5i密码:ao4j更新：2024.08.27 v1.1.01.增加线程防止界面复制时候处于 未响应 状态2.增加进度条显示2024.08.27 v1.0.0初始版本源代码：一共有4个文件：main.py、ui.py、control.py、logo.icomain.py# 导入布局文件 from ui import Win as MainWin # 导入窗口控制器 from control import Controller as MainUIController # 将窗口控制器 传递给UI app = MainWin(MainUIController()) if __name__ == "__main__": # 启动 app.mainloop()ui.pyfrom tkinter import * from tkinter.ttk import * class WinGUI(Tk): def __init__(self): super().__init__() self.__win() self.tk_label_m0c6l6hz = self.__tk_label_m0c6l6hz(self) self.tk_input_m0c6lpcn = self.__tk_input_m0c6lpcn(self) self.tk_button_m0c6lvy7 = self.__tk_button_m0c6lvy7(self) self.tk_label_m0c6mm3a = self.__tk_label_m0c6mm3a(self) self.tk_input_m0c6n6vi = self.__tk_input_m0c6n6vi(self) self.tk_button_m0c6nb3j = self.__tk_button_m0c6nb3j(self) self.tk_button_m0c7djh2 = self.__tk_button_m0c7djh2(self) self.tk_progressbar_m0d8ueyu = self.__tk_progressbar_m0d8ueyu(self) self.tk_label_m0d8xhee = self.__tk_label_m0d8xhee(self) self.tk_label_m0dhb051 = self.__tk_label_m0dhb051(self) def __win(self): self.title("多个文件夹内的文件复制到一个文件夹中_v1.1.0") # 设置窗口大小、居中 width = 572 height = 263 screenwidth = self.winfo_screenwidth() screenheight = self.winfo_screenheight() geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) self.geometry(geometry) self.resizable(width=False, height=False) def scrollbar_autohide(self, vbar, hbar, widget): """自动隐藏滚动条""" def show(): if vbar: vbar.lift(widget) if hbar: hbar.lift(widget) def hide(): if vbar: vbar.lower(widget) if hbar: hbar.lower(widget) hide() widget.bind("<Enter>", lambda e: show()) if vbar: vbar.bind("<Enter>", lambda e: show()) if vbar: vbar.bind("<Leave>", lambda e: hide()) if hbar: hbar.bind("<Enter>", lambda e: show()) if hbar: hbar.bind("<Leave>", lambda e: hid…

python unicode标点范围不同语言Unicode的编码范围
type: item
date: 2024-08-05T10:37:00+08:00
description: 我们常常会用到判断某个字符或者字符串是否包含中文，英文，特殊符号等等。这时候可以通过判断Unicode所在区间来确定某个字符所处类型。当然可以通过直接判断Unicode码，但是鉴于习惯，以下提供的是Unicode码对应的数字区间。毕竟字符的本质也就是通过二进制进行存储编码的而已。基本汉字：[0x4e00,0x9fa5](或十进制[19968,40869]) 数字：[0x 0030,0x0039](或十进制[48, 57]) 小写字母：[0x0061,0x007a](或十进制[97, 122]) 大写字母：[0x0041,0x005a](或十进制[65, 90]) Unicode都是两个字节，由于长度统一，所以比较适合程序处理。 再来一个比较完整的Unicode分布： 0000-007F：C0控制符及基本拉丁文 (C0 Control and Basic Latin) 0080-00FF：C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement) 0100-017F：拉丁文扩展-A (Latin Extended-A) 0180-024F：拉丁文扩展-B (Latin Extended-B) 0250-02AF：国际音标扩展 (IPA Extensions) 02B0-02FF：空白修饰字母 (Spacing Modifiers) 0300-036F：结合用读音符号 (Combining Diacritics Marks) 0370-03FF：希腊文及科普特文 (Greek and Coptic) 0400-04FF：西里尔字母 (Cyrillic) 0500-052F：西里尔字母补充 (Cyrillic Supplement) 0530-058F：亚美尼亚语 (Armenian) 0590-05FF：希伯来文 (Hebrew) 0600-06FF：阿拉伯文 (Arabic) 0700-074F：叙利亚文 (Syriac) 0750-077F：阿拉伯文补充 (Arabic Supplement) 0780-07BF：马尔代夫语 (Thaana) 07C0-077F：西非書面語言 (N'Ko) 0800-085F：阿维斯塔语及巴列维语 (Avestan and Pahlavi) 0860-087F：Mandaic 0880-08AF：撒马利亚语 (Samaritan) 0900-097F：天城文书 (Devanagari)来源：https://blog.csdn.net/weixin_34206263/article/details/11203186