更新:
主要改进点:
1. 颜色过渡效果
- 使用
get_rainbow_color()
函数生成基于正弦波的RGB彩虹色 - 通过
color_phase
控制颜色变化,实现平滑的色彩过渡 - 颜色从红→黄→绿→青→蓝→紫→红 循环变化
2. 防烧屏保护
- 颜色变化:每16ms(约60FPS)改变一次颜色
- 位置微调:每隔约0.5秒轻微移动窗口位置(±2像素)
- 随机移动:每次移动的方向和距离都是随机的
3. 代码结构优化
- 使用面向对象设计,提高代码可维护性
- 将动画逻辑分离到独立的方法中
- 添加了可调节的参数(颜色速度、移动频率等)
4. 性能优化
- 使用
after()
方法替代 time.sleep()
,避免阻塞GUI - 只重绘必要的元素
- 合理的帧率控制
5. 可定制参数
这样改进后,圆点会显示为动态变化的彩色光点,并且会轻微移动,有效防止OLED屏幕烧屏问题。
===============================================
import tkinter as tk
import math
import random
class ColorDotWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title("Color Dot")
# 颜色动画参数
self.color_phase = 0
self.color_speed = 0.025 # 颜色变化速度
# 位置移动参数
self.move_counter = 0
self.move_frequency = 30 # 每30次颜色变化移动一次
self.move_distance = 2 # 每次移动距离(像素)
# 隐藏窗口的标题栏和边框
self.root.overrideredirect(True)
# 设置窗口置顶
self.root.attributes('-topmost', True)
# 设置窗口背景透明色
self.transparent_color = 'magenta'
self.root.wm_attributes('-transparentcolor', self.transparent_color)
# 设置画布大小
self.dot_size = 8
self.border_width = 6
self.canvas_size = self.dot_size + 2 * self.border_width
# 获取屏幕尺寸并计算居中位置
self.screen_width = self.root.winfo_screenwidth()
self.screen_height = self.root.winfo_screenheight()
self.x = (self.screen_width - self.canvas_size) // 2
self.y = (self.screen_height - self.canvas_size) // 2
self.root.geometry(f"{self.canvas_size}x{self.canvas_size}+{self.x}+{self.y}")
# 创建 Canvas
self.canvas = tk.Canvas(self.root, width=self.canvas_size, height=self.canvas_size,
bg=self.transparent_color, highlightthickness=0)
self.canvas.pack()
# 绘制初始图形
self.draw_dot()
# 开始动画循环
self.animate()
def rgb_to_hex(self, r, g, b):
"""将RGB值转换为十六进制颜色字符串"""
return f'#{int(r):02x}{int(g):02x}{int(b):02x}'
def get_bright_color(self, phase):
"""根据相位获取高亮度颜色"""
# 使用HSV色彩空间概念生成明亮的颜色
# 固定高饱和度和高亮度值
hue = phase % (2 * math.pi)
# 确保最小RGB值不低于150,最大值为255
r = math.sin(hue) * 100 + 155
g = math.sin(hue + 2 * math.pi / 3) * 100 + 155
b = math.sin(hue + 4 * math.pi / 3) * 100 + 155
# 确保颜色足够亮
min_val = min(r, g, b)
if min_val < 100:
# 如果有颜色太暗,整体提亮
diff = 100 - min_val
r += diff
g += diff
b += diff
# 确保不超过255
r = min(255, r)
g = min(255, g)
b = min(255, b)
return self.rgb_to_hex(r, g, b)
def get_vibrant_color(self, phase):
"""生成鲜艳的高对比度颜色"""
# 将色彩空间分为几个明亮的区域
section = int(phase / (math.pi / 3)) % 6
colors = [
(255, 50, 50), # 亮红色
(255, 150, 50), # 亮橙色
(255, 255, 50), # 亮黄色
(50, 255, 50), # 亮绿色
(50, 150, 255), # 亮蓝色
(150, 50, 255), # 亮紫色
]
# 在基础颜色之间进行平滑过渡
next_section = (section + 1) % 6
blend = (phase % (math.pi / 3)) / (math.pi / 3)
r1, g1, b1 = colors[section]
r2, g2, b2 = colors[next_section]
r = r1 + (r2 - r1) * blend
g = g1 + (g2 - g1) * blend
b = b1 + (b2 - b1) * blend
return self.rgb_to_hex(r, g, b)
def get_bright_rainbow_color(self, phase):
"""获取明亮的彩虹色 - 最终选择的方案"""
# 使用更明亮的色彩算法
r = abs(math.sin(phase) * 127 + 128)
g = abs(math.sin(phase + math.pi/2) * 127 + 128)
b = abs(math.sin(phase + math.pi) * 127 + 128)
# 提高整体亮度
r = min(255, r * 1.2 + 50)
g = min(255, g * 1.2 + 50)
b = min(255, b * 1.2 + 50)
# 确保至少有一个颜色分量接近最大值
max_val = max(r, g, b)
if max_val < 200:
scale = 200 / max_val
r *= scale
g *= scale
b *= scale
return self.rgb_to_hex(r, g, b)
def draw_dot(self):
"""绘制带描边的圆点"""
# 清除画布
self.canvas.delete("all")
# 获取当前颜色(使用明亮版本)
current_color = self.get_bright_rainbow_color(self.color_phase)
# 先画黑色描边圆(外圈)
self.canvas.create_oval(
self.border_width,
self.border_width,
self.canvas_size - self.border_width,
self.canvas_size - self.border_width,
outline='black',
fill='',
width=self.border_width
)
# 再画彩色实心圆(内圈)
self.canvas.create_oval(
self.border_width,
self.border_width,
self.canvas_size - self.border_width,
self.canvas_size - self.border_width,
outline='',
fill=current_color
)
def move_window_slightly(self):
"""轻微移动窗口位置"""
# 随机选择移动方向
dx = random.randint(-self.move_distance, self.move_distance)
dy = random.randint(-self.move_distance, self.move_distance)
# 更新位置
self.x = max(0, min(self.screen_width - self.canvas_size, self.x + dx))
self.y = max(0, min(self.screen_height - self.canvas_size, self.y + dy))
# 应用新位置
self.root.geometry(f"{self.canvas_size}x{self.canvas_size}+{int(self.x)}+{int(self.y)}")
def animate(self):
"""动画循环"""
# 更新颜色相位
self.color_phase += self.color_speed
if self.color_phase > 2 * math.pi:
self.color_phase -= 2 * math.pi
# 重新绘制
self.draw_dot()
# 增加移动计数器
self.move_counter += 1
# 定期轻微移动窗口位置
if self.move_counter >= self.move_frequency:
self.move_window_slightly()
self.move_counter = 0
# 继续动画循环(约60FPS)
self.root.after(16, self.animate)
def run(self):
"""运行主循环"""
self.root.mainloop()
def create_color_dot_window():
"""创建彩色圆点窗口"""
app = ColorDotWindow()
app.run()
if __name__ == "__main__":
create_color_dot_window()
不依赖第三方库,置顶显示.
玩3D游戏有轻微晕感的,电脑上装有python的可以试试.
现在找个特定功能的小软件的真难,简单的功能动不动就几百兆,还不如AI写一个脚本.
原理: 一个突兀出现的不属于游戏内容的小点,让你的注意力分散,可以有效的减轻3D眩晕的情况.