IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

Recuperer des informations via un evenement


Sujet :

wxPython

Vue hybride

lajuve Recuperer des informations... 10/10/2008, 10h56
Mugen RX Salut, J'ai pensé à... 13/10/2008, 09h01
pacificator Salut, je t'ai fait une... 14/10/2008, 09h52
lajuve mise à jour d'un tree ctrl 14/10/2008, 18h13
Mugen RX Salut, J'ai juste vu... 15/10/2008, 08h28
lajuve Salut Mugen RX, en fait... 15/10/2008, 09h37
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut Recuperer des informations via un evenement
    Titre plus precise : Recuperer des informations via un evenement lors de la fermeture d'une fenetre

    Bonjour à toutes et à tous,

    je lance un nouveau sujet suite à la réponse apportée par Pacificator sur le sujet [Boa] mise à jour d'un treectrl avec une variable globale.

    Pacificator a raison, la methode de la mise à jour de la variable globale n'est pas tres propre.
    En suivant son conseil, je cherche donc à mettre à jour un treectrl à la fermeture d'une autre popup.
    Voici mon probleme: j'ai une premiere frame avec des menus (appelons la Test_frame). En selectionnant un item du premier menu, j'ouvre une seconde boite de dialog (appelé New_Name). A la fermeture de cette boite de dialogue, je souhaite recuperer les informations de New_Name pour mettre à jour le TreeCtrl de Test_frame.

    ci joint le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # correspondant à Test_Frame
    import NewName
     
    def OnMenuFileNewMenu(self, event):
            self.main = NewName.create(None)   
            self.main.Show()                            # creation de la boite de dialogue NewName
            self.Bind(NewName.wx.EVT_BUTTON, sNewName, NewName.OnNewTestNameOKButton())
            print ("valeur de snewname" + sNewName)
            event.Skip()
    Mon souci est le suivant : OnNewTestNameOKButton() n'est pas considéré comme un element de Test_Frame.
    Pour moi c'est normal car il est defini dans New_Name. Par contre je ne comprends pas pourquoi il ne le voit avec la ligne import NewName.

    En recherchant des infos sur Bind, j'ai trouvé les elements suivants :
    Bind(self, target, id1, id2, function) .
    J'ai initialisé les elements comme cela:
    self : NewName.wx.EVT_BUTTON pour dire que c'est sur l'evement BUTTON de la boite de dialog NewName,
    target :sNewName : variable qui va recuperer les information de la boite de dialogue
    id1 et id2: non mis
    function :NewName.OnNewTestNameOKButton(), fonction de la boite de dialogue qui retourne le texte tape dans textCtrl

    Je ne comprends pas ce qui ne marche pas. Avez vous la moindre idée ?
    Bonne journée
    Lajuve
    et merci d'avoir lu jusqu'au bout

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    Salut,

    J'ai pensé à deux choses. La première, essaie d'initialisé ton ID, sNewName avec

    Me demande pas pourquoi car je me rappelle plus mais pour les événements il me semble qu'il te faut l'initialiser d'une certaine manière. Dans mon menue principale ou j'ai mes événements j''initialise tous mes ID comme ca.

    Ensuite, tu as essayé de séparer ton NewName.OnNewTestNameOKButton()
    et de la mettre avant le Bind, déjà pour voir si cela fonctionne et si ca passe mieux.

  3. #3
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut,

    je t'ai fait une petite demo, j'espère que cela t'aidera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    # -*- coding: iso-8859-15 -*-
     
    import wx
     
    class MyDialogFrame(wx.Frame):
     
    	def __init__(self, *args, **kwargs):
    		wx.Frame.__init__(self, *args, **kwargs)
     
    		self.CreateWidgets()
    		self.DoLayout()
     
    	def  CreateWidgets(self):
     
    		panel = wx.Panel(self, -1)
    		self.panel = panel
    		self.txtCtrl = wx.TextCtrl(panel, -1, "nouveau noeud")
    		self.btn = wx.Button(panel, -1, "ajouter")
     
    	def DoLayout(self):
     
    		szr = wx.GridBagSizer(5, 5)
    		szr.Add(self.txtCtrl, (0, 0), flag=wx.EXPAND)	
    		szr.Add(self.btn, (1, 0), flag=wx.ALIGN_RIGHT)
    		szr.AddGrowableCol(0)
    		self.panel.SetSizer(szr)
     
     
     
    class MyFrame(wx.Frame):
     
    	def __init__(self, *args, **kwargs):
    		wx.Frame.__init__(self, *args, **kwargs)
     
    		self.CreateWidgets()
    		self.DoLayout()
    		self.DoBinding()
    		self.Populate()
     
    	def  CreateWidgets(self):
     
    		panel = wx.Panel(self, -1)
    		self.panel = panel
    		self.tc = wx.TreeCtrl(panel, -1)
    		self.btn = wx.Button(panel, -1,
    				"ajouter un fils au parent sélectionné")
     
    	def DoLayout(self):
     
    		szr = wx.GridBagSizer(5, 5)
    		szr.Add(self.tc, (0, 0), flag=wx.EXPAND)
    		szr.Add(self.btn, (1, 0), flag=wx.ALIGN_RIGHT)
     
    		szr.AddGrowableCol(0)
    		szr.AddGrowableRow(0)
     
    		self.panel.SetSizerAndFit(szr)
    		self.SetSize(self.GetBestSize())
     
    	def DoBinding(self):
     
    		self.Bind(wx.EVT_BUTTON, self.OnAddButton, self.btn)
    		self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelectItem, self.tc)
     
    	def Populate(self):
     
    		root = self.tc.AddRoot("root item")
    		self.tc.Expand(root)
     
    	def OnAddButton(self, evt):
     
    		# Tente de donner le focus à la fenêtre DialogFrame
    		# Si cela léve une exception, on en deduit que la fenetre
    		# ne doit pas exister: on l'instancie alors
    		# et créer le binding.
     
    		print "OnAddBtn"
    		try:
    			self.frEntry.SetFocus()
    			evt.Skip()
    		except AttributeError:
    			self.frEntry = MyDialogFrame(self, -1)
    			self.frEntry.Show(True)
    			self.SetDialogFrameTitle(self.tc.GetItemText(self.tc.GetSelection()))
    			self.Bind(wx.EVT_BUTTON, self.OnAddNode, self.frEntry.btn)
    			evt.Skip()
     
    	def OnAddNode(self, evt):
    		print "OnAddNode"
    		label = self.frEntry.txtCtrl.GetValue()
    		item = self.tc.GetSelection()
    		if not item.IsOk():
    			evt.Skip()
    			return False
    		self.tc.AppendItem(item, label)
    		evt.Skip()
     
    	def OnSelectItem(self, evt):
    		# modifie le titre de la fenetre de dialogue 
    		print "OnSelectItem"
    		self.SetDialogFrameTitle(self.tc.GetItemText(evt.GetItem()))
    		evt.Skip()
     
    	def SetDialogFrameTitle(self, txt):
    		try:
    			title = u"Ajouter un enfant a l'item '%s'" % txt
    			self.frEntry.SetTitle(title)
    		except AttributeError:
    			pass
     
    if __name__ == "__main__":
     
    	app = wx.PySimpleApp(redirect=False)
    	fr = MyFrame(None, -1, "fenêtre principale")
    	fr.Show(True)
    	app.MainLoop()
    @+

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut mise à jour d'un tree ctrl
    donc sur la piece jointe vous trouverez un second bouton "Add sequence"
    en appuyant sur ce bouton, je souhaite alimenter le treectrl des differents elements choisis
    par l'utilisateur (via les differentes choicebox).
    Dans l'evenement associé à "Add sequence", je suis capable de recuperer
    l'id de la racine de treectrl, ainsi que l'ID du premier child.

    par contre je ne suis pas capable de selectionner ce premier child
    , et par la meme occasion, je n'arrive pas à ajouter un item à ce child.

    ci dessous mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # creation de l'arbre dans le treectrl
    def OnAddTestButton(self, event):
            sCurrentNameTest = ""
            sNewNameTest = ""
            bCurrentStatus = self.treeCtrl1.IsEmpty()
            print("valeur de currentNameTest : " + str(bCurrentStatus))
            sNewNameTest = self.textCtrl1.GetValue()
            print("valeur de sNewNameTest : " + sNewNameTest)
     
            if (bCurrentStatus == True):
                racine = self.treeCtrl1.AddRoot(sNewNameTest)
                self.treeCtrl1.SetPyData(racine, None)
                InitChild = self.treeCtrl1.AppendItem(racine, "Init")
                TestChild = self.treeCtrl1.AppendItem(racine, "Test") 
                InitEndChild = self.treeCtrl1.AppendItem(racine, "InitEnd")
                self.treeCtrl1.Expand(racine) 
            else:
                print("racine deja present")
            event.Skip()
     
     
    # mise de l'arbre dans le treectrl avec le bouton addsequence
        def OnAddSequenceButton(self, event):
            sWhereAddSeq = ""
            sItemAddSeq =""
            iWhereAddSeq = self.choice1.GetCurrentSelection()
            sWhereAddSeq = self.choice1.GetStringSelection()
            print("ou va etre place la nouvelle sequence :" + str(sWhereAddSeq))
            if (iWhereAddSeq == iNULL):
                print("va etre place dans init")
                sItemAddSeq = self.choice2.GetStringSelection()
     
    	    # recuperation de l'id de la racine de l'arbre
                root= self.treeCtrl1.GetRootItem()
     
     	    # recuperation de l'id du premier child
                Init = self.treeCtrl1.GetFirstChild(root)
     
    	    # selection et mise à jour du child "Init"
                self.treeCtrl1.SelectItem(self.treeCtrl1.Init, True)
                Item = self.treeCtrl1.AppendItem(self.treeCtrl1.Init, self.sItemAddSeq)
                print("valeur de Item" + str(Item))
                self.treeCtrl1.SetPyData(Item, None)
                self.treeCtrl1.Refresh()
            event.Skip()

    le probleme est que Init n'est pas reconnu comme un element de TreeCtrl

    avez vous la moindre idée ?
    et merci d'avoir lu jusqu'au bout
    bonne soirée
    Lajuve
    Images attachées Images attachées  

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    Salut,

    J'ai juste vu cela au moment ou tu utilises ton Init, pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.treeCtrl1.SelectItem(self.treeCtrl1.Init, True) ICI
    Item = self.treeCtrl1.AppendItem(self.treeCtrl1.Init, self.sItemAddSeq)
    Tu utilises pas directement ta variable Init?Pareil dessous?
    C'est peut être fait pour mais ca me semblait bizarre.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut
    Salut Mugen RX,

    en fait tu viens de mettre en relief le probleme.
    Je n'arrive pas à accéder à aux differents elements du treeCtrl.

    J'ai essayé d'utiliser directement l'element Init, mais BoaCosntructor m'annonce qu' il ne connait pas la variable global (ou Init n'est pas definie).

    Ce point me parait bizarre, vu que (pour moi) je recupere l'ID juste avant.
    Pour resoudre ce probleme, je pensais utiliser une fonction en dehors des evenements qui mettrait à jour le treectrl et utiliser à nouveaux des variables globales.
    J'aimerais eviter cette solution

    Si tu as la moindre idée je suis preneur
    merci et bonne journée
    Lajuve

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2007, 18h19
  2. Récupération des informations du fichier mdl
    Par Sensib dans le forum MATLAB
    Réponses: 3
    Dernier message: 17/11/2006, 17h16
  3. [Layout] Récuperation des informations saisies
    Par imane_bennouna dans le forum Struts 1
    Réponses: 1
    Dernier message: 18/08/2006, 10h10
  4. Réponses: 8
    Dernier message: 13/07/2006, 01h17
  5. Réponses: 4
    Dernier message: 08/07/2006, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo