Seite 1 von 1

Button und While

Verfasst: Montag 5. November 2007, 20:45
von IgelaufReisen
Hallöchen liebes Forum.
Ich habe folgendes Programm geschrieben:

Code: Alles auswählen

import SendKeys
import time
import Tkinter
from Tkinter import *
from Tkconstants import *

class neulader:
    def __init__(self):
        a = 0
    def gui(self):
        self.horst = Tkinter.Tk()
        self.oben = Tkinter.Frame (self.horst)
        self.oben.grid(row=1,column=1)
        
        self.knopf1 = Button(self.oben,text='Los',command=self.neuladen)
        self.knopf1.grid(row=1,column=1)
        self.knopf2 = Button(self.oben,text='Stop',command=self.stop)
        self.knopf2.grid(row=1,column=2)
        self.sekauswahl()
        self.oben.mainloop()

    def sekauswahl(self):
        self.unten = Tkinter.Frame (self.horst)
        self.unten.grid(row=2,column=1)
        self.skala1 = Scale(self.unten,from_=3,to=10,orient=HORIZONTAL)
        self.skala1.grid(row=1,column=1)
        

    def neuladen(self):
        self.anzahl = self.skala1.get()
        self.unten.destroy()
        self.unten2 = Tkinter.Frame (self.horst)
        self.unten2.grid(row=2,column=1)
        self.status2 = 'Programm läuft. Ausgabe alle '+(str(self.anzahl))+' Sekunden.'
        self.status1 = Label(self.unten2,text=str(self.status2))
        self.status1.grid(row=1,column=1)
        self.bernd = 0
        self.karl = 1
          
        while self.bernd < self.karl:
            time.sleep(self.anzahl)
            SendKeys.SendKeys   ('''
                                    Hallo!
                                ''')      
   
    def stop(self):
        self.bernd += 1
        self.unten2.destroy()
        self.sekauswahl()
        
        
birgit = neulader()
birgit.gui()
Mache ich nach dem Druck auf Los den Editor auf, schreibt der mir alle paar Sekunden (je nachdem, wie gewünscht) "Hallo!" in den Editor. Aber meine Stoptaste funktioniert nicht.
Und der Button bleibt eingedrückt und das Fenster geht gar nicht mehr.
Kann mir jemand sagen, woran das liegt?
Wäre sehr glücklich über Antworten.

Verfasst: Montag 5. November 2007, 21:02
von IgelaufReisen
Also wen das mit sendkey irritiert:
Das kann auch durch print 'hallo' ersetzt werden.
Kommt das gleiche bei raus. sendkey is nur was Spezielleres.

Verfasst: Montag 5. November 2007, 22:51
von BlackJack
Wenn Du auf den Button drückst, dann wird die Funktion aufgerufen und erst wenn die fertig ist "läuft" die GUI wieder. Da die nie aufhört, blockiert die GUI.

Schau Dir mal die `after()`-Methode auf Widgets an.

Die Namensgebung ist etwas komisch.

Verfasst: Dienstag 6. November 2007, 01:08
von kaytec
Hallo IgelaufReisen !!

Na so geht es mal - nur bekomme ich bestimmt gleich Popohaue mit Anlauf, da ich time.sleep() mit Tkinter benutze.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8
import thread
import time
import Tkinter as tk

class neulader(object):
    def __init__(self):
        self.horst = tk.Tk()
        self.oben = tk.Frame (self.horst)
        self.oben.grid(row=1,column=1)
        self.knopf1 = tk.Button(self.oben,text='Los',command=self.start)
        self.knopf1.grid(row=1,column=1)
        self.knopf2 = tk.Button(self.oben,text='Stop',command=self.stop)
        self.knopf2.grid(row=1,column=2)
        self.unten = tk.Frame (self.horst)
        self.unten.grid(row=2,column=1)
        self.skala1 = tk.Scale(self.unten, from_=1 ,to=10,orient=tk.HORIZONTAL)
        self.skala1.grid(row=1,column=1)
        self.horst.mainloop()
    
    def start(self):
        self.anzahl = self.skala1.get()
        self.unten.grid_remove()
        self.unten2 = tk.Frame (self.horst)
        self.unten2.grid(row=2,column=1)
        self.status2 = 'Programm laeuft. Ausgabe alle '+ (str(self.anzahl)) \
                            + ' Sekunden.'
        self.status1 = tk.Label(self.unten2,text=self.status2)
        self.status1.grid(row=1,column=1)
        self.start_thread = True
        self.thread_adresse = thread.start_new_thread(self.ausgabe, ())
        
    def ausgabe(self):
        while self.start_thread:
            time.sleep(self.anzahl)
            print 'Hallo'
   
    def stop(self):
        self.start_thread = False
        self.unten2.grid_forget()
        self.unten.grid()
        
neulader()
gruß frank

Verfasst: Dienstag 6. November 2007, 09:20
von BlackJack
Vielleicht sollte man vor dem starten testen ob schon ein Thread läuft und dann nicht noch einen starten.

Dann ist die Namensgebung an einigen Stellen irreführend und man muss nun nicht wirklich *alles* an das Objekt binden ─ bei einigen Namen würde es reichen, wenn sie nur lokal in der Methode gültig sind.

Verfasst: Dienstag 6. November 2007, 17:26
von IgelaufReisen
Ok.
Das Programm läuft jetzt so, wie es soll.
Aber wieso das geht, weiß ich nicht.
Wie funktionieren diese Threads?
Gruß
Igel

Verfasst: Dienstag 6. November 2007, 17:41
von IgelaufReisen
Ok,
hab mir das mit den Threads in ner sehr ausführlichen Python Referenz durchgelesen.
Danke für die schnelle und tolle Hilfe!
Der Igel