Python - функция не запускается, если задано повторение - PullRequest
0 голосов
/ 19 июня 2020

Я только начал изучать Python, и я не мог понять этого. В основном я хочу отслеживать свой сетевой трафик c, и запуск этого кода ниже покажет только те результаты, которые были захвачены на данный момент, но он не обновляется

from tkinter import*
import psutil,os
from psutil._common import bytes2human
from threading import Timer
import time

netmon = Tk()
netmon.title("NetMonitor")
netmon.geometry("200x80")

def getresults():
    total_before = psutil.net_io_counters()
    time.sleep(1)
    total_after = psutil.net_io_counters()
    download_rate = "Download : " + bytes2human(total_after.bytes_recv - total_before.bytes_recv) + " KB/S"
    upload_rate = "Upload : " + bytes2human(total_after.bytes_sent - total_before.bytes_sent) + " KB/S"
    text = Label(netmon, text = "\n" + download_rate + "\n\n" + upload_rate, anchor = NW)
    text.pack()
    #Timer(5, getresults).start

getresults()

netmon.mainloop()

Я пробовал с while l oop:

.
.
.
while True:
   getresults()

netmon.mainloop()

, и я пробовал таймер из Threading, но в обоих случаях "программа" не даже запускать, пока я не вернусь к первому коду, который я упомянул выше, может ли кто-нибудь сказать мне, например, как заставить его обновляться каждую секунду?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Более простой способ - реализовать решение с помощью BackgroundScheduler APScheduler:

from apscheduler.schedulers.background import BackgroundScheduler
backgroundScheduler = BackgroundScheduler(daemon=True)

backgroundScheduler.add_job(lambda : backgroundScheduler.print_jobs(),'interval',seconds=4)
backgroundScheduler.start()

... а затем, когда завершено,

backgroundScheduler.shutdown()
0 голосов
/ 19 июня 2020

Вы на правильном пути, поэтому вам нужно использовать while l oop. Я поместил его в отдельный поток (и передал текст в качестве аргумента конструктора классу потока).

from tkinter import*
import psutil,os
from psutil._common import bytes2human
from threading import Timer
import time
import threading

netmon = Tk()
netmon.title("NetMonitor")
netmon.geometry("200x80")

text = Label(netmon, text = "\n" + 'Download : TBD' + "\n\n" + 'Upload : TBD', anchor = NW)
text.pack()

class GetUpdates(threading.Thread):
    def __init__(self, text):
        threading.Thread.__init__(self)
        self._stop_event = threading.Event()
        self._text = text

    def stop(self):
        self._stop_event.set()

    def run(self):
        while not self._stop_event.is_set():
            total_before = psutil.net_io_counters()
            time.sleep(1)
            total_after = psutil.net_io_counters()
            download_rate = "Download : " + bytes2human(total_after.bytes_recv - total_before.bytes_recv) + " KB/S"
            upload_rate = "Upload : " + bytes2human(total_after.bytes_sent - total_before.bytes_sent) + " KB/S"
            self._text['text'] = "\n" + download_rate + "\n\n" + upload_rate


getupdates = GetUpdates(text)
getupdates.start()


netmon.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...