2017-06-03 8 views
0

Ich habe ein Python-Skript und eine Textdatei, die eine Liste von Zeiten (String) wie 18:59, 19:00, 19:02, etc ... jeweils in einer anderen Zeile enthält. Ich möchte die Farbe eines Etiketts in tkinter ändern, wenn die Zeit in der Datei die aktuelle Zeit ist.Tkinter Fenster schließt während der Laufzeit

Das Problem ist, das tkinter Fenster schließt sich, sobald es geöffnet wird und öffnet sich wieder, sobald alles abgeschlossen ist. Ich habe versucht, update_idletasks zu verwenden. Das hat aber nichts geändert. Hier ist die erforderliche Code-Struktur:

class gui(Frame): 
    def __init__(self, parent, txt2, index): 
    Frame.__init__(self,parent,background="white") 
    self.parent = parent 
    self.txt2 = txt2 
    self.index = index 
    self.initUI() 
    self.initChange() 

def initUI(self) 
    #initial window with white color label 

def initChange(self) 
    while(last line hasnt reached): 
     if(current time = file time) 
      #line for changing label color and self.index++ 
      self.parent.update_idletasks() 
     sleep(30) 

main() 
    #call all the functions required and root, txt file and initial index is passed as arguments for gui functions 

Da ich gebeten wurde, um alle Funktionen zu setzen habe ich verwendet, ich so tue, aber ich bin Weglassen der Details. Der Code ist zu lang.

def dataextract(xlsheet): 
    #take data from xlsheet 
    #called only once in the main() function 

def fileio(x, txt1) 
    #Write the time list after doing some operations 
    #based on data from xlsheet 

def main(): 
    x = datextract(xlsheet) 
    fileio(x, txt) 
    print "File IO competed..." 
    root = Tk() 
    app = gui(root, txt2, 0) 
    root.mainloop() 

if __name__ == "__main__": 
    main() 
+0

Was ist 'main()'? Und alle Funktionen/Zeilen werden verpasst. Wir können nicht helfen, ohne diese zu sehen. – SneakyTurtle

+0

Haben Sie einen 'Hauptschleifen'? – Pythonista

+0

@Pythonista ja ich mache – Jake259

Antwort

0

Nachdem ich viele Posts im Stack-Überlauf und viele andere Websites durchlaufen hatte, funktionierte meine App gut. Das Problem ist, Python lief auf einem einzigen Thread. Das tkinter-Fenster wird anfänglich einem Thread zugewiesen, und wenn initChange aufgerufen wird, wird der Thread nun von tkinter entfernt. Ich musste nur initChange in einem separaten Thread aufrufen. Um dies zu tun,

class gui(Frame): 
    def __init__(self, parent, txt2, index): 
    Frame.__init__(self,parent,background="white") 
    self.parent = parent 
    self.txt2 = txt2 
    self.index = index 
    self.initUI() 
    thread.start_new_thread(self.initChange,()) 

Aber es ist ein kleines Problem hier. Es gibt eine leichte Verzögerung, da meine While-Schleife jede Sekunde überprüft, wenn die angegebene Zeit erreicht ist. Es wäre sehr hilfreich, wenn jemand Verbesserungen vorschlagen könnte.