2010-10-20 5 views
0

Chaque fois que j'utilise ce code dans mes applications:Widgets disparaissent après tkMessageBox dans Tkinter

tkMessageBox.showinfo("Test", "Info goes here!") 

une boîte de message apparaît (comme il est censé), mais après avoir cliqué sur OK, la boîte disparaît avec la plupart des autres widgets sur la fenêtre. Comment empêcher les autres widgets de disparaître?


Is Here Mon code:

from Tkinter import * 
import tkMessageBox 
root = Tk() 
root.minsize(600,600) 
root.maxsize(600,600) 
p1 = Label(root, bg='blue') 
p1.place(width=600, height=600) 
b1 = Button(p1, text="Test Button") 
b1.place(x="30", y="50") 
tkMessageBox.showinfo("Test", Info") 
root.mainloop() 
+0

votre code. – pyfunc

+0

c'est définitivement un bug dans votre code. Sans voir une partie de votre code, il est impossible de dire quel est le problème. –

+0

Ok, désolé. Je vais l'ajouter. –

Répondre

1

Ok, il y a quelques petites choses vont mal ici. D'abord, votre étiquette n'a aucune chaîne ou image associée. Par conséquent, sa largeur et sa hauteur seront très petites. Parce que vous utilisez pack, le widget contenant (la fenêtre racine) va "rétrécir pour s'adapter" autour de ce widget et tous les autres widgets que vous emballer dans la fenêtre racine. Deuxièmement, vous utilisez un emplacement pour le bouton, ce qui signifie que sa taille n'affectera pas la taille du parent. Non seulement cela, mais vous placez le bouton à l'intérieur de l'étiquette très minuscule. Ainsi, la seule chose qui contrôle la taille du parent est l'étiquette de sorte que la fenêtre principale finit par être très petite.

Vous avez un autre problème: vous affichez la boîte de dialogue avant d'entrer dans la boucle d'événements. Je suis un peu surpris que cela fonctionne même, mais Tkinter fait parfois des choses inhabituelles sous les couvertures. Vous devriez entrer la boucle d'événement avant d'appeler la boîte de dialogue.

Essayez cette variation de votre code comme point de départ:

from Tkinter import * 
import tkMessageBox 
def showInfo(): 
    tkMessageBox.showinfo("Test","Info") 

root = Tk() 
p1 = Label(root, bg='blue', text="hello") 
p1.pack() 
b1 = Button(root, text="Test Button", command=showInfo) 
b1.pack() 
root.mainloop() 
+0

Ok, ce code a fonctionné pour moi. Mais, j'ai besoin d'utiliser le gestionnaire Place(), comment puis-je développer l'étiquette pour couvrir toute la fenêtre, puis placer les autres widgets sur cela? –

+0

@Zachary Brown: pourquoi avez-vous besoin d'utiliser place? Pour développer l'étiquette, utilisez les options 'remplir' et' développer'. Vous pouvez alors 'pack' (ou' grid') widgets à l'intérieur de l'étiquette si vous le souhaitez. Bien sûr, si vous avez vraiment besoin de placer quelque chose à un x/y précis, vous pouvez utiliser le lieu. C'est inhabituel, mais pas complètement inconnu. –

+0

L'utilisation de grid() place les widgets par rapport à tout le reste de la fenêtre. pack() nécessite un placement côte à côte ou de haut en bas. J'ai besoin de place parce que j'ai plusieurs widgets dont j'ai besoin dans des endroits précis. –

Questions connexes