2 Stimmen

Python-Klassen in Tkinters Grid-Manager

Ich habe ein Problem mit entweder Tkinter's GRID Geometrie-Manager oder benutzerdefinierte Klassen oder beides. Höchstwahrscheinlich beides. Hier ist der Code:

import sys
from tkinter import 

def main():
    app = App()
    app.master.title("Sample application")
    app.mainloop()

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid(sticky=N+S+E+W)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        self.rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)
        self.__createWidgets()

    def __createWidgets(self):
        self.f1 = Frame(self, height=100, width=200,
            bg='green')
        self.f1.grid(row=0, column=0, sticky=E+W)

        self.f2 = Frame( self, bg= "yellow", height=100, width=200 ) ############################# CHANGE to self.f2 = myTestFrame( self )
        self.f2.grid(row=1, sticky = N+S+E+W)

        self.f3 = Frame( self, bg = "cyan", height = 100, width = 200 )
        self.f3.grid(row=2, sticky = E+W)

        self.quitButton = Button ( self, text="Quit", command=self.quit )
        self.quitButton.grid(row=4, column=0, columnspan=100,
            sticky=E+W)

class myTestFrame( Frame ):
    def __init__( self, parent):
        Frame.__init__(self, None)

        self.myText = Text( self )
        self.myText.grid()

        #self.testFrame = Frame ( self, bg = "white", height = 100, width = 300 )
        #self.testFrame.grid()

if __name__ == "__main__":
    main()

`

Jetzt kommt das Problem: Dieses Stück Code tut alles, was ich will, dass es tut. Es gibt hier drei Rahmen, der obere Rahmen self.f1 der mittlere Rahmen self.f2 der untere Rahmen self.f3 und eine einfache Schaltfläche zum Beenden. Der obere (Zeile 0) und der untere (Zeile 2) Rahmen ändern die Größe horizontal (Spalte 0) und die Zeile des mittleren Rahmens (Zeile 1, Spalte 0) erhält die gesamte Gewichtung für die horizontale und vertikale Größenänderung. Alles ist gut... BIS ich versuche, meine eigene Klasse zu implementieren myTestFrame .

Immer wenn ich versuche, einen benutzerdefinierten Rahmen in self.f2 mit etwa einem Text() Widget, geht alles drunter und drüber. Es zeigt die Standard-Text-Widget, aber meine Größenänderung geht funky, GRID Platzierung ist verrückt. Was ist da los?

EDIT!!! unutbu's Antwort unten hilft sicherlich mit der Klasse Problem. Jetzt platziert der GRID-Manager ein Text-Widget korrekt innerhalb des mittleren Rahmens self.f2 aber selbst wenn ich den Aufkleber in myText.grid(sticky = N+S+E+W) es sich nicht richtig ausdehnt. Also habe ich mir Folgendes gedacht:

1) Durch Einstellen der Größenänderung des Root-Fensters mit der Option def __init__ Konstrukteur von class App Ich habe es so eingestellt, dass die erste Zeile und die nullte Spalte des App-Fensters den gesamten Platz für die Größenänderung in self.rowconfigure( 1, weight = 1) y self.columnconfigure( 0, weight = 1) .

2) Nun, da der Rahmen self.f2 in Zeile 1 platziert ist, erhält sie die gesamte Größenänderung mit self.f2.grid(N+S+E+W) .

3) Jetzt fülle ich diesen benutzerdefinierten Rahmen mit einer text() Widget, das so eingestellt ist, dass es den gesamten Platz in diesem Rahmen einnimmt, indem es angibt self.myText.grid( sticky = N+S+E+W) .

Aber die text() Widget wird nicht gefüllt self.f2 ! Wenn ich dies normalerweise ohne eine benutzerdefinierte Klasse mache, indem ich die sticky = N+S+E+W Attribut korrekt funktioniert. Sehe ich das richtig?

5voto

unutbu Punkte 769083

En Frame.__init__ muss dem Elternteil übergeben werden:

class myTestFrame( tk.Frame ):
    tk.Frame.__init__(self, parent, *args, **kwargs)

Lauffähiges Beispiel:

import sys
import Tkinter as tk
E=tk.E
W=tk.W
N=tk.N
S=tk.S
def main():
    app = App()
    app.master.title("Sample application")
    app.mainloop()

class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid(sticky=N+S+E+W)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        self.rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)
        self.__createWidgets()

    def __createWidgets(self):
        self.f1 = tk.Frame(self, height=100, width=200, bg='green')
        self.f1.grid(row=0, sticky=E+W)

        self.f2 = myTestFrame(self, bg='yellow', height=100, width=200)

        self.f3 = tk.Frame( self, bg = "cyan", height = 100, width = 200)
        self.f3.grid(row=2, sticky=E+W)

        self.quitButton = tk.Button(self, text="Quit", command=self.quit)
        self.quitButton.grid(row=4, column=0, sticky=E+W)

class myTestFrame( tk.Frame ):
    def __init__(self, parent, cnf={}, **kw):
        tk.Frame.__init__(self, parent, cnf, **kw)
        self.grid(row=1, sticky=N+S+E+W)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)                
        self.myText = tk.Text(self)
        self.myText.grid(row=0, sticky=N+S+E+W)

if __name__ == "__main__":
    main()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X