Lancement script au démarrage avec rc.local  [RESOLU]

Votre Apache se cache, votre Pi gémit, votre SoC fume ? La panne quoi ! C'est ici que vous trouverez sans doute une solution... Sinon du réconfort :)

Modérateurs : Francois, maxty01

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Lancement script au démarrage avec rc.local

Message par la_couenne » mar. 10 janv. 2017 17:02

Bonjour à tous!

Image
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 :shock:

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!

domi
Administrateur
Messages : 2621
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Lancement script au démarrage avec rc.local

Message par domi » mar. 10 janv. 2017 18:23

Bonjour,

Pour Cron, tu peux lancer une commande au démarrage en mettant la ligne :

Code : Tout sélectionner

@reboot ton_script
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

Code : Tout sélectionner

. ~/.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.

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Re: Lancement script au démarrage avec rc.local

Message par la_couenne » mar. 10 janv. 2017 22:29

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 :oops:

Pourtant si je le lance depuis la console manuellement avec sudo ./menu.py ça fonctionne très bien :roll:

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 :)

mike913
Raspinaute
Messages : 137
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: Lancement script au démarrage avec rc.local

Message par mike913 » jeu. 12 janv. 2017 13:32

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
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.fr

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Re: Lancement script au démarrage avec rc.local

Message par la_couenne » sam. 14 janv. 2017 21:52

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 :shock:
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!

Ghislain
Raspinaute
Messages : 315
Enregistré le : jeu. 12 nov. 2015 17:39
Localisation : Bourges (18)

Re: Lancement script au démarrage avec rc.local

Message par Ghislain » sam. 14 janv. 2017 22:02

Ton script ressemble à quoi ? Les chemins sont bien complet ?

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Re: Lancement script au démarrage avec rc.local

Message par la_couenne » dim. 15 janv. 2017 17:38

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)

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

Avatar du membre
Flachy Joe
Messages : 82
Enregistré le : mar. 20 sept. 2016 22:30

Re: Lancement script au démarrage avec rc.local

Message par Flachy Joe » dim. 15 janv. 2017 22:36

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...

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)

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Re: Lancement script au démarrage avec rc.local

Message par la_couenne » lun. 16 janv. 2017 00:51

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 :D
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 :oops:

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)
et ça ne se lance pas! ni avec /etc/rc.local :cry:

Avatar du membre
la_couenne
Messages : 15
Enregistré le : lun. 2 févr. 2015 07:32

Re: Lancement script au démarrage avec rc.local  [RESOLU]

Message par la_couenne » lun. 16 janv. 2017 01:23

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 :D
Je vais plancher dessus ces quelques jours à venir, en tout car merci pour tous vos messages!

Bonne semaine à tous

Répondre

Retourner vers « En panne ? »