#1 Le 14/02/2013, à 17:30
- Tchitchikof
Questions de débutant Quickly, Glade et PyGTK
Bonjour à tous,
récemment, j'ai découvert le programme DR14 T.meter ( http://dr14tmeter.scienceontheweb.net/i … =Main_Page ) qui permet de mesurer la compression dynamique de fichiers audio. Ce logiciel ne fonctionne seulement qu'en ligne de commande dans un terminal. L'utilisant assez souvent, je me suis dit que ce serait plus pratique d'avoir une interface graphique pour faire les opérations.
Je me suis donc lancé là dedans, n'ayant jamais programmé auparavant. J'ai démarré à partir de http://developer.ubuntu.com/ et j'ai donc utilisé quickly pour créer mon interface. Je suis arrivé tant bien que mal à pondre ceci :
A l'aide du GTKButton "Select Music Folder", on sélectionne le dossier à analyser. Le GTK Entry situé à sa droite indique le chemin de ce dossier. Puis le GtkButton "DR Please!" lance le programme DR 14. Le GtkTextView du bas affiche le retour du programme DR_14 une fois que la fonction a terminé de tourner.
Voici le code du fichier python "GuiguiWindow.py" correspondant (la seule partie que j'ai faite se situe à la fin, après "# Code for other initialization actions should be added here." et quelques "import" au début, le reste est généré automatiquement):
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
### BEGIN LICENSE
# This file is in the public domain
### END LICENSE
import gettext
from gettext import gettext as _
gettext.textdomain('guigui')
from gi.repository import Gtk, GLib # pylint: disable=E0611
import subprocess
import logging
logger = logging.getLogger('guigui')
from guigui_lib import Window
from guigui.AboutGuiguiDialog import AboutGuiguiDialog
from guigui.PreferencesGuiguiDialog import PreferencesGuiguiDialog
from quickly import prompts
import os
# See guigui_lib.Window.py for more details about how this class works
class GuiguiWindow(Window):
__gtype_name__ = "GuiguiWindow"
def finish_initializing(self, builder): # pylint: disable=E1002
"""Set up the main window"""
super(GuiguiWindow, self).finish_initializing(builder)
self.AboutDialog = AboutGuiguiDialog
self.PreferencesDialog = PreferencesGuiguiDialog
# Code for other initialization actions should be added here.
def on_select_clicked(self,widget,data=None): # récupère le signal du GtkButton (défini dans Glade, dans la colonne Handler des signals de ce widget)
path = prompts.choose_directory("Select Music Folder...") #affiche le sélecteur de dossier
dialog=Gtk.FileChooserDialog()
path = dialog.get_current_folder() #récupère le chemin du dossier sélectionné
pathtext = self.builder.get_object('pathtext') # de ce que j'ai compris, permet de relier le widget créé dans glade au code python ?! ce n'est pas très clair pour moi
pathtext.set_text(path) #copier le chemin dans la case de texte
def on_button_clicked (self,widget,data=None): # récupère le signal lorsqu'on clique sur le bouton
pathtext = self.builder.get_object('pathtext') # j'ai réécrit la même ligne qu'au dessus...sans celle ci, ça ne marchait plus mais j'avoue que je ne comprends pas pourquoi...
path = pathtext.get_text()
subprocess.call(['dr14_tmeter', path]) #permet d'éxécuter le programme dr14, avec comme argument le path demandé par l'utilisateur
feedback = subprocess.check_output(['dr14_tmeter', path], stderr=subprocess.STDOUT) # permet de récupérer le feedback du programme qui s'affiche dans le terminal normalement lorsqu'on l'exécute en ligne de commande
textview = self.builder.get_object('textview')
text = textview.get_buffer()
text.set_text(feedback) # affiche le feedback du programme dans le textview du dessous
Le programme tourne, j'ai réussi à générer un .deb et à l'installer sur mon ordi via le software center (avec 2 messages d'alerte cependant...). Je l'utilise déjà à présent et ça c'est très encourageant vu mon niveau Cependant, je me doute bien que je suis loin d'avoir quelque chose de propre et d'abouti; cela me plairait de rendre ça dispo pour tout le monde...mais pour ça, il y a du boulot.
Je me pose de nombreuses questions, aussi bien sur des aspects techniques que sur le développement d'application dans le libre de manière plus générale (comment récupérer le code d'une appli déjà existante, comment faire relire son code, utiliser le debugger etc...
Cependant, je pense y aller pas à pas et poser des questions bien précises pour avancer concrétement, à mon niveau. Désolé pour ce premier post très long, j'espère ne pas vous avoir tous découragé...
Ma première question est donc la suivante:
j'ai détecté un problème. Lorsque l'utilisateur clique sur "Select Music Folder", la fenêtre de choix s'ouvre. Sur celle ci, que l'utilisateur clique sur "cancel" ou "open" ne change rien, le dossier sera sélectionné. Comment je peux faire en sorte que s'il choisit "cancel", rien ne se passe ? j'ai bien trouvé quelque chose avec des conditions du genre "if response == Gtk.RESPONSE_OK"....mais ça n'a pas fonctionné ... Une piste à m'indiquer?
Dernière modification par Tchitchikof (Le 15/02/2013, à 08:47)
Hors ligne
#2 Le 14/02/2013, à 18:29
- Hibou57
Re : Questions de débutant Quickly, Glade et PyGTK
Ben pour un début, c’est bien . Bravissimo
Ma première question est donc la suivante:
j'ai détecté un problème. Lorsque l'utilisateur clique sur "Select Music Folder", la fenêtre de choix s'ouvre. Sur celle ci, que l'utilisateur clique sur "cancel" ou "open" ne change rien, le dossier sera sélectionné. Comment je peux faire en sorte que s'il choisit "cancel", rien ne se passe ? j'ai bien trouvé quelque chose avec des conditions du genre "if response == Gtk.RESPONSE_OK"....mais ça n'a pas fonctionné... Une piste à m'indiquer?
Python n’étant pas typé, il est facile d’intervertir les paramètres dans les signatures des gestionnaires d’événements, sans que ça ne soit détecté. Peut‑être que tu reçois un paramètres qui n’est pas celui que tu pense, c’est une trappe dans laquelle il est facile de tomber.
Vérifie si en lançant ton programme depuis une console, pour voir s’afficher les message sur stdout et stderr, tu n’obtiendrais pas quelques messages d’erreur instructifs. C’est le réflexe universel à avoir sous Ubuntu, quand quelque chose se passe mal avec une application disposant d’une GUI et ne se lançant normalement pas depuis une console.
P.S. Pour faciliter la lecture de ton source Python, si tu le souhaites, tu peux éditer ton message et remplacer la balise quote par la balise code.
Dernière modification par Hibou57 (Le 14/02/2013, à 18:31)
Hajimemashteeeee… \(^o^)/ Tachikoma desu (^_^;)
Le saviez‑vous : le j’m’en foutisme est la cause de la plupart des fléaux du monde contemporain.
Mangez des standards : un grand bol de Standard tous les matins, et vous débutez la journée en pleine forme !
bulleforum.net — Forum de discussions, La Bulle (papotage de la vie courante ou choses trop sérieuses)
Hors ligne
#3 Le 15/02/2013, à 09:05
- Tchitchikof
Re : Questions de débutant Quickly, Glade et PyGTK
Merci pour ton retour, premier message édité !
Alors concernant mon problème, lorsque j'ajoute dans mon code python un "if:
def on_select_clicked(self,widget,data=None):
path = prompts.choose_directory("Select Music Folder...")
dialog=Gtk.FileChooserDialog()
if response == Gtk.ResponseType.OK:
path = dialog.get_current_folder()
pathtext = self.builder.get_object('pathtext')
pathtext.set_text(path)
(j'ai finalement essayé avec un "if response == Gtk.ResponseType.OK" plutôt que "if response == gtk.RESPONSE_OK" suite à la lecture de ce post sur askubuntu: http://askubuntu.com/questions/139420/p … -tutorial)
Dans l'appli, quand je clique sur Cancel, ça fonctionne bien et je retourne à ma fenêtre principale sans qu'un chemin de fichier soit ajouté. En revanche, si je clique sur ok, ça ne fait rien et en sortie dans le terminal, j'ai ça:
File "/home/guigui/guigui/guigui/GuiguiWindow.py", line 41, in on_select_clicked
if response == Gtk.ResponseType.OK:
NameError: global name 'response' is not defined
EDIT :
j'ai trouvé la réponse ici !!
def on_select_clicked(self,widget,data=None):
response, path = prompts.choose_directory("Select Music Folder...")
dialog=Gtk.FileChooserDialog()
if response == Gtk.ResponseType.OK:
path = dialog.get_current_folder()
pathtext = self.builder.get_object('pathtext')
pathtext.set_text(path)
j'ai ajouté à la seconde ligne "response, ". Cela semble fonctionner comme ça avec Prompts.
Dernière modification par Tchitchikof (Le 15/02/2013, à 10:04)
Hors ligne
#4 Le 15/02/2013, à 11:20
- Hibou57
Re : Questions de débutant Quickly, Glade et PyGTK
File "/home/guigui/guigui/guigui/GuiguiWindow.py", line 41, in on_select_clicked if response == Gtk.ResponseType.OK: NameError: global name 'response' is not defined
J’ai vu que tu as trouvé la solution, mais juste un commentaire général sur le message d’erreur ci‑dessus : quand Python se plaint qu’une variable globale n’existe pas, ça signifie le plus souvent qu’une variable locale n’a pas été initialisée.
En Python, c’est l’assignation d’une variable qui crée la variable (sauf si elle est reçue en paramètre); l’assignation est l’équivalent de la déclaration, qui n’existe pas en Python. Si la variable locale n’est pas assignée, elle n’existe pas, et Python ne sait pas que tu pensais à une variable locale. Quand il voit une référence à une variable, et qu’il ne la trouve pas comme variable dans la portée locale, il va la chercher dans la portée globale. Et s’il ne la trouve pas là, il se plaint que la variable n’existe pas dans la portée globale. Ce que tu peux comprendre, c’est que ce message à toujours deux interprétations possibles, même si à le lire, on croirait qu’il n’en a qu’une.
Dernière modification par Hibou57 (Le 15/02/2013, à 11:21)
Hajimemashteeeee… \(^o^)/ Tachikoma desu (^_^;)
Le saviez‑vous : le j’m’en foutisme est la cause de la plupart des fléaux du monde contemporain.
Mangez des standards : un grand bol de Standard tous les matins, et vous débutez la journée en pleine forme !
bulleforum.net — Forum de discussions, La Bulle (papotage de la vie courante ou choses trop sérieuses)
Hors ligne