2016-03-27 25 views
0

Mein Problem ziehen, ist, dass, wenn ich benutze:Wie Funktionen zu machen, die Linien in einer for-Schleife (tkinter 3.x)

from tkinter import * 
import time 

root = Tk() 
root.geometry("800x850") 

cans=Canvas(root,height=500,width=600) 

a=Scale(root,from_=0,to=600) 
b=Scale(root,from_=0,to=500) 
c=Scale(root,from_=0,to=600) 

for i in range(0,50): 
    cans.create_line(i,0,0,i) #< the loop that i am talking about 

cans.pack() 
root.mainloop() 

was tkinter tut, ist, dass sie wartet, bis die Linien gezeichnet werden (bis sich die Schleife 50 mal wiederholt) und erst dann die App anzeigt.

Was ich versuche mit dieser Schleife zu tun, ist es, tkinter Linien in Echtzeit zu zeichnen, während die App angezeigt wird. Kann mir jemand eine alternative Methode dazu geben oder mir sagen, was mit dem Code nicht stimmt?

UPDATE: Tkinter lässt keine Loops mit seinem Mainloop() laufen, ich hoffe wirklich, dass es eine Alternative dazu gibt.

+0

Bitte schreiben Sie ein [MCVE] (http://stackoverflow.com/help/mcve), wenn Sie Hilfe benötigen. –

+0

Fertig. Tut mir wirklich leid für das Chaos, ich habe komplett vergessen, dass der Rest des Codes wirklich ein Schlüssel dazu ist! Ich glaube, ich habe meinen Kopf verloren, als ich das gepostet habe. – Koteu

+0

Sie können Teilprozesse verwenden und die Linien alle gleichzeitig zeichnen, das ist schneller und einfacher anzupassen, wenn Sie etwas Ähnliches tun müssen. Zusätzlich können Sie die Zeichenfläche erstellen und ** dann ** fügen Sie die Zeilen mit den Unterprozessen –

Antwort

0

In tk (inter) wird Live-Looping mit root.after durchgeführt. Es gibt mehrere Beispiele für SO, die Sie finden können, indem Sie [tkinter] root.after suchen. Die folgende ist eine Version für Ihren Code, reduziert auf einen MCVE, mit den Zeilen, die etwas auseinander liegen.

from tkinter import * 
import time 

root = Tk() 

cans=Canvas(root,height=500,width=600) 
cans.pack() 

delay = 200 # milliseconds 
def draw_line(i=0): 
    if i <= 150: 
     cans.create_line(i,0,0,i) 
     root.after(delay, draw_line, i+3) 

draw_line()  
root.mainloop() 
+0

Eine letzte Frage: Wie macht man das interaktiv? Einfach die Funktion zum Befehl eines Buttons zu machen funktioniert nicht, sollte ich dazu eine gesonderte Frage stellen? – Koteu

+0

Sie fragen mich, weil Ihre vorherige Frage mit dem gleichen Titel über interaktive Eingabe mit Scales war. In jedem Fall empfehle ich dringend, dass Sie in IDLE experimentieren. Kommentieren Sie 'root.mainloop', damit Sie mit der GUI experimentieren und mit ihr interagieren können, nachdem Sie den Code ausgeführt haben. Lesen Sie die Online-Ressourcen in den Dokumenten. Probieren Sie Lösungen für andere TK-Fragen zu SO aus. Stellen Sie dann eine neue Frage, nachdem Sie den neuen Code geschrieben und versucht haben, ihn selbst zu beheben. –

Verwandte Themen