"Linker" entre 2 fonctions DEF

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

"Linker" entre 2 fonctions DEF

Message par LuDoPhotography » lun. 27 mars 2017 18:14

Bonjours ou bonsoir à tous, j'ai fait un petit programme : https://pastebin.com/sSrQY69b

Mon problème c'est que je veut régler les paramètres ISO, Lumière, saturation et contraste de la Camera V2 avec picamera via des scales dans un menu de config, un boutoun différent de celui de la prise de photo. dans mon 2nd groupe DEF : takePhoto j'ai mis les paramètres suivants. camera.ISO = scaleISO.get() / camera.saturation = scaleSaturation.get .

Mon problème c'est que une fois lancé j'ai une erreur comme quoi les "scalesxx" ne sont pas définis. Comment dire au programe que scalexx est égale aux scales du 1er boutons ?? :roll: :?: :?: :?:

Avatar du membre
Manfraid
Modérateur
Messages : 1401
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: "Linker" entre 2 fonctions DEF

Message par Manfraid » mar. 28 mars 2017 09:09

Salut,

pourrais tu mettre l'erreur au complet (le tracback) cela aiderai beaucoup plus pour le diagnostique car la je n'arrive pas a voir ou est le problème exactement
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

Re: "Linker" entre 2 fonctions DEF

Message par LuDoPhotography » mar. 28 mars 2017 10:20

Alors voici l'erreur :
Trackback (most recent call last):
File "/home/pi/photobooth.py", line 175, in takePhoto camera.ISO = scaleISO.get()
NameError: name 'scaleISO' is not defined

Avatar du membre
Manfraid
Modérateur
Messages : 1401
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: "Linker" entre 2 fonctions DEF

Message par Manfraid » mer. 29 mars 2017 08:43

Salut,

donc le problème est très simple tu défini tout tes scaleISO/scaleContrast/scaleBrightness... dans la fonction confg, mais comme tu n'indique pas qu('il doivent être en porté global tu ne peu les utiliser dans les autres fonctions.
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

Re: "Linker" entre 2 fonctions DEF

Message par LuDoPhotography » mer. 29 mars 2017 11:43

Manfraid a écrit :Salut,
donc le problème est très simple tu défini tout tes scaleISO/scaleContrast/scaleBrightness... dans la fonction confg, mais comme tu n'indique pas qu('il doivent être en porté global tu ne peu les utiliser dans les autres fonctions.
Je comprend pas trop ce que tu me dit, car il y a déjà le global dans la fonction :/

Avatar du membre
Manfraid
Modérateur
Messages : 1401
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: "Linker" entre 2 fonctions DEF

Message par Manfraid » mer. 29 mars 2017 12:41

comme ceci

Code : Tout sélectionner

import cups
from tkinter import * 
from PIL import Image, ImageTk
from picamera import PiCamera
from datetime import datetime

def clearWindow():
    for widget in self.winfo_children():
        widget.destroy()
        
#Menu 
def menu():
    global noprint
    noprint = 2
    clearWindow()
    img1 = Image.open('barmenu.png')
    img2 = Image.open('launch.png')
    img3 = Image.open('setting.png')
    camera = ImageTk.PhotoImage(img1)
    launch = ImageTk.PhotoImage(img2)
    setting = ImageTk.PhotoImage(img3)
    photoButton = Button(self, image=camera, width=width, height=66, bg='white')
    photoButton.image = camera
    photoButton.pack(side=TOP)
    photoButton = Button(self, image=launch, width=245, height=257, bg='white', command=waitUser)
    photoButton.image = launch
    photoButton.pack(side=RIGHT)
    photoButton = Button(self, image=setting, width=247, height=257, bg='white', command=confg)
    photoButton.image = setting
    photoButton.pack(side=LEFT)
    self.bind('<Key-Escape>', exitProgram)
    self.bind('<Escape>', exitProgram)
    
#APPLIQUATION
def waitUser():
    global noprint
    noprint = 2
    clearWindow()
    img = Image.open('backgrounda.png')
    camera = ImageTk.PhotoImage(img)
    photoButton = Button(self, image=camera, width=width, height=height, bg='blue', activebackground='blue', command=takePhoto)
    photoButton.image = camera
    photoButton.pack(side=TOP)
    
