Seite 1 von 1

Ausgabe aus einem unsichtbaren Python Prozess

Verfasst: Sonntag 25. Januar 2009, 13:01
von Boa
Hi,

Ich habe mir ein script geschrieben, welches alle 5 Minuten den Status einer Webseite überprüfen soll. Mein erster Ansatz war es mit pythonw zu starten, da es unsichtbar sein soll, solange eine bestimmte Bedingung erfüllt ist.
Ansonsten soll sich das script eine Ausgabe produzieren.
Wie kann ich also eine möglichst einfache Ausgabe machen, obwohl das Fenster unsichtbar ist?

Verfasst: Sonntag 25. Januar 2009, 13:30
von sea-live
wie wärs mit einenm popup dialog

Verfasst: Sonntag 25. Januar 2009, 13:41
von Boa
sea-live hat geschrieben:wie wärs mit einenm popup dialog
Cool, gefällt mir :)

Code: Alles auswählen

from Tkinter import *
from SimpleDialog import SimpleDialog

# initialize GUI toolkit

root = Tk()

# pop up a dialog window with some text

SimpleDialog(root,
             text="Hi there\nHere is some text",
             buttons=["OK"],
             default=0,
             title="Demo Dialog").go()
Das verkürzt mein Skript erheblich.

Danke :D

Verfasst: Sonntag 25. Januar 2009, 14:01
von Boa
Schade, es klappt doch noch nicht.
Da das Programm in einer Endlosschleife läuft, deren Rumpf mit time.sleep() verzögert ausgeführt wird, bleibt das Skript stehen, sobald ich auf den OK Knopf drücke. Muss ich den Dialog in einem eigenen Thread starten?

Verfasst: Sonntag 25. Januar 2009, 14:41
von BlackJack
Das Skript bleibt stehen *bis* Du den Knopf gedrückt hast, danach sollte es weiterlaufen.

Verfasst: Sonntag 25. Januar 2009, 15:59
von Boa
@BlackJack
Schön wärs. Aber vielleicht mache ich was falsch:

Code: Alles auswählen

import re
import httplib
import subprocess
import os
import time
from Tkinter import *
from SimpleDialog import SimpleDialog

while True:

  #Read the traffic updated after a change of 10%
  file = "traffic.txt"
  fh = open(file,"r")
  oldTraffic = int(fh.readline()) 
  fh.close()
      
  #Get the actual traffic site
  conn = httplib.HTTPConnection("example.de")
  conn.request("GET", "/traffic/index.php")
  resp = conn.getresponse()
  msg = resp.read()
  conn.close()

  #filter it for the actual traffic
  p = re.compile('blahblah')
  m = p.search(msg) 
  newTraffic = int(m.group(1))
  
  #after a traffic-change of 5% 
  if newTraffic > (oldTraffic + 5): #makeoutput -> output -> update
    fh = open(file,"w")
    fh.write(str(newTraffic)+"\n") 
    fh.close()  
    SimpleDialog(Tk(),
           text="Traffic:"+str(newTraffic),
           buttons=["OK"],
           default=0,
           title="Traffic").go()   
  if newTraffic < (oldTraffic - 5): # not makeoutput -> update   
    fh = open(file,"w")
    fh.write(str(newTraffic)+"\n") 
    fh.close()  
  
  time.sleep(10)
     
     
    
    
    
    
    

Verfasst: Sonntag 25. Januar 2009, 16:30
von DasIch
file sollte man nicht überschreiben.

Dateien sollte man mit with oder einem try..finally Konstrukt öffnen.

Verfasst: Sonntag 25. Januar 2009, 17:04
von Boa
@DasIch
Ich habe das Programm gerade erst mit der while-schleife ergänzt.
Dabei habe ich die Zuweisung an file nicht berücksichtigt. Aber einen merkbaren Unterschied macht es nicht, weil das Skript nur für mich geschrieben ist, also nur den Anspruch hat zu funktionieren. Leider tut es das aber nicht.
Ich gehe davon aus, dass die Try-Catch Blöcke nicht die Lösung des Problems sind, da das Programm vorher schon ohne diese lief, als ich noch eine andere Form der Ausgabe verwendete.
Trotzdem Danke ich für die Hinweise, da ich nun weiß, dass es in Python Try-Catch Blöcke gibt.

Verfasst: Sonntag 25. Januar 2009, 18:07
von HWK
Evtl. liegt es daran, dass Du jedesmal eine neue Instanz von Tk() verwendest? Vielleicht musst Du auch eine Instanz des Dialogs erhalten, damit der Dialog nicht dem GC zum Opfer fällt:

Code: Alles auswählen

dialog = SimpleDialog(...)
dialog.go()
MfG
HWK

