ubuntuusers.de

Python: Intervallabfrage

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

DrSheldonCooper

Anmeldungsdatum:
18. März 2010

Beiträge: 11

Hallo,

ich habe ein kleines Problem mit meinem Programm ☺.

Zuerst einmal dazu was mein Programm könnten sollte: ich drücke einen Knopf oder aktiviere einen Checkbutton und dann soll das Programm in einem bestimmten Intervall etwas ausführen. Das ganze kann ich mit dem Knopf/Checkbutton dann auch wieder deaktivieren.

Nun zu meinem Problem: Ich aktiviere den Checkbutton aus meinem Programm und die Schleife startet und führt den Befehl auch alle 5 Sekunden aus. Jedoch blockiert meine Schleife die GUI und ich kann sie somit nicht mehr deaktivieren.

Ich bin um Tipps, Denkanstösse oder was auch immer dankbar ☺

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from Tkinter import *
import time

root = Tk()

def Minimalbeispiel():
	global intervall
        frame = Frame(root, bd = 1, relief = SUNKEN)
        frame.grid()
	
	intervall = BooleanVar()
        Checkbutton(frame, text = "start", variable = intervall, onvalue = 1, offvalue = 0, command = start, width=50).grid(row = 1, column = 1, sticky = EW)
	
	root.mainloop()

def start():
	while intervall.get():
		print u"Ich soll in 5 Sekunden wieder erscheinen"
		time.sleep(5)

Minimalbeispiel()

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Such mal nach dem Begriff "timer" (oder ähnliches) für dein Toolkit. Du willst ja offenbar nicht, dass dein Programm anhält, sondern eher, dass eine bestimmte Aktion nach einer bestimmten Zeitspanne ausgeführt wird.

DrSheldonCooper

(Themenstarter)

Anmeldungsdatum:
18. März 2010

Beiträge: 11

zuerst einmal danke.

Ich habe einen Timer vom sched-Paket eingebaut und die while-Schleife durch eine if-Abfrage ersetzt. Jedoch tritt das gleiche Problem wie aus dem ersten Post auf.

Hier mal der neue Code:

from Tkinter import *
import time
import sched


root = Tk()
intervall = BooleanVar()
timer = sched.scheduler(time.time, time.sleep)

def Minimalbeispiel():
        frame = Frame(root, bd = 1, relief = SUNKEN)
        frame.grid()
	
	
        Checkbutton(frame, text = "start", variable = intervall, onvalue = 1, offvalue = 0, command = start, width=50).grid(row = 1, column = 1, sticky = EW)

	root.mainloop()
def start():
	if intervall.get():
		print u"Ich soll in 5 Sekunden wieder erscheinen"
		timer.enter(5, 1, start, ())
		timer.run()

Minimalbeispiel()

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ich sagte ja eigentlich: Suche etwas für *dein Toolkit* (in diesem Fall offensichtlich TKinter). Python-eigene Sachen können mit dem Zeug von der GUI Schwierigkeiten kriegen.

Ich war aber mal so frei, selbst nachzuschauen, wobei ich kein TKinter-Experte bin. Alle Widgets haben wohl die Methode .after(), welche die Wartezeit als delay (Achtung: Angabe in Millisekunden) und dann die Funktion als callback annehmen. Dahinter können dann ggf die Argumente mitgegeben werden, die zum Funktionsaufruf benötigt werden. Hier der entsprechende Link zur (englischsprachigen) Doku, die zudem noch erklärt, wie man einen bereits aktivierten Timer wieder stoppen kann.

DrSheldonCooper

(Themenstarter)

Anmeldungsdatum:
18. März 2010

Beiträge: 11

Das war des Rätsels Lösung ☺. Klappt jetzt alles wunderbar.

from Tkinter import *

root = Tk()
intervall = BooleanVar()

def Minimalbeispiel():
        frame = Frame(root, bd = 1, relief = SUNKEN)
        frame.grid()
		
        Checkbutton(frame, text = "start", variable = intervall, onvalue = 1, offvalue = 0, command = start, width=50).grid(row = 1, column = 1, sticky = EW)

	root.mainloop()

def start():
	if intervall.get():
		print u"Ich soll in 5 Sekunden wieder erscheinen"
		root.after ( 5000, start)

Minimalbeispiel()
Antworten |