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

Pygame数学函数绘制脚本需空跑一次函数才正常运行问题

解决方案

核心故障原因

  • 初始化顺序错误:必须先调用pygame.init()完成pygame全模块初始化,再调用pygame.display.set_mode()创建显示窗口。原代码先创建窗口再初始化pygame,导致首次运行时窗口渲染上下文未正常加载,才会出现需要空跑一次才能正常显示的异常。
  • 渲染时序混乱:原代码存在多处多余的pygame.display.flip()调用,填充背景、获取用户输入、每绘制一条线时都触发了屏幕刷新,打乱了正常的渲染流程。
  • 不必要的重复计算:绘制循环内每次迭代都重复生成函数对象,属于无意义的性能损耗。

修复后可直接运行的代码

import pygame


def replace_x(function):
    f = lambda x: eval(function)
    return f


def convert_y(y_coords):
    y_coords = 540 - y_coords
    return y_coords


def convert_x(x_coord):
    x_coord = x_coord + 960
    return x_coord


# 先初始化pygame再创建窗口,修正初始化顺序
pygame.init()
# variables
background_colour = (255, 255, 255)
screen = pygame.display.set_mode((1920, 1080))
running = True
current_y = 0
previous_y = 0

pygame.display.set_caption('Mathe Kreativarbeit')

screen.fill(background_colour)
# 填充背景后仅刷新一次
pygame.display.flip()

function_input = input("Funktion: ")
function_input = function_input.replace("^", "**")
# 提前生成函数对象,避免循环内重复创建
f = replace_x(function_input)

for x_coords in range(-15, 17):
    current_y = convert_y(f(x_coords))
    previous_y = convert_y(f(x_coords - 1))
    start_pos = (convert_x((x_coords - 1) * 60), previous_y)
    end_pos = (convert_x(x_coords * 60), current_y)
    print(start_pos)
    print(end_pos)
    pygame.draw.aaline(screen, (0, 0, 0), start_pos, end_pos)

# 所有线条绘制完成后统一刷新一次即可
pygame.display.flip()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

内容的提问来源于stack exchange,提问作者Christopher Löwenstein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:24:03