微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 tkinter 中的按钮关闭后再次调用海龟窗口时出错

如何解决通过 tkinter 中的按钮关闭后再次调用海龟窗口时出错

以下代码是 tkinter 窗口,包含调用海龟窗口的按钮

import tkinter
from tkinter import *
from turtlefunc import *
root = Tk()

#creating a button
myButton = Button(root,text="call turtle",command =call)
myButton.pack()

root.mainloop()

以下代码为海龟窗口

import turtle
def call():
    t = turtle.Turtle()
    screen = turtle.Screen()
    screen.bgcolor('white')
    t.width(3)
    for i in range(1,5):
        t.forward(20)
        t.left(90)
    t.hideturtle()
    turtle.exitonclick()

按钮第一次工作正常,但第二次调用海龟窗口或函数时返回错误

错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\tkinter\__init__.py",line 1883,in __call__
    return self.func(*args)
  File "C:\Users\sharmila\PycharmProjects\GAME ARCADE GUI\turtlefunc.py",line 3,in call
    t = turtle.Turtle()
  File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\turtle.py",line 3813,in __init__
    RawTurtle.__init__(self,Turtle._screen,File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\turtle.py",line 2557,in __init__
    self._update()
  File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\turtle.py",line 2660,in _update
    self._update_data()
  File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\turtle.py",line 2646,in _update_data
    self.screen._incrementudc()
  File "C:\Users\sharmila\AppData\Local\Programs\Python\python38\lib\turtle.py",line 1292,in _incrementudc
    raise Terminator
turtle.Terminator

解决方法

您必须在销毁画布之前.clear(),因此所有海龟都不在等式之外。这样,当它不再看到 Terminator

时,它不会引发 TurtleScreen._RUNNING
#! /usr/bin/python3

import tkinter as tk
import turtle as trt

title = 'Python Turtle'
root  = tk .Tk() ; root .title( title )

Width,Height  = 500,500
myButton = None  ##  empty,forward declaration

def call():
    myButton .pack_forget()  ##  hide button
    canvas  = tk .Canvas( root,width=Width,height=Height )
    canvas .pack()  ##  show canvas
    turtle  = trt .RawTurtle( canvas=canvas )
    screen  = turtle .getscreen()
    screen .bgcolor('white')
    turtle .width( 3 )
    for i in range( 1,5 ):
        turtle .forward( 20 )
        turtle .left( 90 )
    turtle .hideturtle()
    def dest( x,y ):
        screen .clear()  ##  destroy turtles
        canvas .destroy()
        myButton .pack()  ##  show button again
    screen .onclick( dest )

##  creating a button
myButton = tk .Button( root,text='call turtle',width=len(title) +10,command=call )
myButton .pack()

root .mainloop()

不过,您真的不需要每次都“破坏”画布并重建它。您可以在不使用时“隐藏”它。

#! /usr/bin/python3

import tkinter as tk
import turtle as trt

title = 'Python Turtle'
root  = tk .Tk() ; root .title( title )

Width,500
canvas  = tk .Canvas( root,height=Height )
myButton = None  ##  empty,forward declaration

def call():
    myButton .pack_forget()  ##  hide button
    canvas .pack()  ##  show canvas
    turtle  = trt .RawTurtle( canvas=canvas )
    screen  = turtle .getscreen()
    screen .bgcolor('white')
    turtle .width( 3 )
    for i in range( 1,y ):
        screen .clear()  ##  destroy turtles
        canvas .pack_forget()  ##  hide canvas,so you can reuse it later
        myButton .pack()  ##  show button again
    screen .onclick( dest )

##  creating a button
myButton = tk .Button( root,command=call )
myButton .pack()

root .mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。