2017-03-18 3 views
0

ich ein Python-Programm, das wie dieses jedochAufruf pack_forget() in einem Thread

from tkinter import * 
import threading, time 
def cancel(): 
    print ("Stop!") 
def thread(): 
    threading.Thread (target = new).start() 
def new(): 
    b.pack_forget() 
    c = Canvas (root, width = 200, height = 25, bg = "white") 
    c.pack() 
    Button (root, text = "OK", command = root.destroy).pack() 
    try: 
     for x in range (200): 
      time.sleep (0.02) 
      c.create_rectangle ((x, 2, x + 1, 26), outline = "green", fill = "green") 
     root.destroy() 
    except: pass 
root = Tk() 
root.title ("Threading") 
b = Button (root, text = "Begin.", command = thread) 
b.pack() 
root.mainloop() 

sieht, stürzt es jedes Mal, wenn ich die pack_forget() aufrufen. Ich weiß, dass ich tun kann, es wie folgt aus:

from tkinter import * 
import threading, time 
def cancel(): 
    print ("Stop!") 
def thread(): 
    b.pack_forget() 
    threading.Thread (target = new).start() 
def new(): 
    c = Canvas (root, width = 200, height = 25, bg = "white") 
    c.pack() 
    Button (root, text = "OK", command = root.destroy).pack() 
    try: 
     for x in range (200): 
      time.sleep (0.02) 
      c.create_rectangle ((x, 2, x + 1, 26), outline = "green", fill = "green") 
     root.destroy() 
    except: pass 
root = Tk() 
root.title ("Threading") 
b = Button (root, text = "Begin.", command = thread) 
b.pack() 
root.mainloop() 

Für andere Programme, aber ist es möglich, pack_forget in einem Thread zu nennen. Vielen Dank.

+0

Ihr erster Block läuft für mich, aber ich hatte Probleme in der Vergangenheit mit tkinter Objekte aus mehreren verschiedenen Threads zu steuern. Ich würde das nicht empfehlen. Warum benutzt du nicht die 'after' Methode von tkinter anstatt eines Threads? – Novel

+0

Dies ist ein Demonstrationsprogramm. In meinem vollen Programm verwende ich es auf einem Stück Code, der in der Zeit, die bis zum Ende benötigt wird, massiv variiert. –

+0

In deinem echten Programm versuchst du auch, einen Fortschrittsbalken zu steuern? Die Verwendung von tkinter-Variablen ist threadsafe, so dass Sie Ihren Fortschrittsbalken an eine IntVar binden und dann int_var.set() vom anderen Thread aufrufen können. – Novel

Antwort

3

Sie können tkinter-Funktionen nicht aus einem anderen Thread als dem Thread aufrufen, in dem Sie die GUI erstellt haben. Sie müssen eine Thread-sichere Warteschlange einrichten und vom Worker-Thread etwas in die Warteschlange stellen. Der Haupt-Thread kann diese Warteschlange abfragen und auf die Daten antworten.

Zum Beispiel könnten Sie etwas so einfach wie "pack_forget" in die Warteschlange legen, und wenn das Hauptprogramm die Zeichenfolge "pack_forget" aus der Warteschlange zieht, weiß es, diese Funktion aufzurufen.

+0

Wie würde ich das tun (Entschuldigung, ich bin relativ neu)? –

Verwandte Themen