OVH Cloud OVH Cloud

wxPython : wxMessageBox minimal

2 réponses
Avatar
Sébastien Kirche
Bonjour,

je rencontre un problème avec wxPython pour afficher une MessageBox dans un
script appelé depuis le shell que je n'ai pas lorsque je teste le même code
interactivement avec PyCrust :

wx._core.PyNoAppError: The wx.App object must be created first!

Mon code est minimal :
,----
| #!/usr/bin/python
| # -*- coding: mac-roman -*-
|
| from wxPython import wx
|
| wx.wxMessageBox("bozo le clown")
`----

Je suppose que mon script doit manquer de quelque chose (la classe App ?)
qui est implicitement fourni par PyCrust.

En interrogeant Google, j'ai vu des réponses qui conseillaient de rajouter

app = wx.wxPySimpleApp()
app.MainLoop()

avant l'appel à wxMessageBox, mais cela semble bloquer le script (attente de
MainLoop je suppose).

Pourriez vous me donner un exemple du code minimal permettant l'usage de
wxMessageBox et des autres widgets ?

Merci.

--
Sébastien Kirche

2 réponses

Avatar
jean-michel
Pourriez vous me donner un exemple du code minimal permettant l'usage
de

wxMessageBox et des autres widgets ?


Voici le plus simple que j'arrive à faire:
#-----------------------
# wx 2.4.2.4 - python 2.3.4
from wxPython.wx import *
class myApp(wxApp):
def OnInit(self):
dlg = wxMessageDialog(wxFrame(None,-1,''), 'bozo est bien là !','A
Message Box', wxOK | wxICON_INFORMATION)
dlg.ShowModal()
return False
application = myApp(0)
application.MainLoop()
#-----------------------
Une instance de wxApp est nécessaire (pour la procédure de fenêtre de
Windows, je pense). Cette instance déclenche OnInit. wxMessageDialog a
besoin d'une wxFrame (créée par wxFrame(None,-1,'')). Le return False permet
de terminer wxApp.
Ouf !
Si tu veux juste afficher un message, il me simple qu'il y a plus simple que
wx.
Je me rappelle d'une API toute bête sous Windows qui fait ça en souplesse;
il devrait y avoir la même chose sous X. A voir dans la doc des SDK
respectifs...
Peut-être aussi que d'autres systèmes graphiques sont plus simples pour ça ?

++jm

Avatar
Sébastien Kirche
Le 18 Feb 2005, jean-michel s'est exprimé ainsi :


Pourriez vous me donner un exemple du code minimal permettant l'usage de
wxMessageBox et des autres widgets ?


Voici le plus simple que j'arrive à faire:
#-----------------------
# wx 2.4.2.4 - python 2.3.4
from wxPython.wx import *
class myApp(wxApp):
def OnInit(self):
dlg = wxMessageDialog(wxFrame(None,-1,''), 'bozo est bien là !','A
Message Box', wxOK | wxICON_INFORMATION)
dlg.ShowModal()
return False
application = myApp(0)
application.MainLoop()
#-----------------------


Ça marche aussi ici. Merci.

Une instance de wxApp est nécessaire (pour la procédure de fenêtre de
Windows, je pense). Cette instance déclenche OnInit. wxMessageDialog a
besoin d'une wxFrame (créée par wxFrame(None,-1,'')). Le return False
permet de terminer wxApp. Ouf !


Ok, c'est ce dont je me doutais. Comme PyCrust est lui même en wxPython, il
fournit la wxApp que mes essais nécessitaient. C'est pourquoi en l'absence
de la classe dérivée de wxApp ça ne fonctionne plus lorsque le script est
appelé via le shell.

Si tu veux juste afficher un message, il me simple qu'il y a plus simple
que wx.


Non non, c'est bien comme cela. Je me fais une bibliothèque de "macros"
python pour Codewarrior sur Mac à partir d'une lib de macros Visual Studio
(vb) et j'ai besoin d'un tas de choses dont les dialogues standard
d'ouverture de fichier, sélection de répertoire... en plus de dialogues
maison.

Mais je commence par tester la faisabilité sur des choses simples avant de
devoir débugguer des trucs complexes.

--
Sébastien Kirche