Kann man Frames übereinander legen?

Fragen zu Tkinter.
Antworten
Kiiba
User
Beiträge: 4
Registriert: Sonntag 7. August 2011, 21:03

Hey :!:
Meine Frage wie oben schon beschrieben: Kann man Frames übereinander legen.
Ich habe vor diese einzelnt zu "zerstören" um in einen nächste Ebene zu gelangen.
Oder kann man ganz einfach durch klicken eines Buttons ein neues Python programm starten...
Was ich will sieht ungefäher so aus :wink:

Danke im vorraus..!

Code: Alles auswählen

#IMPS
import tkinter
#die enden

#DEF
def allesende():
    main.destroy()
    
def mfdestroy():
    mf1.destroy()
    
def wkframedes():
    wkframe.destroy()

    
#Main
main = tkinter.Tk()

#------------------------------------------------------------------------------
#Willkommens-Frame

wkframe = tkinter.Frame(main)
wkframe.pack(fill="both")
#Logo
logolb = tkinter.Label(wkframe)
im1 = tkinter.PhotoImage(file="logo.gif")
logolb["image"] = im1
logolb.pack(side="right")
#willkommenende
wkende = tkinter.Button(wkframe, text = "Accept", command = wkframedes)
wkende.pack()
#text
text1 = tkinter.Label(wkframe, text = "Accept the AGB's :P.")
text1.pack(side="left")
#------------------------------------------------------------------------------
#main-Frame1
    
mf1 = tkinter.Frame(main)
mf1.pack(expand=1, fill="both")

#Ende Button 1MF
mfende = tkinter.Button(mf1, text = "Ende", command = mfdestroy)
mfende.pack(side="right")

#Text
text2 = tkinter.Label(mf1, text = "Hallo zu meinem Programm.")
text2.pack(side="left")

#------------------------------------------------------------------------------
#Programm Loop& Ende
#Ende
allesbeendenbuttonknopname = tkinter.Button(main, text = "Programm beenden",
                                            command = allesende)
allesbeendenbuttonknopname.pack(side="bottom")



#Loop
main.mainloop()

Code: Alles auswählen

#Statt einer Falltür, wie wäre es mal mit einem Fallfenster? Der Typ guckt raus, und wenn er sich zu weit rauslehnt, fällt er runter. Moment - ich glaub, das ist wie bei einem normalen Fenster.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Kiiba

Willkommen in unserem Forum. Ja Frames können übereinander gelegt werden. Hier eine Test-Variantel zum herumexperimentieren:

Code: Alles auswählen

import Tkinter as tk

COLOR_LIST = ['yellow', 'green', 'blue', 'red', 'brown']
FRAME_WIDTH = 200
FRANE_HEIGHT = 200
FRAME_OFFSET = 20
XORG = 20
YORG = 20

def create_frame(index):
    frame  = tk.Frame(app_win, width=FRAME_WIDTH, height=FRANE_HEIGHT,
        relief='raised', bd=1, bg=COLOR_LIST[index], cursor='hand1')
    frame.propagate(0) 
    frame.place(x=XORG+index*FRAME_OFFSET, y=YORG+index*FRAME_OFFSET)
    return frame
    
if __name__ == "__main__":
    app_win = tk.Tk()
    app_win.wm_geometry('400x400+20+20')
    app_win.title("Frame-Widget Level")

    frame_obj_list = [create_frame(index) for index in xrange(len(COLOR_LIST))]

    frame_obj_list[-1].lower(None)
    frame_obj_list[2].lower(frame_obj_list[1])
    frame_obj_list[0].lift(None)
    frame_obj_list[3].lift(frame_obj_list[0])
        
    app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Kiiba
User
Beiträge: 4
Registriert: Sonntag 7. August 2011, 21:03

wuf hat geschrieben:Hallo Kiiba

Willkommen in unserem Forum. Ja Frames können übereinander gelegt werden. Hier eine Test-Variantel zum herumexperimentieren:

Gruß wuf :wink:



Danke =) abaabababab hast du das auch für python 3.2 ... ? =o weil .. juaa und ich versteh nicht was das sein soll ich will praktisch einfach ein "interface" wo man ok drücken kann um weiter zu kommen und dann alles weg ist was da war und man dann was komplett anderes hat oder sich vorher "einloggen" muss um auf das nächste zuzugreifen können ...

Code: Alles auswählen

#Statt einer Falltür, wie wäre es mal mit einem Fallfenster? Der Typ guckt raus, und wenn er sich zu weit rauslehnt, fällt er runter. Moment - ich glaub, das ist wie bei einem normalen Fenster.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Warum arbeitest du dann nicht mit Toplevel-Widgets? Theoretisch kann man auch nur ein Toplevel nehmen und immer eine "{geometry manager}_forget()"-Methode benutzen und dann den neuen Frame auf das Toplevel packen. Wenn du aber einfach nur mehrere Fenster hintereinander öffnen möchtest z.B. wie bei einem Install-Dialog unter Windows, kannst du auch schlicht die einzelnen Fenster nacheinander erzeugen.

Ein einfaches Beispiel wie man das mit einem modalen Dialog machen könnte:

Code: Alles auswählen

#/usr/bin/env python3
from tkinter import simpledialog
import tkinter as tk

if __name__ == "__main__":
    root = tk.Tk()
    root.withdraw()

    simpledialog.Dialog(root, "Hallo Welt 1")
    simpledialog.Dialog(root, "Hallo Welt 2")
    simpledialog.Dialog(root, "Hallo Welt 3")
    simpledialog.Dialog(root, "Hallo Welt 4")    

    root.mainloop()
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Kiiba

