Seite 1 von 3

Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Donnerstag 19. Juli 2012, 22:30
von Scriptinggamer
Weil es "relativ einfach" ist so ein Programm zu schreiben, hab auch ich es getan, hier mein Shutdowner :D

Code: Alles auswählen

import tkinter as tk
from tkinter import messagebox
import subprocess
import time

class App:
    def __init__(self, master):
        self.master = master
        self.master.title("Shutdowner")
        self.master.tk.call('wm', 'iconbitmap', self.master._w, '-default', 'sicon.ico')
        self.add_widgets()

    def add_widgets(self):
        #Variablen initialisieren
        self.radio_var = tk.IntVar()
        self.radio_var.set(0)

        self.check_var = tk.IntVar()
        self.check_var.set(0)
        #Bilder initialisieren
        self.shutdown_image = tk.PhotoImage(file = "shutdown.gif")
        self.restart_image = tk.PhotoImage(file = "restart.gif")
        self.logout_image = tk.PhotoImage(file = "logout.gif")
        #Widgets initialisieren
        head_label = tk.Label(self.master, text = "Herzlich willkommen zum Shutdowner!", font = "Arial 15")
        description_label = tk.Label(self.master, text = "Gib hier ein, wann der PC heruntergefahren werden soll:")

        entry_frame = tk.Frame(self.master)
        self.day_entry = tk.Entry(entry_frame, width = 10)
        colon1_Label = tk.Label(entry_frame, text = ":")
        self.hour_entry = tk.Entry(entry_frame, width = 10)
        colon2_Label = tk.Label(entry_frame, text = ":")
        self.minute_entry = tk.Entry(entry_frame, width = 10)

        count_radio = tk.Radiobutton(self.master, text = "Zeit herunterzählen", variable = self.radio_var, value = 0)
        clock_radio = tk.Radiobutton(self.master, text = "Stunden und Minuten als Uhrzeit verwenden", variable = self.radio_var, value = 1)

        check_frame = tk.Frame(self.master)
        message_check = tk.Checkbutton(check_frame, variable = self.check_var)
        self.message_time_entry = tk.Entry(check_frame, width = 4)
        message_label = tk.Label(check_frame, text = "Minuten vorher eine Warnung anzeigen.")

        shutdown_button = tk.Button(self.master, image = self.shutdown_image, command = self.shutdown)
        restart_button = tk.Button(self.master, image = self.restart_image, command = self.restart)
        logout_button = tk.Button(self.master, image = self.logout_image, command = self.logout)

        self.day_entry.insert(0, "Tage")
        self.hour_entry.insert(0, "Stunden")
        self.minute_entry.insert(0, "Minuten")
        
        #Widgets positionieren
        head_label.grid(row = 0, column = 0, columnspan = 3)
        description_label.grid(row = 1, column = 0, columnspan = 3)

        entry_frame.grid(row = 2, column = 0, columnspan = 3)
        self.day_entry.grid(row = 0, column = 0)
        colon1_Label.grid(row = 0, column = 1)
        self.hour_entry.grid(row = 0, column = 2)
        colon2_Label.grid(row = 0, column = 3)
        self.minute_entry.grid(row = 0, column = 4)
        
        count_radio.grid(row = 3, column = 0, columnspan = 3, sticky = "w")
        clock_radio.grid(row = 4, column = 0, columnspan = 3, sticky = "w")

        check_frame.grid(row = 5, column = 0, columnspan = 3, sticky = "w")
        message_check.grid(row = 0, column = 0)
        self.message_time_entry.grid(row = 0, column = 1)
        message_label.grid(row = 0, column = 2)

        shutdown_button.grid(row = 6, column = 0)
        restart_button.grid(row = 6, column = 1)
        logout_button.grid(row = 6, column = 2)

    def shutdown(self):
        parameters = (self.day_entry.get(),
                      self.hour_entry.get(),
                      self.minute_entry.get(),
                      self.radio_var.get(),
                      self.check_var.get(),
                      self.message_time_entry.get(),
                      "shutdown -s -t 1 /f")
        self.run_command(*parameters)

    def restart(self):
        parameters = (self.day_entry.get(),
                      self.hour_entry.get(),
                      self.minute_entry.get(),
                      self.radio_var.get(),
                      self.check_var.get(),
                      self.message_time_entry.get(),
                      "shutdown -r -t 1 /f")
        self.run_command(*parameters)

    def logout(self):
        parameters = (self.day_entry.get(),
                      self.hour_entry.get(),
                      self.minute_entry.get(),
                      self.radio_var.get(),
                      self.check_var.get(),
                      self.message_time_entry.get(),
                      "shutdown -l -t 1 /f")
        self.run_command(*parameters)

    def run_command(self, day, hour, minute, mode, warn_check, warn_time, command):
        #Zeit zum herunterzählen
        time_now = int(time.strftime("%H")) * 3600 + int(time.strftime("%M")) * 60
        if mode == 0:
            if day.isdigit() and 0 <= int(day) <= 1000:
                sleep_time = int(day) * 86400
            else:
                sleep_time = 0
            if hour.isdigit() and 0 <= int(hour) < 60:
                sleep_time += int(hour) * 3600
            if minute.isdigit() and 0 <= int(minute) < 60:
                sleep_time += int(minute) * 60
        #Zeit bis zur Uhrzeit
        else:
            if day.isdigit() and 0 < int(day) <= 32:
                time_end_day = int(day)
            else:
                time_end_day = 0
            if hour.isdigit() and 0 <= int(hour) < 24:
                time_end = int(hour) * 3600
            else:
                time_end = 0
            if minute.isdigit() and 0 < int(minute) < 60:
                time_end += int(minute) * 60

            if time_end_day != 0:
                sleep_time = (86400 - int(time.strftime("%H")) * 3600 - int(time.strftime("%M")) * 60) + (time_end_day - 1) * 86400 + time_end
            else:
                if time_now < time_end:
                    sleep_time = (time_end - time_now)
                else:
                    sleep_time = 0
                    
        #Datum und Uhrzeit ermitteln
        if (time_now + sleep_time) > 86400:
            check_message_day = (time_now + sleep_time) // 86400
        else:
            check_message_day = 0
        check_message_rest = (time_now + sleep_time) % 86400
            
        check_message_hour = check_message_rest // 3600
        check_message_rest = check_message_rest % 3600
        
        check_message_minute = check_message_rest // 60
        #Messagetext erstellen und message starten
        message_text = "Möchten sie ihren PC wirklich "
        if check_message_day == 0:
            message_text += "heute um "
        elif check_message_day == 1:
            message_text += "morgen um "
        elif check_message_day == 2:
            message_text += "übermorgen um "
        else:
            message_text += "in " + str(check_message_day) + " Tagen um "
        message_text += str(check_message_hour) if len(str(check_message_hour)) == 2 else "0" + str(check_message_hour)
        message_text += ":"
        message_text += str(check_message_minute) if len(str(check_message_minute)) == 2 else "0" + str(check_message_minute)
        message_text += " uhr "
        if command == "shutdown -s -t 1 /f":
            message_text += "herunterfahren lassen?"
        if command == "shutdown -r -t 1 /f":
            message_text += "neustarten lassen?"
        if command == "shutdown -l -t 1 /f":
            message_text += "abmelden lassen?"
            
        if messagebox.askyesno(title = "Starten", message = message_text):
            #Herunterzählen starten
            self.master.destroy()
            if warn_check and warn_time.isdigit() and int(warn_time)*60 < sleep_time:
                time.sleep(sleep_time - warn_time * 60)
                subprocess.call("start warning.exe", shell = True)
                time.sleep(warn_time * 60)
                subprocess.call(command, shell = True)
            else:
                time.sleep(sleep_time)
                subprocess.call(command, shell = True)
            
        
