Comment créer de fenêtre enfant et de communiquer avec les parents dans TkInter
Je suis la création de certains dialogues, en utilisant TkInter, et doivent être en mesure d'ouvrir une enfant de la sous-fenêtre modale ou non modale) en cliquant sur un bouton dans le parent. L'enfant serait alors de permettre un enregistrement de données d'être créé, et les données (soit l'enregistrement ou si l'opération a été annulée) doit être communiquée à la fenêtre parent. Pour l'instant j'ai:
import sel_company_dlg
from Tkinter import Tk
def main():
root = Tk()
myCmp = sel_company_dlg.SelCompanyDlg(root)
root.mainloop()
if __name__ == '__main__':
main()
Ce invoque le haut niveau de la boîte de dialogue qui permet à l'utilisateur de sélectionner une entreprise. L'entreprise de sélection de la boîte de dialogue ressemble à ceci:
class SelCompanyDlg(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent_ = parent
self.frame_ = Frame( self.parent_ )
// .. more init stuff ..
self.btNew_ = Button( self.frame_, text="New ...", command=self.onNew )
def onNew(self):
root = Toplevel()
myCmp = company_dlg.CompanyDlg(root)
En cliquant sur le Nouveau ... bouton, Créer une Société boîte de dialogue s'affiche qui permet à l'utilisateur de remplir les détails de la société et cliquez sur créer ou annuler. Voici l'ouverture de peu:
class CompanyDlg(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
// etc.
Je suis aux prises avec la meilleure façon d'invoquer la boîte de dialogue enfant dans onNew()
- ce que j'ai fonctionne, mais je ne suis pas persuadé que c'est la meilleure approche, et aussi, je ne vois pas comment communiquer les détails à et de la boîte de dialogue enfant.
J'ai essayé de chercher des tutoriels en ligne /références, mais ce que j'ai trouvé est trop simpliste ou met l'accent sur des choses comme tkMessageBox.showinfo()
qui iss pas ce que je veux.
Vous devez vous connecter pour publier un commentaire.
Il existe au moins un couple de façons de résoudre votre problème. Soit votre boîte de dialogue peut envoyer directement les informations à la principale de l'application, ou votre boîte de dialogue peut générer un événement qui raconte l'application principale que les données sont vraiment à être tiré à partir de la boîte de dialogue. Si la boîte de dialogue change simplement l'apparence de quelque chose (par exemple, une boîte de dialogue police) j'ai l'habitude de générer un événement. Si la boîte de dialogue crée ou supprime des données en général, je l'ai pousser de l'information à l'application.
J'en général, l'objet de l'application qui joue le rôle de contrôleur de l'interface graphique dans son ensemble. C'est souvent la même classe que la fenêtre principale, ou il peut être une catégorie distincte ou même défini comme un mixin. Cet objet application a des méthodes que les dialogues peuvent appeler pour flux de données à la demande.
Par exemple:
Lors de la création de la boîte de dialogue, vous pouvez passer d'une référence à l'objet application. La boîte de dialogue sait alors d'appeler une méthode sur cet objet pour envoyer des données à l'application.
Si vous n'êtes pas dans l'ensemble du modèle/vue/contrôleur de chose, vous pouvez facilement passer à une fonction plutôt qu'un objet, de manière efficace de raconter la boîte de dialogue "appel de cette fonction lorsque vous voulez me donner des données".
Dans un de mes projets j'ai essayé de vérifier dans un enfant savoirs traditionnels.Fenêtre Toplevel (enfant1) de ma fenêtre racine (auto), si les savoirs traditionnels.Fenêtre Toplevel (enfant2) a été créé par l'utilisateur à partir de l'intérieur de la fenêtre racine, et si cette fenêtre (enfant2) est présent à l'écran utilisateurs pour le moment.
Si ce ne serait pas le cas, la nouvelle savoirs traditionnels.Fenêtre Toplevel devrait se crée par la fenêtre enfant (enfant1) de la fenêtre racine, au lieu de la fenêtre de la racine elle-même. Et si elle a déjà été créé par la fenêtre racine et est actuellement présent à l'écran utilisateurs, il convient de se concentrer() au lieu de se réinitialisé par "enfant1".
La fenêtre racine a été enveloppé à l'intérieur d'une classe appelée App() et les deux "enfants" de windows ont été créés par des méthodes à l'intérieur de la racine de la classe Application().
J'ai eu à initialiser "enfant2" dans un mode silencieux si un argument donné à la méthode était Vrai. Je suppose que c'est le méli erreur. Le problème est survenu sur Windows 7 64 bits, si c'est important.
J'ai essayé ceci (exemple):
Voici le problème:
Je n'étais pas en mesure de vérifier si "enfant2" est déjà présent. Suis d'erreur: _tkinter.TclError: mauvaise fenêtre de nom de chemin d'accès
Solution:
La seule façon d'obtenir le droit de la fenêtre de nom de chemin d'accès " a été, au lieu d'appeler la winfo_exists() la méthode directement sur le "enfant2" fenêtre, appeler le maître de la "enfant1" de la fenêtre et l'ajout de la fonction d'attributs suivie par les attributs de la fenêtre master que vous souhaitez utiliser.
Exemple (modifier la méthode CheckForChild2):