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?