Seite 1 von 1

Frames

Verfasst: Dienstag 15. Januar 2008, 16:21
von VitroN
Hallo,
Habe eine recht komplexe Benutzeroberfläche, die ich gerne mit Frames ein wenig übersichtlicher gestalten möchte und auch ne Radiogroup umranden will. In meinem Python-Buch steht nur leider fast nichts dadrüber.
Also, meine Frage: Wie ereuge ich ein Frame und wie bekomme ich es hin, dass es z.B. alles von column 0, row 0 bis column 1, row 13 umrandet? Und wie siehts aus, wenn ich jetzt die ganzen Widgets anordnen will? Kann ich die einfach mit den normalen Befehlen anordnen? So wie ich das verstanden hab, geht das unabhängig von den Widgets in anderen Frames.

Schon mal Danke ;)

VitroN

Tkinter Frame Widget

Verfasst: Dienstag 15. Januar 2008, 17:16
von Pythonierer
Hallo Vitron!
Um ein Frame Widget zu erstellen, gehst du genauso wie bei der Erstellung eines Labels, Buttons, usw. vor. Zudem musst du jedem Widget, das sich im Frame befinden soll, als erstes Parameter den Namen deines Frames übergeben.

Beispiel:

Code: Alles auswählen

import Tkinter as tk
fenster=tk.Tk()

rahmen=tk.Frame(fenster, bd=2, relief="sunken")
rahmen.pack(padx=10, pady=10)

text=tk.Label(rahmen, text="Im Rahmen")
text.pack()

button=tk.Button(fenster, text="Nicht im Rahmen")
button.pack()

fenster.mainloop()
Ich hoffe es klappt, ist nicht getestet :?

Verfasst: Mittwoch 16. Januar 2008, 10:56
von Mawilo
Hallo Vitron,

ich nutze zur Gruppierung gerne auch ein LabelFrame.

Code: Alles auswählen

import Tkinter as tk 

fenster=tk.Tk() 

rahmen=tk.LabelFrame(fenster, bd=2, text='Das ist der Rahmen') 
rahmen.pack(padx=10, pady=10) 

text=tk.Label(rahmen, text="Im Rahmen") 
text.pack() 

button=tk.Button(fenster, text="Nicht im Rahmen") 
button.pack() 

fenster.mainloop()
Damit sieht eine Oberfläche oft übersichtlicher und besser strukturiert aus. So bekommst Du auch die Umrandung hin.

Mawilo

Verfasst: Mittwoch 16. Januar 2008, 15:32
von VitroN
Danke für eure Hilfe...und die Sache mit dem LabelFrame ist hilfreiche

Programmier allerdings mit Klassen und da will Python das Frame nicht als master erkennen...

Code: Alles auswählen

from Tkinter import *

class Programm:

    def __init__(self):
        hauptfenster = Tk()
        rahmen1 = LabelFrame(hauptfenster, bd=2, text='Hallo', font=('MS Sans Serif', 10, 'underline'))
        self.LBiologie1 = Label(rahmen1, text='Biologie')
        rahmen.pack()
        self.LBiologie1.pack()
        hauptfenster.mainloop()
Er gibt keinerlei Fehler aus, startet die Shell, aber nicht das Benutzerfenster und hängt sich dann auf (also nur das Programm nicht der Rechner)
Hab ich da irgendwas falsch gemacht?

Verfasst: Mittwoch 16. Januar 2008, 18:36
von Mawilo
In Zeile 9 muss es rahmen1 heisen.

Code: Alles auswählen

import Tkinter as tk 

class Programm: 

    def __init__(self): 
        hauptfenster = tk.Tk() 
        rahmen1 = tk.LabelFrame(hauptfenster, bd=2, text='Hallo', font=('MS Sans Serif', 10, 'underline')) 
        self.LBiologie1 = tk.Label(rahmen1, text='Biologie') 
        rahmen1.pack() 
        self.LBiologie1.pack() 
        hauptfenster.mainloop()