def main():
    root = tk.Tk()
    app = App(root)
    root.mainloop()

if __name__ == "__main__":
    main()
Er ist nochnicht perfekt, aber er sollte funktionieren :D
Die warning.exe kann man im programmcode ja in warnung.pyw ändern und eine warning.pyw mit folgendem Code in den selben Ordner stecken:

Code: Alles auswählen

from tkinter import messagebox
import tkinter as tk
root = tk.Tk()
root.withdraw()
messagebox.showwarning(title = "Erinnerung", message = "Erinnerung: Der Shutdowner ist aktiv!")
root.destroy()
Mal wieder sind alle Ideen und Vorschläge gerne gesehen.
Gruß

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Donnerstag 19. Juli 2012, 23:10
von Dav1d
Ich habe auch einen :twisted:

Code: Alles auswählen

sleep 60m && shutdown -h now
Ich hab den Code jetzt nur überflogen, sieht aber so aus als würde das datetime Modul einiges erleichtern (z.B. datetime.timedelta)

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Freitag 20. Juli 2012, 08:19
von Scriptinggamer
ja, damit werde ich mich nochmal beschätfigen müssen, Danke
Gruß

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Freitag 20. Juli 2012, 09:08
von senft
Dav1d hat geschrieben:Ich habe auch einen :twisted:

