小能豆

Python中的Turtle模块注册形状问题

python

我试图创建一个 Turtle 项目,如下所示:

def randcol():
    hex=["1","2","3","4","5","6","7","8","9","0","a","b","c","d","e","f"]
    cur="#"
    for _ in range(6):
        cur+=(choice(hex))
    return cur

def _setup():
    import turtle as t
    global t
    t.register_shape("circ.gif")
    from random import choice
    global choice
    from time import sleep
    global sleep

def _main():
    wn=t.Screen()
    wn.bgcolor((randcol()))
    ck=t.Turtle()
    ck.fillcolor((randcol()))
    ck.shape("circ.gif")
    ck.shapesize(40,50)
    ck.penup()
    ck.setpos(0,0)
    while running:
        wn.mainloop()

if __name__=="__main__":
    _setup()
    global running=True
    _main()

但是,该代码绝对没有给出任何错误,并且无法按预期工作。

我注册了一个图像“circ.gif”并尝试使用它。但它没有显示。我已确保该文件位于同一目录中并且扩展名为 gif。这是“circ.gif”文件:

GIF89a���������,-�-.�;<�<=�JK�KL�YZ�Z[�hi�ij�wx�wy��������������������!�,��� '�di�h��l�p,�tm�x��|���pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N����~������������������������������������������������������������������������������������������������������������������������������������
H���*\Ȱ�Ç#J�H��ŋ3j�ȱ�Ǐ C�I��ɓ(S��\ɲ�˗0cʜI��͛8s��ɳ�ϟ@�
J��ѣH�*]ʴ�ӧP�J�J��իX�j�ʵ�ׯ`ÊK��ٳhӪ]˶�۷p�ʝK��ݻx���˷�߿�L���È+^̸��ǐ#K�L���˘3k�̹��ϠC�M���ӨS�^ͺ��װc˞M���۸s��ͻ����N����ȓ+_μ���УK�N����سk�ν����ËO�����ӫ_Ͼ�����˟O��������Ͽ���(�h�&����6��F(�Vh�f��v�� �(�$�h�(���,���0�(�4�h�8��<���@)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i�x�)|�Az���8�����6�(� ��H����1(  ���*ꨑ:��j�
x:꫰�*80��:�*���믌����J�
���*�������������Ұ�
d+
�@�ݮ`����閐��«ホ ��j��l0�
L�A�H`��G̀y
�o�L�uj�@� g�q��lr�@���z������-�l3��.��3�9��A�?�3g��F7-rZVp��T���Qj@t�\���@�����L��+���������$Sӭ7��+�[�-8��Aރ'N�I�(���۷������cjc������礓[��1V^���
�񌜳.��4������/�����
��o�¯X�����7/���?<��j.��c���x�����㗯~��~����j�S�����[�������P�G@�A�+��@�*�����6h�| ��>�y
Z�?� ����   O����,̠T���̏gC*`@��# �  1�)�O
�C�g�L����(����1�m�D�,q�6t�}���N�>,�
�8����]L��Ḑst����<�m�р��@�n�1�{��H!�1=�c#m���q�G��w�IB�琝�!��P
Q9��xhJV�<Zl%5y�
�r���%o��𬒗V�%wv    L!���,� ���(ӊ��$����=��v����1;��
��n�������E;b��D�u�(&�:άg��s�����?�X���r�=�r���2:�l�#��F�����I�E)�P�0�r�1@t�#*�9�,����p�ԃ�\I_�Ó.G�4-`G�#М����ɧOc�J��t�,<�M����Г�'<�r\
U.��U-�R��Ь���y�W3(Ֆ�����Y���tu��+q���{'�tU P��Ѽ�8������
v}m���t���\���u8x�,��:��j6~�    �g�GX�v��K�o�Z�9�7�mm�&������m��Y�dv����o~\�    �7�-�����*Wz�}n�#Z�2�����v����rwz��Mu�������e�yu���2o��i�{�_��w��{-{�{<����]}o��W��݀m3�cn�i��#a�HxS�m.���y�äUA���8��q�=��{n��u1���xn4�MJo���ǐ��o���7.��*a%�����VO�i��n��5��lc�o���7I.s�l*����iLf�v+��d8NO��3/ז�F�j]4���Ä>��yc�D,��q���
2Kb���/�E�Ƴ�6X����PG�ȱ������lz���a}�Q/�Դ�����\c���A���%k��o�y�{uf�z���p�mf��9��6���)kX�Ζ�-�];'��U��3�t�������g���{Tl�N��m�����������s^�#���V8t~l�'��ˆtvЭ�uK�ָv8�l�O��6��m��;���t���fg�ÎyyH��|�ⴖ�v-�pc'�ж�w�p�G��޴�yy4��\��<Ds�.MZ+}<(���uI[�;��HN;=>�Vs�m�l_���:�)��O9����������I���N��c����    / �w�hT;���h^Ɯ׏�yy9���?���z�>��oP��{Q\�t�틋y�]��'P���
���_��+d-_��W���M����f_�ڇ��y���֏�����I4z�@�j?c�"
�_/�����p�~7b�g�,��=�H%�>B�>e�3���DU\W#Pv��#i�P ��:6�d6Ycy��C���t&8$K�L�}R�,�F_�%@s[t��$?8I �PR�y4iR;HAL�&���3�%���G&%3B�҅g�-�=�8h'ex<  P}qr/@8;�0���<W(��|x.w80�kSPbX�%���=��@ �І/s܂�G�0�T/p`�H��; ��h��v��*��~���r��@�苼���'Cx�ʸ��،�����8��X��x�ؘ�ڸ��؍�����8��X��x�蘎긎�؎�����8��X��x����؏���9�Y�y���
��ِ��9�Y�y�����ّ� �"9�$Y�&y�(��*��,ْ.�0�29�4Y�6y�8��:��<ٓ>�@�B9�DY�Fy�H��J��LٔN�P�R9�TY�Vy��X��Z��\ٕ^�`�b9�dY�fy�h��j��lٖn�p�r9�tY�vy�x��z��|ٗ~���9��Y��y��������٘����9��Y��y��������ٙ����9��Y��y��������ٚ����9��Y��y��������ٛ�����9��Y��y�ș�ʹ��ٜ�����9��Y��y�ؙ�ڹ��ٝ�����9��Y��y�虞깞�ٞ�����9��Y��y����ٟ����:�Z�z���
��ڠ��:�Z�z�����ڡ� �":�$Z�&z�(��*��,ڢ.�0�2:�4Z�6z�8��:��<ڣ>�@�B:�DZ�Fz�H��J��LڤN�P�R:�TZ�Vz�X��Z��\ڥ^�`�b:�dZ�fz�h��j��lڦn�p�r:�tZ�vz�x��z��|ڧ~���:��Z��z��������ڨ����:��Z��z��������ک����:��Z��z���������ڪ����:��Z��z��������ګ�����:��Z��z�Ț�ʺ��ڬ�����:��Z��z�ؚ�ں��ڭ�����:��Z��z�蚮꺮�ڮ�����:��Z��z����گ���!;

阅读 131

收藏
2023-07-28

共1个答案

小能豆

问题出在您的代码中 running=True 的位置。在 Python 中,您不能在变量名前面加上 global 关键字来赋值,这将导致语法错误。

要解决这个问题,您可以在 _main() 函数中将 running 定义为一个局部变量,并在需要改变 running 的值时使用 nonlocal 关键字。这样可以使 running 成为 _main() 函数内的局部变量,从而避免全局变量问题。

以下是修改后的代码:

def randcol():
    hex = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "a", "b", "c", "d", "e", "f"]
    cur = "#"
    for _ in range(6):
        cur += (choice(hex))
    return cur

def _setup():
    import turtle as t
    global t
    t.register_shape("circ.gif")
    from random import choice
    global choice
    from time import sleep
    global sleep

def _main():
    running = True  # Define running as a local variable
    wn = t.Screen()
    wn.bgcolor(randcol())  # Call the randcol() function to get a random color
    ck = t.Turtle()
    ck.fillcolor(randcol())  # Call the randcol() function to get a random color
    ck.shape("circ.gif")
    ck.shapesize(40, 50)
    ck.penup()
    ck.setpos(0, 0)
    while running:
        wn.update()  # Use wn.update() to update the screen
        sleep(0.1)  # Add a small delay to control the loop speed
        # Check for user input to stop the loop
        if wn.textinput("Stop", "Press 'Enter' to stop.") != None:
            running = False

if __name__ == "__main__":
    _setup()
    _main()

在修改后的代码中,我们将 running 定义为 _main() 函数的局部变量,并且在 while 循环中使用 wn.textinput() 来检查是否有用户输入。当用户按下 “Enter” 键时,循环会停止,从而退出 _main() 函数。

此外,我们还对背景色和海龟的填充颜色调用了 randcol() 函数来获取随机颜色,以使每次运行都有不同的颜色效果。

2023-07-28