Tkinter: plusieurs commandes shell simultanément (threads)

Bonjour,
Je ne sais pas si le titre de mon sujet correspond bien à mon problème mais bon… je vais tenter de m’expliquer:

en python, avec Tkinter, j’ai un bouton qui execute le bout de code suivant si une case est cochée:

[code]def ButtonClick3():
if retour1.get():
os.system(‘avconv -f alsa -i hw:0,0 -acodec mp2 -b 64k -f rtp rtp://226.0.0.1:1234 &’)
os.system(‘cvlc rtp://226.0.0.17:1235 &’)
env.host_string = ‘{}’.format(IP1)
env.user = ‘{}’.format(user1)
env.password = ‘{}’.format(passwd1)
with settings(warn_only=True):
run(“avconv -f alsa -i hw:0,0 -acodec mp2 -b 64k -f rtp rtp://226.0.0.17:1235 | cvlc rtp://226.0.0.1:1234”)

if retour2.get(): 
             La même chose mais adapté à un autre poste...

[/code]

Ce qui permet de communiquer avec casque et micro entre 2 postes en réseau. Seulement j’ai aussi d’autres fonctionnalités (transfert de fichiers par exemple), mais la dernière commande me bloque le programme (le bouton reste enfoncé tant qu’il y a communication…) J’ai bien essayé avec un & à la fin de la dernière commande, mais là elle ne se lance plus du tout…
Comment puis-je faire pour pouvoir continuer à interagir avec ma fenêtre quand ce code est lancé?

J’espère m’être à peu près fait comprendre… :s

Merci!

C’est en réalité un problème assez complexe. Je n’ai aucune idée de comment ça fonctionne avec Tkinter, mais en GTK c’est le boxon. Il faut utiliser plusieurs threads, ce qui est déjà pas toujours simple en Python, et là comme c’est des “grosses” librairies graphiques, ça en rajoute une couche.
Un exemple de lien qui m’a débloqué avec GTK : unpythonic.blogspot.fr/2007/08/u … pygtk.html

Pour Tkinter, essaie de demander à Google son avis sur “tkinter threads”, pour voir.

Ah oui des threads! j’en avais déjà entendu parler en effet… :confused:
Je cherche dans cette direction alors!
Merci

En effet… Il va falloir que je me penche là-dessus sérieusement :s

Autre chose: est-ce possible avec une case à cocher d’exécuter une action quand on la coche et une autre action quand on la décoche?
C’est à dire sans passer par un bouton qui lit la valeur de la case?
Je ne trouve rien là-dessus sur le net…

Si je comprends bien, c’est encore une histoire de threads… il faut que je fasse un thread avec une boucle qui vérifie en permanence l’état de la case et qui agit si ça change?

voilà ce que j’ai trouvé:

http://openclassrooms.com/courses/apprenez-a-programmer-en-python/la-programmation-parallele-avec-threading

[quote=“totola”]Autre chose: est-ce possible avec une case à cocher d’exécuter une action quand on la coche et une autre action quand on la décoche?
C’est à dire sans passer par un bouton qui lit la valeur de la case?[/quote]
Oui, et sans threads cette fois. En tout cas ce n’est pas à toi de t’en occuper. Les librairies graphiques fonctionnent par signaux, et c’est la librairie elle-même qui fait tourner une boucle en tâche de fond qui vérifie sans arrêt si un signal est envoyé. Donc dans Tkinter il te suffit de trouver le signal envoyé par une case à cocher lorsqu’elle est cochée/décochée.

Regarde notamment ici : zetcode.com/gui/tkinter/widgets/ l’exemple du Checkbutton. Lors de la création du widget, tu peux lui associer un “callback”, une fonction qui sera appelée lorsque l’état du widget change (il envoie un signal), grâce au paramètre “command”.

Il te faut ensuite la fonction associée, ici “onClick” :

[code]def onClick(self):

    if self.var.get() == 1:
        self.master.title("Checkbutton")
    else:
        self.master.title("")[/code]

J’espère que c’est clair :slightly_smiling:

Merci!
oui c’est clair! Je vais tester ça dès que je peux!

[edit] ça fonctionne parfaitement en effet!!

Au fait j’ai pas répondu ici mais j’ai trouvé mon bonheur, c’est même très simple les threads en tkinter:

def callback():

	"Mes instructions ici...."

t = threading.Thread(target=callback)
t.start()

Ça c’est le threading “inclus” dans Python, donc c’est que Tkinter le supporte bien. Tant mieux, ce n’est (malheureusement) pas le cas de GTK+ :frowning: