Python: boucle et volume (c'est dur à expliquer!)

Bonjour,
me revoilà… :slightly_smiling:

Alors, je m’explique j’ai créé un curseur pour régler le volume du micro et un thread avec une boucle qui règle la valeur du micro à la valeur du curseur:

curseurMic = Scale(self, from_=0, to=50, orient=HORIZONTAL)
curseurMic.place(relx=0.65,rely=0.65, anchor='w')
curseurMic.set(12)
		
def callbackVolMic():
	a=1
	while (a>0):
		valMic = str(curseurMic.get())+'%'
		os.system("amixer -q -D pulse set Capture {}".format(valMic))
tMic = threading.Thread(target=callbackVolMic)
tMic.start()
		

Et ça marche. Je suis déjà content :slightly_smiling:

MAIS… j’aimerais également pouvoir, et ce depuis un autre poste, donc avec un autre programme, agir sur la valeur du micro avec une commande de ce type:

commande qui fonctionne parfaitement lorsque le programme précédent n’est pas lancé mais totalement inopérante sinon (c’est le curseur qui impose sa valeur en continu…)

Du coup, je ne sais pas comment faire…
Une solution serait peut-être de pouvoir changer la valeur du curseur depuis le poste distant? Mais ça je ne sais pas faire… Et je ne sais même pas si c’est possible, depuis un autre programme, peut on agir sur la valeur d’une variable?

J’espère avoir été à peu près clair :s

Merci

Je pense que c’est la manière dont agit ton programme qu’il faut changer.

Au lieu de régler en continue la valeur du micro il faudrait plutôt en faire la lecture.
[ul][li]Si tu déplace le curseur et seulement a ce moment, tu change la valeur du micro[/li]
[li]Si la valeur du micro change tu change le positionnement du curseur[/li][/ul]

Du coup si a distance tu change la valeur du micro cette modification sera immédiatement répercuter sur le positionnement de ton curseur.

Voilà ce qui me parait le plus logique.

Je me doutais que c’était un problème conceptuel…
Merci pour la piste, je creuse et je reviens si je ne trouve pas…:slightly_smiling:

[quote=“Mimoza”]Je pense que c’est la manière dont agit ton programme qu’il faut changer.

Au lieu de régler en continue la valeur du micro il faudrait plutôt en faire la lecture.
[list=][]Si tu déplace le curseur et seulement a ce moment, tu change la valeur du micro
[
]Si la valeur du micro change tu change le positionnement du curseur[/list]

Du coup si a distance tu change la valeur du micro cette modification sera immédiatement répercuter sur le positionnement de ton curseur.

Voilà ce qui me parait le plus logique.[/quote]

Bon,
j’ai déjà trouvé une première partie, en ajoutant une commande au curseur:

[code] def curseur(self):
valMic = str(curseurMic.get())+’%'
os.system(“amixer -q -D pulse set Capture {}”.format(valMic))

	curseurMic = Scale(self, from_=0, to=50, orient=HORIZONTAL,command=curseur)[/code]

Reste plus que l’autre partie: lorsqu’on change le volume ça change le niveau du curseur…
Mais là je ne vois pas encore…

[REDIT] Trouvé:

def callbackVolMic(): a=1 while (a>0): valMic = str(curseurMic.get())+'%' os.system("echo $(amixer -D pulse get Capture |grep % |awk '{print $5}'|sed 's/[^0-9]//g' | sed -n 1p) > vol.txt") fs = open("vol.txt","r") t=fs.read() curseurMic.set(t) time.sleep(1) tMic = threading.Thread(target=callbackVolMic) tMic.start()

Bon, je passe par un fichier externe en écriture/lecture, il y a peut-être une autre solution? Et peut-être que ma ligne de commande grep awk sed sed est simplificable!!

Merci pour m’avoir bien mis sur la voie!
:wink:

Ça me semble déjà mieux

Tu ligne «fs = open(“vol.txt”,“r”)» est surement sortable de la boucle car te génère un pointeur vers fichier (que tu ne ferme jamais !!!).
Sinon en effet tu ligne awk/sed est clairement simplifiable car awk/sed est largement assez agile pour t’extraire l’info que tu recherche en 1 commande. Là tu lance 3 process pour 1 info … pas très rentable :neutral_face:

Et je me demande vraiment pourquoi tu passe par un fichier intermédiaire, mais bon là c’est déjà plus sain comme programme je pense.

[quote=“Mimoza”].
Sinon en effet tu ligne awk/sed est clairement simplifiable car awk/sed est largement assez agile pour t’extraire l’info que tu recherche en 1 commande. Là tu lance 3 process pour 1 info … pas très rentable :neutral_face:[/quote]

Oui… pour l’instant ça marche comme ça, j’ai compilé plusieurs exemples de manière “empiriques” jusqu’à ce que ça me sorte quelque chose de convenable… :s
C’est pas très académique, mais je me note ça quelque part et dès que je peux je chercherai à comprendre exactement comment marchent sed et awk dans le détail pour simplifier ça.

[quote=“Mimoza”]
Et je me demande vraiment pourquoi tu passe par un fichier intermédiaire, mais bon là c’est déjà plus sain comme programme je pense.[/quote]

Ben… je me doute bien que c’est possible, mais j’y suis pas encore arrivé… :confused:
Un peu de la même façon, à un moment je récupère le PID d’un vlc et je le stocke aussi dans un fichier externe… ça ne me plait pas beaucoup je dois dire… Mais pour l’instant ça marche quand même… Pareil, je garde ça dans un coin (pour les longues soirées où je m’ennuie…) :slightly_smiling:

Pour après:

Tu es trop violent ! Le «-9» tue le process sans rien lui demander et du coup est susceptible de te laisser des process zombi + lock sur des fichiers.
Enlève ce «-9» et regarde ce que veut dire chaque code si tu as du temps.

Et met cette ligne en dehors de ta boucle.
[code]fs = open("vol.txt","r")[/code]

De plus tu n'as pas de système d'arrêt propre genre un [code]fs.close[/code] qui serait éxécuter si ton programme reçoit un ordre d'arrêt.

Tu es trop violent ! Le «-9» tue le process sans rien lui demander et du coup est susceptible de te laisser des process zombi + lock sur des fichiers.
Enlève ce «-9» et regarde ce que veut dire chaque code si tu as du temps.

Et met cette ligne en dehors de ta boucle.

De plus tu n’as pas de système d’arrêt propre genre un fs.close qui serait éxécuter si ton programme reçoit un ordre d’arrêt.

[quote=“Mimoza”]
Tu es trop violent ! Le «-9» tue le process sans rien lui demander et du coup est susceptible de te laisser des process zombi + lock sur des fichiers.
Enlève ce «-9» et regarde ce que veut dire chaque code si tu as du temps.[/quote]

Ok, j’essaierai sans le -9! Merci pour le conseil!

[quote=“Mimoza”]
Et met cette ligne en dehors de ta boucle.

Là par contre je ne comprends pas… Si je la sors de la boucle, ça ne va plus marcher??

[quote=“Mimoza”]
De plus tu n’as pas de système d’arrêt propre genre un fs.close qui serait éxécuter si ton programme reçoit un ordre d’arrêt.[/quote]

Je vois ce que tu veux dire… Je regarde ça… Merci!

Là par contre je ne comprends pas… Si je la sors de la boucle, ça ne va plus marcher??
[/quote]

Si, ce continuera a fonctionner sans problème. Met là juste en dessous de ton «a=1».
Cette commande te permet juste d’avoir un pointeur vers un fichier, tu n’as pas besoin de recréer ce pointeur a chaque tour de boucle. Tu ouvre une fois ton fichier en lecture et tu utilise ce pointeur autant de fois que tu veux dans ta boucle.

Ben, c’est ce que j’ai fait, mais sans résultat…

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.

Ha bizarre… je suis pas utilisateur de Python donc je ne pourrais t’aider bien plus :017

Ok!
Merci en tout cas! Tu m’as déjà bien aidé! :slightly_smiling:

Maintenant j’ai un problème qui me semble bien plus embêtant…!! :s

https://www.debian-fr.org/python-channelexception-1-administratively-prohibited-t51507.html