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?
Ausgabe aus einem unsichtbaren Python Prozess
Cool, gefällt mirsea-live hat geschrieben:wie wärs mit einenm popup dialog
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()
Danke
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?
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?
Das Skript bleibt stehen *bis* Du den Knopf gedrückt hast, danach sollte es weiterlaufen.
@BlackJack
Schön wärs. Aber vielleicht mache ich was falsch:
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
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.
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.
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:
MfG
HWK
Code: Alles auswählen
dialog = SimpleDialog(...)
dialog.go()
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?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:MfGCode: Alles auswählen
dialog = SimpleDialog(...) dialog.go()
HWK
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.
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)
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:Boa hat geschrieben:In der Form lässt es sich wenigstens testen.
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)
MfG
HWK
Oder das Hauptfenster unsichtbar machen. `withdraw()` heisst die Methode glaube ich.
Wie peinlich, da steht's ja. Und bei der Uhrzeit kann ich noch nicht einmal die "'s war halt spät" Ausrede verwenden.
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.
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.