Uptime-GUI

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Hallo,
ich habe eine GUI für »uptime« programmiert. Damit sieht man wie lange der Rechner schon an ist. Das GUI-Toolkit ist Qt. Damit es funktioniert muss man eine Linux-Distribution benutzen (und uptime installiert haben, kann man testen indem man "uptime" [ohne Anführungszeichen] in ein Terminal, Konsole, oder Befehlszeile etc. eingibt. Aber ich glaube uptime ist wirklich bei jeder Linux-Distribution dabei) . Außerdem wird PyQt4 benötigt.

Ich hoffe jemand kann was damit anfangen. Außerdem wäre es nett wenn ihr mir sagen könntet was ich dabei besser machen kann.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.

"""
    uptime.py
    ~~~~~~~~~

    Gibt als Qt-GUI aus, wie lange der Rechner schon an ist
"""

import sys # Für das "richtige" Beenden
import re # Zum entfernen von überflüssigen Sachen
import subprocess # Damit man uptime überhaupt benutzen kann

from PyQt4 import QtGui # Für die GUI


class Fenster(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.resize(300, 200) # Das Fenster 300 x 200 Pixel groß machen
        self.setWindowTitle("Uptime mit Qt") # Fenstertitel festlegen

        # Unnötiges Zeug entfernen; mit subprocess uptime ausführen
        self.uptime = re.sub(",.*", "", subprocess.Popen("uptime",
                             stdout=subprocess.PIPE).communicate()[0])
        self.uptime = re.sub(".*up ", "", self.uptime).replace("\n", "")

        self.uptime_label = QtGui.QLabel("Der Rechner ist seit " + self.uptime + " Stunden an.", self)
        self.setCentralWidget(self.uptime_label) # self.uptime_label in die Mitte der GUI schieben


anwendung = QtGui.QApplication(sys.argv)
fenster = Fenster()
fenster.show()
sys.exit(anwendung.exec_())
Für mich wäre es auch interessant ob auch alles den PEP8 Richtlinien entspricht.

Viele Grüße,
Jakob.
BlackJack

@nomnom: Das `uptime` vorhanden ist, sollte man wohl voraussetzen können, aber ich denke Du machst zu viele Annahmen über die Ausgabe von dem Programm. Mit anderen Spracheinstellungen kann der Text anders aussehen und ich denke mal das zum Beispiel bei folgender Ausgabe das mit den "Stunden" in Deinem Text nicht hinhaut:

Code: Alles auswählen

$ uptime
 23:09:10 up 73 days, 13:42,  2 users,  load average: 0.34, 0.22, 0.37
Ausserdem hätte ich's wohl versucht ohne `re` zu lösen. Das hat sowas "Perliges". :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@PEP8: Deutsche Variablen und Kommentare und damit auch Sonderzeichen machen die Konformitaet schon mal kaputt ;)

Daneben sollte man den letzten Teil in eine ifmain-Klausel packen.

Warum `uptime` eine GUI braucht, ist mir allerdings schleierhaft. :roll:
lunar

Man setzt nie absolute Größen für graphische Steuerelemente, da die Größe von Steuerelemente von ihrem Inhalt abhängt, und somit an diversen Systemeinstellungen wie Schriftart und Schriftgröße hängt. Bei Dir mag das passen, aber das muss nicht der Fall sein. Wenn Du eine bestimmte Größe für das Fenster beim Start vorgeben möchtest, dann leite diese Größe zumindest von ".minimumSize()" ab, damit die Steuerelemente immer vollständig angezeigt werden.

Und nur so nebenbei: Diese Lizenz ist nach den Lizenzbedingungen von PyQt4 nicht erlaubt. Nicht, dass das bei diesem Programm relevant wäre, aber im Allgemeinen ist es eben ratsam, die Lizenzbedingungen der verwendeten Bibliotheken auch zu lesen.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Danke lunar, cofi und BlackJack!

@BlackJack:
Wie kann man das denn ohne `re` lösen? Gibt es so eine Art erase()-Funktion wie in C++? Aber ich verstehe nicht wieso ich es ohne `re` machen sollte. (Ich mag Perl :-P)

@lunar:
Wieder etwas von dir gelernt, vielen Dank! :-D

@cofi:
Ich habe gedacht es wäre okay die Variablen, Funktionen, und Klassen etc. deutsch zu benennen… Habe jetzt mal alle Variablennamen übersetzt. Außerdem habe ich den letzten Teil in ein

Code: Alles auswählen

if __name__ == "name"
gepackt. Eine Uptime-GUI braucht man ja auch nicht wirklich. Manche Leute aber, können gar nichts mit der Befehlszeile anfangen. Die wissen dann nicht mal wie man einen Befehl ausführt. Denn sie suchen nach einem Knopf zum Absenden…

Erst habe ich gedacht: Ich lese den Inhalt der Datei »/proc/uptime« aus, und gebe ihn dann aus, das ist ja auch alles immer gleich (außer die Werte). Dann hat man aber nur die Sekunden… Ich such mal nach einer Lösung wie man das »umwandeln« kann.

Viele Grüße,
Jakob.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

nomnom hat geschrieben:Außerdem habe ich den letzten Teil in ein

Code: Alles auswählen

if __name__ == "name"
gepackt.
Und das soll was bringen? Das sollte

Code: Alles auswählen

if __name__ == "__main__"
heissen.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

@cofi:
Was schreib ich da nur? Im eigentlichen Programm steht bei mir jedoch

Code: Alles auswählen

if __name__ == "__main__"
BlackJack

@nomnom: Eine `erase()`-Methode gibt es nicht, ich finde den Ansatz aber da man Zeichenketten nicht verändern kann sowieso etwas "hintenrum". Ich würde das eher so formulieren das der gewünschte Teil aus der Zeichenkette ausgewählt wird, statt den unerwünschten zu "löschen". Also zum Beispiel:

Code: Alles auswählen

uptime = uptime[uptime.index('up ') + 3:uptime.index(',')]
Was allerdings das Gleiche leistet wie Dein Ansatz, also bei Tagen falsche Ergebnisse liefert.

Wenn es einfach und lesbar ohne `re` geht, sollte man es halt nicht künstlich komplizierter machen. Bei Perl ist das ja egal, da ist der Rest der Sprache genauso kryptisch wie reguläre Ausdrücke, wenn nicht sogar schlimmer. :twisted:

Von Sekunden auf Tage, Stunden, Minuten, und Sekunden zu kommen ist nicht wirklich schwer. Da braucht man doch nur einfache Grundrechenoperationen. Die `divmod()`-Funktion ist da ganz nützlich.
Antworten