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

Python Tkinter绘图计算器:如何绘制无连线的间断函数?

修复Tkinter绘制tan(x)函数的间断点问题

你的代码存在两个核心问题:

  1. 间断点前后的错误连接:当遇到tan(x)的无定义点(如x接近π/2 + kπ)时,代码直接跳过但未重置“上一个点”的状态,导致下一个有效点会和间断点前的最后一个点错误连接,形成横跨间断点的直线。
  2. 坐标混淆:初始时把数学坐标x赋值给了prevx,但create_line需要的是画布像素坐标,导致第一条线从画布外开始绘制。

解决方案

  • 新增标志位has_prev_point,标记是否存在可连接的上一个有效点。
  • 遇到异常或超出画布的极端值时重置标志位,避免跨间断点连线。
  • 统一使用画布像素坐标记录上一个点的位置。

修正后的代码

import math
import tkinter as tk

root = tk.Tk()
graph = tk.Canvas(root, width=640, height=640, bg="white")
graph.pack()

has_prev_point = False
prevx = 0
prevy = 0

for i in range(0, 640):
    x = (i - 320)/32
    try:
        y = math.tan(x)
        y = 320 - (32 * y)
        # 过滤超出画布范围的极端值
        if 0 <= y <= 640:
            if has_prev_point:
                graph.create_line(prevx, prevy, i, y, fill='#ff0000', width=3)
            prevx = i
            prevy = y
            has_prev_point = True
        else:
            # y值超出画布,视为间断,重置连接状态
            has_prev_point = False
    except (ZeroDivisionError, ValueError):
        # 遇到无定义点,重置连接状态
        has_prev_point = False

root.mainloop()

关键改动说明

  • 用has_prev_point控制连线逻辑:只有存在上一个有效点时,才绘制当前点与上一个点的连线,避免跨间断点的错误线条。
  • 新增y值范围检查:tan(x)在接近间断点时y值会趋近于无穷大,超出画布的点直接跳过并重置标志,避免无效绘制。
  • 统一使用画布像素坐标记录上一个点,彻底解决坐标混淆问题。

内容的提问来源于stack exchange,提问作者idris_0602

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:27:42