Frames

Fragen zu Tkinter.
Antworten
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Dienstag 15. Januar 2008, 16:21

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
Pythonierer
User
Beiträge: 41
Registriert: Samstag 13. Januar 2007, 15:26

Dienstag 15. Januar 2008, 17:16

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 :?
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 16. Januar 2008, 10:56

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
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Mittwoch 16. Januar 2008, 15:32

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?
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 16. Januar 2008, 18:36

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
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Freitag 18. Januar 2008, 12:23

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
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Freitag 18. Januar 2008, 19:18

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
Antworten