如何每隔n秒运行一个函数,但不中断其他代码?也许可以在后台运行?

2024-04-29 10:01:04 发布

您现在位置:Python中文网/ 问答频道 /正文

Python是我的第一语言,所以请理解我,如果它没有意义。我在用Python做一个虚拟宠物。我在用Tkinter做GUI。我想在Action类中每5秒运行一次display方法。但是,如果我使用threading、sched或time并将代码放在按钮的正前方,它就会冻结并运行display方法。如何在不中断按钮和其他部分的情况下,每5秒运行一次display方法?你知道吗

class Pet:    
def __init__(self, name, hunger=0, boredom=0, tiredness=0, sickness=False,
             age=0, waste=0):
    self.__name = name
    self.hunger = hunger
    self.boredom = boredom
    self.tiredness = tiredness
    self.sickness = sickness
    self.age = age
    self.waste = waste
    self.choice = choice

class Action(Pet):
    def __init__(self, name):
        Pet.__init__(self, name, hunger=0, boredom=0, tiredness=0,
                 sickness=False, age=0, waste=0)
        self.name = name

    def display(self):
        print("------------")
        print("hunger", self.hunger)
        print("boredom", self.boredom)
        print("tiredness", self.tiredness)
        print("sickness", self.sickness)
        print("age", self.age)
class Window(Frame):
    def openmenu(self):
        petname = self.petnameEntry.get()
        user_pet = Action(petname)
        print("I am your pet,", petname)
        window = tk.Toplevel(root)
        w = Label(window, text="What would you like to do?")
        w.pack()

        btFeed = Button(window, text="Feed", command=lambda: user_pet.eat())
        btFeed.pack(pady=3)
        btPlay = Button(window, text="Play", command=lambda: 
        user_pet.play())
        btPlay.pack(pady=3)

Tags: 方法nameselfagedefdisplayactionwindow
2条回答

建议在class Window(Frame)中定义一个新函数:

def show_pet_status(self, pet):
    # show the pet status only if the 'toplevel' still exists
    if Toplevel.winfo_exists(self.window):
        pet.display()
        root.after(5000, self.show_pet_status, pet)

然后修改openmenu(...),如下所示:

def openmenu(self):
    petname = self.petnameEntry.get()
    user_pet = Action(petname)
    print("I am your pet,", petname)
    self.window = Toplevel(root)   # save the window object to be used by new function
    w = Label(self.window, ...)
    w.pack()
    btFeed = Button(self.window, text="Feed", ...)
    btFeed.pack(pady=3)
    btPlay = Button(self.window, text="Play", ...)
    btPlay.pack(pady=3)
    # start showing the pet status
    self.show_pet_status(user_pet)

您可以使用After方法。你知道吗

import tkinter as tk
root = tk.Tk()

class Pet:
    def __init__(self, name, hunger=0, boredom=0, tiredness=0, sickness=False,
                 age=0, waste=0):
        self.__name = name
        self.hunger = hunger
        self.boredom = boredom
        self.tiredness = tiredness
        self.sickness = sickness
        self.age = age
        self.waste = waste

class Action(Pet):
    def __init__(self, name):
        Pet.__init__(self, name, hunger=0, boredom=0, tiredness=0,
                 sickness=False, age=0, waste=0)
        self.name = name

    def display(self):
        print("      ")
        print("hunger", self.hunger)
        print("boredom", self.boredom)
        print("tiredness", self.tiredness)
        print("sickness", self.sickness)
        print("age", self.age)
        root.after(5000,self.display)

root.after(5000,Action(Pet).display)

root.mainloop()

相关问题 更多 >