Как я могу запускать функцию каждые n секунд, но не прерывать другой код?может быть, работает в фоновом режиме? - PullRequest
0 голосов
/ 14 декабря 2018

Python - мой первый язык, поэтому, пожалуйста, поймите меня, если он не имеет смысла.Я делаю виртуального питомца на питоне.Я использую Tkinter для GUI.Я хочу запускать метод отображения в классе действий каждые 5 секунд.Но если я использую многопоточность, график или время и помещаю код прямо перед кнопками, он зависает и просто запускает метод отображения.Как запустить метод отображения каждые 5 секунд, пока он не прерывает кнопки и другие части?

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)

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Предложить определить новую функцию в 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)
0 голосов
/ 14 декабря 2018

Вы можете использовать метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...