Python Tkinter报错:'int'对象无'draw_line'属性(科赫雪花绘制)
问题分析与解决
核心错误原因
报错AttributeError: 'int' object has no attribute 'draw_line'的直接诱因:
- 调用方式错误:
draw_line是当前类的成员方法,并非画布对象self.canv的方法,正确调用方式是self.draw_line,而非self.canv.draw_line。 - 变量未定义:
x0和y0在draw_base函数中未声明,需将传入trisection的起始点(0和self.canv_length/2)明确赋值给这两个变量。 - 潜在隐患:若
self.canv实际是整数(比如误将画布长度赋值给它),需检查类初始化代码,确保self.canv是Tkinter的Canvas实例,否则draw_line里的create_line也会报错。
修正后的draw_base函数
def draw_base(self): x0, y0 = 0, self.canv_length/2 x1, y1 = 500, self.canv_length/2 xa, ya, xb, yb = self.trisection(x0, y0, x1, y1) # 角度转弧度,避免三角函数计算错误 xc, yc = self.rotate_points(xa, ya, xb, yb, math.radians(-60)) # 调用类的draw_line方法绘制各段 self.draw_line(x0, y0, xa, ya) self.draw_line(xa, ya, xc, yc) self.draw_line(xc, yc, xb, yb) self.draw_line(xb, yb, x1, y1)
额外优化:rotate_points函数的通用性修正
原函数把cos写死为0.5仅适配60度,改为通过三角函数计算,支持任意角度:
def rotate_points(self, xa, ya, xb, yb, angle_rad): sin = math.sin(angle_rad) cos = math.cos(angle_rad) x_c = cos*(xb-xa) - sin*(yb-ya) + xa y_c = sin*(xb-xa) + cos*(yb-ya) + ya return x_c, y_c
调用时传入math.radians(-60)将角度转为弧度,保证计算准确。
内容的提问来源于stack exchange,提问作者user14880056
相关产品推荐
相关产品推荐

