Lancement script au démarrage avec rc.local [RESOLU]
Modérateurs : Francois, maxty01
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Lancement script au démarrage avec rc.local
Bonjour à tous!
Je me suis amusé à faire un "GameBoy" avec quelques jeux en PyGame.
J'ai fait un script menu.py qui permet de choisir quel jeu lancer depuis une liste de jeux.
Et voilà que forcément je cherche à lancer mes scripts PyGame au démarrage avec le fichier /etc/rc.local en ajoutant la commande python /home/pi/menu.py et ça ne marche pas
D'où ma question: est-ce possible de lancer un script Python avec PyGame de cette façon? ou est-ce qu'il est trop tôt pour pouvoir initialiser correctement l'environnement PyGame?
Comment peut-on faire du coup? J'ai pensé à CronTab, mais on ne peut lancer que des commandes à heures fixes et non au démarrage...
Si quelqu'un à une idée ça m'aiderait beaucoup
Salutation à tous!
Je me suis amusé à faire un "GameBoy" avec quelques jeux en PyGame.
J'ai fait un script menu.py qui permet de choisir quel jeu lancer depuis une liste de jeux.
Et voilà que forcément je cherche à lancer mes scripts PyGame au démarrage avec le fichier /etc/rc.local en ajoutant la commande python /home/pi/menu.py et ça ne marche pas
D'où ma question: est-ce possible de lancer un script Python avec PyGame de cette façon? ou est-ce qu'il est trop tôt pour pouvoir initialiser correctement l'environnement PyGame?
Comment peut-on faire du coup? J'ai pensé à CronTab, mais on ne peut lancer que des commandes à heures fixes et non au démarrage...
Si quelqu'un à une idée ça m'aiderait beaucoup
Salutation à tous!
-
- Administrateur
- Messages : 3233
- Enregistré le : mer. 17 sept. 2014 18:12
- Localisation : Seine et Marne
Re: Lancement script au démarrage avec rc.local
Bonjour,
Pour Cron, tu peux lancer une commande au démarrage en mettant la ligne :
Mais dans ton cas, cela ne fonctionnera pas, tout comme le rc.local
Dans ton cas il faut que le user soit connecté avant de lancer ton script, et le lancer dans ton interface écran.
Pour cela, je tenterai de passer par le ".bashrc" de l'utilisateur lancer au démarrage de ta console.
si c'est PI, tu te connectes en PI, puis dans le fichier ~/.bashrc, tu ajoutes à la fin du fichier la commande qui lance ton script.
Une fois la modif effectuée, tu peux tester avant de redémarrer ton Rpi en lançant la commande suivante qui va ré-exécuter ton .bashrc
Attention, la commande commence par "point espace"
PS : Je ne connais pas Pygame, je te donne donc ici le standard Linux, à toi d'adapter si besoin.
Pour Cron, tu peux lancer une commande au démarrage en mettant la ligne :
Code : Tout sélectionner
@reboot ton_script
Dans ton cas il faut que le user soit connecté avant de lancer ton script, et le lancer dans ton interface écran.
Pour cela, je tenterai de passer par le ".bashrc" de l'utilisateur lancer au démarrage de ta console.
si c'est PI, tu te connectes en PI, puis dans le fichier ~/.bashrc, tu ajoutes à la fin du fichier la commande qui lance ton script.
Une fois la modif effectuée, tu peux tester avant de redémarrer ton Rpi en lançant la commande suivante qui va ré-exécuter ton .bashrc
Code : Tout sélectionner
. ~/.bashrc
PS : Je ne connais pas Pygame, je te donne donc ici le standard Linux, à toi d'adapter si besoin.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Re: Lancement script au démarrage avec rc.local
Re,
merci pour ta réponse rapide, je ne connaissais pas 'bashrc' j'ai donc essayé, un script python sans PyGame fonctionne bien mais pas avec PyGame.
J'ai essayé de faire un python qui attend 30 secondes avant qu'il lance un autre script qui contient PyGame, éh bien que je le lance au démarrage avec le fichier rc.local, bashrc ou encore avec CronTab @reboot c'est toujours pareil, ce ne marche pas
Pourtant si je le lance depuis la console manuellement avec sudo ./menu.py ça fonctionne très bien
Pourtant ceux qui font un jeu avec Pygame, il doivent bien le lancer automatiquement au démarrage non?!
Si quelqu'un a une idée
merci pour ta réponse rapide, je ne connaissais pas 'bashrc' j'ai donc essayé, un script python sans PyGame fonctionne bien mais pas avec PyGame.
J'ai essayé de faire un python qui attend 30 secondes avant qu'il lance un autre script qui contient PyGame, éh bien que je le lance au démarrage avec le fichier rc.local, bashrc ou encore avec CronTab @reboot c'est toujours pareil, ce ne marche pas
Pourtant si je le lance depuis la console manuellement avec sudo ./menu.py ça fonctionne très bien
Pourtant ceux qui font un jeu avec Pygame, il doivent bien le lancer automatiquement au démarrage non?!
Si quelqu'un a une idée
-
- Raspinaute
- Messages : 248
- Enregistré le : mar. 7 oct. 2014 09:46
- Localisation : Morsang / Orge - Essonne
- Contact :
Re: Lancement script au démarrage avec rc.local
Bonjour,
Si cela fonction avec sudo ./menu.py cela doit fonctionner avec la ligne: @reboot sudo ./menu.py
pour modifier crontab il ne faut le faire directement mais utiliser les commande suivante:
1/ crontab -e et modifier le texte
ou
2/ créer un fichier que tu appelle par exemple crontab.txt dans le quel tu met les lignes de ton cron.
tu le sauvegarde et tu tapes: crontab -u [username] crontab.txt
ensuite tu vérifie que cela à bien été pris en compte avec crontab -l
cordialement
Si cela fonction avec sudo ./menu.py cela doit fonctionner avec la ligne: @reboot sudo ./menu.py
pour modifier crontab il ne faut le faire directement mais utiliser les commande suivante:
1/ crontab -e et modifier le texte
ou
2/ créer un fichier que tu appelle par exemple crontab.txt dans le quel tu met les lignes de ton cron.
tu le sauvegarde et tu tapes: crontab -u [username] crontab.txt
ensuite tu vérifie que cela à bien été pris en compte avec crontab -l
cordialement
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Re: Lancement script au démarrage avec rc.local
Bonjour Mike!
Merci pour ta réponse, j'ai suivi ta marche à suivre pour modifier Crontab et même comme ça, ça ne fonctionne pas
En fait le programme se lance bien, mais l'écran reste noir. L'un des boutons qui fait un "sudo shutdown -h now" fonctionne très bien, donc c'est bien la partie Pygame qui ne s'initialise pas convenablement..
Pourtant le truc dingue c'est que quand j'écris au clavier "sudo ./menu.py" ça fonctionne nickel
et je ne trouve rien sur internet
Est-ce une question de droits? mais je l'ai rendu exécutable par tous...
Bonne journée, et merci de votre aide!
Merci pour ta réponse, j'ai suivi ta marche à suivre pour modifier Crontab et même comme ça, ça ne fonctionne pas
En fait le programme se lance bien, mais l'écran reste noir. L'un des boutons qui fait un "sudo shutdown -h now" fonctionne très bien, donc c'est bien la partie Pygame qui ne s'initialise pas convenablement..
Pourtant le truc dingue c'est que quand j'écris au clavier "sudo ./menu.py" ça fonctionne nickel
et je ne trouve rien sur internet
Est-ce une question de droits? mais je l'ai rendu exécutable par tous...
Bonne journée, et merci de votre aide!
-
- Raspinaute
- Messages : 315
- Enregistré le : jeu. 12 nov. 2015 17:39
- Localisation : Bourges (18)
Re: Lancement script au démarrage avec rc.local
Ton script ressemble à quoi ? Les chemins sont bien complet ?
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Re: Lancement script au démarrage avec rc.local
Voici mon script, qui fait simplement une liste des jeux, que l'on peut sélectionner:
(on peut faire + simple, c'est un premier jet, mon problème est juste l'affichage, donc à mon avis c'est Pygame qui ne s'initialise pas)
(on peut faire + simple, c'est un premier jet, mon problème est juste l'affichage, donc à mon avis c'est Pygame qui ne s'initialise pas)
Code : Tout sélectionner
#!/usr/bin/python
import RPi.GPIO as gpio
import pygame
import time
import pygame.gfxdraw
import urllib2
import os
gpio.setmode(gpio.BCM)
# On defini les ports comme des entrees
gpio.setup(4, gpio.IN) # bouton bas
gpio.setup(6, gpio.IN) # bouton haut
gpio.setup(12, gpio.IN) # bouton B
gpio.setup(16, gpio.IN) # bouton shutdown
gpio.setup(17, gpio.IN) # bouton droite
gpio.setup(21, gpio.IN) # bouton A
gpio.setup(22, gpio.IN) # bouton gauche
pygame.init()
screen = pygame.display.set_mode((320, 240), pygame.FULLSCREEN) # on genere la fenetre en plein ecran
noir = (0, 0, 0)
screen.fill(noir) # couleur de fond: noir
rubrique = "accueil" # utiliser pour afficher plusieurs pages de liste de jeux
print("Ecran accueil")
noir = (0, 0, 0)
blanc = (255, 255, 255)
bleu = (0, 0, 255)
rouge = (255, 0, 0)
vert = (0, 255, 0)
jaune = (255, 255, 0)
violet = (255, 0, 255)
maron = (160, 82, 45)
orange = (255, 165, 0)
rose = (255, 192, 203)
gris = (125, 125, 125)
vertClair = (76, 255, 0)
vertFonce = (38, 127, 0)
screen.fill(noir) # couleur de fond: noir
font = pygame.font.Font(None, 24) # definit l ecriture
# Menu du haut
text = font.render("Liste des jeux - Page 1/1", 1, (255, 255, 255)) # en blanc
screen.blit(text, (65, 10)) # on le met sur la surface
# Les traits autour des menus haut
pygame.gfxdraw.line(screen, 35, 40, 285, 40, blanc) # horizontal haut
pygame.gfxdraw.line(screen, 35, 0, 35, 40, blanc) # verticaux haut tout a gauche
pygame.gfxdraw.line(screen, 285, 0, 285, 40, blanc) # verticaux haut tout a droite
# Titre
text = font.render("[D], [U], [X] ou [ESC]", 1, (255, 255, 255)) # en blanc
screen.blit(text, (165, 220)) # on le met sur la surface
# dessin croix
pygame.gfxdraw.line(screen, 30, 65, 40, 65, rouge)
pygame.gfxdraw.line(screen, 30, 65, 30, 80, rouge)
pygame.gfxdraw.line(screen, 40, 65, 40, 80, rouge)
pygame.gfxdraw.line(screen, 15, 80, 30, 80, rouge)
pygame.gfxdraw.line(screen, 40, 80, 55, 80, rouge)
pygame.gfxdraw.line(screen, 15, 90, 30, 90, rouge)
pygame.gfxdraw.line(screen, 40, 90, 55, 90, rouge)
pygame.gfxdraw.line(screen, 15, 80, 15, 90, rouge)
pygame.gfxdraw.line(screen, 55, 80, 55, 90, rouge)
pygame.gfxdraw.line(screen, 30, 90, 30, 105, rouge)
pygame.gfxdraw.line(screen, 40, 90, 40, 105, rouge)
pygame.gfxdraw.line(screen, 30, 105, 40, 105, rouge)
pygame.gfxdraw.line(screen, 35, 70, 70, 80, blanc) # traits blancs
pygame.gfxdraw.line(screen, 35, 100, 70, 90, blanc)
text = font.render("selection", 1, (255, 255, 255))
screen.blit(text, (75, 75)) # on le met sur la surface
# dessin des 3 boutons
pygame.gfxdraw.circle(screen, 170, 105, 5, rouge)
pygame.gfxdraw.circle(screen, 185, 85, 5, rouge)
pygame.gfxdraw.circle(screen, 200, 65, 5, rouge)
text = font.render("shutdown", 1, (255, 255, 255))
screen.blit(text, (185, 96)) # on le met sur la surface
text = font.render("info jeu", 1, (255, 255, 255))
screen.blit(text, (200, 76)) # on le met sur la surface
text = font.render("lancer jeu", 1, (255, 255, 255))
screen.blit(text, (215, 56)) # on le met sur la surface
# liste des jeux
# on liste tous les jeux /!\ le nom du jeu DOIT avoir 15 caracteres (utiliser des espaces apres le nom pour faire 15 caracteres)
# le nom du fichier python DOIT avoir 5 caracteres (jeu00.py)
# /!\ MAX 5 jeux (sinon creer une page 2..)
jeux = "<>Jeu numero 1 <>jeu01.py<>Jeu numero 2 <>jeu02.py<>Jeu numero 3 <>jeu03.py<>Jeu numero 4 <>jeu04.py<>Jeu numero 5 <>jeu05.py" # /!\ DE NE PAS METTRE <> A LA FIN!!
nom_jeu = {} # on creer un dictionnaire pour pouvoir utiliser la variable nom_jeu[i]
nom_py = {}
nb_caractere = 2
i = 1
while 1 == 1: # boucle executee jusqu au break quand on a recuperer tous les noms des jeux
#print("nom jeu " + str(i) + ":")
nom_jeu[i] = (jeux[nb_caractere:(nb_caractere + 15)]) # on prend du 3e caractere au 17
#print(nom_jeu[i])
nb_caractere = (nb_caractere +17)
#print("fichier.py " + str(i) + ":")
nom_py[i] = (jeux[nb_caractere:(nb_caractere + 8)])
#print(nom_py[i])
nb_caractere = (nb_caractere +6)
#print("")
jeux = (jeux[27:]) # on enleve le titre du jeu qui vient d etre mis en variable ainsi que son nom de fichier.py
nb_caractere = 2 # on remet le nb de caractere a 2
if jeux[(nb_caractere - 2):(nb_caractere)] != "<>": # si il n y a plu de jeu dans la variable $jeux -> break
break # on sort de la while..
i = (i + 1)
y_position = 118 # position Y de la ligne du jeu numero 1 (+25 a chaque ligne)
pygame.gfxdraw.box(screen,(5, y_position, 310, 20),vertFonce) # carre vert sur jeu selectionner
screen.blit(text, (500, 80)) # on le met sur la surface
text = font.render(nom_jeu[1], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 1:
text = font.render(nom_jeu[2], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 2:
text = font.render(nom_jeu[3], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 3:
text = font.render(nom_jeu[4], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 4:
text = font.render(nom_jeu[5], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 5:
text = font.render(nom_jeu[6], 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
y_position = y_position + 25 # on descend le curseur de 30 pour ecrire la ligne suivante
if i > 6:
text = font.render("Autres (bug)", 1, (255, 255, 255)) # en blanc
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.display.flip() # update de la fenetre
selection = 1
while 1 == 1: # boucle infinie (jusqu a touche retour -> return)
y_position = 118 # position Y de la ligne du jeu numero 1 (+25 a chaque ligne)
# puis quand on selectionne une ligne en vert, on remet les lignes d avant et apres en normal non-selectionner
if selection == 1:
pygame.gfxdraw.box(screen,(5, (y_position), 310, 20),vertFonce) # carre vert pour effacer ligne 1
text = font.render(str(nom_jeu[1]), 1, (255, 255, 255)) # ligne 1
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position+25), 310, 20),noir) # carre noir pour effacer ligne 2
text = font.render(str(nom_jeu[2]), 1, (255, 255, 255)) # ligne 2
screen.blit(text, (10, (y_position + 25))) # on le met sur la surface
elif selection == 2:
y_position = (y_position + 25)
pygame.gfxdraw.box(screen,(5, (y_position), 310, 20),vertFonce) # carre vert pour effacer ligne 2
text = font.render(str(nom_jeu[2]), 1, (255, 255, 255)) # ligne 2
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position-25), 310, 20),noir) # carre noir pour effacer ligne 1
text = font.render(str(nom_jeu[1]), 1, (255, 255, 255)) # ligne 1
screen.blit(text, (10, (y_position-25))) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position+25), 310, 20),noir) # carre noir pour effacer ligne 3
text = font.render(str(nom_jeu[3]), 1, (255, 255, 255)) # ligne 3
screen.blit(text, (10, (y_position+25))) # on le met sur la surface
elif selection == 3:
y_position = (y_position + 50)
pygame.gfxdraw.box(screen,(5, (y_position), 310, 20),vertFonce) # carre vert pour effacer ligne 3
text = font.render(str(nom_jeu[3]), 1, (255, 255, 255)) # ligne 3
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position-25), 310, 20),noir) # carre noir pour effacer ligne 2
text = font.render(str(nom_jeu[2]), 1, (255, 255, 255)) # ligne 2
screen.blit(text, (10, (y_position-25))) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position+25), 310, 20),noir) # carre noir pour effacer ligne 4
text = font.render(str(nom_jeu[4]), 1, (255, 255, 255)) # ligne 4
screen.blit(text, (10, (y_position+25))) # on le met sur la surface
elif selection == 4:
y_position = (y_position + 75)
pygame.gfxdraw.box(screen,(5, (y_position), 310, 20),vertFonce) # carre vert pour effacer ligne 4
text = font.render(str(nom_jeu[4]), 1, (255, 255, 255)) # ligne 4
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position-25), 310, 20),noir) # carre noir pour effacer ligne 3
text = font.render(str(nom_jeu[3]), 1, (255, 255, 255)) # ligne 3
screen.blit(text, (10, (y_position-25))) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position+25), 310, 20),noir) # carre noir pour effacer ligne 5
text = font.render(str(nom_jeu[5]), 1, (255, 255, 255)) # ligne 5
screen.blit(text, (10, (y_position+25))) # on le met sur la surface
else:
y_position = (y_position + 100)
pygame.gfxdraw.box(screen,(5, (y_position), 310, 20),vertFonce) # carre vert pour effacer ligne 5
text = font.render(str(nom_jeu[5]), 1, (255, 255, 255)) # ligne 5
screen.blit(text, (10, y_position)) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position-25), 310, 20),noir) # carre noir pour effacer ligne 4
text = font.render(str(nom_jeu[4]), 1, (255, 255, 255)) # ligne 4
screen.blit(text, (10, (y_position-25))) # on le met sur la surface
pygame.gfxdraw.box(screen,(5, (y_position+25), 310, 20),noir) # carre noir pour effacer ligne 6
pygame.display.flip() # update de la fenetre
# ci-dessous gestion des touches
# 4: bouton bas
# 6: bouton haut
# 12: bouton B
# 16: bouton shutdown
# 17: bouton droite
# 21: bouton A
# 22: bouton gauche
if(gpio.input(16) == False): # bouton shutdown
print("Bouton shutdown actif")
os.system('sudo shutdown -h now')
if(gpio.input(4) == False): # bouton bas
if selection < 5: # on fait descendre la selection
selection = (selection + 1) # si < 17
print("Selection: " + str(selection))
else:
selection = 5 # sinon on bloque sur la derniere ligne
print("Selection: " + str(selection))
if(gpio.input(6) == False): # bouton haut
if selection > 1: # on fait monter la selection (Up)
selection = (selection - 1) # si > 1
print("Selection: " + str(selection))
else:
selection = 1 # sinon on bloque sur la premiere ligne
print("Selection: " + str(selection))
if(gpio.input(12) == False): # bouton B qui lance le jeu
print("Lancer fichier: " + str(nom_py[selection]))
os.system("sudo ./" + str(nom_py[selection]))
# os.system("sudo ./jeu01")
time.sleep(0.2) # pour diminuer la charge CPU
- Flachy Joe
- Messages : 88
- Enregistré le : mar. 20 sept. 2016 22:30
Re: Lancement script au démarrage avec rc.local
Salut la_couenne,
comme je m'ennuyais, j'ai réécrit ton programme avec un peu de POO et quelques astuces pour qu'il tourne sur PC avec les événements clavier.
J'ai aussi séparé les différents graphiques dans des procédures pour qu'ils puissent être mis à jour indépendamment.
Chez moi ça ne voulait pas se lancer depuis la console sous prétexte qu'il n'y a pas de souris disponible, j'ai donc contourné le problème en désactivant la souris (ligne 69).
Je n'ai pas testé sur RPi, donc pas plus d'info concernant ton pb...
comme je m'ennuyais, j'ai réécrit ton programme avec un peu de POO et quelques astuces pour qu'il tourne sur PC avec les événements clavier.
J'ai aussi séparé les différents graphiques dans des procédures pour qu'ils puissent être mis à jour indépendamment.
Chez moi ça ne voulait pas se lancer depuis la console sous prétexte qu'il n'y a pas de souris disponible, j'ai donc contourné le problème en désactivant la souris (ligne 69).
Je n'ai pas testé sur RPi, donc pas plus d'info concernant ton pb...
Code : Tout sélectionner
#!/usr/bin/python
# coding: utf8
import pygame
import time
import pygame.gfxdraw
import urllib2
import os
try:
import RPi.GPIO as gpio
except ImportError:
#faux gpio pour les PC autres que Raspberry
class __gpio:
IN=1
BCM=1
def setup(self, port, mode):
return
def setmode(self,port):
return
def input(self,port):
return True
gpio=__gpio()
gpio.setmode(gpio.BCM)
# On defini les ports comme des entrees
gpio.setup(4, gpio.IN) # bouton bas
gpio.setup(6, gpio.IN) # bouton haut
gpio.setup(12, gpio.IN) # bouton B
gpio.setup(16, gpio.IN) # bouton shutdown
gpio.setup(17, gpio.IN) # bouton droite
gpio.setup(21, gpio.IN) # bouton A
gpio.setup(22, gpio.IN) # bouton gauche
class colors:
noir=(0,0,0)
blanc=(255,255,255)
bleu=(0, 0, 255)
rouge=(255, 0, 0)
vert=(0, 255, 0)
jaune=(255, 255, 0)
violet=(255, 0, 255)
maron=(160, 82, 45)
orange=(255, 165, 0)
rose=(255, 192, 203)
gris=(125, 125, 125)
vertClair=(76, 255, 0)
vertFonce=(38, 127, 0)
class mypygame:
background=colors.noir
foreground=colors.jaune
colorselect=colors.bleu
colorbutton=colors.rouge
screensize=(0,0) #taille par defaut
# liste des jeux
jeux=[(0,0), #les indices commencent à zéro, on triche...
("Jeu numero 1","jeu01.py"),
("Jeu numero 2","jeu02.py"),
("Jeu numero 3","jeu03.py"),
("Jeu numero 4","jeu04.py")]
def __init__(self):
os.environ['SDL_NOMOUSE']='1'
pygame.init()
self.screen = pygame.display.set_mode(self.screensize, pygame.FULLSCREEN) # plein ecran
self.screen.fill(self.background)
self.font = pygame.font.Font(None, 24) # definit l ecriture
#Trace l'écran
self.menu_haut()
self.titre()
self.croix()
self.boutons()
self.listejeux()
self.selection(1)
def menu_haut(self):
# Menu du haut
text = self.font.render("Liste des jeux - Page 1/1", 1, self.foreground) # en blanc
self.screen.blit(text, (65, 10)) # on le met sur la surface
# Les traits autour des menus haut
pygame.gfxdraw.line(self.screen, 35, 40, 285, 40, self.foreground) # horizontal haut
pygame.gfxdraw.line(self.screen, 35, 0, 35, 40, self.foreground) # verticaux haut tout a gauche
pygame.gfxdraw.line(self.screen, 285, 0, 285, 40, self.foreground) # verticaux haut tout a droite
def titre(self):
# Titre
text = self.font.render(u"[Haut], [Bas], [Entrée] ou [ESC]", 1, self.foreground)
self.screen.blit(text, (165, 220)) # on le met sur la surface
def croix(self):
# dessin croix
pygame.gfxdraw.line(self.screen, 30, 65, 40, 65, self.colorbutton)
pygame.gfxdraw.line(self.screen, 30, 65, 30, 80, self.colorbutton)
pygame.gfxdraw.line(self.screen, 40, 65, 40, 80, self.colorbutton)
pygame.gfxdraw.line(self.screen, 15, 80, 30, 80, self.colorbutton)
pygame.gfxdraw.line(self.screen, 40, 80, 55, 80, self.colorbutton)
pygame.gfxdraw.line(self.screen, 15, 90, 30, 90, self.colorbutton)
pygame.gfxdraw.line(self.screen, 40, 90, 55, 90, self.colorbutton)
pygame.gfxdraw.line(self.screen, 15, 80, 15, 90, self.colorbutton)
pygame.gfxdraw.line(self.screen, 55, 80, 55, 90, self.colorbutton)
pygame.gfxdraw.line(self.screen, 30, 90, 30, 105, self.colorbutton)
pygame.gfxdraw.line(self.screen, 40, 90, 40, 105, self.colorbutton)
pygame.gfxdraw.line(self.screen, 30, 105, 40, 105, self.colorbutton)
pygame.gfxdraw.line(self.screen, 35, 70, 70, 80, self.foreground) # traits blancs
pygame.gfxdraw.line(self.screen, 35, 100, 70, 90, self.foreground)
text = self.font.render("selection", 1, self.foreground)
self.screen.blit(text, (75, 75)) # on le met sur la surface
def boutons(self):
# dessin des 3 boutons
pygame.gfxdraw.circle(self.screen, 170, 105, 5, self.colorbutton)
pygame.gfxdraw.circle(self.screen, 185, 85, 5, self.colorbutton)
pygame.gfxdraw.circle(self.screen, 200, 65, 5, self.colorbutton)
text = self.font.render("shutdown", 1, self.foreground)
self.screen.blit(text, (185, 96))
text = self.font.render("info jeu", 1, self.foreground)
self.screen.blit(text, (200, 76))
text = self.font.render("lancer jeu", 1, self.foreground)
self.screen.blit(text, (215, 56))
def listejeux(self):
y_position = 118 # position Y de la ligne du jeu numéro 1 (+25 a chaque ligne)
for i in range(1,min(len(self.jeux),5)):
text = self.font.render(self.jeux[i][0], 1, self.foreground)
self.screen.blit(text, (10, y_position))
y_position += 25 # on descend le curseur de 25 pour écrire la ligne suivante
def selection(self, index):
y_position = 118+25*(index-1)
if index>1 :
#on met un fond noir à la ligne du dessus
pygame.gfxdraw.box(self.screen,(5, y_position-25, 310, 20),self.background)
text = self.font.render(str(self.jeux[index-1][0]), 1, self.foreground)
self.screen.blit(text, (10, y_position-25))
if index<4 :
#on met un fond noir à la ligne du dessous
pygame.gfxdraw.box(self.screen,(5, y_position+25, 310, 20),self.background)
text = self.font.render(str(self.jeux[index+1][0]), 1, self.foreground)
self.screen.blit(text, (10, y_position+25))
#On met un fond vert à la ligne indiqué
pygame.gfxdraw.box(self.screen,(5, y_position, 310, 20),self.colorselect)
text = self.font.render(str(self.jeux[index][0]), 1, self.foreground)
self.screen.blit(text, (10, y_position))
pygame.display.update()
def lancer(self,index):
print("Lancer fichier: " + str(self.jeux[index][1]))
os.system("./" + str(self.jeux[index][1]))
thegame = mypygame()
selection = 1
boucle = True
while boucle:
time.sleep(0.2) # pour diminuer la charge CPU
action=0
# ci-dessous gestion des touches
# 4: bouton bas
# 6: bouton haut
# 12: bouton B
# 16: bouton shutdown
# 17: bouton droite
# 21: bouton A
# 22: bouton gauche
#gestion événements clavier
for event in pygame.event.get():
if event.type == pygame.QUIT:
boucle = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
boucle = False
if event.key == pygame.K_RETURN:
action=12
if event.key == pygame.K_UP:
action=6
if event.key == pygame.K_DOWN:
action=4
if (gpio.input(16) == False or action==16) : # bouton shutdown
print("Bouton shutdown actif")
os.system('sudo shutdown -h now')
if(gpio.input(4) == False or action==4): # bouton bas
if selection < 4: # on fait descendre la selection
selection += 1
print("Selection: " + str(selection))
thegame.selection(selection)
if(gpio.input(6) == False or action==6): # bouton haut
if selection > 1: # on fait monter la selection (Up)
selection -= 1
print("Selection: " + str(selection))
thegame.selection(selection)
if(gpio.input(12) == False or action == 12):
# bouton B qui lance le jeu
thegame.lancer(selection)
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Re: Lancement script au démarrage avec rc.local
Wow merci Flachy Joe! c'est joliment écrit avec les class, ça fait longtemps que je veux m'y mettre, mais je n'ai jamais fait l'effort
Je vais étudier tout code en détail!
Par contre ça fait toujours pareil! si je le lance depuis la console il fonctionne nickel, et si je le lance au démarrage avec Crontab le programme tourne (puisque les boutons permettent de rebooter) mais l'écran reste noir
J'ai fait un script tout simple pour vérifier, en affichant simplement un fond bleu avec Pygame:
et ça ne se lance pas! ni avec /etc/rc.local
Je vais étudier tout code en détail!
Par contre ça fait toujours pareil! si je le lance depuis la console il fonctionne nickel, et si je le lance au démarrage avec Crontab le programme tourne (puisque les boutons permettent de rebooter) mais l'écran reste noir
J'ai fait un script tout simple pour vérifier, en affichant simplement un fond bleu avec Pygame:
Code : Tout sélectionner
#!/usr/bin/python
import pygame
import time
pygame.init()
screen = pygame.display.set_mode((320, 240))
bleu = (0, 0, 255)
screen.fill(bleu) # couleur de fond
pygame.display.flip() # update de la fenetre
time.sleep(2)
- la_couenne
- Messages : 15
- Enregistré le : lun. 2 févr. 2015 07:32
Re: Lancement script au démarrage avec rc.local [RESOLU]
Je crois que j'ai trouvé!!
J'ai mis mon dernier mini script sur un autre Raspberry avec un écran HDMI, il se lance normalement!
En fait sur mon "GameBoy" j'ai utilisé un écran qui ne passe pas par la sortie HDMI mais par les Gpio, voici son lien:
https://www.adafruit.com/products/2423
Du coup il utilise une version modifiée de Jessie, https://learn.adafruit.com/adafruit-2-8 ... sy-install
Donc je ne comprends toujours pas pourquoi l'affichage Pygame marche si on lance le script depuis la console et pas depuis rc.local ou Crontab, mais je pense avoir un début de solution
Je vais plancher dessus ces quelques jours à venir, en tout car merci pour tous vos messages!
Bonne semaine à tous
J'ai mis mon dernier mini script sur un autre Raspberry avec un écran HDMI, il se lance normalement!
En fait sur mon "GameBoy" j'ai utilisé un écran qui ne passe pas par la sortie HDMI mais par les Gpio, voici son lien:
https://www.adafruit.com/products/2423
Du coup il utilise une version modifiée de Jessie, https://learn.adafruit.com/adafruit-2-8 ... sy-install
Donc je ne comprends toujours pas pourquoi l'affichage Pygame marche si on lance le script depuis la console et pas depuis rc.local ou Crontab, mais je pense avoir un début de solution
Je vais plancher dessus ces quelques jours à venir, en tout car merci pour tous vos messages!
Bonne semaine à tous