Hier noch deine Variante mit überlappenden bzw. abdeckenden Frames. Sorry habe dein Skript völlig umgeschrieben um es lesbarer zu machen. Das mit den Frames funktioniert nur, wenn du den 'place'-Layoutmanager für deren Platzierung verwendest. Wird die Grösse des Hauptfensters geändert passen sich die Frames aber nicht automatisch dieser Änderung an. Wollte dich auch darauf aufmerksam machen an Stelle von Frames Toplevel-Fenster zu verwenden. Hierfür wirst du beim durchlesen des Beitrages von Xynon1 bestens informiert.

Code: Alles auswählen

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk
    
def all_close():
    main.destroy()
   
def main_frame_close():
    main_frame.destroy()
   
def close_welcome_frame():
    wellcome_frame.destroy()

#---- Main-Window -------------------------------------------------------------#

XPOS = 10
YPOS = 10
WIDTH = 200
HEIGHT = 200

LABEL_TXT_1 = "Accept the AGB's :P."
LABEL_TXT_2 = "Hallo zu meinem Programm."

main = tk.Tk()
main.geometry("%dx%d+%d+%d" % (WIDTH, HEIGHT, XPOS, YPOS))
main.config(bg='khaki1')

all_close_but = tk.Button(main, text="Programm beenden", command=all_close)
all_close_but.pack(expand=True)

#---- Main-Frame --------------------------------------------------------------#

main_frame = tk.Frame(main, bg='khaki2')
main_frame.place(x=0, y=0, width=WIDTH, height=HEIGHT)

text2 = tk.Label(main_frame, text=LABEL_TXT_2, bg=main_frame['bg'])
text2.pack(expand=True)

main_frame_close_but = tk.Button(main_frame, text="Ende",
    command=main_frame_close)
main_frame_close_but.pack(expand=True)

#---- Wellcome-Frame ----------------------------------------------------------#

wellcome_frame = tk.Frame(main, bg='khaki3')
wellcome_frame.place(x=0, y=0, width=WIDTH, height=HEIGHT)

logo = tk.PhotoImage(file="logo.gif")
logo_label = tk.Label(wellcome_frame, image=logo, bg=wellcome_frame['bg'])
logo_label.pack(expand=True)

text1 = tk.Label(wellcome_frame, text=LABEL_TXT_1, bg=wellcome_frame['bg'])
text1.pack(expand=True)

# Wellcom-Frame schliessen
wellcome_end_but = tk.Button(wellcome_frame, text="Accept",
    command=close_welcome_frame)
wellcome_end_but.pack(expand=True)

main.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Kiiba
User
Beiträge: 4
Registriert: Sonntag 7. August 2011, 21:03

wuf hat geschrieben:Hallo
"wuf" :mrgreen:
:!: Dankee Euch :!:
Xynon1 hat geschrieben:Warum arbeitest du dann nicht mit Toplevel-Widgets?
Weil ich nicht weiß wie ;)
Ich hab mir nur so ein Buch durchgelesen da steht nur mit tkinter diese Sachen ..
http://www.galileocomputing.de/katalog/ ... telID-2640


Wie könnte man denn damit jetzt Frames auf die Dialoge bringen,für die Buttons und Texte..? Ist dann mein main=tk.Tk() einfach ein "Hallo Welt X" und ich kann einfach Sachen herauf schreiben...

Code: Alles auswählen

#/usr/bin/env python3
from tkinter import simpledialog
import tkinter as tk

if __name__ == "__main__":
    root = tk.Tk()
    root.withdraw()

    simpledialog.Dialog(root, "Hallo Welt 1")
    simpledialog.Dialog(root, "Hallo Welt 2")
    simpledialog.Dialog(root, "Hallo Welt 3")
    simpledialog.Dialog(root, "Hallo Welt 4")    

    root.mainloop()
[/quote]
wuf hat geschrieben:Sorry habe dein Skript völlig umgeschrieben um es lesbarer zu machen.
:shock: Ich finde ihn lesbar :( whäääää :lol: .:Danke das du ihn umgeschrieben hast:. wusste garnicht das man Variabelen so
wuf hat geschrieben:"%dx%d+%d+%d" % (WIDTH, HEIGHT, XPOS, YPOS)
dort einbringen kann :/

Code: Alles auswählen

#Statt einer Falltür, wie wäre es mal mit einem Fallfenster? Der Typ guckt raus, und wenn er sich zu weit rauslehnt, fällt er runter. Moment - ich glaub, das ist wie bei einem normalen Fenster.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Kiiba hat geschrieben:Wie könnte man denn damit jetzt Frames auf die Dialoge bringen,für die Buttons und Texte..? Ist dann mein main=tk.Tk() einfach ein "Hallo Welt X" und ich kann einfach Sachen herauf schreiben...
:roll: :mrgreen:
Du musst dein Buch leider nochmals durchlesen aber diesmal genauer und unbedingt alle Beispiele ausprobieren :lol:

Gruß wuf :wink:
Take it easy Mates!
Kiiba
User
Beiträge: 4
Registriert: Sonntag 7. August 2011, 21:03

wuf hat geschrieben: diesmal genauer und unbedingt alle Beispiele ausprobieren
(sad face) xD das ist so megaaa dick (._.') okyy mach ich
Gruß zurück

Ps: instnant massanger :D

Code: Alles auswählen

#Statt einer Falltür, wie wäre es mal mit einem Fallfenster? Der Typ guckt raus, und wenn er sich zu weit rauslehnt, fällt er runter. Moment - ich glaub, das ist wie bei einem normalen Fenster.
Antworten