2010-10-15 8 views
1

Je pense qu'il me manque quelque chose de basique sur Tkinter.Première fenêtre Python Tkinter fonctionne, mais le reste est vide

Quelle serait la bonne façon de créer plusieurs fenêtres avec la même fenêtre racine cachée? Je peux ouvrir une fenêtre, mais une fois fermée, les suivantes apparaissent vides, sans aucun widget. J'ai également remarqué que si je laisse la fenêtre racine visible, elle disparaît lorsque je ferme la première fenêtre "réelle". Je publierais du code, mais je n'ai pas été en mesure de comprendre ce qui provoque le comportement, et mon code actuel est assez compliqué, et doit fonctionner dans un autre programme (encore plus compliqué).

J'ai essayé d'utiliser .quit() ou .destroy() pour fermer les fenêtres, et de mettre mainloop() s et wait_window() boucles dans des endroits différents, mais tout soit a toujours l'erreur ou quelque chose de pire va mal. Je suppose que ce que je cherche est juste une perspective différente.

Mon problème semble similaire à celui here, mais je n'ai pas été en mesure de gagner quelque chose de nouveau à partir de la réponse.

Des idées? Je sais que c'est un peu vague. Merci

Résolu: Cela n'aidera probablement personne, mais j'ai compris le problème. J'ai plusieurs classes de fenêtres, chacune dérivée de Tkinter.Toplevel. Dans ma classe de base Window j'ai fait une fonction close() qui appelle self.destroy(). Ensuite, dans ses sous-classes, j'ai ajouté un code personnalisé pour stocker leur géométrie, etc, et finalement appelé Window.close(self). Quelque chose à ce sujet ne fonctionne pas, parce que si j'utilise simplement self.quit() au lieu d'invoquer close() de la superclasse, tout va bien.

Répondre

2

Votre question est trop vague pour savoir avec certitude quel est le problème. Rassurez-vous, lorsque vous l'utilisez correctement, il est assez facile de créer plusieurs fenêtres, et de les cacher et de les montrer à volonté.

Vous demandez quelle est la bonne façon de créer plusieurs fenêtres; la réponse à cela est d'appeler Toplevel() pour chaque fenêtre, rien de plus, rien de moins. Il vous appartient alors de placer des widgets à l'intérieur de cette fenêtre. Il n'y a pas de secret, pas d'options cachées, pas de commandes supplémentaires. Assurez-vous simplement que le parent de chaque widget enfant est correctement défini.

Voici un exemple simple:

import Tkinter as tk 
import sys 

def exit(): 
    sys.exit(0) 

root = tk.Tk() 
root.wm_withdraw() 
for i in range (10): 
    top = tk.Toplevel(root) 
    top.title("Window %s" % i) 
    label = tk.Label(top, text="This is toplevel #%s" % i) 
    button = tk.Button(top, text="exit", command=exit) 
    label.pack() 
    button.pack() 

root.mainloop() 
+0

Ouais, je la plupart du temps posté dans le désespoir en espérant qu'il y avait une tendance générale évidente je mal utilisé. Merci quand même si – Jeff

Questions connexes