Button und While

Fragen zu Tkinter.
Antworten
IgelaufReisen
User
Beiträge: 49
Registriert: Montag 29. Oktober 2007, 20:10
Wohnort: Berlin
Kontaktdaten:

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.
IgelaufReisen
User
Beiträge: 49
Registriert: Montag 29. Oktober 2007, 20:10
Wohnort: Berlin
Kontaktdaten:

Also wen das mit sendkey irritiert:
Das kann auch durch print 'hallo' ersetzt werden.
Kommt das gleiche bei raus. sendkey is nur was Spezielleres.
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.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
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.
IgelaufReisen
User
Beiträge: 49
Registriert: Montag 29. Oktober 2007, 20:10
Wohnort: Berlin
Kontaktdaten:

Ok.
Das Programm läuft jetzt so, wie es soll.
Aber wieso das geht, weiß ich nicht.
Wie funktionieren diese Threads?
Gruß
Igel
IgelaufReisen
User
Beiträge: 49
Registriert: Montag 29. Oktober 2007, 20:10
Wohnort: Berlin
Kontaktdaten:

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
Antworten