Verfasst: Sonntag 25. Januar 2009, 19:26
von Boa
HWK hat geschrieben:Evtl. liegt es daran, dass Du jedesmal eine neue Instanz von Tk() verwendest? Vielleicht musst Du auch eine Instanz des Dialogs erhalten, damit der Dialog nicht dem GC zum Opfer fällt:

Code: Alles auswählen

dialog = SimpleDialog(...)
dialog.go()
MfG
HWK
Obwhol ich Tk nun nur einmal instanziiere verhält sich das Programm wie gegeben. Ich verstehe nicht, warum Tk nicht öfter instantiiert werden können sollte. Ist das eine Art Singleton?
Das Programm verwendet Tk nämlich nur relativ selten. Denn normalerweise ist die Wartezeit pro Schleifendurchgang 5 Min.. Ich habe diese nur zu Testzwecken heruntergestellt.
Am GC scheint es auch nicht zu liegen. So schnell ändert sich der traffic nicht, also wird auch sehr selten der Dialog aufgerufen, bzw. die Referenz gelöscht. Und bestimmt nicht bevor ich das Fenster geschlossen habe.

Verfasst: Sonntag 25. Januar 2009, 19:32
von Boa

Code: Alles auswählen

import time
from Tkinter import *
from SimpleDialog import SimpleDialog 

tk = Tk()
dialog = ""
 
while True:  
  dialog = SimpleDialog(tk,
       text="Traffic:",
       buttons=["OK"],
       default=0,
       title="Traffic")
  dialog.go()   
  time.sleep(30)
In der Form lässt es sich wenigstens testen.

Verfasst: Sonntag 25. Januar 2009, 19:39
von Leonidas
Wenn du gerade mit Tkinter anfängst, solltest du dir *-Imports gar nicht erst angewöhnen.

Verfasst: Montag 26. Januar 2009, 13:53
von HWK
Boa hat geschrieben:In der Form lässt es sich wenigstens testen.
Es funktioniert auch. Man sieht es nur wegen des langen Sleeps sehr spät. Man sollte aber noch vor dem Sleep ein tk.update() einfügen oder man minimiert das ganze Fenster:

Code: Alles auswählen

import time
import Tkinter as tk
from SimpleDialog import SimpleDialog

root = tk.Tk()
i = 0
while True:
    i += 1
    root.deiconify()
    dialog = SimpleDialog(root,
       text="Traffic: %i" % i,
       buttons=["OK"],
       default=0,
       title="Traffic")
    dialog.go()
    root.withdraw()
    time.sleep(3)
Wobei das mit dem zusätzlichen Dialogfenster in dem Hauptfenster m.E. nicht sehr schön aussieht. Man sollte sich dann vielleicht doch die Mühe machen, die wenigen Widgets im Hauptfenster zu platzieren.
MfG
HWK

Verfasst: Montag 26. Januar 2009, 16:21
von BlackJack
Oder das Hauptfenster unsichtbar machen. `withdraw()` heisst die Methode glaube ich.

Verfasst: Dienstag 27. Januar 2009, 13:02
von HWK
@BlackJack: Schau mal meinen Code an. Nach withdraw() wird auch der Dialog nicht mehr angezeigt. Deshalb das deiconify(), was aber natürlich auch das Hauptfenster wieder darstellt.
MfG
HWK

Verfasst: Dienstag 27. Januar 2009, 19:19
von BlackJack
:oops: Wie peinlich, da steht's ja. Und bei der Uhrzeit kann ich noch nicht einmal die "'s war halt spät" Ausrede verwenden. :-)

Verfasst: Dienstag 27. Januar 2009, 20:17
von Boa
Na klasse! Es funktioniert ;)

Momentan habe ich nicht die Muße mich in Python weiter einzugraben.
Aber die Graphische Programmierung + OOP in Python werde ich mir auf jeden Fall zu Gemüte führen, wenn nichts Anderes anliegt. Ich hoffe, dass das Event-System einfacher zu durchschauen ist als in Java, sodass sich darin schnell entwickeln lässt. Denn eine mächtige prototyping Programmiersprache zur Hand zu haben ist zu Demo Zwecken und zum Rumprobieren einfach toll. Und Dank eurer Hilfe habe ich auch die Motivation das durchzuziehen :)

Die Tipps, die ihr mir gegeben habt beachte ich in Zukunft.
Als Anfänger ist es immer gut zu wissen, mit welchen Modulen man hantiert, um einen Überblick zu bekommen.
Das Try-Catch Konstrukt werde ich ergänzen und sobald ich Lust dazu habe auch dem Skript ein ansehentliches Äußeres geben.

In dem Sinne Danke für eure Hilfe.