Code: Alles auswählen

sleep 60m && shutdown -h now

Code: Alles auswählen

shutdown -h +60
;)

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Samstag 21. Juli 2012, 16:57
von Py-Prog
senft hat geschrieben:
Dav1d hat geschrieben:Ich habe auch einen :twisted:

Code: Alles auswählen

sleep 60m && shutdown -h now

Code: Alles auswählen

shutdown -h +60
;)

Code: Alles auswählen

shutdown.exe -t 3600 -s
SCNR :D

Achja und lass die Zeilen 11 - 13 weg.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 17:21
von Scriptinggamer
So, jetzt ist auch erstmal alles Tkinterige in der Klasse und der Rest nicht. Außerdem hab ich alle Zeit vorgänge und berechnungen mit dem time-modul gemacht und das gesammte Main window ist in der Init Funktion. Jetzt auch functools.partial:

Code: Alles auswählen

import tkinter as tk
from tkinter import messagebox
import functools
import subprocess
import time

class App:
    def __init__(self, master):
        #Master initialiesieren
        self.master = master
        self.master.title("Shutdowner")
        self.master.wm_iconbitmap('sicon.ico')
        
        #Variablen initialisieren
        self.radio_var = tk.IntVar()
        self.radio_var.set(0)
        self.check_var = tk.IntVar()
        self.check_var.set(0)
        
        #Bilder initialisieren
        self.shutdown_image = tk.PhotoImage(file = "shutdown.gif")
        self.restart_image = tk.PhotoImage(file = "restart.gif")
        self.logout_image = tk.PhotoImage(file = "logout.gif")
        
        #Widgets initialisieren
        head_label = tk.Label(self.master,
                              text = "Herzlich willkommen zum Shutdowner!",
                              font = "Arial 15")
        description_label = tk.Label(self.master,
                                     text = "Gib hier ein, wann der PC \
heruntergefahren werden soll:")

        entry_frame = tk.Frame(self.master)
        self.day_entry = tk.Entry(entry_frame, width = 10)
        colon1_Label = tk.Label(entry_frame, text = " - ")
        self.hour_entry = tk.Entry(entry_frame, width = 10)
        colon2_Label = tk.Label(entry_frame, text = ":")
        self.minute_entry = tk.Entry(entry_frame, width = 10)

        count_radio = tk.Radiobutton(self.master,
                                     text = "Zeit herunterzählen",
                                     variable = self.radio_var,
                                     value = 0)
        clock_radio = tk.Radiobutton(self.master,
                                     text = "Stunden und Minuten als \
Uhrzeit verwenden",
                                     variable = self.radio_var,
                                     value = 1)

        check_frame = tk.Frame(self.master)
        message_check = tk.Checkbutton(check_frame,
                                       variable = self.check_var)
        self.message_time_entry = tk.Entry(check_frame,
                                           width = 4)
        message_label = tk.Label(check_frame,
                                 text = "Minuten vorher eine Warnung anzeigen.")

        shutdown_button = tk.Button(self.master,
                                    image = self.shutdown_image,
                                    command = functools.partial\
                                    (self.run_sleep_shutdown,
                                     "shutdown -s -t 60 /f"))
        restart_button = tk.Button(self.master,
                                   image = self.restart_image,
                                   command = functools.partial\
                                   (self.run_sleep_shutdown,
                                    "shutdown -r -t 0 /f"))
        logout_button = tk.Button(self.master,
                                  image = self.logout_image,
                                  command = functools.partial\
                                  (self.run_sleep_shutdown,
                                   "shutdown -l"))

        self.day_entry.insert(0, "Tage")
        self.hour_entry.insert(0, "Stunden")
        self.minute_entry.insert(0, "Minuten")
        
        #Widgets positionieren
        head_label.grid(row = 0, column = 0, columnspan = 3)
        description_label.grid(row = 1, column = 0, columnspan = 3)

        entry_frame.grid(row = 2, column = 0, columnspan = 3)
        self.day_entry.grid(row = 0, column = 0)
        colon1_Label.grid(row = 0, column = 1)
        self.hour_entry.grid(row = 0, column = 2)
        colon2_Label.grid(row = 0, column = 3)
        self.minute_entry.grid(row = 0, column = 4)
        
        count_radio.grid(row = 3, column = 0, columnspan = 3, sticky = "w")
        clock_radio.grid(row = 4, column = 0, columnspan = 3, sticky = "w")

        check_frame.grid(row = 5, column = 0, columnspan = 3, sticky = "w")
        message_check.grid(row = 0, column = 0)
        self.message_time_entry.grid(row = 0, column = 1)
        message_label.grid(row = 0, column = 2)

        shutdown_button.grid(row = 6, column = 0)
        restart_button.grid(row = 6, column = 1)
        logout_button.grid(row = 6, column = 2)

    def run_sleep_shutdown(self, command):
        sleep_shutdown(self.master,
                      self.day_entry.get(),
                      self.hour_entry.get(),
                      self.minute_entry.get(),
                      self.radio_var.get(),
                      self.check_var.get(),
                      self.message_time_entry.get(),
                      command)

