首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tkinter中的RecursionError

tkinter中的RecursionError
EN

Stack Overflow用户
提问于 2016-04-23 19:07:28
回答 1查看 402关注 0票数 0

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

这是我的代码:

代码语言:javascript
复制
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:调用对象时超过了最大递归深度

我最好的猜测是,定义语句有一点小问题,但我不确定这种情况发生在哪里,以及如何修复。

这是一条错误信息,给你们中的一些人:

Python3.5.1 (v3.5.1:37a07cee5969,2015年12月6日,01:38:48) MSC v.1900 32位(英特尔)关于win32类型的“版权”、“信用”或“许可()”以获得更多信息。

重新启动:"C:\Users\Acer_PC\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py",10\计算\python\猜测Tkinter回调跟踪中的number.py异常(最近一次调用): call 返回self.func(*args)中的文件number.py第1549行

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 19:39:14

函数wrong_guess正在调用自己,在终端程序中经常使用它来表示“回到函数的开始,然后再试一次”,但是这并不是一个很好的实践,除非等待用户输入什么东西是函数的一部分,否则它肯定不起作用。(如你所见)

考虑一下何时真正调用wrong_guess函数,每次用户按<Return>键(程序已经启动)时,检查用户的猜测是有意义的。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36815207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档