Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/02/2023, à 19:07

Maga

[Python pour un nul] Structure d'une application graphique !!

Bonjour,
Ça fait un quelques années que je bidouille avec Python et j'avais développé une application en 2.7 et GTK2...
Les versions d'Ubuntu évoluant, il devient très difficile de faire fonctionner mon appli depuis la 20.04 et l'abandon de Python 2.7.
J'ai donc opté pour une migration vers la version 3 mais de passer aussi sur wxpython.
J'entreprend donc d'appendre quelques nouvelles subtilités mais sur un programme super basique, j'ai un drôle de comportement : mes variables ne sont pas reconnues alors que le programme se lance...
Je voulais tester le timer sur wx et assigner le texte de la barre de status au timer en incrémentant simplement la variable avant de la passer en str() pour la visualiser dans ladite StatusBar.
Les variables sont pourtant globales !
Donc j'ai sûrement une groooosse erreur évidente devant les yeux mais tellement évidente que je ne la vois pas !!

Surtout que ça ne marche plus alors que ça a marché hier soir (la valeur du timer s'affichait bien dans la barre de status)...

Le début du code :

import wx
import math
import random
import os
import time
import lxml

import sys

USE_WIT = False

AppBaseClass = wx.App

if USE_WIT:
	from wx.lib.mixins.inspection import InspectableApp
	AppBaseClass = InspectableApp


class CosmoPy(wx.Frame):

	def __init__(self, parent, title):
		
		wx.Frame.__init__(self, parent, -1, title)
		
		self.ajoutMenu ()  # APPEL de fonction ajoutMenu
		self.creationBarreStatus() # Barre de status
		self.declarationVariables()
		self.LesMaitresDuTemps ()  # Lancement du Timer
		self.iconAppli () # Icon de l'application
		self.Squelette ()
		
		
		

	def declarationVariables (self) :
		
		self.maVariable1 = 1
		self.maVariable2 = 1
		self.maVariable3 = 5
	
	def iconAppli (self):
        
		self.icon = wx.Icon()
		self.imageIcon = wx.Bitmap('images/CALA-logo.svg')
		self.icon.CopyFromBitmap(self.imageIcon)
		self.SetIcon(self.icon)
	
	def creationBarreStatus (self):
				
		self.barreStatus = wx.StatusBar(self, 1)
		self.barreStatus.SetFieldsCount(3)
		self.barreStatus.SetStatusWidths([-3,-1,-2])
		self.SetStatusBar(self.barreStatus)
		
		#self.bar.SetStatusText("Zone 01",0)
		#self.bar.SetStatusText("Zone 02",1)
		self.barreStatus.SetStatusText("Zone 03",2)
		
		
		
	def Squelette (self):

		# Now create the Panel to put the other controls on.
		panel = wx.Panel(self)
		panel.SetBackgroundColour( wx.Colour( 25, 0, 0 ) )
		
		self.zoneH = wx.BoxSizer(wx.HORIZONTAL)
		self.zoneBox01 = wx.StaticBox(self, -1, "Zone BOX 01")
		self.zoneH.Add(self.zoneBox01, 0, wx.FIXED_MINSIZE)

	def LesMaitresDuTemps (self):
		
		self.leMetronome = wx.Timer(self)
		self.leMetronome.Start(1000)
		self.leMetronome.Bind(wx.EVT_TIMER, self.leMetroAction)
		
		
		#self.unDixiemeSec = wx.Timer(self)
		#self.unDixiemeSec.Start(1000)
		#self.unDixiemeSec.Bind(wx.EVT_TIMER, self.unDixiemeSecAction)
		
		
	def leMetroAction(self, evt):

		self.maVariable1 = self.maVariable1 + 1
		self.barreStatus.SetStatusText(str(self.maVariable1),0)
		self.zoneBox01.SetLabel("Essai")

	def unDixiemeSecAction(self, evt):

		self.maVariable2 = self.maVariable2 + 1
		self.barreStatus.SetStatusText(str(self.maVariable2),1)

Dernière modification par Maga (Le 25/02/2023, à 19:38)

Hors ligne

#2 Le 24/02/2023, à 19:29

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

Bonjour,
Tu rencontres une exception? Que retourne le Traceback ?

#3 Le 24/02/2023, à 19:41

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

MPython Alaplancha a écrit :

Bonjour,
Tu rencontres une exception? Que retourne le Traceback ?

C'est ça que je ne comprend pas non plus, quand je lance le programme via la console, je me retrouve avec le prompt sans aucune erreur !!
Ci-dessous mon dernier lancement... sad

matthieu@matthieu-ms7a38:~/Documents/CALA/COSMOGONE/2022_02_07-SC$ python3 cosmopy.py
matthieu@matthieu-ms7a38:~/Documents/CALA/COSMOGONE/2022_02_07-SC$ 

Hors ligne

#4 Le 24/02/2023, à 20:18

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

Si tu ne l'as pas fait, utilises des print() afin de voir l'état des variables en question et de voir si la méthode concernée est bien appelée.

(Pour ce qui est des exceptions autant python est bavard autant certaines lib sont muettes, mais bon je doute que ce soit le cas ici.)

#5 Le 24/02/2023, à 22:06

Watael

Re : [Python pour un nul] Structure d'une application graphique !!

je ne vois, en gros, qu'une définition de classe, mais elle n'est jamais utilisée.
le code posté est complet ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 24/02/2023, à 22:40

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

Watael a écrit :

je ne vois, en gros, qu'une définition de classe, mais elle n'est jamais utilisée.
le code posté est complet ?

Non, ce n'est que la moitié : je suis parti d'une base de wxpython-demo... qui j'espère est correctement codée !!!  wink
J'ai juste ajouté des fonctions de test.

Hors ligne

#7 Le 24/02/2023, à 22:53

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

Bon, je crois que le problème, c'est que je dois passer la variable dans l'appel de fonction.
Mais je n'ai pas compris comment créer la structure de l'appli correctement.
Dans ma précédente version, j'avais ceci

if __name__ == "__main__":
    
    scripto = Scriptodome(1)
    scripto.CentreSourisSE(gtk.ToggleButton(),"")
    #scripto.Ephemerides()
    scripto.midiSol(gtk.ToggleButton())
    scripto.reglages(gtk.SpinButton(),"")

...que je ne retrouve pas dans le nouveau code copié sur la démo de wxpython (j'avoue à ma grande honte, je code empiriquement tant que ça marche).
Et dans cette fonction "__main__", les lignes définissaient les variables utilisées dans les arguments des fonctions (comme des pointeurs ?), j'imagine que ma nouvelle appli doit avoir cette structure.

Dernière modification par Maga (Le 24/02/2023, à 22:54)

Hors ligne

#8 Le 25/02/2023, à 07:24

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

Bonjour,
ce n'est donc pas un problème de variable mais une méconnaissance de l'interface graphique que tu utilises.
à ce propos, pourquoi ce choix de travailler avec Wxpython? Pourquoi pas tkinter?
Tkinter est installé par défaut sur nos systèmes contrairement à Wxpython. De plus, étant bien plus utilisé, en cas de souci tu trouveras de l'aide facilement.
Ceci etant dit pour afficher un Label avec Wx:

import wx 

app = wx.App() 
window = wx.Frame(None, title = "wxPython Frame", size = (300,200)) 

# add Panel
panel = wx.Panel(window) 
panel.BackgroundColour="white"

# Create Label on panel
label = wx.StaticText(panel, label = "Hello World", pos = (100,50)) 
window.Show(True) 
app.MainLoop()

#9 Le 25/02/2023, à 10:20

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

Merci, j'ai en effet repris la structure du programme et je vais d'ailleurs essayer de comprendre clairement les différentes parties d'une application avec une GUI !
Concernant les différentes GUI justement, quel est l'intérêt de wx, Qt, Gtk vu que Thinker est installé par défaut ?
Pourquoi les un-es et les autres choisissent celle-ci ou celle-là ?
La portabilité ? La variété des widgets ?

Hors ligne

#10 Le 25/02/2023, à 14:38

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

Maga a écrit :

Pourquoi les un-es et les autres choisissent celle-ci ou celle-là ?

On choisit une interface graphique en fonction de plusieurs paramètres:
Déjà quel projet et pour quel support?. Pour Pc, pour de l'embarqué? , pour Android? multiplateforme?
Pour faire des jeux? ...
Quelle licence ?
à ceci j'ajoute la courbe d'apprentissage. Il y a t'il des tutoriels ?, une documentation fournie?, une communauté active qui pourrait aider au cas où?
Un développement continue...

#11 Le 25/02/2023, à 15:06

Watael

Re : [Python pour un nul] Structure d'une application graphique !!

<HS>petit point grammaire :

Y a-t-il ... ?

ce "t" n'est pas l'élision d'un pronom personnel "tu" (donc pas d'apostrophe), mais un "t" euphonique.

PS: j'aurai l'occasion de le répéter, car c'est une erreur fréquente ces temps-ci.</HS>


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 25/02/2023, à 15:12

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

Oui. C'est une erreur récurrente chez moi...
sa oré pu etre pir^^

#13 Le 25/02/2023, à 17:26

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

MPython Alaplancha a écrit :
Maga a écrit :

Pourquoi les un-es et les autres choisissent celle-ci ou celle-là ?

On choisit une interface graphique en fonction de plusieurs paramètres:
Déjà quel projet et pour quel support?. Pour Pc, pour de l'embarqué? , pour Android? multiplateforme?
Pour faire des jeux? ...
Quelle licence ?
à ceci j'ajoute la courbe d'apprentissage. Il y a t'il des tutoriels ?, une documentation fournie?, une communauté active qui pourrait aider au cas où?
Un développement continue...

Alors nous sommes complètement sur de l'interne, wxpython a l'air assez bien documenté (leur démo est assez pratique pour se faire une idée du fonctionnement de chaque widget), au cas, la portabilité sur différent OS est assuré (ce sera sous Linux de toute façon).

Pour revenir au sujet, à propos de la structure générale, en farfouillant sur le net, je trouve que ce n'est pas absolument clair (on trouve plusieurs structures un peu différentes), si j'ai bien compris :
  - Je fais mes import divers dont wx
  - Je déclare la classe de ma fenêtre graphique et ses diverses fonctions internes
  - Je déclare la classe de l'application dans laquelle la fonction OnInit() me permet de créer l'instance de ma fenêtre graphique.

A quoi sert if __name__ == '__main__': ?!
J'ai vu que on y créait un instance de l'application mais elle n'y est pas dans tous les exemples, pourquoi ce if ?
Il faut que j'ai un __main__ quelque part donc mais pourquoi n'y-est-il pas systématiquement dans les exemples d'application ?

Merci pour votre aide... smile

Hors ligne

#14 Le 25/02/2023, à 18:20

Compte supprimé

Re : [Python pour un nul] Structure d'une application graphique !!

A quoi sert if __name__ == '__main__': ?!

Lorsque tu exécutes un programme via python3 mon_prog, c'est le bloc figurant en dessous de cette condition qui va être exécuté.

Exemple: soit ce code enregistré sous l'appellation : bidon.py

class Maclasse:
    def __init__(self, arg):
        self.arg = arg
    def affiche(self):
        return self.arg

if __name__ == '__main__':
    print('Je passe par là.')
    instance = Maclasse('Coucou')
    mon_arg = instance.affiche()
    print(f"mon arg est: {mon_arg}")
    

Lorsque tu l'exécutes (depuis le même répertoire) en appelant l'interpréteur python3:

python3 bidon.py

voici le retour:

Je passe par là.
mon arg est: Coucou

Une autre façon d'utiliser sa classe est de l'importer:
(toujours depuis le même répertoire depuis l'interpréteur python)

Python 3.8.10 (default, Nov 14 2022, 12:59:47) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bidon import Maclasse
>>> i = Maclasse('yep!')
>>> i.affiche()
'yep!'
>>>

#15 Le 25/02/2023, à 18:40

Maga

Re : [Python pour un nul] Structure d'une application graphique !!

OK, dans ma précdente version , c'est là que j'étais obligé de déclarer des instances de fonctions qui se trouvaient dans la classe graphique avec le widget correspondant et le type de variables utilisées.
Il y avait aussi un appel à une fonction main() !!

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    
    scripto = Scriptodome(1)
    scripto.CentreSourisSE(gtk.ToggleButton(),"")
    #scripto.Ephemerides()
    scripto.midiSol(gtk.ToggleButton())
    scripto.reglages(gtk.SpinButton(),"")
    #scripto.BMotsClesNoteBox("","","","","")
    #scripto.BNoteIMG (1)
    scripto.barrePlayPlus(1,1)
    scripto.barrePlayMoins(1,1)
    #scripto.barreJour(1,1)
    scripto.barreDate (1,1)
    scripto.carte ()
    scripto.afficheImg(gtk.ToggleButton(),1)
    scripto.tranScript(1,"","","")
    scripto.transbasculeScript(gtk.ToggleButton(),"","","","","","","","","","")
    main()

Sachant que mes fonctions ressemblaient à ça :

        def BComHNoteBox (self,groupeBoutons,relief,fxml,start_end,conteneur): #Boite à boutons TOP ECRAN
            
                
            self.BComNoteBH = gtk.Notebook()
            self.BComNoteBH.show()
            
            from lxml import etree # LXML
            tree = etree.parse(fxml)
            
            self.nombreBoutons = 0           
            
            
            #Creation d'un objet Tooltips
            self.infobullesBComH = gtk.Tooltips()
            self.infobullesOnglet = gtk.Tooltips()

etc...

Dernière modification par Maga (Le 26/02/2023, à 12:05)

Hors ligne