def sleep_shutdown(root, day, hour, minute, mode, warn_check, warn_time, command):
    #Zeit zum herunterzählen
    if mode == 0:
        day = int(day) if day.isdigit() and 0 <= int(day) <=1000\
              else 0
        hour = int(hour) if hour.isdigit() and 0 <= int(hour) < 24\
               else 0
        minute = int(minute) if minute.isdigit() and 0 <= int(minute) < 60\
                 else 0
        shutdown_time = time.mktime((time.localtime()[0],
                                    time.localtime()[1],
                                    time.localtime()[2] + day,
                                    time.localtime()[3] + hour,
                                    time.localtime()[4] + minute,
                                    time.localtime()[5],
                                    time.localtime()[6],
                                    time.localtime()[7],
                                    time.localtime()[8]))
    #Zeit bis zur Uhrzeit
    else:
        day = int(day) if day.isdigit() and 0 <= int(day) <=1000 else 0
        hour = int(hour) if hour.isdigit() and 0 <= int(hour) < 24\
               else time.localtime()[3]
        minute = int(minute) if minute.isdigit() and 0 <= int(minute) < 60\
                 else time.localtime()[4]
        shutdown_time = time.mktime((time.localtime()[0],
                                    time.localtime()[1],
                                    time.localtime()[2] + day,
                                    hour,
                                    minute,
                                    time.localtime()[5],
                                    time.localtime()[6],
                                    time.localtime()[7],
                                    time.localtime()[8]))
        if time.localtime(shutdown_time)[3] != hour:
            if time.localtime()[8]:
                hour_plus = 1
            else:
                hour_plus = -1
            shutdown_time = time.mktime((time.localtime()[0],
                                    time.localtime()[1],
                                    time.localtime()[2] + day,
                                    hour + hour_plus,
                                    minute,
                                    time.localtime()[5],
                                    time.localtime()[6],
                                    time.localtime()[7],
                                    time.localtime()[8]))
            

    #Messagetext erstellen und message starten
    shutdown_date = (day,
                     time.localtime(shutdown_time)[3],
                     time.localtime(shutdown_time)[4])
    message_text = "Möchten sie ihren PC wirklich "
    if shutdown_date[0] == 0:
        message_text += "heute um "
    elif shutdown_date[0] == 1:
        message_text += "morgen um "
    elif shutdown_date[0] == 2:
        message_text += "übermorgen um "
    else:
        message_text += "in " + str(shutdown_date[0]) + " Tagen um "
    message_text += str(shutdown_date[1]) if len(str(shutdown_date[1])) == 2\
                    else "0" + str(shutdown_date[1])
    message_text += ":"
    message_text += str(shutdown_date[2]) if len(str(shutdown_date[2])) == 2\
                    else "0" + str(shutdown_date[2])
    message_text += " Uhr "
    if command == "shutdown -s -t 1 /f":
        message_text += "herunterfahren lassen?"
    if command == "shutdown -r -t 1 /f":
        message_text += "neustarten lassen?"
    if command == "shutdown -l":
        message_text += "abmelden lassen?"
            
    if messagebox.askyesno(title = "Starten", message = message_text):
        #Herunterzählen starten
        root.destroy()
        sleep_time = shutdown_time - time.time() if shutdown_time > time.time() else 0
        if warn_check and warn_time.isdigit()\
           and int(warn_time)*60 < sleep_time:
            time.sleep(time.localtime(shutdown_time) - time.localtime())
            subprocess.call("start warning.exe", shell = True)
            time.sleep(warn_time * 60)
            subprocess.call(command, shell = True)
        else:
            time.sleep(sleep_time)
            subprocess.call(command, shell = True)
        
