Pages : 1
#1 Le 10/07/2006, à 20:48
- david breizh
python pygtk
bonjour j'essai de faire un programme python avec pygtk pour lire les radios du web.
je voudrais qu'en fait lieu de créer plusieurs fois une fonction player à chaques boutons cliquer n'en avoir qu'un en fait et que le changements de l'url se fasse en fonction du bouton cliquez.
je poste mon premier essai ou je bloque depuis un moment (c'est le début je signal):
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
url = 'mms://vip1.yacast.fr/encodernrj'
# définition de la classe bb
class bb:
# fonction de mplayer
def player(self, evt):
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
gtk.main_quit()
return gtk.FALSE
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures de la fenetre.
fenetre.set_default_size(220 ,100)
fenetre.set_border_width(10)
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.HBox(gtk.FALSE, 0)
boite2 = gtk.HBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton1 = gtk.Button("energy")
bouton2 = gtk.Button("stop lecture")
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton1.connect("clicked", self.player)
bouton2.connect("clicked", self.stop)
# placement du bouton1 dans la boite1
boite1.pack_start(bouton1, gtk.TRUE, gtk.TRUE, 0)
boite2.pack_start(bouton2, gtk.TRUE, gtk.TRUE, 0)
# incorporation des deux boite dans la boite principale
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
# N'oubliez pas cette etape, elle fait savoir a GTK que la preparation
# de ce bouton est achevee et qu'il peut maintenant etre affiche
fenetre.add(boite)
bouton1.show()
bouton2.show()
boite1.show()
boite2.show()
boite.show()
fenetre.show()
def boucle():
gtk.main()
if __name__ == "__main__":
salut = bb()
boucle()
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#2 Le 10/07/2006, à 22:43
- david breizh
Re : python pygtk
il n'y a aucun pro de python par là
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#3 Le 11/07/2006, à 02:05
- david breizh
Re : python pygtk
est bien le forum est vide de dévellopeurs ou quoi?
Dernière modification par david breizh (Le 11/07/2006, à 02:06)
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#4 Le 11/07/2006, à 10:00
- gapz
Re : python pygtk
J'ai le temps tout de suite de regarder à ton code, et je suis un nouvel utilisateur assez récent de pygtk, avant je fesais du wxpython.
La seule chose que je peux te proposer pour le moment c'est un bon liens Donc tu disposes d'une très bonne documentation (en anglais) via un rapide :
sudo apt-get install python-gtk2-tutorial
L'index ce trouve ici : file:///usr/share/doc/python-gtk2-tutorial/html/index.html
Voilà ;-)
PS : Si j'ai le temps je jeterais un coup d'oeil demain.... ;-)
Real programmers code in binary :: http://gapz.tuxfamily.org
Hors ligne
#5 Le 11/07/2006, à 12:34
- mccricri
Re : python pygtk
Je ne suis pas spécialiste pyGtk, parce contre, je vois ce que tu veux faire, et ça me parait pas trop mal. Simplement parce que ça ne sera pas forcément simple de faire changer d'url à mplayer.
Le souci c'est le pilotage à distance d'un autre processus (ici mplayer) en pouvant lui passer des infos.
Et je ne sais pas si c'est faisable avec python et mplayer. Donc si dans la méthode player, tu faisait simplement un stop() du précédent pid puis tu redémarres un nouveau avec la nouvelle URL, ça devrait le faire.
Il y aura un petit temps de traitement avant de zapper de chaine, mais il n'y aura qu'un seul processus mplayer lancé à la fois.
Reste à faire une Liste de sélection avec plusieurs radios et prendre la chaine sélectionnée au click sur le boutton de zapping
Hors ligne
#6 Le 11/07/2006, à 16:02
- david breizh
Re : python pygtk
justement c'est ça que je veux faire une liste d'url qui change suivant le bouton clicked c'est tout, avec une seul lecture à la fois comme tu dis mccricri mais je n'y arrive pas c'est faisable je l'ai vu sur un autre poste mais avec wxpython et je ne trouve pas le moyen de le transformer .
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#7 Le 11/07/2006, à 16:30
- benohite
Re : python pygtk
Salut,
Je ne connais pas python donc je me suis penché sur mplayer et j'ai trouvé un truc intéressant dans la doc:
3.2.3. Mode esclave
Le mode esclave vous permet de construire un frontend à MPlayer. Quand il est activé (avec -slave) MPlayer lit les commandes séparées par un saut de ligne (\n) depuis l'entrée par défaut (stdin). Les commandes sont documentées dans le fichier slave.txt.
Et bien sur dans la liste des commandes il y en a une qui colle
pt_step <value> [force]
Go to the next/previous entry in the playtree. The sign of <value> tells
the direction. If no entry is available in the given direction it will do
nothing unless [force] is non-zero.
bon courage
ben
Dernière modification par benohite (Le 11/07/2006, à 16:31)
You are legally entitled and encouraged to copy, share and redistribute this CD for yourself and your friends. Share the spirit of Ubuntu !
Hors ligne
#8 Le 11/07/2006, à 18:15
- david breizh
Re : python pygtk
voilà j'ai vu un scrypt en python de francescu et retranscrit en wxpython( à l'origine thinker) par bipede donc moi je veux le même fonctionement pour le player mais en pygtk pour pouvoir récuperer le bouton sélectionner et suivant le bouton avoir une url différente, voilà je poste le script en question de bipede pour que quelqu'un puisse trouver une retranscription pour mon script :
#! /usr/bin/env python
#-*- coding: utf-8 -*-
import wx
import os
import signal
class APropos(wx.Dialog):
def __init__(self, parent, police):
wx.Dialog.__init__(self, parent, -1, title = "A propos de Radio")
sizer = wx.BoxSizer(wx.VERTICAL)
label = wx.StaticBox(self, -1, "Merci d'utiliser Radio v0.4 by Francescu", style = wx.ALIGN_CENTER)
label.SetOwnFont(police)
label.SetForegroundColour(wx.RED)
sizer.Add(label, 0, wx.ALL|wx.ALIGN_CENTRE, 5)
label = wx.StaticBox(self, -1, "Pour signaler un bug ou pour toute remarque," , style = wx.ALIGN_CENTRE)
label.SetOwnFont(police)
label.SetForegroundColour(wx.RED)
sizer.Add(label, 0, wx.ALL|wx.ALIGN_CENTRE, 5)
label = wx.StaticBox(self, -1, "et surtout si vous avez apporté des améliorations au programme :" , style = wx.ALIGN_CENTRE)
label.SetOwnFont(police)
label.SetForegroundColour(wx.RED)
sizer.Add(label, 0, wx.ALL|wx.ALIGN_CENTRE, 5)
label = wx.StaticBox(self, -1, "Francescu@freesurf.fr",style = wx.ALIGN_CENTER)
label.SetOwnFont(police)
label.SetForegroundColour(wx.RED)
sizer.Add(label, 0, wx.ALL|wx.ALIGN_CENTRE, 5)
bouton = wx.Button(self, wx.ID_OK, "Ok")
sizer.Add(bouton, 0, wx.ALIGN_CENTRE)
self.SetSizer(sizer)
self.Fit()
class Ecoute(wx.Dialog):
def __init__(self, parent, radio, police):
wx.Dialog.__init__(self, parent, -1, title = "En ecoute")
sizer = wx.BoxSizer(wx.VERTICAL)
message = wx.StaticText(self, -1, radio, size = (150,-1), style = wx.ALIGN_CENTRE)
message.SetOwnFont(police)
message.SetForegroundColour(wx.RED)
sizer.Add(message, 1, wx.ALIGN_CENTRE|wx.ALL, 5)
bouton = wx.Button(self, wx.ID_OK, "Terminer")
sizer.Add(bouton, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
self.SetSizer(sizer)
self.Fit()
class MesRadios(wx.Frame):
radios = [['Radios Nationales',['Cherie FM', 'Fun-Radio', 'Nrj', 'Nostalgie', 'Le Mouv']],
['Radios Corses', ['Alta Frequenza', 'Radio Corti Vivu', 'RCFM']],
['Radios House-Music', ['Radio Fg', 'Fg Underground', 'www.di.fm']]]
urlS = {'Cherie FM':'mms://vip1.yacast.fr/encodercheriefm',
'Fun-Radio':'mms://vip2.yacast.fr/encoderfun',
'Nrj':'mms://vip1.yacast.fr/encodernrj',
'Nostalgie':'mms://vip1.yacast.fr/encodernostalgie',
'Le Mouv':'mms://viptvr.yacast.fr/encoderlemouv',
'Alta Frequenza':'http://alta-frequenza.streamfr.com:8061/listen.pls',
'Radio Corti Vivu':'rtsp://a1251.l252147863.c2521.e.lr.akamaistream.net/live/D/1251/2521/666/reflector:47863?site',
'RCFM':'mms://wm02.tv-radio.com/fbfrequenzamora-16k?site',
'Radio Fg':'http://87.98.197.99:8000',
'Fg Underground':'http://ufg.impek.tv',
'www.di.fm':'http://www.di.fm/mp3/house.pls'}
def __init__(self, titre):
wx.Frame.__init__(self, parent = None, id = -1, title = titre)
self.police = wx.Font(12, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_BOLD)
sizerPrinc = wx.BoxSizer(wx.VERTICAL)
for x in range(3):
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add((0,0),1)
label = wx.StaticText(self, -1, self.radios[x][0], style = wx.ALIGN_CENTRE)
label.SetForegroundColour(wx.RED)
label.SetOwnFont(self.police)
sizer.Add(label, 2, wx.ALIGN_CENTRE)
sizer.Add((0,0),1)
for texte in self.radios[x][1]:
bouton = wx.Button(self, -1, texte, size = (150, -1))
self.Bind(wx.EVT_BUTTON, self.ChoixRadio, bouton)
sizer.Add(bouton, 0, wx.ALIGN_CENTRE|wx.ALL, 2)
sizerPrinc.Add(sizer, 0, wx.ALL|wx.ALIGN_CENTRE, 5)
sizer = wx.BoxSizer(wx.VERTICAL)
bouton = wx.Button(self, -1, "A propos...", size = (150, -1))
self.Bind(wx.EVT_BUTTON, self.About, bouton)
sizer.Add(bouton, 0, wx.ALIGN_CENTRE|wx.ALL, 2)
bouton = wx.Button(self, -1, "Quitter", size = (150, -1))
self.Bind(wx.EVT_BUTTON, self.Quitter, bouton)
sizer.Add(bouton, 0, wx.ALIGN_CENTRE|wx.ALL, 2)
sizerPrinc.Add(sizer, 0, wx.ALL|wx.ALIGN_CENTRE, 15)
label = wx.StaticText(self, -1, "Radio v0.4 By Francescu wink", style = wx.ALIGN_CENTRE, size = (300,-1))
label.SetOwnFont(self.police)
label.SetForegroundColour(wx.BLUE)
sizerPrinc.Add(label, 0, wx.ALL|wx.ALIGN_CENTRE, 10)
self.SetSizer(sizerPrinc)
self.Fit()
self.Centre()
def Quitter(self, evt):
self.Destroy()
def About(self, evt):
dlg = APropos(self, self.police)
dlg.ShowModal()
dlg.Destroy()
def ChoixRadio(self, evt):
radio = self.FindWindowById(evt.GetId()).GetLabel()
url = self.urlS[radio]
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer","mplayer", url)
dlg = Ecoute(self, radio, self.police)
dlg.ShowModal()
os.kill(pidActuel, signal.SIGTERM)
dlg.Destroy()
class MonApp(wx.App):
def OnInit(self):
f = MesRadios("Radio v0.4")
f.Show(True)
self.SetTopWindow(f)
return True
app = MonApp()
app.MainLoop()
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#9 Le 11/07/2006, à 23:30
- david breizh
Re : python pygtk
en fait voilà , ce que je veux exactement c'est de n'avoir qu'une seule fonction player et que l'url change selon le bouton click; j'ai rajouté une radio au script et dans la fonction player je kill d'abord le signal comme ça lors d'un click sur le deuxième bouton on change mais le fait d'avoir plusieurs fonction player (et va y en avoir des tas vu le nombres de radios que je veux mettre et plus après)chez emmer... car ça fait un script à rallonge pour juste changer url.
du coup j'aimerai que quelqu'un trouve une solution pour que je puisse ensuite le développer un peu plus car c'est que le début .
voilà alors si une gentille personne pouvait donner une soluce ça me donnerai un coup de pouce car dans la doc je trouve pas grand chose mais si quelqu'un sait après je pourrai avancer car j'ai plein d'idées pour après mais cette fonction de rappel de bouton pourrait m'aider par la suite... affaire à suivre
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#10 Le 11/07/2006, à 23:31
- david breizh
Re : python pygtk
a oui j'ai oublié de poster le sript dans l'état actuel, le voilà:
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
# définition de la classe bb
class bb:
#fonction de mplayer
def player(self, widget):
url = 'mms://vip1.yacast.fr/encodernrj'
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
#fonction de mplayer bouton 3
def player1(self, widget):
url = 'mms://vip2.yacast.fr/encoderfun'
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
gtk.main_quit()
return gtk.FALSE
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures de la fenetre.
fenetre.set_default_size(220 ,100)
fenetre.set_border_width(10)
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.VBox(gtk.FALSE, 0)
boite2 = gtk.HBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton1 = gtk.Button('nrj')
bouton2 = gtk.Button('stop lecture')
bouton3 = gtk.Button('fun radio')
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton1.connect("clicked", self.player)
bouton2.connect("clicked", self.stop)
bouton3.connect("clicked", self.player1)
# placement du bouton1 dans la boite1
boite1.pack_start(bouton1, gtk.TRUE, gtk.TRUE, 0)
boite2.pack_start(bouton2, gtk.TRUE, gtk.TRUE, 0)
boite1.pack_start(bouton3, gtk.TRUE, gtk.TRUE, 0)
# incorporation des deux boite dans la boite principale
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
# N'oubliez pas cette etape, elle fait savoir a GTK que la preparation
# de ce bouton est achevee et qu'il peut maintenant etre affiche
fenetre.add(boite)
bouton1.show()
bouton2.show()
bouton3.show()
boite1.show()
boite2.show()
boite.show()
fenetre.show()
def boucle():
gtk.main()
if __name__ == "__main__":
salut = bb()
boucle()
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#11 Le 11/07/2006, à 23:41
- Stemp
Re : python pygtk
Ne pas oublier les balises Code pour afficher les longs listings, merci
«La violence n'a jamais rien réglé» Gengis Khan 1162-1227
Blog | Crunchbang Linux | Arch Linux
Hors ligne
#12 Le 12/07/2006, à 00:57
- david breizh
Re : python pygtk
désoler je ne l'utilisais pas car avant je ne poster pas de long script.
Dernière modification par david breizh (Le 12/07/2006, à 00:57)
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#13 Le 12/07/2006, à 07:20
- david breizh
Re : python pygtk
juste avant d'aller au boulot j'ai rajouter la fonction fermer le son au deux fonction player et à la fonction quiter pour raccorcir le code et ne pas avoir la music quand on a oublié de stoper lors de la fermeture c'est mieux quand même.
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
# définition de la classe bb
class bb:
#fonction de mplayer
def player(self, widget):
url = 'mms://vip1.yacast.fr/encodernrj'
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
#fonction de mplayer bouton 3
def player1(self, widget):
url = 'mms://vip2.yacast.fr/encoderfun'
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
self.stop(self)
gtk.main_quit()
return gtk.FALSE
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures de la fenetre.
fenetre.set_default_size(220 ,100)
fenetre.set_border_width(10)
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.VBox(gtk.FALSE, 0)
boite2 = gtk.HBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton1 = gtk.Button('nrj')
bouton2 = gtk.Button('stop lecture')
bouton3 = gtk.Button('fun radio')
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton1.connect("clicked", self.player)
bouton2.connect("clicked", self.stop)
bouton3.connect("clicked", self.player1)
# placement du bouton1 dans la boite1
boite1.pack_start(bouton1, gtk.TRUE, gtk.TRUE, 0)
boite2.pack_start(bouton2, gtk.TRUE, gtk.TRUE, 0)
boite1.pack_start(bouton3, gtk.TRUE, gtk.TRUE, 0)
# incorporation des deux boite dans la boite principale
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
# N'oubliez pas cette etape, elle fait savoir a GTK que la preparation
# de ce bouton est achevee et qu'il peut maintenant etre affiche
fenetre.add(boite)
bouton1.show()
bouton2.show()
bouton3.show()
boite1.show()
boite2.show()
boite.show()
fenetre.show()
def boucle():
gtk.main()
if __name__ == "__main__":
salut = bb()
boucle()
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#14 Le 13/07/2006, à 06:55
- mccricri
Re : python pygtk
Haaaa, ben expliqué une deuxième fois, je comprends mieux ce que tu voulais faire.
Donc, j'ai trouvé un petit exemple qui explique les bouttons.
Apparement, on peut ajouter des données qui seront les paramètres supplémentaires lors de l'appel de la méthode qui gère l'événement de click.
Donc, en changeant la ligne de "connection" de l'événement au boutton, tu devrais pouvoir récupérer l'url dans l'événement de click.
bouton1.connect("clicked", self.player, "mms://vip1.yacast.fr/encodernrj")
bouton3.connect("clicked", self.player1, "mms://vip2.yacast.fr/encoderfun")
Bien sur, la fonction d'événement doit un peu changer :
#fonction de mplayer
def player(self, widget, url=None):
if url == None:
return
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
Maintenant, moi je disais d'utiliser plutôt une liste contenant plusieurs valeurs dans laquelle on peut choisir une valeur correspondant à une radio et cliquer sur le bouton pour zapper. Parce qu'avec des bouttons, à partir d'un moment, la liste des radios va être longue et ta fenêtre va contenir beaucoup de boutons.
Mais il s'agit là d'un autre objet à gérer, et c'est une autre aventure
Edit : Merci à Benohit pour l'astuce, ça éviterait de relancer mplayer à chaque click, mais là aussi c'est une autre histoire. (Voir os.popen2() )
Dernière modification par mccricri (Le 13/07/2006, à 07:16)
Hors ligne
#15 Le 13/07/2006, à 17:06
- david breizh
Re : python pygtk
en tout cas merci ça marche nickel, donc je vais pouvoir l'améliorer et le construire un peu mieux (icon, fond, fonctions,etc...) , en fait j'étais pas loin du tout du tient, il me manquait juste la section if return et None pour l'url moi je mettais une adresse, mais bon maintenant j'ai compris le truc donc ça va m'aider pour plus loin sinon pour le bouton zapp j'ai pas très bien compris ce que tu veux dire ( tu veux un seul bouton zapp qui à chaques clic de souris zappe entre les radios dans une liste, c'est ça que tu veux dire ou pas car si c'est ça et bien je mettrais la main à la patte car j'ai des idées pour pouvoir le faire simplement mais bon pour le moment j'ai du pain sur la planche donc si pour suivre la suite du programme(je suis en vacances maintenant donc vais pouvoir avancer et chercher) il faut ouvrir un nouveau topic ou pas, en tout cas je peux mettre un résolu sur celui là en attendant ta réponse et encore merci car je tournais autour depuis 4 jours enfin bon, maintenant "ACTION LES MIMINES":D:D:D:D
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#16 Le 14/07/2006, à 14:49
- mccricri
Re : python pygtk
Réponse de normand : Oui, ça pourrait être rigolo de pouvoir passer à la radio suivante/précédente enregistrée dans une liste.
Et non, c'est pas ce que je voulais dire. Je pensais plus à mettre toutes tes radios dans un tableau. Je connais pas bien les composants GTK, mais en wxWindows, c'est une ListBox, ici je crois que ça doit être un TreeView a 1 seule colonne et 1 seul niveau de "feuille"
Mais ça m'a l'air compliqué pour gérer une simple liste, sinon il y a la ComboBox qui est pratique aussi.
Après, t'en choisi une dans la liste, et un click sur le bouton démarre la radio choisie. Voir un double click. Voir... mais bon, ce ne sont que des idées d'amélioration que je te donne. Histoire de te donner des pistes pour t'occuper pendant tes vacances, et que tu continues à t'amuser avec python et gtk.
Dernière modification par mccricri (Le 14/07/2006, à 14:51)
Hors ligne
#17 Le 17/07/2006, à 15:49
- david breizh
Re : python pygtk
hé bien me revoilà après avoir été carbonisé sur les plages de crozon pour repartir dans le sud.
donc les nouvelles ajoutées:
- création d'un menu quand on clique sur le bouton.(gain de place c'est clair).
- ajout de plusieurs radios.
maintenant je vais sûrement incorporer les logos de la radio écouté dans la fenètre.
voilà donc je poste le script en cours (qui fonctionne parfaitement):
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
# définition de la classe bb
class bb:
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures et la taille de la fenetre.
fenetre.set_size_request(220, 100)
fenetre.set_default_size(220 ,100)
fenetre.set_border_width(10)
#création du menu
menu = gtk.Menu()
#création des entrées du menu
xnrj = gtk.MenuItem("NRJ")
xfunradio = gtk.MenuItem("Fun Radio")
xskyrock =gtk.MenuItem("Skyrock")
xcherie = gtk.MenuItem("Chérie fm")
xeurope2 = gtk.MenuItem("Europe 2")
xrtl2 = gtk.MenuItem("RTL 2")
xlemouv = gtk.MenuItem("Le Mouv")
# on les places dans le menuradio
menu.append(xnrj)
menu.append(xfunradio)
menu.append(xskyrock)
menu.append(xcherie)
menu.append(xeurope2)
menu.append(xrtl2)
menu.append(xlemouv)
# on connect une fonction au choix de la liste du menu
xnrj.connect("activate", self.player, "mms://vip1.yacast.fr/encodernrj")
xfunradio.connect("activate", self.player, "mms://vip2.yacast.fr/encoderfun")
xskyrock.connect("activate", self.player, "mms://vip3.yacast.fr/encoderskyrock")
xcherie.connect("activate", self.player, "mms://vip1.yacast.fr/encodercheriefm")
xeurope2.connect("activate", self.player, "mms://viptvr.yacast.fr/tvr_europe2")
xrtl2.connect("activate", self.player, "mms://vipbu.yacast.fr/encoderrtl2")
xlemouv.connect("activate", self.player, "mms://viptvr.yacast.fr/encoderlemouv")
xnrj.show()
xfunradio.show()
xskyrock.show()
xcherie.show()
xeurope2.show()
xrtl2.show()
xlemouv.show()
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.VBox(gtk.FALSE, 0)
boite2 = gtk.HBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton20 = gtk.Button('stop lecture')
bouton = gtk.Button("radios, click me!")
bouton.connect_object("event", self.evnmt_button_press, menu)
bouton.show()
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton20.connect("clicked", self.stop)
bouton20.show()
# placement du bouton1 dans la boite1
boite1.pack_start(bouton, gtk.TRUE, gtk.TRUE, 0)
boite1.show()
boite2.pack_start(bouton20, gtk.TRUE, gtk.TRUE, 0)
boite2.show()
# incorporation des deux boite dans la boite principale
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
boite.show()
fenetre.add(boite)
fenetre.show()
# fonction pour la connection du bouton avec notre menu
def evnmt_button_press(self, widget, evenement):
if evenement.type == gtk.gdk.BUTTON_PRESS:
widget.popup(None, None, None, evenement.button, evenement.time)
# On fait savoir au code appelant que l'on a traite l'evenement. Son
# histoire s'arrete ici.
return gtk.TRUE
# On fait savoir au code appelant que l'evenement n'a pas ete traite. Il continue.
return gtk.FALSE
#fonction de mplayer
def player(self, widget, url=None):
if url == None:
return
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
self.stop(self)
gtk.main_quit()
return gtk.FALSE
def boucle():
gtk.main()
return 0
if __name__ == "__main__":
salut = bb()
boucle()
Dernière modification par david breizh (Le 17/07/2006, à 15:50)
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#18 Le 17/07/2006, à 18:25
- david breizh
Re : python pygtk
bon et bien je bloque encore, ca me saoul.
donc j'ai mis un logo dans une des vbox (elle s'affiche) mais je voudrais qu'elle change lorsque l'on clique sur la radio dans le menu.
et là j'ai pas trouvé comment mis prendre.
donc si quelqu'un a une idée ou comment attribuer un logo différent par rapport au clic je suis preneur
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
logox = "funradio.jpg"
# définition de la classe bb
class bb:
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures et la taille de la fenetre.
fenetre.set_size_request(220, -1)
fenetre.set_default_size(220 ,-1)
fenetre.set_border_width(10)
#création du menu
menu = gtk.Menu()
#création des entrées du menu
xnrj = gtk.MenuItem("NRJ")
xfunradio = gtk.MenuItem("Fun Radio")
xskyrock =gtk.MenuItem("Skyrock")
xcherie = gtk.MenuItem("Chérie fm")
xeurope2 = gtk.MenuItem("Europe 2")
xrtl2 = gtk.MenuItem("RTL 2")
xlemouv = gtk.MenuItem("Le Mouv")
# on les places dans le menuradio
menu.append(xnrj)
menu.append(xfunradio)
menu.append(xskyrock)
menu.append(xcherie)
menu.append(xeurope2)
menu.append(xrtl2)
menu.append(xlemouv)
# on connect une fonction au choix de la liste du menu
xnrj.connect("activate", self.player, "mms://vip1.yacast.fr/encodernrj", "nrj.jpg")
xfunradio.connect("activate", self.player, "mms://vip2.yacast.fr/encoderfun")
xskyrock.connect("activate", self.player, "mms://vip3.yacast.fr/encoderskyrock")
xcherie.connect("activate", self.player, "mms://vip1.yacast.fr/encodercheriefm")
xeurope2.connect("activate", self.player, "mms://viptvr.yacast.fr/tvr_europe2")
xrtl2.connect("activate", self.player, "mms://vipbu.yacast.fr/encoderrtl2")
xlemouv.connect("activate", self.player, "mms://viptvr.yacast.fr/encoderlemouv")
xnrj.show()
xfunradio.show()
xskyrock.show()
xcherie.show()
xeurope2.show()
xrtl2.show()
xlemouv.show()
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.VBox(gtk.FALSE, 0)
boite2 = gtk.VBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton2 = gtk.Button("stoper la lecture")
bouton = gtk.Button("radios cliquez moi!")
bouton.connect_object("event", self.evnmt_button_press, menu)
bouton.show()
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton2.connect("clicked", self.stop)
bouton2.show()
logo = gtk.Image()
logo.set_from_file(logox)
logo.show()
# placement du bouton1 dans la boite1
boite2.pack_start(bouton, gtk.TRUE, gtk.TRUE, 0)
boite2.pack_start(bouton2, gtk.TRUE, gtk.TRUE, 0)
boite2.show()
boite1.pack_start(logo, gtk.TRUE, gtk.TRUE, 0)
boite1.show()
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
boite.show()
# incorporation des deux boite dans la boite principale
fenetre.add(boite)
fenetre.show()
# fonction pour la connection du bouton avec notre menu
def evnmt_button_press(self, widget, evenement):
if evenement.type == gtk.gdk.BUTTON_PRESS:
widget.popup(None, None, None, evenement.button, evenement.time)
# On fait savoir au code appelant que l'on a traite l'evenement. Son
# histoire s'arrete ici.
return gtk.TRUE
# On fait savoir au code appelant que l'evenement n'a pas ete traite. Il continue.
return gtk.FALSE
#fonction de mplayer
def player(self, widget, url=None, logox=None):
if url == None:
return
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
self.stop(self)
gtk.main_quit()
return gtk.FALSE
def boucle():
gtk.main()
return 0
if __name__ == "__main__":
salut = bb()
boucle()
Dernière modification par david breizh (Le 17/07/2006, à 18:25)
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#19 Le 18/07/2006, à 12:43
- mccricri
Re : python pygtk
Ouais, le menu sur le boutton, c'est pas mal non plus.
Pour l'image, c'est bien commencé.
Ce qu'il faut c'est garder la référence à l'objet image pour plus tard :
self.logo = gtk.Image()
self.logo.set_from_file(logox)
self.logo.show()
Ensuite, dans la méthode qui change de radio, il faut utiliser le paramètre que tu as ajouté , logox, pour changer l'url de l'image de tout à l'heure :
self.logo.set_from_file(logox)
Eventuellement tester si logox == None et mettre alors une image par défaut, qui dirais "J'ai pas d'image"
Reste à compléter la liste des images lors du connect de chaque menu, comme tu l'as déjà fait pour nrj
Autre proposition d'amélioration : je mettrais les informations des radios dans une liste en début de script, et je l'utiliserai en "boucle" dans le programme.
Parce que là, y a pas beaucoup de radio, mais déjà quand tu en ajoutes une il faut changer à pas mal d'endroit dans le code. Au risque d'oublier un bout.
list_radio = [("Nrj","mms://vip1.yacast.fr/encodernrj","nrj.jpg"), ("Fun Radio","mms://vip2.yacast.fr/encoderfun","funradio.jpg"),... ]
Hors ligne
#20 Le 21/07/2006, à 16:28
- david breizh
Re : python pygtk
salut, merci mccricri pour tes solutions.
mais là je suis dans le sud donc je peux pas trop tester le truc car ils sont sous windows donc je testerai ça en rentrant mais juste une question à ton amélioration pour la liste ( heu je ne fais que commencer la prog python pygtk donc j'ai lu les aides et tutoriels sur le sujet (et y'en a)) , donc si tu pouvait reprendre le code pour en faire un exemple pour la liste ça serai pas mal pour que je comprennes déjà et pouvoir l'exploiter plus tard .
en plus de ça je ne sais plus trop si il vaut mieux utiliser python avec python avec pygtk ou wxpython à votre avis lequel et le mieux et je voudrai savoir si on pouvais créer un einterface graphique rapidement à l'aide de glade avec python ou avec un autre logiciel du style.
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#21 Le 22/07/2006, à 23:13
- mccricri
Re : python pygtk
Ben oui, mais si c'est moi qui l'écrit, c'est pas toi qui apprends à le faire
Je te donnais juste des indications, mais du moment que ça fonctionne, que t'en est content, c'est bon. Pas la peine non plus de se prendre la tête.
Pour le choix de la lib graphique, y a de quoi débattre toute la nuit, un peu comme le choix de sa wm sous linux (kde ou gnome ou ...). Y a du bon dans chaque, du moins bon aussi. Après c'est surtout une question d'habitude. Et pour les débutants, c'est du pareil au même. ça permettra simplement d'apprendre les bases de la prog graphique. Et plus tard, la transition sera super facile, et il sera encore temps de voir pour tester chaque toolkit et choisir vraiment.
Et oui, glade doit permettre de faire des interfaces gtk réutilisable avec python.
un petit exemple
Bonnes vacances, et bonne continuation
Hors ligne
#22 Le 21/08/2006, à 14:30
- Francescu
Re : python pygtk
Je vois que mon petit script a donné des idée a certains parcontre sa serait bien de me tenir o courant de l'évolution de ton script stp sa me permettrai d'apprendre certaine chose en prog et de voir comment vous avez retranscrit mon script merci
MacBook Pro with Ubuntu of Course !! ;)
Hors ligne
#23 Le 06/09/2006, à 03:04
- david breizh
Re : python pygtk
désolé faut que je mis remet car vendu mes 2 pc donc là je viens juste de réinstaller sur le portable de ma copine , en attente de mon prochain pc (sur mesure) car je dois déménager bientôt donc ça va venir un peu de patience car il faut que je réinstall tout le toutine ainsi que ma clé usb tnt mais bon ça ne devrait pas être trop long , et pour ce qui est du prog tout est là enfin le principal. voilà alors très bientôt.
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
#24 Le 11/02/2007, à 15:47
- david breizh
Re : python pygtk
bon j'ai décider de mi remettre mais c'est pas facile, j'ai l'image par défault qui s'affiche mais j'ai essayer de connecter (je suis plus très sur) le nom de l'image lors du clic sur la radio mais ne change pour l'image), en plus j'aimerai bien en faire une liste de toutes les radios car ça fait un peut long quand même), donc si quelqu'un a des petites pistes car je but encore ou je doit me mélanger les pinceaux.
je poste la source du prog:
#!/usr/bin/env python
# importation de gtk et pygtk
import os
import signal
import pygtk
pygtk.require('2.0')
import gtk
#variables de début
pidActuel = 0
logox = "fun.jpg"
# définition de la classe bb
class bb:
# fonction init
def __init__(self):
# Creation de la fenetre principale
fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
# titre de la fenêtre principale
fenetre.set_title("Radio on line !")
# Ici on definit juste un gestionnaire pour le signal
# delete_event (qui quittera GTK immediatement)
fenetre.connect("delete_event", self.evnmt_delete)
# On fixe la largeur des bordures et la taille de la fenetre.
fenetre.set_size_request(220, -1)
fenetre.set_default_size(220 ,-1)
fenetre.set_border_width(10)
#création du menu
menu = gtk.Menu()
#création des entrées du menu
xnrj = gtk.MenuItem("NRJ")
xfunradio = gtk.MenuItem("Fun Radio")
xskyrock =gtk.MenuItem("Skyrock")
xcherie = gtk.MenuItem("Chérie fm")
xeurope2 = gtk.MenuItem("Europe 2")
xrtl2 = gtk.MenuItem("RTL 2")
xlemouv = gtk.MenuItem("Le Mouv")
# on les places dans le menuradio
menu.append(xnrj)
menu.append(xfunradio)
menu.append(xskyrock)
menu.append(xcherie)
menu.append(xeurope2)
menu.append(xrtl2)
menu.append(xlemouv)
# on connect une fonction au choix de la liste du menu
xnrj.connect("activate", self.player, "mms://vip1.yacast.fr/encodernrj", "nrj.jpg")
xfunradio.connect("activate", self.player, "mms://vip2.yacast.fr/encoderfun", "fun.jpg")
xskyrock.connect("activate", self.player, "mms://vip3.yacast.fr/encoderskyrock")
xcherie.connect("activate", self.player, "mms://vip1.yacast.fr/encodercheriefm")
xeurope2.connect("activate", self.player, "mms://viptvr.yacast.fr/tvr_europe2")
xrtl2.connect("activate", self.player, "mms://vipbu.yacast.fr/encoderrtl2")
xlemouv.connect("activate", self.player, "mms://viptvr.yacast.fr/encoderlemouv")
xnrj.show()
xfunradio.show()
xskyrock.show()
xcherie.show()
xeurope2.show()
xrtl2.show()
xlemouv.show()
# création de la boite principale verticale
boite = gtk.VBox(gtk.FALSE, 0)
# création de la boite1 et boite2 horizontale
boite1 = gtk.VBox(gtk.FALSE, 0)
boite2 = gtk.VBox(gtk.FALSE, 0)
# Creation des différents boutons avec leurs étiquettes
bouton2 = gtk.Button("stoper la lecture")
bouton = gtk.Button("radios cliquez moi!")
bouton.connect_object("event", self.evnmt_button_press, menu)
bouton.show()
# Lorsque on cliquera sur le bouton, la ligne suivante appellera la
# methode employé avec la chaine comme argument.
bouton2.connect("clicked", self.stop)
bouton2.show()
logo = gtk.Image()
logo.set_from_file(logox)
logo.show()
# placement du bouton1 dans la boite1
boite2.pack_start(bouton, gtk.TRUE, gtk.TRUE, 0)
boite2.pack_start(bouton2, gtk.TRUE, gtk.TRUE, 0)
boite2.show()
boite1.pack_start(logo, gtk.TRUE, gtk.TRUE, 0)
boite1.show()
boite.pack_start(boite1, gtk.TRUE, gtk.TRUE, 0)
boite.pack_start(boite2, gtk.TRUE, gtk.TRUE, 0)
boite.show()
# incorporation des deux boite dans la boite principale
fenetre.add(boite)
fenetre.show()
# fonction pour la connection du bouton avec notre menu
def evnmt_button_press(self, widget, evenement):
if evenement.type == gtk.gdk.BUTTON_PRESS:
widget.popup(None, None, None, evenement.button, evenement.time)
# On fait savoir au code appelant que l'on a traite l'evenement. Son
# histoire s'arrete ici.
return gtk.TRUE
# On fait savoir au code appelant que l'evenement n'a pas ete traite. Il continue.
return gtk.FALSE
#fonction de mplayer
def player(self, widget, url=None, logox=None):
if url == None:
return
logo = logox
self.stop(self)
global pidActuel
pidActuel = os.spawnl(os.P_NOWAIT, "/usr/bin/mplayer", "mplayer", url)
# fonction pour stopper la lecture de la radio
def stop(self, widget):
global pidActuel
if pidActuel != 0:
os.kill(pidActuel, signal.SIGTERM)
pidActuel = 0
# fonction a deux bal
def salut(self, widget, donnees):
print "Salut ! - Clic sur le %s" % donnees
# fonction pour quiter le programme
def evnmt_delete(self, widget, evenement, donnees=None):
self.stop(self)
gtk.main_quit()
return gtk.FALSE
def boucle():
gtk.main()
return 0
if __name__ == "__main__":
salut = bb()
boucle()
est ce qu'il y moyen de mettre deux fonctions sur le click du bouton ou deux arguments?
ah ! du fin fond de la bretagne grâce au libre on se sent moins seul!
Vive le libre et toutes les distributions qui m'ont fait découvrir le monde de linux!
Hors ligne
Pages : 1