Shutdowner - noch so ein Shutdown-Timer ;)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

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ß
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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)
the more they change the more they stay the same
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

ja, damit werde ich mich nochmal beschätfigen müssen, Danke
Gruß
senft
User
Beiträge: 25
Registriert: Montag 31. März 2008, 14:47

Dav1d hat geschrieben:Ich habe auch einen :twisted:

Code: Alles auswählen

sleep 60m && shutdown -h now

Code: Alles auswählen

shutdown -h +60
;)
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

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,
Zuletzt geändert von Scriptinggamer am Montag 23. Juli 2012, 15:23, insgesamt 3-mal geändert.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

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

@Scriptinggamer: Ad 3.: Ich wüsste nicht was an ``lambda`` per se unsauber sein sollte. Wobei ich `functools.partial()` vorziehe.
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

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ß
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`.
Scriptinggamer
User
Beiträge: 107
Registriert: Sonntag 24. Juni 2012, 16:38
Wohnort: Werder/Havel

Hab den Code ersetzt, will ja nich ein ums andere mal fast identischen Code posten. Danke
Gruß
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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():.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
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.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Also Prinzipiell das gleiche wie mit der exec() Funktion die ich vergessen sollte das es sie gibt.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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', '')
the more they change the more they stay the same
Antworten