【问题标题】:Turtle Graphics window not responding海龟图形窗口没有响应
【发布时间】:2019-04-23 11:47:55
【问题描述】:

我正在尝试将我之前制作的 Julia 集生成器转换为 Python 代码。然而,当代码运行时,乌龟图形窗口立即停止响应并且什么也不画。我做了什么可怕的错误还是我遗漏了什么?也许我在 1 帧中对 python 的要求太多了。请解释导致这种情况发生的原因以及我如何解决它。谢谢!

import turtle
import time

y_set = []
map_output = 0
iterations = 0
#turtle.hideturtle()
#turtle.speed(1)

生成一个 y 值列表

def y_set (r):
    global y_set
    y_set = []
    for n in range ((360*2)+1):
        y_set.append(n)

创建颜色值

def color (i, n):
    output = map(i, 2, 10000, 0, 2500)
    if output < 0:
        output = 0
    if output > 0:
        output = 255

在 x 上迭代

def repeat (n, r, i):
    global iterations
    global x
    global y
    aa = 0
    ba = 0
    ab = 0
    a = 0
    b = 0
    for j in range (n):
        iterations += 1
        aa = a * a
        bb = b * b
        ab = 2 * a * b
        a = ((aa - bb) + float(r))
        b = (ab + float(i))
        if (ab + bb) > 4:
            break
    turtle.setx(100 * x)
    turtle.sety(100 * y)
    color(iterations, n)
    turtle.pendown()
    turtle.penup()

在 y 上迭代

def Julia (s, r, i, d):
    global iterations
    global y_set
    global x
    global y
    global a
    global b
    y_set(s)
    while len(y_set) > 0:
        y = y_set[0]/360
        del y_set[0]
        x = -1.5
        for n in range (round((700/(float(r)+1))+1)):
            a = x
            b = y
            iterations = 0
            repeat(10**d, r, i)
            x += ((1/240)*s)

用户输入

real = input('Real: ')
imag = input('Imaginary: ')

Julia (1, real, imag, 100)
turtle.done()

【问题讨论】:

  • 您希望map(i, 2, 10000, 0, 2500) 做什么?
  • 我希望 map 取一个 2 到 10000 范围内的数字“i”,并将其映射到 0 到 2500 的新范围。这不是这个函数吗?
  • 不,这不是内置的map() 函数所做的——尽管您可以使用它来实现您自己的函数。强烈建议您阅读其documentation

标签: python python-3.x turtle-graphics fractals


【解决方案1】:

此代码存在太多问题,无法专注于算法错误。当我尝试运行它时,我得到了TypeError: 'int' object is not iterable。具体问题:

这里的i 参数被传递了一个数字:

    iterations += 1
...
color(iterations, n)
...

def color(i, n):
    output = map(i, 2, 10000, 0, 2500)

但是 Python 的 map 函数(和 Julia 的)需要一个函数作为它的第一个参数:

map(func, *iterables)

它会返回将func 应用于iterables 的结果列表,但您将结果视为标量值:

output = map(i, 2, 10000, 0, 2500)
if output < 0:
    output = 0
if output > 0:
    output = 255

color() 函数从不使用它的第二个参数,并且从不返回任何内容!

这里的变量a&b被当作全局变量,设置但不使用,好像准备被repeat()使用:

global a
global b

...

a = x
b = y
iterations = 0
repeat(10 ** d, r, i)

但是repeat() 使用的ab 是初始化为零的本地变量:

a = 0
b = 0

你有一个同名的函数和全局变量y_set

而且你的全局变量已经失控了。

【讨论】:

  • 看来我误解了地图功能的作用。我认为它将一个数字从一个范围映射到另一个范围。至于颜色,我只是出于测试目的取出了“n”。另外,哎呀,没有意识到 y-set 是一个函数和一个变量。非常感谢您的帮助!
  • 感谢您的帮助。但是,我的全局变量“失控”是什么意思。在让 2 个或更多函数修改同一个变量时,这是我使用了一年多的解决方案。此外,即使修复了您提出的所有其他问题,海龟图形窗口仍然不会响应。
  • @Noah:全局变量通常被认为是一种糟糕的编程习惯。文章Global Variables Are Bad 描述了其中的一些原因。
  • @NoahGehlhausen,全球范围内,考虑iterations。您将其设为全局并声明它,但就在您调用 repeat() 之前,您始终将其设置为零。这与将其设置为 repeat() 本地并扔掉全局内容没有什么不同。
猜你喜欢
  • 2020-01-10
  • 2011-11-05
  • 2020-06-17
  • 2016-03-06
  • 1970-01-01
  • 2023-02-25
  • 2018-04-17
  • 2018-05-30
  • 2019-01-28
相关资源
最近更新 更多