#1 Le 06/04/2013, à 10:28
- ibra21
wx python : gérer des événements de click sur un bouton
Bonjour je suis nouveau en wxPython. J'ai écris un petit script dans lequel il y a 2 boutons l'un pour Valider et l'autre pour Quitter mais à chaque fois que je cliques soit n'importe lequel des boutons c'est l'événement associé à Quitter qui s'exécute.
Que dois je faire?
Hors ligne
#2 Le 06/04/2013, à 10:30
- pingouinux
Re : wx python : gérer des événements de click sur un bouton
Bonjour,
Que dois je faire?
Peut-être nous montrer le script…
Hors ligne
#3 Le 06/04/2013, à 10:42
- ibra21
Re : wx python : gérer des événements de click sur un bouton
Bonjour,
Peut-être nous montrer le script…
le voici :
#!/usr/bin/python
# -*- coding:utf-8 -*
import wx
class Frame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self,parent,id,title,size=(350,250), style=wx.DEFAULT_DIALOG_STYLE)
sizer = wx.GridBagSizer()
self.panel = wx.Panel(self,-1)
sizer.Add(self.panel,(-1,self.GetSize().y),(-1,self.GetSize().y),wx.EXPAND)
self.bouton = wx.Button(self, 5, "DEMARRER", (120, 85))
self.bouton.SetFocus()
self.Bind(wx.EVT_BUTTON, self.OnNetoyer)
self.bouton = wx.Button(self, 6, "QUITTER", (240, 200))
self.Bind(wx.EVT_BUTTON, self.OnQuitter)
def OnNetoyer(self, event):
self.bouton.Destroy()
self.taillematrice()
def OnQuit(self, event):
self.Destroy()
class MyApp(wx.App):
def OnInit(self):
frame = Frame(None,-1,"MyApp")
frame.Center()
frame.Show(True)
return True
app = MyApp(0)
app.MainLoop()
Hors ligne
#4 Le 06/04/2013, à 11:59
- Jules Petibidon
Re : wx python : gérer des événements de click sur un bouton
Hello,
alors déjà :
self.bouton = wx.Button(self, 5, "DEMARRER", (120, 85))
self.bouton.SetFocus()
self.Bind(wx.EVT_BUTTON, self.OnNetoyer)
self.bouton = wx.Button(self, 6, "QUITTER", (240, 200))
self.Bind(wx.EVT_BUTTON, self.OnQuitter)
tu lie tes deux boutons à la même propriété : La seconde affectation écrase la première. Du coup ça sert un peu à pas grand chose. Mais en même temps c'est pas ça qui pose soucis.
Ton problème vient plutot de là :
self.Bind(wx.EVT_BUTTON, self.OnNetoyer)
...
self.Bind(wx.EVT_BUTTON, self.OnQuitter)
Tu fais une erreur similaire. Les événements EVT_BUTTON sont liés à ta fenetre, qui n'a aucun moyen d'identifier l'emetteur. Je sais pas comment wx gère ça, mais soit il exécute les deux fonctions enrgistrées dans l'ordre, soit la dernière fonction enregistrée écrase la précédente.
Une proposition de correction (codée à la rache et non testée):
self.bouton1 = wx.Button(self, 5, "DEMARRER", (120, 85))
self.bouton1.SetFocus()
self.bouton1.Bind(wx.EVT_BUTTON, self.OnNetoyer)
self.bouton2 = wx.Button(self, 6, "QUITTER", (240, 200))
self.bouton2.Bind(wx.EVT_BUTTON, self.OnQuitter)
Sachant qu'à moins d'un besoin explicite, lier les boutons à l'instance est inutile
self.bouton1 = ...
et
bouton1 = ...
fonctionneront aussi bien et éviteront de polluer la classe avec des propriétés inutiles
Petit bonus trololo :
Si tu as le choix entre des libs graphiques : wx est très bien mais dispose d'une doc assez pourrie
C'est aussi le cas de GTK.
Par contre Qt dispose d'une très bonne documentation, c'est plus facile du coup
Et sinon tu as des tuto assez pratiques pour se mettre le pied à l'étrier ici : http://zetcode.com
Hors ligne