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?

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()

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).

 

  • 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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...