#CONFIGURATION APPAREIL
def confg():
    global noprint, scaleISO,scaleContrast, scaleBrightness, scaleSaturation # sinon ces objets ne sont accessible que dans cette fonction
    noprint = 2

    root = Tk()

    root.wm_title("CONFIG")
    root.geometry('480x320')
    
    bouton1 = Button(root, text="OK")
    bouton1.pack(side=BOTTOM) 
    bouton2 = Button(root, text="TEST", command=takePhoto)
    bouton2.pack(side=BOTTOM)
    
    
    
    scaleISO = Scale(root, from_=0, to=500, relief='solid', label="ISO", resolution=50, tickinterval=50, length=180)
    scaleISO.pack(side=LEFT)
    scaleISO.set(100)
    
    scaleContrast = Scale(root, from_=0, to=100, relief='solid', label="CONTS", resolution=10, tickinterval=50, length=180, command=takePhoto)
    scaleContrast.pack(side=LEFT)
    scaleContrast.set(50)
    
    scaleBrightness = Scale(root, from_=0, to=100, relief='solid', label="LUMI", resolution=10, tickinterval=50, length=180)
    scaleBrightness.pack(side=LEFT)
    scaleBrightness.set(100)

    scaleSaturation = Scale(root, from_=0, to=100, relief='solid', label="SATUR", resolution=10, tickinterval=50, length=180)
    scaleSaturation.pack(side=LEFT)
    scaleSaturation.set(50)

    

                  
#COMPTE A REBOURS
def countDown(counter):
    clearWindow()
    if counter == 0:
        self.after(100, capturePicture)
        countdown = Label(self, text="Souriez!", font=font, width=width, height=height, bg='white', activebackground='white').pack()
    else:
        ct = str(counter)
        countdown = Label(self, text=counter, font=font, width=width, height=height, bg='white', activebackground='white').pack()
        self.after(1000, countDown, counter-1)

#APRECUS PHOTO
def reviewPhoto(filename, counter):
    global noprint
    if noprint == 1:
        waitUser()
        return
    if noprint == 0:
        printCups(filename)
        return
    if counter == 0:
        waitUser()
        return
    elif counter == 60:
        clearWindow()
        canvas = Canvas(self, width=width, height=height, bg='black')
        canvas.pack()
        photo = Image.open(filename)
        photo.thumbnail(maxsize, Image.ANTIALIAS)
        canvas.photo = ImageTk.PhotoImage(photo) #BOUTON RETOUR
        canvas.create_image(53, 0, image=canvas.photo, anchor=NW)
        img2 = Image.open('retour.png')
        noprint = ImageTk.PhotoImage(img2)
        decidePrintNo = Button(self, image=noprint, bg='white', activebackground='white', command=dontPrint)
        decidePrintNo.image = noprint
        decidePrintNo_window = canvas.create_window(0, 0, anchor=NW, window=decidePrintNo)
    if counter > 0:
        self.after(1000, reviewPhoto, filename, counter-1)

#BOUTON RETOUR
def doPrint():
    global noprint
    noprint = 0

def dontPrint():
    global noprint
    noprint = 1

def printCups(filename):
    clearWindow()
    img = Image.open('printing.png')
    printing = ImageTk.PhotoImage(img)
    printingButton = Button(self, image=printing, width=width, height=height, bg='yellow', activebackground='yellow', command=takePhoto)
    printingButton.image = printing
    printingButton.pack(side=TOP)
    conn = cups.Connection ()
    printers = conn.getPrinters ()
    printer = list(printers)[0]
    printqueue = len(conn.getJobs())
    if printqueue > 0:
        conn.enablePrinter(printer)
        clearWindow()
        img2 = Image.open('paper.png')
        paper = ImageTk.PhotoImage(img2)
        paperButton = Button(self, text="!", font=font, image=paper, compound=CENTER, width=int(width/2), height=height, bg='blue', activebackground='blue', command= lambda: printCups(filename))
        paperButton.image = paper
        paperButton.pack(side=LEFT)
        img3 = Image.open('noprint.png')
        noprint = ImageTk.PhotoImage(img3)
        noprintButton = Button(self, image=noprint, width=int(width/2), height=height, bg='blue', activebackground='blue', command=waitUser)
        noprintButton.image = noprint
        noprintButton.pack(side=LEFT)
    else:
        conn.enablePrinter(printer)
        conn.printFile(printer, filename, filename, {})
        self.after(2000, waitUser)

#PARAMETTRES APPAREIL PHOTO
def takePhoto():
    global scaleISO,scaleContrast, scaleBrightness, scaleSaturation # et ici pour pouvoir savoir ou ces objets sont situés 
    clearWindow()
    camera.vflip = True
    camera.ISO = scaleISO.get()               #ISO
    camera.contrast = scaleContrast.get()     #CONTRAST
    camera.brightness = scaleBrightness.get() #LUMINAUSITE
    camera.satration = scaleSaturation.get()  #SATURATION 
 #PARAMETRES PAR DEFAUTS
    camera.exposure_mode = 'auto' #MODE D'EXPOSITION
    camera.awb_mode = 'auto' # BALANCE DES BLANC
    camera.image_effect = 'none' # STYLE DES PHOTOS
    camera.ISO = 0
    camera.contrast = 0
    camera.brightness = 50
    camera.saturation = 0