def main():
    root = tk.Tk()
    app = App(root)
    root.mainloop()

if __name__ == "__main__":
    main()
So,

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 19:56
von Py-Prog
Ich hab mir es den Code gestern nicht wirklich angesehen, deshalb hier noch ein paar Verbesserungsvorschläge:

1) nim wm_iconbitmap('icon.ico') stat tk.call('wm', 'iconbitmap', ...
2) wenn du z. B. ein Label nur für einen immer gleichbleibenden Text brauchst kannst du auch tk.Label(root, text='TEXT').grid(row=0, column=0) schreiben, in dem Fall von head_label also:

Code: Alles auswählen

tk.Label(self.master, text = "Herzlich willkommen zum Shutdowner!", font = "Arial 15").grid(row = 0, column = 0, columnspan = 3)
denn Namen kannst du weglassen.
3) Die Funktionen shutdown, restart und logout sind im Inhalt fast gleich, das geht in einer Funktion viel geschickter.
4) Dann solltest du die Zeile root.destroy() durch self.master.destroy() ersetzen, weil wenn du root umbenennst dann dann gibt das einen NameError.
5) wieso setzt du den Inhalt von main() nicht einfach gleich unter if __name__ == '__main__': ?

Das ist jetzt mal das was mir jetzt aufgefallen ist.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 21:09
von Scriptinggamer
ok, danke,
zu 1. Alles klar
zu 2. Weiß ich, aber "muss" man das so machen? So kann ich alles in einem Block positionieren, und sehe auch gleich am Zeilenanfang den Namen und somit die Bedeutung des Widgets.
zu 3. Das würde ich ja machen, aber Buttons können ja keine argumente übergeben (wäre aber cool, so ungefähr tk.Button(root, text = "Guten Tag", command = meine-lieblings-funktion, args = ("Hallo ich bin der Willi", 92)) das wäre ja realisierbar in Python), und die Lambda methode ist ja nicht so sauber. Ich hab jetzt aber den sich wiederholenden Teil in eine weitere Funktion gesteckt.
zu 4. das root.destroy() im run_command() ist lokal, das ist doch ein Argument für die Funktion.
zu 5. Leonidas höchst persönlich hat mir gesagt ich solle eine ordentliche main-Funktion machen, dann sieht man auch sofort wo's losgeht.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 21:38
von BlackJack
@Scriptinggamer: Ad 3.: Ich wüsste nicht was an ``lambda`` per se unsauber sein sollte. Wobei ich `functools.partial()` vorziehe.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 21:48
von Scriptinggamer
Hi, also darf man so einem Button argumente einschmuggeln?
Ja, funktools.partial() tuts, aber ist das üblich? Macht man das wirklich?
Es wäre ja völlig unkomplitziert das in die Button Klasse reinzubaun, warum ist das da dann nicht drinn!?
ich könnte mit ja eine Tkinter kopie anlegen (tkinter_sg oder so) und es da rein bauen :D
Gruß

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Sonntag 22. Juli 2012, 22:31
von BlackJack
@Scriptinggamer: Ja das ist üblich.

