2010-10-14 4 views
0

J'ai développé de nombreuses applications de bureau en Delphi/Pascal - Ici, j'ai utilisé des formulaires modaux.Application Destop en Python avec plus d'une image!

//Mainform 
Form1:= TForm1.Create(Self); 
If Form1.Showmodal =mrOK then …. 
In Form1 you cal call vars in Mainform like mainform.X := 1 

(je sais - j'utiliser normaly essayer, sauf, enfin)

Je vais maintenant passer à Python et mon problème est le suivant:

Je veux une application avec une fenêtre principale (cadre) où vous pouvez appeler un certain nombre de formes qui peuvent avoir des formulaires et ainsi de suite

Je peux faire un programme avec python et wxpython où un cadre principal créer un nouveau cadre et le montrer - Mais comment puis-je revenir - et comment faire référence au cadre parent - si c'est possibl e!

De mainform

Def OnButton1(self, event): 
    self.main2 = Frame2.create(None) 
    self.main2.Show() 
    self.Hide() 

Quand je suis fait à main2 qui dois-je retourner à Mainform - Il est caché !!

Je sais que je peux utiliser le dialogue, mais j'ai besoin d'un cadre normal !! Ce que je cherche est un petit programme où un mainframe - avec un bouton qui appelle un cadre (Frame1) qui a un bouton qui appelle un cadre (Frame1A)

Je suis nouveau sur Python mais j'ai fait beaucoup d'applications en C, C++, Pascal J'ai regardé presque toutes les démos, mais aucune n'a pu me donner un indice!

Cordialement Mick

+0

Copie possible de: http: // stackoverflow.com/questions/3898988/wxpython-comment-contrôler-une-trame-d'un autre-cadre/3899899 # 3899899 – volting

Répondre

1

curiosité, pourquoi ne pas utiliser une boîte de dialogue?

Quoi qu'il en soit, une solution simple serait de fournir une fonction de rappel au constructeur de Frame2, qui est appelée lorsque Frame2 est sur le point d'être fermé.


class Frame2(wx.wxFrame): 
    def __init__(self, parent, callback, ...) 
     wx.wxFrame(self, parent) 
     self._callback = callback 
     self.bind(wx.EVT_CLOSE, self.OnClose(), self) 

    def OnClose(): 
     self.Destroy() 
     self._callback() 

class Frame1(...): 
    ... 

    def OnButton1(self, event): 
     self.main2 = Frame2(self, self.OnButton1Callback) 
     self.main2.Show() 
     self.Hide() 

    def OnButton1Callback(self) 
     self.Show() 

    ... 

Le code ci-dessus est juste un soupçon, a été jamais testé!

+0

Salut Chris, merci pour la réponse! – Mickdane

+0

solution simple ;-) Pourquoi je n'utilise pas de boîtes de dialogue? c'est peut-être juste moi qui n'ai pas encore assez de connaissances sur python - je ne pensais pas pouvoir utiliser un dialogue de la même manière qu'un cadre - Les nouvelles boîtes de dialogue ont des menus, mais je vais tester pour voir! Mick – Mickdane

1

Il existe plusieurs façons d'obtenir une référence à la trame principale. Lorsque vous créez les images secondaires, vous pouvez les transmettre à None ou à un parent. Si vous passez le cadre principal en tant que parent, vous avez un moyen facile de le référencer.

Alternativement, vous pouvez le faire:

topframe = wx.GetTopLevelParent()

Comme pour montrer un cadre secondaire et se cachant le principal, ce que je fais est d'utiliser Pubsub. Quand j'ouvre le cadre secondaire, je cache le principal. Lorsque je ferme le cadre secondaire, il envoie un message pubsub à la trame principale cachée qui est interceptée et la trame principale est ré-affichée.

Il y a beaucoup d'exemples pubsub sur le wiki wxPython. Il y a aussi cet article écrit:

http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

Hope that helps!

+0

Thanx Mike, Cela ressemble à quelque chose que je comprends donc je l'ai testé et ça marche vraiment! ;-) Je vois aussi beaucoup d'autres options pour cela donc merci .. Mick – Mickdane