Python Tkinter绘图计算器:如何绘制无连线的间断函数?
修复Tkinter绘制tan(x)函数的间断点问题
你的代码存在两个核心问题:
- 间断点前后的错误连接:当遇到tan(x)的无定义点(如x接近π/2 + kπ)时,代码直接跳过但未重置“上一个点”的状态,导致下一个有效点会和间断点前的最后一个点错误连接,形成横跨间断点的直线。
- 坐标混淆:初始时把数学坐标
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
相关产品推荐
相关产品推荐

