Ausgabe aus einem unsichtbaren Python Prozess

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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?
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

wie wärs mit einenm popup dialog
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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

Das Skript bleibt stehen *bis* Du den Knopf gedrückt hast, danach sollte es weiterlaufen.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@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)
     
     
    
    
    
    
    
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

file sollte man nicht überschreiben.

Dateien sollte man mit with oder einem try..finally Konstrukt öffnen.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@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.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn du gerade mit Tkinter anfängst, solltest du dir *-Imports gar nicht erst angewöhnen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
BlackJack

Oder das Hauptfenster unsichtbar machen. `withdraw()` heisst die Methode glaube ich.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@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
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. :-)
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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