2017-06-25 1 views
1

durch Blogs, Tutorials und dergleichen anzeigen, ich konnte nicht verstehen, warum der folgende Code wird nicht angezeigt, ein Label in einem Frame. Ich kann diese Aufgabe gut ausführen, wenn ich keine Klasse definiere, aber ich möchte diese Anwendung erstellen, um Frames und andere Widgets dynamischer erstellen zu können. Hier ist der Code. init funktioniert gut und zeigt einen Frame im Root-Fenster entsprechend. Der Code wird ohne Fehler ausgeführt. Ich habe print-Anweisungen und print (type()) -Anweisungen über die Funktion add_heading hinzugefügt, aber es wird immer noch kein Label angezeigt. Hoffentlich kann mir jemand sagen, was ich falsch mache. Vielen Dank im Vorauskann Widget nicht durch Klassen-Def in bestehenden Rahmen

#!/usr/bin/python3 
from tkinter import * 

class CompFrame(Tk): 

    def __init__(self, parent, rows, columns, title): 
     Frame.__init__(self, parent) 
     self.root = parent 
     f_w = screen_width/3 
     f_h = screen_height * .90 
     self = LabelFrame(root, text=title, width=f_w, height=f_h, bg="light grey") 
     self.grid_columnconfigure(columns, weight=1) 
     self.grid(row=rows, column=columns) 
     self.grid_propagate(False) 

    def add_heading(self, title): 
     label_width=12 
     ftitle = Label(self, text=title) 
     ftitle.configure(font='Helvetica 24 bold', width=label_width) 
     ftitle.place(x=".5i", y=".2i") 

root = Tk() 
root.grid_rowconfigure(0, weight=1) 
root.grid_columnconfigure(0, weight=1) 

screen_width = root.winfo_screenwidth() 
screen_height = root.winfo_screenheight() 
root.geometry("%dx%d%d%d" % (screen_width,screen_height,0,0)) 

Calibrator = PhotoImage(file="image1.png") 
Feeeder = PhotoImage(file="image2.PNG") 

frame1 = CompFrame(root, 0, 0, "Component 1") 
frame1.add_heading("NATURAL") 

root.mainloop() 
+1

Ihre 'CompFrame' muss von' Frame', nicht 'Tk' erben . Das ist nicht das ganze Problem, aber es ist Teil des Problems. –

Antwort

0

Der self = LabelFrame(root ... Teil ist schuldig, vielleicht so etwas wie diese versuchen, die Kontrolle über die labelframe zu halten:

from tkinter import * 

class CompFrame(Frame): # Edit with Bryan Oakley comment 

    def __init__(self, parent, rows, columns, title): 
     Frame.__init__(self, parent) 
     self.root = parent 
     f_w = screen_width/3 
     f_h = screen_height * .90 
     self.labelframe = LabelFrame(root, text=title, width=f_w, height=f_h, bg="light grey") 
     self.labelframe.grid_columnconfigure(columns, weight=1) 
     self.labelframe.grid(row=rows, column=columns) 
     self.labelframe.grid_propagate(False) 

    def add_heading(self, title): 
     label_width=12 
     ftitle = Label(self.labelframe, text=title) 
     ftitle.configure(font='Helvetica 24 bold', width=label_width)    
     ftitle.place(x=5, y=2) 
+0

Danke - das funktioniert - Ich habe Tage damit verbracht, das zu betrachten - Kannst du mich auf ein Dokument hinweisen, das erklärt - ich will nicht nur das, aber ich möchte verstehen warum - ich dachte (falsch), dass wenn ich erstellt der LabelFrame in __init__, da self ein LabelFrame war, hätte die Instanziierung der Datei zu der Funktion geführt. Ich verstehe nicht, warum es nicht so war. Warum müsste ich ein self erstellen und ein Attribut erstellen, um die LabelFrame-Referenz zu halten (ich hoffe, dass das Sinn macht) – Kurt

+1

in einer Klasse bezieht sich "self" auf die Instanz, die Sie erstellt haben "frame1 = CompFrame (...)" also if Sie weisen dieses "self" einem anderen Widget zu, Sie bringen die Objekte irgendwie durcheinander. Um andere Widgets zu verwalten, verlinke sie einfach mit einem neuen Klassenattribut wie hier mit 'self.labelframe', dann folge einer einfachen Hierarchie mit Eltern (root> compFrame> labelFrame> label) – PRMoureu

+0

@Kurt http://zetcode.com/ gui/tkinter/layout /, hier gibt es viele Beispiele – PRMoureu

Verwandte Themen