【问题标题】:RecursionError in tkintertkinter 中的递归错误
【发布时间】:2016-04-23 19:07:28
【问题描述】:

我用 Python 制作了一个简单的“猜数字”游戏,没有任何难度,所以我想挑战自己,更进一步。我尝试在 Tkinter 中制作它,并添加了“猜测”和“计时器”变量。

这是我的代码:

import tkinter
import random

guesses = 0
timeleft = 30

numbers = ['1','2','3','4','5','6','7','8','9','10']
numbers2 = []

doTick = True

def startGame(event):
    global doTick

    doTick = True

    number = random.choice(numbers)
    numbers.remove(number)
    numbers2.append(number)

    if timeleft == 30:
        countdown()

    wrong_guess()

def wrong_guess():

    global score
    global timeleft
    global guesses

    if timeleft > 0:
        e.focus_set()

        if int(e.get()) == int(numbers2[0]):
            guesses += 1
            guessesLabel.config(text="Guesses: " + str(guesses))
            correct_guess()
        else:
            if int(e.get()) > int(numbers2[0]):
                Label.config(text="Your guess is too high!")
                guesses += 1
                guessesLabel.config(text="Guesses: " + str(guesses))
                wrong_guess()
            else:
                Label.config(text="Your guess is too low!")
                guesses += 1
                guessesLabel.config(text="Guesses: " + str(guesses))
                wrong_guess()

        e.delete(0, tkinter.END)

def countdown():

    global timeleft

    if not doTick:
        return

    if timeleft > 0:
        timeleft -= 1
        timeLabel.config(text="Time left:" + str(timeleft))
        root.after(1000, countdown)

def correct_guess():

    global guesses
    global timeleft
    global doTick

    doTick = False

    guessesLabel.config(text="You correctly guessed the number in " + str(guesses) + " guesses!")

    timeLabel.config(text="You had " + str(timeleft) + " seconds to spare!")

root = tkinter.Tk()
root.title("Guess the Number")
root.state('zoomed')

timeLabel = tkinter.Label(root, text="", fg="red",font=('Helvetica',25))
timeLabel.pack()

guessesLabel = tkinter.Label(root,text="", fg="green",font=('Helvetica',25))
guessesLabel.pack()

Label = tkinter.Label(root, text="", fg="blue",font=('Helvetica',25))
Label.pack()

e = tkinter.Entry(root)
root.bind('<Return>',startGame)
e.pack()
e.focus_set()

root.mainloop()

我的问题是,当程序运行时,出现以下错误信息:

RecursionError:调用 Python 对象时超出最大递归深度

我的最佳猜测是 语句有一点问题,但我不确定这发生在哪里以及如何解决。

这是错误消息,对于那些询问的人:

Win32 上的 Python 3.5.1(v3.5.1:37a07cee5969,2015 年 12 月 6 日,01:38:48)[MSC v.1900 32 位(英特尔)] 输入“copyright”、“credits”或“license()”以获取更多信息。
重新启动:C:\Users\Acer_PC\MINCH\Year 10\Computing\python\guess the number.py Tkinter 回调中的异常 回溯(最近一次通话最后): 调用中的文件“C:\Users\Acer_PC\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py”,第 1549 行 返回 self.func(*args)

【问题讨论】:

  • 能否请您发布回溯(删除末尾的数百个重复行)?
  • 这是在数百个重复行之前弹出的错误消息: Tkinter 回调 Traceback 中的异常(最近一次调用最后一次):文件“C:\Users\Acer_PC\AppData\Local\Programs\ Python\Python35-32\lib\tkinter_init_.py",第 1549 行,在 call 中返回 self.func(*args)
  • 这是您要找的吗?
  • @RhysMinchin 您能否编辑您的问题以包含回溯? (在评论中真的很难阅读)
  • 请在问题中发布该数据。此外,这不是完整的追溯。你提到的框架之前是什么

标签: def python tkinter


【解决方案1】:

函数wrong_guess 正在调用自己,这在终端程序中经常使用以表示“返回函数的开头并重试”,但这不是好的做法,除非等待用户,否则肯定不起作用输入一些东西是功能的一部分。 (如你所见)

考虑何时真正应该调用函数wrong_guess,检查用户每次按下&lt;Return&gt; 键的猜测是有意义的(并且程序已经启动)

def press_enter_callback(e=None):
    if doTick:
        #game is running
        wrong_guess() #might be better to call it "check_guess"
    else:
        startGame(e) #if there is no countdown clock then start a new game

root.bind('<Return>',press_enter_callback)

然后删除wrong_guess 中对wrong_guess 的两个调用,因为它们没有意义。

您的代码还缺少一些条件,这些条件将在倒计时达到 0 时重置计时器或设置 doTick = False

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 2023-03-13
    • 2016-06-05
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多