Tkinter und parallele Threads für Status

Fragen zu Tkinter.
Antworten
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

Hallo,
mein Programm sieht so aus:

Code: Alles auswählen

from huffmanCode import *
from Tkinter import *
from tkFileDialog import *
import thread
import time
a=True

win=Tk()
win.title('Huffman-Komprimierer')
fenster=Frame(win).pack()
percent2=StringVar()
percent2.set(str(0.0)+' Prozent')
def run():
    thread.start_new_thread(status,())
    myPath()        
    
def myPath():
    global a
    a=True
    myPath = askopenfilename(filetypes=[("alle Formate", "*")])
    hu=huffman(myPath)
    if myPath[-4:]=='.txt':
        hu.write()
    elif myPath[-4:]=='.dsm':
        hu.read()
    else:
        print 'Fehler'
    a=False
def status():
    while a:
        f=open('Fortschritt','r')
        percent2.set(f.read())
        f.close()
        win.update()
        time.sleep(1)

#p1.join()
#p2.join()
Input=Button(fenster, text='Input-Datei', command=run).pack()
Prozent=Label(fenster, textvariable=percent2).pack()
mainloop()
win.destroy()
, funktioniert aber nicht.
Das Programm hängt sich jedes Mal auf. Ziel ist es, das die Programme myPath() und status() parallel ablaufen, ich hoffe jemand kann mir helfen.

MfGrüßen
daniels7[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du solltest dich erst einmal mit den Grundlagen von Tkinter vertraut machen. Dazu gehört u.a.:
- Unterschied zwischen der Erzeugung eines Widgets und der Anzeige eines Widgets (z.B. mittels pack()). Du kannst zwar beides auf einmal machen, aber dann kannst du auf das Widget nicht mehr zugreifen, weil eben keine Widget-Instanz, sondern der Rückgabewert von pack() - ich vermute mal None - zurückgeliefert wird.
- Alles, was hinter mainloop() steht, wird nicht mehr ausgeführt. Nachdem die Mainloop aufgesetzt ist, verläuft der weitere Ablauf event-gesteuert.
- Die Kombination "GUI und Threads" ist grundsätzlich nicht unproblematisch. Wenn man weiß wie, lässt sich da was machen. Dazu gibt es - speziell zu Tkinter und Threads - schon einige gute Beiträge hier im Forum. Kannst ja mal nach suchen.

Außerdem: Auf die Sternchen-Importe verzichten.
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

Inzwischen funktioniert das Programm genauso wie ich es haben will, bis auf einen kleinen Fehler, wenn es durchgelaufen ist reagiert die gui nicht mehr. ich denke es löst sich wenn ich die threads beenden kann, aber ich weiß nicht wie. hier der code:

Code: Alles auswählen

from huffmanCode import *
from Tkinter import *
from tkFileDialog import *
import thread
import time
import sys
import os
a=True

win=Tk()
win.title('Huffman-Komprimierer')
fenster=Frame(win,width=300).pack()
percent2=StringVar()
percent2.set(str(0.0)+' Prozent')
def run():
    myPath()
    thread.start_new_thread(huff,())
    thread.start_new_thread(status,())
    
def myPath():
    tid = os.getpid()
    global a
    a=True
    global myPath
    myPath = askopenfilename(filetypes=[("alle Formate", "*")])
def huff():
    hu=huffman(myPath)
    if myPath[-4:]=='.txt':
        hu.write()
    elif myPath[-4:]=='.dsm':
        hu.read()
    else:
        print 'Fehler'
    percent2.set('Status: Abgeschlossen')
    win.update()
    print 'Fertig'
    
    
def status():
    while a:
        try:
            f=open('Fortschritt','r')
            percent2.set('Status: '+f.read())
            f.close()
        except:
            pass


#p1.join()
#p2.join()
Input=Button(fenster, text='Input-Datei', command=run)
Input.pack()
Prozent=Label(fenster, textvariable=percent2)
Prozent.pack()
mainloop()
MfGrüßen
daniels7
Antworten