Fenster nachträglich bearbeiten

Fragen zu Tkinter.
Antworten
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Hallo,

ich habe ein Tkinter Fenster, das Linien mit Canvas zeichnet (hier abgekürzt als print 'a.'), und es sollen weitere Linien nachträglich hinzugefügt werden (print 'b.'). Allerdings blockt der mainloop() alle folgenden Zeilen, bis der mainloop geschlossen wird.

Code: Alles auswählen

from Tkinter import Tk

Tk = Tk()

class testapp():
    def __init__(self, master):
        print "a."        
        Tk.mainloop()
        print "b."

testapp(Tk)
Tk.mainloop()
Wie kann ich trotzdem weiterarbeiten? :K Alternativen, Lösungen, Tipps?

Stefan :mrgreen:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
BlackJack

@StefanLawl: Das ``print 'b.'`` vor den Aufruf der Hauptschleife ziehen. Das sollte ja keinen Unterschied machen. Falls es das doch tut, sag mal was Du *eigentlich* machen möchtest. :-)
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Wie schon gesagt, ich möchte ein Fenster haben, welches nach und nach Linien zieht (nach Eingabe oder kontinuierlichem Auslesen einer Datei, welche sich ändert).

Stefan :)
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
BlackJack

@StefanLawl: Wenn der Benutzer dazu etwas eingeben soll, dann packst Du das Linien zeichnen für die jeweilige Eingabe einfach in die Rückruffunktion zu der Eingabe.

Kontinuierlich etwas tun geht nur in soweit, als dass Du Code zeitverzögert von Tk aufrufen lassen kannst, der dann kurz etwas tut. Das geht mit der `after()`-Methode, die es auf jedem Widget gibt.

Linearer Programmablauf ist nicht mehr wirklich drin wenn man ein GUI-Toolkit verwendet. Die arbeiten in aller Regel ereignisbasiert. Der Programmierer sagt wie die GUI aussehen soll, und welche Funktion bei welchem Ereignis aufgerufen werden soll, und gibt dann die Kontrolle an das GUI-Toolkit ab. Wenn ein Ereignis eintritt ruft das den registrierten Code auf. Der darf aber nicht zu lange laufen, denn solange er läuft ist die GUI blockiert. Sie reagiert während der Zeit nicht auf Benutzereingaben und wird auch nicht aktualisiert.

Was man noch machen kann, ist Code in einem Thread laufen lassen. Der darf aber die GUI nicht manipulieren! Um mit dem Hauptthread, in dem die GUI-Hauptschleife läuft zu kommunizieren, kann man eine `Queue.Queue` verwenden. Auf GU-Seite wieder mit `after()` regelmässig nachsehen ob etwas da drin steckt.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Danke für die Antwort,

ich habe schon überlegt mit threads und queues zu arbeiten, das erschien mir dann aber zu viel Aufwand für mein Vorhaben.

Ich glaube ich verwende einfach turtle, da man dort nichts vorkonfigurieren muss und man anschließend Linien ziehen kann.
Ich wollte eigentlich nur ausprobieren, eine Art Diagramm zu erstellen und da erschien mit canvas.create_line() am einfachsten, habe aber nicht daran gedacht, dass das Probleme aufwirft :mrgreen:

Stefan
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du nur ein Diagramm anzeigen willst, dann verwende doch einfach matplotlib.
Das Leben ist wie ein Tennisball.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Danke EyDu :mrgreen:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Antworten