Seite 1 von 1

Fenster geometry

Verfasst: Sonntag 16. Mai 2010, 13:25
von Pascal
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

Re: Fenster geometry

Verfasst: Montag 17. Mai 2010, 23:38
von wuf
Hallo Pascal

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

Gruß wuf :(

Re: Fenster geometry

Verfasst: Dienstag 18. Mai 2010, 14:04
von Pascal
Danke, allerdings suche ich noch, wie es es auf mein konkretes Problem übertragen kann.

Re: Fenster geometry

Verfasst: Dienstag 18. Mai 2010, 16:02
von wuf
.... Wie sieht dein konkretes Problem aus?

Gruss wuf :?

Re: Fenster geometry

Verfasst: Dienstag 18. Mai 2010, 20:39
von Pascal
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.

Re: Fenster geometry

Verfasst: Dienstag 18. Mai 2010, 22:12
von wuf
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:

Re: Fenster geometry

Verfasst: Mittwoch 19. Mai 2010, 16:23
von Pascal
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.

Re: Fenster geometry

Verfasst: Mittwoch 19. Mai 2010, 17:37
von wuf
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:

Re: Fenster geometry

Verfasst: Mittwoch 19. Mai 2010, 18:20
von wuf
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:

Re: Fenster geometry

Verfasst: Mittwoch 19. Mai 2010, 19:03
von Pascal
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

Re: Fenster geometry

Verfasst: Donnerstag 20. Mai 2010, 14:48
von Pascal
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.

Re: Fenster geometry

Verfasst: Donnerstag 20. Mai 2010, 16:54
von 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.