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 :

Un problème de ListCtrl


Sujet :

wxPython

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Un problème de ListCtrl
    Bonjour,

    Je me mets à Python et wxPython.
    Je rencontre un problème avec l'utilisation de ListCtrl

    Tout d'abord le code et ensuite la description du problème !

    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
     
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
     
    import wx
    class MyFrame(wx.Frame):
    	def __init__(self, parent, id, title):
    		wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition)
     
    		self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT, size=(-1,-1))
     
    		self.lc.InsertColumn(0, 'Toto')
    		self.lc.InsertColumn(1, 'Tata')
    		self.lc.InsertColumn(2, 'Titi')
     
    		self.lc.InsertStringItem(0, "Toto Un")
    		self.lc.SetStringItem(0,1,"Tata Un")
    		self.lc.SetStringItem(0,2,"Titi Un")
     
    		self.lc.InsertStringItem(0, "Toto Deux")
    		self.lc.SetStringItem(0,1,"Tata Deux")
    		self.lc.SetStringItem(0,2,"Titi Deux")
     
    		self.Bind(wx.EVT_PAINT, self.OnPaint)
     
    	def OnPaint(self, evt):
    		larg, haut = self.lc.GetSize()
    		for i in range(3):
    			self.lc.SetColumnWidth(i, larg/3)
    		evt.Skip() 
     
    class MyApp(wx.App):
    	def OnInit(self):
    		frame = MyFrame(None, -1, "Liste")
    		frame.Show(True)
    		self.SetTopWindow(frame)
    		return True
     
    app = MyApp(0)
    app.MainLoop()
    En fait, rien ne s'affiche ! Si je commente le self.Bind(wx.EVT_PAINT, self.OnPaint), tout fonctionne. De même si je le remplace par un EVT_RESIZE.

    Certainement quelque chose m'échappe.

    Merci d'avance,
    Nicolas.

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai fait des tests et voici ce qui se passe : le même code fonctionne très bien sous linux (ubuntu edgy) mais ne fonctionne pas sous macosx avec MacPython2.4 et wxPython correspondant (pas la version utf-8 l'autre).

    Hier, lorsque j'ai dit que rien ne se passait, je voulais dire que la liste ne s'affichait pas, la fenêtre de l'application apparaissant tout-à-fait normalent ainsi que les "titres" des colonnes...

    Je ne comprends pas : tout se passe comme si l'événement n'était pas relâché par event.Skip().

    Autre question : lorsque j'utilise wx.EVT_SIZE au lieu de EVT_PAINT, ça marche bien SAUF que la taille de la fenêtre donnée par GetSize est cele d'avant le changement de taille. Ce n'est pas très gênant lorsqu'on redimmensionne à la main mais en cas de maximisation de la fenetre c'est très visible. Y a-t-il une solution ?

    Merci,
    Nicolas.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1
    Points : 0
    Points
    0
    Par défaut self.Bind
    Bonjour,
    et en essayant comme ça?
    ....
    self.lc.Bind(wx.EVT_PAINT, self.OnPaintlc)
    .......
    # Les méthodes OnPaint
    .......
    def OnPaintlc(self, evt):
    larg, haut = self.lc.GetSize()
    for i in range(3):
    self.lc.SetColumnWidth(i, larg/3)
    evt.Skip()

    def OnPaintFenetre(self,evt)
    ....................


    L'objectif étant de différencier les OnPaint...
    L'un pour la fenêtre principale l'autre pour le listCtrl, etc...
    Je n'ai pas eu l'occasion d'essayer

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Les interfaces graphiques génèrent des signaux lors de leur création. Paint event, Resize event et tout le toutim.

    Ton slot OnPaint procède à un calcul sur les dimensions de listCtrl qui n'est pas encore affiché et n'a pas de dimensions.


    Solution: lier le signal après frame.Show(True) mais peut-être aussi faudra-t-il forcer wxPython à afficher réellement la fenêtre parce que, souvent, les rafraîchissements graphiques sont reportés après exécution du code.

Discussions similaires

  1. Petit problème avec ListCtrl
    Par gotcha007 dans le forum wxPython
    Réponses: 1
    Dernier message: 06/02/2011, 02h17
  2. problème avec listctrl MFC
    Par steph_1 dans le forum MFC
    Réponses: 21
    Dernier message: 21/09/2009, 09h04
  3. Problème avec un wx.ListCtrl
    Par Ggamer dans le forum wxPython
    Réponses: 2
    Dernier message: 05/11/2008, 18h37
  4. problème avec wx.ListCtrl
    Par malick021988 dans le forum wxPython
    Réponses: 1
    Dernier message: 01/07/2008, 09h07
  5. Problème d'affichage ds un listctrl
    Par cathar_rhythm dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 12h45

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