Bygg din egen äggklocka (python)

Här diskuteras programmering och utveckling
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Bygg din egen äggklocka (python)

Inlägg av David Andersson »

Exempel på python-program med grafiskt gränssnitt. Tanken är att läsaren ska få ett hum om python utan att kunna så mycket om programmering och utan att kräva så mycket terminal-vana. (Men man måste veta att "~" i början av filnamn motsvarar hemmamappen.)

Den viktigaste faktorn när jag skrev programmet var att det ska vara kort och lätt att förstå. Trots det (eller kanske just därför) blev det så bra att jag nu använder det nästan dagligen, som teklocka.

Förberedelse:
  • Installera paketen python-tk, sox och libsox-fmt-all (om inte redan installerade)
  • Leta reda på en kort ljud-fil och kopiera den till ~/Musik/apskrik.mp3
  • Skapa i din hemmamapp mapparna bin och man och man/man1, (om du inte redan har dem)
  • Logga ut och in igen (om du just skapat nämnda mappar)
Skapa en manual-sida:
  • Kopiera följande text till en fil ~/man/man1/myäggklocka2.1

    Kod: Markera allt

    .TH myäggklocka2 l
    
    .SH NAMN
    myäggklocka2 - enkel grafisk nedräknande klocka med larm
    
    .SH SYNOPSIS
    .B myäggklocka2
    [LJUDFIL]
    
    .SH BESKRIVNING
    Räkna ner från inställd tid och larma när tiden blir 0.
    Larm innebär att LJUDFIL spelas,
    eller, om ingen ljudfil har angivits, ~/Musik/apskrik.mp3,
    samt att tidvisningen börjar blinka.
    .PP
    Inställning av tid kan göras med knapparna + och - i det grafiska gränssnittet
    och med knapparna + och - på tangentbordet.
    .TP
    .B +
    Öka inställd tid med 1 minut och starta nedräkning om den inte redan pågår.
    Max inställbar tid är 30 minuter.
    .TP
    .B -
    Minska inställd tid med 1 minut.
    Om inställd tid minskas till 0 aktiveras larmet.
    Om larmet redan har aktiverats så gör knappen att tidvisningen slutar blinka.
    .TP
    .B Stäng
    Stäng programmet.
    Eventuellt pågående nedräkning avbryts.
    
    .SH SE ÄVEN
    myäggklocka1(1)
    
    .SH FÖRFATTARE
    David Andersson
    
  • Titta på den nya manualsidan med man myäggklocka2 (första gången kan man behöva skriva man -u myäggklocka2)
  • Sluta titta på manualsidan med q
Lägg in själva programmet:
  • Kopiera följande text till en fil ~/bin/myäggklocka2

    Kod: Markera allt

    #!/usr/bin/python
    #  encoding: utf-8
    #  Copyleft (C) 2010 David Andersson
    #
    # Äggklocka med enkelt grafiskt gränssnitt. Spelar ljud efter vald tid.
    #
    # Beroenden: paketet 'python-tk' för gui:t, paketet 'sox' för att spela ljudfil
    
    import sys, time, os
    from Tkinter import *
    
    # Ljudfilnamn valfritt argument på kommandoraden, default ~/Musik/apskrik.mp3
    try:                ljudfil = sys.argv[1]
    except IndexError:  ljudfil = os.path.expanduser('~/Musik/apskrik.mp3')
    
    STILLA  = 0          # Klockans tre möjliga tillstånd (konstanter)
    TAR_TID = 1
    LARMAR  = 2
    
    status  = STILLA     # Börja i 0:00 läge och vänta på iställning av tid
    sluttid = None       # Inställd larmtidpunkt, mätt i sekunder sedan 1 jan 1970
    
    def bygg_upp_grafiskt_granssnitt():
        topp_widget = Tk()
        topp_widget.title('Äggklocka')
        # Tangentbordsknappar
        topp_widget.bind('+', plus_knapp_callback)
        topp_widget.bind('-', minus_knapp_callback)
        global label_widget
        # Tid-visning
        label_widget = Label(topp_widget, text='0:00', relief=SUNKEN, width=6,
                             font=('sans',18), background='black')
        # Grafiska knappar
        minus_knapp  = Button(topp_widget, text='-', command=minus_knapp_callback)
        plus_knapp   = Button(topp_widget, text='+', command=plus_knapp_callback)
        exit_knapp   = Button(topp_widget, text='Stäng', command=quit)
        for knapp in (minus_knapp, plus_knapp):
            knapp.config(repeatdelay=1000, repeatinterval=200)
        # Placering inom topp_widget, vänster till höger
        label_widget.pack(side=LEFT)
        minus_knapp.pack(side=LEFT)
        plus_knapp.pack(side=LEFT)
        exit_knapp.pack(side=LEFT)
        return topp_widget
    
    def kolla_om_sluttid():
        global status
        if status==TAR_TID and just_nu() >= sluttid:
            os.system('play -q "'+ljudfil+'" &')
            status = LARMAR
    
    def uppdatera_visad_tid():
        if status==STILLA:
            label_widget.config(foreground='cyan')
    
        elif status==TAR_TID:
            tid_kvar = sluttid - just_nu()
            label_widget.config(text=sekunder_som_text(tid_kvar), foreground='cyan')
    
        elif status==LARMAR:
            noll_eller_ett = int(just_nu()) % 2   # udda/jämna sekund
            farg = ['cyan', 'orange'][noll_eller_ett]
            label_widget.config(foreground=farg)
    
    def plus_knapp_callback(argument=None):
        global sluttid, status
        if status==TAR_TID:
            sluttid = min(sluttid+60+0.2, just_nu()+30*60+1)
        else:
            sluttid = just_nu()+60+0.8
            status  = TAR_TID
        uppdatera_visad_tid()
    
    def minus_knapp_callback(argument=None):
        global sluttid, status
        if status==TAR_TID:
            sluttid = max(sluttid-60, just_nu()+1)
        else:
            status  = STILLA
        uppdatera_visad_tid()
    
    def varje_sekund_callback():
        kolla_om_sluttid()
        uppdatera_visad_tid()
        topp_widget.after(1000, varje_sekund_callback)
    
    def sekunder_som_text(sekunder):   # returnera sträng min:sek, t.ex. '3:21'
        minuter  = int(sekunder/60)
        sekunder = int(sekunder - minuter*60)
        return '%d:%02d' % (minuter, sekunder)
    
    def just_nu():
        return time.time()
    
    # Starta upp allt
    topp_widget = bygg_upp_grafiskt_granssnitt()
    topp_widget.after_idle(varje_sekund_callback)
    topp_widget.mainloop()
    
  • Gör filen körbar, med högerklick > egenskaper > rättigheter eller med chmod +x ~/bin/myäggklocka2
  • Starta programmet i en terminal med myäggklocka2
  • Tryck på + en gång
  • Om den börjar räkna ner och ljudfilen spelas efter 1 minut så funkar det
  • Om det fungerar, lägg en program-startare i panelen. Högerklicka i panelen > lägg till panel välj anpassad programstartare, lägg till och ange kommando myäggklocka2
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Bygg din egen äggklocka (python)

Inlägg av dmz »

Har du lämnat Perl din buse. :(
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
orlytux
Inlägg: 4
Blev medlem: 30 jul 2010, 17:10
OS: Ubuntu
Utgåva: 20.04 Focal Fossa LTS
Ort: Västerås

Re: Bygg din egen äggklocka (python)

Inlägg av orlytux »

Grymt!! Detta ska jag testa. ;D
Skriv svar

Återgå till "Programmering och webbdesign"