#DELAIS COMPTE A REBOURS
    countDown(3)

#LIEU D'ENREGISTREMENT
def capturePicture():
    filename='/home/pi/Pictures/img_' + datetime.now().strftime(dateString) + '.jpg'
    camera.capture(filename)
    camera.stop_preview()
    reviewPhoto(filename, 60)

def exitProgram(event=None):
    self.destroy()

#PARAMETRES DIVERS
self = Tk()
self.attributes("-fullscreen", True)
self.title("Photobooth")
width = self.winfo_screenwidth()
height = self.winfo_screenheight()
maxsize = (width, height)
noprint = 2 # 2=Undecided, 1=Don't print, 0=Print
camera = PiCamera()
camera.resolution = (2592, 1944)
camera.framerate = 15
font = ['Billabong', 120]
dateString = '%Y%m%d_%H%M%S'
waitUser()
menu()
self.mainloop()
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

Re: "Linker" entre 2 fonctions DEF

Message par LuDoPhotography » mer. 29 mars 2017 15:12

Sa marche pour le bouton de test dans la fenêtre des configs mais pas sur le bouton pour déclancher la prise de vue dans le bouton application ( def waitUser).
De plus quand je fait plusieur modif dans les curceurs est que j'appuie sur "test" ça change pas. J'a vue qu'il existe une commande pour mettre a jour les valeurs des paramètres mais comment faire ? voici le l'article avec le code dans laquel je l'ai vue : http://helloraspberrypi.blogspot.fr/201 ... ra_18.html

voici le code erreur que j'ai en appuyant sur les curceurs puis en fermant la fenêtres est qu'ensuite je rentre dans le programme :
ception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
return self.func(*args)
File "/home/pi/photobooth2.py", line 175, in takePhoto
camera.ISO = scaleISO.get() #ISO
File "/usr/lib/python3.4/tkinter/__init__.py", line 2880, in get
value = self.tk.call(self._w, 'get')
_tkinter.TclError: invalid command name ".1949275440"

Est-ce que sa vient du fait que le bouton "Ok" n'a pas de fonction pour mettre à jour les valeurs ?

LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

Re: "Linker" entre 2 fonctions DEF

Message par LuDoPhotography » ven. 31 mars 2017 11:44

Edit :

Voici en directe le code avec les erreurs :
https://vimeo.com/210906031

Avatar du membre
Manfraid
Modérateur
Messages : 1401
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: "Linker" entre 2 fonctions DEF

Message par Manfraid » ven. 31 mars 2017 12:14

Salut,

je pense avoir compris, le soucis c'est que la page des réglages n'est pas forcément appeler, si c'est bien celà il faut que tu trouve un moyen de sauvegarder les paramètre ailleurs, ou le faire d'une autre façon, par exemple avec des variable global initialisé au début de ton programme (avec des valeur par défaut) et quand tu va dans les préférences cela fait la mise a jour avec les nouvelles valeurs et ensuite dans la partie prise de photo cela fonctionnera toujours.

J'espère que tu a compris ce que je voulais dire, désolé je ne pourrais te faire un correctif sur ton code je n'ai pas le temps
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

LuDoPhotography
Messages : 9
Enregistré le : mer. 15 mars 2017 21:16

Re: "Linker" entre 2 fonctions DEF

Message par LuDoPhotography » ven. 31 mars 2017 16:37

Manfraid a écrit :Salut,

je pense avoir compris, le soucis c'est que la page des réglages n'est pas forcément appeler, si c'est bien celà il faut que tu trouve un moyen de sauvegarder les paramètre ailleurs, ou le faire d'une autre façon, par exemple avec des variable global initialisé au début de ton programme (avec des valeur par défaut) et quand tu va dans les préférences cela fait la mise a jour avec les nouvelles valeurs et ensuite dans la partie prise de photo cela fonctionnera toujours.

J'espère que tu a compris ce que je voulais dire, désolé je ne pourrais te faire un correctif sur ton code je n'ai pas le temps


Je vois à peut près ce que tu veut dire. Quand tu parle de sauvegarder les paramètres ailleurs je pensais à un 2nd fichier python sa serais possible de dire au début de la fonction takePhoto qu'il doit aller chercher les valeurs dans le fichier config.py ?

Répondre

Retourner vers « Python »