Gå til innhold

Python, kalle en funksjon på ett gitt tidspunkt hver dag?


Anbefalte innlegg

Hei,

 

Jeg sliter litt med å få til noe, har laget en GUI applikasjon me Tkinter hvor jeg kan kalle noen funksjoner med ett par knapper for å sjekke ett par ting. Jeg ønsker å kalle en av funksjonene uten å trykke på noe som helst på ett gitt tidspunkt hver dag. Noen som vet om dette er mulig? Uten å kjøre en kontinuerlig loop for å sjekke tidspunkt?

Lenke til kommentar
Videoannonse
Annonse

På et eller annet punkt må det være en løkke som sjekke noe - som går kontinuerlig. Om den er skjult for deg i rammeverket eller om du implementerer den selv er litt opp til deg. En slik løkke, implementert riktig vil heller ikke være veldig kostbar.

 

En mulig implementasjon er å ha en egen tråd som sjekker tidspunktet med 30 sekunders mellomrom (og sover ellers) for å kun utføre ønsket oppgave 1 gang om dagen. Dette vil kreve neglisjerbare ressurser.

 

En annen mulighet, og kanskje bedre, er å bruke sched-biblioteket i python. Dette kan brukes til å sette opp oppgaver som skal utføres frem i tid - men den kan ikke brukes til å sette opp ting som skal kjøre på faste intervaller. Men dette kan jo lett implementeres ved å bare sette opp funksjonen til å kjøre neste dag hver gang den blir kallt.

 

Eksempel på mulig implementasjon:

import time
import sched
import datetime


def main():
    def daily_function(my_argument):
        print "do something here, " + my_argument
        one_day = datetime.timedelta(days=1).total_seconds()
        scheduler.enterabs(time.time()+one_day, 1, daily_function, ("Repeated run",))

    scheduler = sched.scheduler(time.time, time.sleep)
    scheduler.enterabs(time.time(), 1, daily_function, ("First run",))
    scheduler.run()


if __name__ == '__main__':
    main()
Lenke til kommentar

De fleste GUI rammeverk har bygd inn funksjoner for dette.

Tkinter har after som kan brukes til dette.
import Tkinter as tk

def foo():
    return 'foo got called'

root = tk.Tk()
def task():
    print 'Calling function {} --> {} '.format(foo.__name__, foo())
    root.after(5000,task) #Schedule event in 5 seconds

root.after(5000,task)
root.mainloop()

Så kan det diskuteres om det smart og la GUI kjøre hele tiden og gjøre jobben,eller se på noe som etse postet.

Har brukt sched-biblioteket før og det har fungert fint.

Viss dette er noe som skal kjører over lengre periode kan man også tenke på og bruke OS(Windows scheduler, Linux Cron).

 

Lenke til kommentar
  • 4 uker senere...
  • 3 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...