`Tkinter` ist eine relativ dünne Schicht über dem `Tk`-Toolkit. Und `Tk` kennt für `button` halt nur ein `-command` und kein `-args`.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 15:25
von Scriptinggamer
Hab den Code ersetzt, will ja nich ein ums andere mal fast identischen Code posten. Danke
Gruß

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 16:37
von Py-Prog
Scriptinggamer hat geschrieben:zu 2. Weiß ich, aber "muss" man das so machen? So kann ich alles in einem Block positionieren, und sehe auch gleich am Zeilenanfang den Namen und somit die Bedeutung des Widgets.
Wenn ein Programm funktioniert gibt es kein Richtig und Falsch programmieren, sondern nur geschickt und ungeschickt, müssen tust du nur wenn etwas nicht funktioniert. Und wenn du es so machen willst wie du es bereits gemacht hast dann lass es so wie es ist.
Scriptinggamer hat geschrieben:zu 5. Leonidas höchst persönlich hat mir gesagt ich solle eine ordentliche main-Funktion machen, dann sieht man auch sofort wo's losgeht.
Wenn man in einen Programm mehrere Klassen und Funktionen hat dann finde ich fällt es einen Schneller auf wenn da wo if __name__ == '__main__': steht als def main():.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 16:43
von Dav1d
Py-Prog hat geschrieben:Wenn man in einen Programm mehrere Klassen und Funktionen hat dann finde ich fällt es einen Schneller auf wenn da wo if __name__ == '__main__': steht als def main():.
Das mit der `main()` Funktion passt schon. Ab einer bestimmten Komplexität wird es ohne `main()` Funktion schnell unübersichtlich, außerdem ist es üblich.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 16:45
von cofi
Das viel wichtigere Argument fuer eine `main` Funktion ist, dass man genau sieht welche Variablen beeinflusst werden: Lokale Variablen und globale nur mit `global`.
Bei einem "main-Block" kann man beliebig globale Variablen benutzen ohne das zu kennzeichnen. Was nach Freiheit klingt, macht es aber nur schwerer fuer den Leser den Code nachzuvollziehen.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 16:52
von Py-Prog
cofi hat geschrieben:Das viel wichtigere Argument fuer eine `main` Funktion ist, dass man genau sieht welche Variablen beeinflusst werden: Lokale Variablen und globale nur mit `global`.
Bei einem "main-Block" kann man beliebig globale Variablen benutzen ohne das zu kennzeichnen. Was nach Freiheit klingt, macht es aber nur schwerer fuer den Leser den Code nachzuvollziehen.
Stimmt das mit dem root.destroy() hätte ja gar nicht funktioniert weil die variable nicht global war. Dann endere ich das bei meinen Programmen jetzt auch um.
Aber ich dachte wenn man global her nimmt macht man "immer" etwas falsch?

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 17:11
von deets
Wenn man "immer" etwas falsch machen wuerde, dann wuerde das bedeuten man koennte es aus der Sprache werfen.

Man macht "so gut wie immer" etwas falsch, und ich kann mich nicht erinnern, wann ich es in den letzten Monaten oder gar Jahren verwenden musste. Um ehrlich zu sein: mir faellt auf Anhieb noch nicht mal ein Fall ein, wo es denn noetig waere... Aber vielleicht hat da wer anders ne Idee.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 17:19
von Py-Prog
Also Prinzipiell das gleiche wie mit der exec() Funktion die ich vergessen sollte das es sie gibt.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 17:49
von EyDu
Py-Prog hat geschrieben:Also Prinzipiell das gleiche wie mit der exec() Funktion die ich vergessen sollte das es sie gibt.
Einfach weiter vergessen, dass es global und exec überhaupt gibt. Wie auch deets kann ich mich an keine Situation in den letzten Jahren erinnern, in denen ich eins von beiden hätte sinnvoll einsetzen könnten.

Re: Shutdowner - noch so ein Shutdown-Timer ;)

Verfasst: Montag 23. Juli 2012, 18:14
von Dav1d
EyDu hat geschrieben:Einfach weiter vergessen, dass es global und exec überhaupt gibt. Wie auch deets kann ich mich an keine Situation in den letzten Jahren erinnern, in denen ich eins von beiden hätte sinnvoll einsetzen könnten.
Wenn es mal schnell gehen muss:

Code: Alles auswählen

import weechat as w
from subprocess import check_call
from time import time

w.register('notify', 'dav1d', '1.0', 'GPL', 'uses libnotify to notify on highlight', '', '')

INTERVAL = 30

last = 0 

def notify_send(title, msg, icon):
    check_call(['notify-send', title, msg, '-i', icon])


def notify(data, signal, msg):
    global last
    print signal
    if time() - last > INTERVAL and not msg.split()[0] == '--':
        n = 'Highlight' if signal.endswith('highlight') else 'Private Message'
        title = '{}: {}'.format(n, msg.split()[0])
        notify_send(title, msg.split(None, 1)[1], 'notification-message-im')
    last = time()

    return w.WEECHAT_RC_OK

w.hook_signal('weechat_highlight', 'notify', '')
w.hook_signal('weechat_pv', 'notify', '')