2011-10-20 6 views
1

Je rencontre un problème avec le gestionnaire de géométrie GRID de Tkinter ou les classes personnalisées ou les deux. Très probablement les deux. Voici le code:Classes Python dans le gestionnaire de grille de Tkinter

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() 

`

Maintenant, voici le problème: ce morceau de code fait tout ce que je veux faire. Il ya trois cadres ici, le cadre supérieur self.f1, l'image du milieu self.f2, le cadre inférieur self.f3, et un simple bouton de quitter. Les cadres supérieur (ligne 0) et inférieur (ligne 2) sont redimensionnés horizontalement (colonne 0) et la ligne du cadre central (ligne 1, colonne 0) reçoit tout le poids à redimensionner horizontalement et verticalement. Tout est bon ... jusqu'à ce que j'essaie d'implémenter ma propre classe myTestFrame.

Chaque fois que j'essaie de remplir un cadre personnalisé en self.f2 avec un widget Text(), les choses vont mal. Il affiche le widget de texte par défaut mais mon redimensionnement devient funky, le placement de GRID est fou. Que se passe-t-il?

ÉDITER !!! La réponse d'unutbu ci-dessous aide certainement le problème de classe. Maintenant, le gestionnaire GRID place un widget de texte correctement à l'intérieur de l'image du milieu self.f2, cependant, même lorsque je mets le sticky dans myText.grid(sticky = N+S+E+W) il ne se développe pas correctement. Donc, je pensais que les éléments suivants:

1) En définissant la fenêtre racine pour être redimensionnable avec le constructeur de class App, je l'ai mis pour que la première ligne et la colonne zeroth de la fenêtre App recevraient toutes l'attribution de l'espace pour redimensionnement en self.rowconfigure(1, weight = 1) et self.columnconfigure(0, weight = 1).

2) Maintenant que la trame self.f2 est placée dans la ligne 1, elle recevra tous les redimensionnements avec self.f2.grid(N+S+E+W).

3) Maintenant, je remplis ce cadre personnalisé avec un widget text() qui est configuré pour occuper tout l'espace dans ce cadre en indiquant self.myText.grid(sticky = N+S+E+W). Mais le widget text() ne remplit pas self.f2! Lorsque je le fais normalement sans classe personnalisée, l'utilisation de l'attribut sticky = N+S+E+W fonctionne correctement. Est-ce que je pense à cela correctement?

Répondre

4

Les Frame.__init__ besoins à passer le parent:

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

exemple Runnable:

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() 
+0

Merci beaucoup. Tout ce que je devais faire était de changer Frame .__ init __ (self, None) en Frame .__ init __ (self, parent). Merci encore. – voxeloctree

+0

J'ai parlé à bientôt. S'il vous plaît voir la modification ci-dessus. Je veux vraiment comprendre ce qui se passe ici. – voxeloctree

+0

'myTestFrame' doit appeler' rowconfigure' et 'columnconfigure' pour définir' weight = 1'. Sinon, les widgets de sa grille ne se développent pas. J'ai appris ceci [ici] (http://www.tkdocs.com/tutorial/grid.html). – unutbu