【问题标题】:Make a loop wait until an action has been done循环等待直到动作完成
【发布时间】:2021-01-27 12:57:14
【问题描述】:
import tkinter as tk
import random


root = tk.Tk()
canvas = tk.Canvas(root, height=600, width=700, bg="#4f75b3")
canvas.pack()

frame = tk.Frame(root, bg="#66bd5e")
frame.place(relx=0.075, rely=0.075, relheight=0.85, relwidth=0.85,)

def destroymole():
    mole.destroy()

xcoords = random.randrange(100, 500, 10)
ycoords = random.randrange(100, 500, 10)

mole = tk.Button(root, text="MOLE", relief="raised", command=destroymole, height=1, width=10, 
bg="brown")
mole.place(x=xcoords, y=ycoords)

for i in range(15):                                                                                
    def destroymole():
        mole.destroy()
        return destroymole()

    xcoords = random.randrange(100, 500, 10)
    ycoords = random.randrange(100, 500, 10)

    mole = tk.Button(root, text="MOLE", relief="raised", command=destroymole, height=1, width=10, 
bg="brown")
    mole.place(x=xcoords, y=ycoords)


root.mainloop()

我怎样才能让循环等到一个“鼹鼠”被摧毁再产生另一个?

另外,会引发错误

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

每当我按下多个按钮来销毁它时。

这也有助于解决 destroymole() 不按特定按钮的问题,因为屏幕上一次只有一个痣。

【问题讨论】:

    标签: python loops tkinter


    【解决方案1】:

    您收到此错误 RecursionError: maximum recursion depth exceeded while calling a Python object 是因为您在无限时间内递归调用函数,即没有 base condition

        def destroymole():
            mole.destroy()
            return destroymole()
    

    这里destroymole() 正在调用自己并制作stack overflow :) 的recursion stack

    另外,你的销毁痣实现的问题是,你有 15 个痣,但是当你做mole.destroy() 时,它怎么知道要销毁哪个痣?所以你必须将每个痣的引用传递给方法。这可以简化如下--

    import tkinter as tk
    import random
    
    
    root = tk.Tk()
    canvas = tk.Canvas(root, height=600, width=700, bg="#4f75b3")
    canvas.pack()
    
    frame = tk.Frame(root, bg="#66bd5e")
    frame.place(relx=0.075, rely=0.075, relheight=0.85, relwidth=0.85,)
    
    # def destroymole():
    #     mole.destroy()
    
    xcoords = random.randrange(100, 500, 10)
    ycoords = random.randrange(100, 500, 10)
    
    mole = tk.Button(root, text="MOLE", relief="raised", command=mole.destroy, height=1, width=10, bg="brown")
    mole.config(command = mole.destroy)
    mole.place(x=xcoords, y=ycoords)
    
    for i in range(15):                                                                                
    #     def destroymole():
    #         mole.destroy()
    #         return destroymole()
    
        xcoords = random.randrange(100, 500, 10)
        ycoords = random.randrange(100, 500, 10)
    
        mole = tk.Button(root, text="MOLE", relief="raised", height=1, width=10, bg="brown")
        mole.config(command = mole.destroy)
        mole.place(x=xcoords, y=ycoords)
        
    
    root.mainloop()
    

    【讨论】:

    • 如果 command=mole.destroy 它不起作用,因为在该行中定义了 moole 这个词
    • 我不想让人讨厌,但我只有 14 岁,而且我有大约 3 个月的 python 经验,所以:destroymole() 正在调用自身并使递归堆栈的堆栈溢出:)。对我来说完全是胡言乱语。但是,谢谢你和这样的东西让世界变得更美好。 :)
    • 太棒了。你可以在线阅读。递归是使用堆栈完成的。因此,如果您无限次调用函数,堆栈就会溢出。祝一切顺利。如果它解决了您的问题,请不要忘记接受答案。
    猜你喜欢
    • 2015-06-24
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2017-05-03
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多