Programm()
Übergebe das Frame doch an die Klasse. Dann kannst Du das Frame auch als Master verwenden.

Mawilo

Verfasst: Freitag 18. Januar 2008, 12:23
von VitroN

Code: Alles auswählen

from Tkinter import *

class Programm:

    def __init__(self):
        hauptfenster = Tk()
        rahmen1 = LabelFrame(hauptfenster, bd=2, text='Hallo', font=('MS Sans Serif', 10, 'underline'))
        self.LBiologie1 = Label(rahmen1, text='Biologie')
        rahmen1.pack()
        self.LBiologie1.pack()
        hauptfenster.mainloop()
hmm, der will das rahmen1 immernoch nicht erkennen :( ich hab abolut keine Ahnung warum. Fehlt vllt iwo ein self. oder so...
Hab alles ausprobiert: so wie es hier oben steht, mit import Tkinter as tk, mit ner eingenen Klasse für den Rahmen (wo bei ich mir nicht sicher bin wie genau das geht, dass ich die in der anderen class verwende)

Also, er gibt immer diese Fehlermeldung aus:
Traceback (most recent call last):
File "F:\Eigene Dateien\Programm.py", line 277, in <module>
test=Programm()
File "F:\Eigene Dateien\Programm.py", line 25, in __init__
self.LBiologie1 = Label(rahmen1, text='Biologie')
NameError: global name 'rahmen1' is not defined

Verfasst: Freitag 18. Januar 2008, 19:18
von Andy
VitroN hat geschrieben: Also, er gibt immer diese Fehlermeldung aus:
Traceback (most recent call last):
File "F:\Eigene Dateien\Programm.py", line 277, in <module>
test=Programm()
File "F:\Eigene Dateien\Programm.py", line 25, in __init__
self.LBiologie1 = Label(rahmen1, text='Biologie')
NameError: global name 'rahmen1' is not defined
Klar ist nichts definiert, wenn Du Deine Klasse nicht abschliesst. Es fehlt nur dass hier:

Code: Alles auswählen

from Tkinter import *

class Programm:

    def __init__(self):
        hauptfenster = Tk()
        rahmen1 = LabelFrame(hauptfenster, bd=2, text='Hallo', font=('MS Sans Serif', 10, 'underline'))
        self.LBiologie1 = Label(rahmen1, text='Biologie')
        rahmen1.pack()
        self.LBiologie1.pack()
        hauptfenster.mainloop()
programm = Programm()# Das hast Du vergessen!
Und *-Importe sind böse und werden trotzdem in nahezu jeden Tutorial angewendet. (Einfach mal hier nach suchen. Du wirst findig werden)

EDIT: So kannst Du den Frame an eine Klasse binden:

Code: Alles auswählen

import Tkinter as Tk 
  
class Hauptfenster(Tk.Frame): 
    def __init__(self, master): 
        Tk.Frame.__init__(self, master) 
        self.pack(expand='yes', fill='both') 
        self.Button_open = Tk.Button(self,
                                     text='Ok', bg='green',
                                     border="1",relief='ridge',
                                     command=self.opentop2) 
        self.Button_open.pack(expand='true', anchor='n')  
        
    def opentop2(self): 
        # Oeffnet Fenster 2 
        oeffnen = Fenster2(self) 
        
class Fenster2(Tk.Toplevel): 
    def __init__(self, master): 
        # Ein Toplevel 2 erstellen 
        Tk.Toplevel.__init__(self, master) 
        self.Label=Tk.Label(self ,text='Ich bin ein Text',
                            width=10, height=2)
        self.Label.pack(expand='true', fill='both', anchor='n') 
        
        self.grab_set() 
        self.focus_set() 
        self.wait_window() 

def _main(): 
    root = Tk.Tk() 
    app = Hauptfenster(root) 
    root.mainloop() 

if __name__=='__main__': 
    _main()
Gruß Andy