You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python开发Android锁屏式点阵折线绘制GUI工具?

实现n*n点阵折线绘制工具的方案

推荐用Python + Pygame实现,上手快且适配图形交互场景,以下是完整实现步骤和代码:

核心功能拆解

  • 自定义n*n点阵布局(n≥3),可灵活调整行列数、点间距等参数
  • 鼠标位置自动吸附到最近的点阵点,避免手动定位偏差
  • 点击拖拽绘制折线,实时预览线段状态,松开鼠标确认添加
  • 支持一键清空已绘制的折线,方便重新操作

完整代码实现

import pygame
import math

# 初始化Pygame
pygame.init()

# 可配置参数
n = 3  # 点阵行列数,可修改为≥3的整数
POINT_RADIUS = 10  # 点阵点的半径
GRID_GAP = 80  # 相邻点阵点的间距
WINDOW_PADDING = 20  # 窗口边缘留白

# 计算窗口尺寸
window_width = GRID_GAP * (n - 1) + POINT_RADIUS * 2 + WINDOW_PADDING * 2
window_height = GRID_GAP * (n - 1) + POINT_RADIUS * 2 + WINDOW_PADDING * 2

# 颜色定义
BG_COLOR = (255, 255, 255)
POINT_COLOR = (50, 50, 50)
LINE_COLOR = (0, 120, 215)
PREVIEW_LINE_COLOR = (150, 200, 250)

# 创建窗口
screen = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption(f"{n}x{n} 点阵折线绘制工具")

# 生成所有点阵点的屏幕坐标
grid_points = []
start_x = WINDOW_PADDING + POINT_RADIUS
start_y = WINDOW_PADDING + POINT_RADIUS
for row in range(n):
    current_row = []
    for col in range(n):
        x = start_x + col * GRID_GAP
        y = start_y + row * GRID_GAP
        current_row.append((x, y))
    grid_points.append(current_row)

# 折线数据存储
drawn_segments = []
current_preview = None  # 实时预览的线段:(起点坐标, 终点坐标)
active_start_point = None  # 当前选中的折线起点

def get_closest_point(mouse_pos):
    """计算鼠标位置最近的点阵点,仅吸附近距离目标"""
    min_distance = float('inf')
    closest_point = None
    for row in grid_points:
        for point in row:
            distance = math.hypot(mouse_pos[0] - point[0], mouse_pos[1] - point[1])
            if distance < min_distance and distance < GRID_GAP // 2:
                min_distance = distance
                closest_point = point
    return closest_point

# 主循环
running = True
clock = pygame.time.Clock()
while running:
    screen.fill(BG_COLOR)
    mouse_pos = pygame.mouse.get_pos()

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # 左键点击
                nearest_point = get_closest_point(mouse_pos)
                if nearest_point:
                    if active_start_point is None:
                        active_start_point = nearest_point
                    else:
                        # 添加新线段到已绘制列表
                        drawn_segments.append((active_start_point, nearest_point))
                        active_start_point = nearest_point  # 更新起点为当前终点
        elif event.type == pygame.MOUSEMOTION:
            if active_start_point is not None:
                nearest_point = get_closest_point(mouse_pos)
                if nearest_point and nearest_point != active_start_point:
                    current_preview = (active_start_point, nearest_point)
                else:
                    current_preview = None
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_c:  # 按C键清空所有折线
                drawn_segments.clear()
                active_start_point = None
                current_preview = None

    # 绘制所有点阵点
    for row in grid_points:
        for point in row:
            pygame.draw.circle(screen, POINT_COLOR, point, POINT_RADIUS)

    # 绘制已完成的折线
    for segment in drawn_segments:
        pygame.draw.line(screen, LINE_COLOR, segment[0], segment[1], 3)

    # 绘制实时预览线段
    if current_preview:
        pygame.draw.line(screen, PREVIEW_LINE_COLOR, current_preview[0], current_preview[1], 2)

    # 更新窗口显示
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

代码说明

  1. 参数调整:修改n可切换点阵大小,GRID_GAP调整点间距,POINT_RADIUS调整点的显示尺寸
  2. 吸附逻辑:get_closest_point函数仅捕捉鼠标附近的点阵点,避免跨区域误吸附
  3. 交互流程:左键点击选中折线起点,拖拽时实时显示预览线段,松开左键确认添加;按C键快速清空画布
  4. 可视化区分:已绘制线段用深蓝色,预览线段用浅蓝色,点阵点用深灰色,视觉层次清晰

你可以基于这个基础框架扩展功能,比如在添加新线段时加入交叉检测、遍历完成状态判断等逻辑,只需在drawn_segments添加新元素前插入对应的检查代码即可。

内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:23