Fenster geometry

Fragen zu Tkinter.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Hallo,

Code: Alles auswählen


import Tkinter as tk


def geometry(tkgeo):
    '''macht aus widthxheightxXxY Fensterkoordinaten'''
    x1, y1 = map(int, tkgeo.split('+')[1:])
    x2, y2 = map(int, tkgeo.replace('+', 'x').split('x')[:2])
    x2 += x1
    y2 += y1

    return x1, y1, x2, y2
    


def fenster_erstellen():

    top = tk.Toplevel(win)
    wingeo = geometry(win.winfo_geometry())
    
    #print len(win.winfo_children())
    
    try:
        ## prüfen, ob es sich um ein Fenster handelt 
        win.winfo_children()[-2].geometry('%ix%i+%i+%i' %(300, 100, wingeo[0], wingeo[-1])) 

        x1, y1, x2, y2 = geometry(win.winfo_children()[-2].winfo_geometry())
        top.geometry('%ix%i+%i+%i' %(300, 100, x1, y2))

        
    except AttributeError: ## Button instance has no attribute 'geometry'
        top.geometry('%ix%i+%i+%i' %(300, 100, wingeo[0], wingeo[-1]))
    



win = tk.Tk()

win.geometry('300x100+10+10')
mehr = tk.Button(win, text='Ich will mehr Fenster!', command=fenster_erstellen)
mehr.pack(padx=20, pady=20)


win.mainloop()

Dieses Skript soll (was es teilweise auch tut) Toplevel-Fenster erzeugen, die genau unter dem letzten Fenster liegen.
Das klappt 3 mal ganz gut, doch dann wird nur noch das letzte Fenster verschoben.

Und noch eine zweite Sache: Wie kann ich herausfinden, um was für ein Widget es sich handelt.

Pascal
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Pascal

Hier etwas zum herumexperimentieren:
http://paste.pocoo.org/show/215045/

Gruß wuf :(
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Danke, allerdings suche ich noch, wie es es auf mein konkretes Problem übertragen kann.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

.... Wie sieht dein konkretes Problem aus?

Gruss wuf :?
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Die Toplevel-Fenster sollen untereinander angeordnet sein.
Bei meinem Code geht das gut, bis zum dritten Fenster.
Bei deinem Code liegen die Fenster versetzt übereinander.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Pascal

Bei meinem Code-Beispiel werden die mit der Schaltfäche 'Erstelle Toplevel-Fenster' Toplevel-Fenster genau hinter das Hauptfenster platziert. Mit der Schaltfläche 'Zeige Toplevel-Fenster' platziere ich die erstelletn Toplevel-Fenster unterhalb des Hauptfensters versetzt nur für Demozwecke um zu zeigen, dass sie auch wirklich vorhanden sind. Wenn du also nach dem erstellen der Toplevel-Fenster mittels der Schaltfäche 'Erstelle Toplevel-Fenster' es unterlässt sie mit der Schaltfäche 'Zeige Toplevel-Fenster' sichtbar zu machen entspricht dies genau deinem Wunsch. Alle erstellten Toplevel-Fenster bleiben hinter dem Hauptfenster. Du kannst dies kontrollieren indem du das Hauptfenster auf die Seite ziehst. Als erstes siehst du dann das Toplevel-Fenster-0. Oder du kannst das Hauptfenster an seiner ursprünglichen Position stehen lassen und das gewünschte Toplevel-Fenster durch anklicken seines Namens in der Listbox ganz nach oben über das Hauptfenster hieven. Probier es einmal aus.

Gruß wuf :wink:
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Ja, das hab ich schon selbst festgestellt.
Kann es sein, dass wir ein Verständisproblem haben? Untereinander heißt bei mir nicht, dass die Fenster verdeckt sein sollen, sondern Auf dem Bildschirm das eine Fenster unter dem anderen ist. Also die Koordinaten müssen sich anpassen.
wenn das erste das erste Toplevel-fenster 100x100+10+10 hat, dann das zweite 100x100+110+10, das dritte 100x100+210+10 usw.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

OK Pascal

Sorry da habe ich dich tatsächlich missverstanden. Um dich nicht ein zweites mal zu missverstehen. Die Geometriedaten werden doch wie folgt an das Toplevel-Fenster übergeben:

Code: Alles auswählen

toplevel_obj.geometry("width x heigth + xpos + ypos")
Das heisst nach deiner Angabe würden die Toplevel-Fenster nebeneinander und nicht untereinander platziert. Ist meine Interpretation richtig?

Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hier eine angepasste Variante meines Skriptes:
http://paste.pocoo.org/show/215838/

Bemerkungen:
a) Die Toplevel-Fenster lassen sich nicht ausserhalb der Bildschirmgeometrie platzieren!
b) Beim löschen von Toplevel-Fenstern musst du die Positionskoordinaten für die Platzierung neuer Toplevel-Fenster selber verwalten.

Gruß wuf :wink:
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

wuf hat geschrieben: Das heisst nach deiner Angabe würden die Toplevel-Fenster nebeneinander und nicht untereinander platziert. Ist meine Interpretation richtig?

Das habe ich schon befürchtet :roll:
Ich verwechsel die Koordinaten immer
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Vielen Dank. Ich werde es an meine Bedürfnisse anpassen.
wuf hat geschrieben: Beim löschen von Toplevel-Fenstern musst du die Positionskoordinaten für die Platzierung neuer Toplevel-Fenster selber verwalten.
Das könnte zum Problem werden...

In meiner Vorstellung sollte es eine Prozedur geben, die die Anordnung neu vornimmt.
Aus win.winfo_children() sollen die Toplevel-Fenster rausgesucht werden und dann dem entsprechend neu angeordnet werden.

Ich melde mich hier wieder, wenn ich auch Probleme stoße oder es lösen sollte.
BlackJack

@Pascal: Das mit dem raussuchen aus den Kindern eines Widgets würde ich sein lassen und lieber explizit die `Toplevel`-Exemplare in einer Datenstruktur verwalten. Dann muss man sich die nicht raussuchen und man bekommt auch keine Probleme wenn es vielleicht auch noch andere Dialoge oder ähnliches geben sollte, die nicht so verwaltet werden sollen.
Antworten