这张星座图是不是很酷?实际上这里面隐藏着我的名字!哈哈哈

上链接
https://share.weiyun.com/lyQILoD0
将你的名字变成专属的键盘星座签名!很有趣的小东西,废话少说,下面上教程:
项目概述
键盘轨迹绘制器是一个交互式应用程序,能够将用户输入的文本转换为在虚拟键盘上显示的视觉轨迹,并可以保存为星座风格的图片。
开发环境
-
Python 3.x
-
Pygame库
-
支持中文字体显示(可选)
核心功能
-
实时键盘输入与显示
-
大小写字母支持
-
虚拟键盘可视化
-
星座风格轨迹绘制
-
图片导出功能
关键技术实现
1. 键盘布局设计
python
# 定义QWERTY键盘布局
keyboard_layout = [
"1234567890",
"QWERTYUIOP",
"ASDFGHJKL",
"ZXCVBNM"
]
# 计算每个键位的中心坐标
for row_idx, row in enumerate(keyboard_layout):
y = start_y + row_idx * (key_height + vertical_gap)
for col_idx, key in enumerate(row):
x = start_x + col_idx * (key_width + horizontal_gap)
# 调整行偏移以模拟标准键盘布局
if row_idx == 1:
x += key_width // 2
elif row_idx == 2:
x += key_width
elif row_idx == 3:
x += key_width * 1.5
# 存储键位坐标(同时支持大小写)
key_positions[key] = (x + key_width // 2, y + key_height // 2)
if key.isalpha():
key_positions[key.lower()] = (x + key_width // 2, y + key_height // 2)
2. 星座背景生成
使用固定随机种子确保每次生成的背景一致:
python
def create_constellation_background():
background = pygame.Surface((WIDTH, HEIGHT))
background.fill(BLACK)
# 使用固定随机种子确保每次生成的星座相同
random.seed(42)
# 在按键位置添加星星
stars = []
for pos in key_positions.values():
stars.append(pos)
brightness = random.randint(100, 150)
size = random.randint(1, 2)
pygame.draw.circle(background, (brightness, brightness, brightness), pos, size)
# 添加随机星星
for _ in range(150):
x = random.randint(0, WIDTH)
y = random.randint(0, HEIGHT)
stars.append((x, y))
brightness = random.randint(50, 100)
size = random.randint(1, 2)
pygame.draw.circle(background, (brightness, brightness, brightness), (x, y), size)
# 添加星座连线
for i in range(len(stars)):
for j in range(i + 1, len(stars)):
x1, y1 = stars[i]
x2, y2 = stars[j]
distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
# 只连接距离较近的星星
if distance < 150:
# 根据距离调整连线透明度
alpha = int(100 * (1 - distance / 150))
line_color = (100, 100, 150, alpha)
# 创建临时surface来绘制半透明线
line_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
pygame.draw.line(line_surface, line_color, (x1, y1), (x2, y2), 1)
background.blit(line_surface, (0, 0))
return background
3. 轨迹绘制系统
实现了两种显示模式:
-
实时显示模式:使用清晰明亮的线条和点
-
导出模式:保持星座风格的半透明效果
python
def draw_trajectory(surface, text, is_live_display=False):
if not text:
return
points = []
for char in text: # 支持大小写输入
if char in key_positions:
points.append(key_positions[char])
# 绘制连线
for i in range(len(points) - 1):
start_pos = points[i]
end_pos = points[i+1]
if is_live_display:
# 实时显示时使用更清晰的线条
pygame.draw.line(surface, TRAJECTORY_COLOR, start_pos, end_pos, 3)
else:
# 导出图片时保持原有样式
distance = math.sqrt((end_pos[0] - start_pos[0])**2 + (end_pos[1] - start_pos[1])**2)
alpha = 100
line_color = (150, 150, 220, alpha)
line_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
pygame.draw.line(line_surface, line_color, start_pos, end_pos, 2)
surface.blit(line_surface, (0, 0))
# 绘制点
for point in points:
if is_live_display:
# 实时显示时使用更清晰的点
pygame.draw.circle(surface, POINT_COLOR, point, 7)
pygame.draw.circle(surface, WHITE, point, 4)
else:
# 导出图片时保持原有样式
pygame.draw.circle(surface, BRIGHT_STAR, point, 5)
for r in range(6, 10):
alpha = 100 - (r - 5) * 20
if alpha > 0:
glow_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
pygame.draw.circle(glow_surface, (*BRIGHT_STAR, alpha), point, r)
surface.blit(glow_surface, (0, 0))
4. 输入处理与用户交互
python
# 主循环中的事件处理
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_BACKSPACE:
input_text = input_text[:-1]
elif event.key == K_c and pygame.key.get_mods() & KMOD_CTRL:
# Ctrl+C 复制
pygame.scrap.init()
if pygame.scrap.get_init():
pygame.scrap.put(pygame.SCRAP_TEXT, input_text.encode('utf-8'))
elif event.key == K_v and pygame.key.get_mods() & KMOD_CTRL:
# Ctrl+V 粘贴
pygame.scrap.init()
if pygame.scrap.get_init():
try:
pasted_text = pygame.scrap.get(pygame.SCRAP_TEXT)
if pasted_text:
input_text += pasted_text.decode('utf-8')
except:
pass
elif event.key == K_s and pygame.key.get_mods() & KMOD_CTRL:
# Ctrl+S 保存图片
save_image(input_text)
else:
if event.unicode.isprintable():
input_text += event.unicode # 保留原始大小写输入
开发挑战与解决方案
-
大小写支持问题
-
挑战:最初只支持大写字母输入
-
解决方案:为每个字母键同时添加大小写映射
-
-
视觉清晰度与美学平衡
-
挑战:需要在实时显示清晰度和导出图片的美学效果之间取得平衡
-
解决方案:实现两种显示模式,实时显示使用清晰样式,导出使用星座样式
-
-
中文字体兼容性
-
挑战:确保在不同系统上都能正确显示中文
-
解决方案:尝试多种中文字体,并提供回退机制
-
-
键盘布局准确性
-
挑战:创建逼真的键盘布局
-
解决方案:计算每行键位的偏移量,模拟标准键盘的错位排列
-
使用方法
-
运行程序
-
在输入框中输入文本(支持大小写字母、数字和空格)
-
观察键盘上显示的轨迹
-
使用Ctrl+S保存图片
-
使用Ctrl+C和Ctrl+V进行复制粘贴操作
扩展可能性
-
添加更多键盘键位(功能键、符号键等)
-
实现轨迹动画效果
-
添加多种视觉主题选择
-
支持自定义颜色方案
-
添加轨迹回放功能
案例欣赏
|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |
|
|
|
|
|
|
|
|
|
[Name2Constell专属星座签名]
总结
键盘轨迹绘制器项目成功实现了将文本输入转换为视觉轨迹的功能,通过巧妙的设计解决了大小写支持、视觉清晰度和跨平台兼容性等问题。项目展示了Pygame在创建交互式可视化应用方面的强大能力,并为未来扩展提供了良好的基础架构。