CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : Enregistrer une image et changer de page en boucle

News culture
La Planète des Singes : Le Nouveau Royaume - la révolution simienne est en marche !
DébutPage précedente
12
Page suivantePage suivante
Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 22:30:33

AH et oui excuse moi j'ai conscience que ca soit sale, j'ai fait ça à la va vite car je découvre tkinter :hap:

MrGreez94 MrGreez94
MP
Niveau 10
18 mai 2017 à 22:41:46

Le 18 mai 2017 à 22:30:33 Exacompta a écrit :
AH et oui excuse moi j'ai conscience que ca soit sale, j'ai fait ça à la va vite car je découvre tkinter :hap:

Pas de soucis, bah concrètement c'est l'idée. Bon c'est optimisable car comme tu le constates, toute l'interface graphique est figée pendant l'exécution mais pour corriger ça là c'est quand même le niveau bien au dessus :p

Ensuite tout dépend ce que tu cherches, si ça marche et que tu cherches juste à récupérer les photos c'est bon ?

Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 22:43:15

Bha en soit ça fonctionne mais je sais pas si y'aurait des trucs à ajouter. Pour l'interface graphique figée c'est au niveau des threads c'est ça ? :hap: c'est accessible pour mon niveau ? :hap: J'ai pas fait d'orienté objet pour l'instant :hap:

MrGreez94 MrGreez94
MP
Niveau 10
18 mai 2017 à 22:56:45

c'est ça, bouarf rien est impossible mais je pense que ce serait sauter les étapes :(

Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 22:59:39

D'accord bin je vais continuer en cherchant d'autres projets car c'était mon seul objectif :hap:

MrGreez94 MrGreez94
MP
Niveau 10
18 mai 2017 à 23:06:31

ensuite si ton objectif c'est de progresser en python et que t'apprécies ce projet il y a encore beaucoup à faire pour l'améliorer avant meme les threads :)

Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 23:21:09

Le 18 mai 2017 à 23:06:31 MrGreez94 a écrit :
ensuite si ton objectif c'est de progresser en python et que t'apprécies ce projet il y a encore beaucoup à faire pour l'améliorer avant meme les threads :)

Qu'est ce que tu as comme idées ? Je suis preneur de tout :noel:

Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 23:41:49

Si possible qui pourrait m'introduire à la POO classe toussa :noel: car j'ai aucune idée comment les commencer :rire:

Merci d'avance :hap:

MrGreez94 MrGreez94
MP
Niveau 10
18 mai 2017 à 23:44:19

Dans un premier temps je réitère ce que j'ai dit un peu avant, commence à prendre l'habitude d'organiser ton code en fonction. Dès que tu sens que tu écris un bout de code qui remplit une tâche particulière -> une fonction.

je te donne un exemple

tu crées une fonction du genre:

def is_file(number)
    extensions = ['.jpg', '.JPG']
    for extension in extensions:
        if os.path.isfile(str(number)+extension):
            return True
    return False

et au lieu d'écrire:

if(os.path.isfile(str(number)+".jpg") == False and os.path.isfile(str(number)+".JPG") == False):

tu écris:

if is_file(number):

concrètement ça fait la même chose mais de manière plus lisible et élégante, ça te permet aussi d'avoir une seul ligne à modifier et si jamais tu l'utilises dans d'autres cas de figure, il suffit de modifier la ligne

extensions = ['.jpg', '.JPG']

et ajouter les extensions que tu veux, sans avoir une condition qui fait 15km :hap:

Message édité le 18 mai 2017 à 23:46:35 par MrGreez94
MrGreez94 MrGreez94
MP
Niveau 10
18 mai 2017 à 23:45:59

La POO c'est un sujet assez difficile à aborder, je ne peux que te recommander ce tutoriel http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-1/

Sam & Max c'est globalement très ludique et pédagogique

Exacompta Exacompta
MP
Niveau 10
18 mai 2017 à 23:53:29

Merci et pour l'histoire des fonctions je vois désormais ce que tu veux dire :bave: C'est vrai que ca fait tout de suite plus propre [[sticker:p/1lm9]] Dès demain j'améliore ça. Et encore à propos du For, j'ai l'impression qu'il a énormément de possibilité par rapport à ce que j'ai vu dans le C++, en tout cas il le fait plus proprement :bave:

MrGreez94 MrGreez94
MP
Niveau 10
19 mai 2017 à 00:05:56

J'avais un projet un peu dans le meme thème mais pour les pages de mangas, je te donne des exemples de fonctions dans un contexte concret:
https://pastebin.com/Z3ZfcWs5

Exacompta Exacompta
MP
Niveau 10
19 mai 2017 à 15:24:30

Salut [[sticker:p/1lm9]] Aujourd'hui j'ai un peu travaillé dessus, j'ai répartie en plusieurs fonctions différentes mais j'ai pas mal galéré :noel: Surtout pour la partie fill pour une histoire de string et int :rire:

Voici mon code :


from tkinter import *
from urllib.request import urlretrieve
import os
from time import sleep
import traceback

#Permet de tester l'existence d'un fichier
def is_file(number):
	type_extensions = ['.jpg', '.JPG']
	for type_extension in type_extensions:
		if os.path.isfile(str(number)+type_extension):
			return False
	return True

#Permet de construire l'URL qui va être utilisée pour DL l'image
def buildUrl(url, number, type_ext):
	nb_zero = 1
	url_modified = url[:-5]
	while url_modified[-1] == "0":
		url_modified = url_modified[:-1]
		nb_zero += 1
	number = str(number)
	new_number = number.zfill(nb_zero)
	type_extensions = ['.jpg', '.JPG']
	final_url = url_modified+new_number+type_extensions[type_ext]

	return final_url


#Permet de telecharger une image, renvoie True si l'image est DL sinon False
def dl_try(url, number):
	
	try:
		try:
			urlretrieve(buildUrl(url, number, 0), str(number)+".jpg")
			print("image number " + str(number) + " was downloaded")
		except:
			urlretrieve(buildUrl(url, number, 1), str(number) +".jpg")
			print("image number " + str(number) + " was downloaded")
		return True
	except:
		return False

#Fonction demandé par le bouton télécharger
def download():
	number = 1
	time_sleep = 0.001
	url = entree.get()
	while (number < int(nb_image.get())+1):
		sleep(time_sleep)
		if is_file(number):
			if (dl_try(url, number)):
				pass
			else:
				print("A problem occured, trying to download the image again...")
				time_sleep = time_sleep + 0.05
				continue
		else:
				print("image number " + str(number) + " is already downloaded")
		number += 1
	print ("All images downloaded")


fenetre = Tk()
texturl = Label(fenetre, text="URL de l'image déjà modifiée")
text_nb_dimage = Label(fenetre, text="Combien d'images il y a t'il ?")

#première ligne avec l'url de l'image à mettre
texturl.pack()
string ="0"

value = StringVar()
value.set("Http://exemple.com/image.jpg")
entree = Entry(fenetre, textvariable=string, width=100)
entree.pack()
text_nb_dimage.pack()
nb_image = Spinbox(fenetre, from_=1, to=9999)
nb_image.pack()

var = IntVar()
boutonZero = Checkbutton(fenetre, text="Des zeros", variable=var)
boutonZero.pack()

#bouton permettant de lancer
download = Button(fenetre, text="Telecharger", command=download)
download.pack()

#Bouton permettant de fermer
closeButton = Button(fenetre, text="Fermer", command=fenetre.quit)
closeButton.pack()


fenetre.mainloop()

Sur pastebin : https://pastebin.com/t7TbXnq4

Si vous avez des suggestions faites le moi savoir, je suis conscient que c'est assez limité par rapport à l'URL étant donné que c'est fait de façon séquentielle, pour dire, même sur le site où je DL les images ca sera limité car certaines n'ont pas des nombres construits de la même manière :-(( Et pour l'interface graphique c'est très limité faut que j'y touche un bout :hap:

Merci d'avance pour toutes vos suggestions vu que je débute [[sticker:p/1lm9]]

MrGreez94 MrGreez94
MP
Niveau 10
19 mai 2017 à 19:21:44

Déjà on peut dire que ton programme commence à avoir une bonne tête [[sticker:p/1ljp]]

#Permet de tester l'existence d'un fichier
def is_file(number):
    type_extensions = ['.jpg', '.JPG']
    for type_extension in type_extensions:
        if os.path.isfile(str(number)+type_extension):
            return False
    return True

Pourquoi as-tu inversé False etTrue ? Là ce qu'il se passe c'est qu'il va tester la première possibilité et s'il en trouve un bon il va te retourner qu'il y en a pas. Il faut plutôt tout essayer, dès qu'il trouve il te dit "stop j'ai trouvé" et si jamais il a tout essayé en vain il va te dire qu'il a rien trouvé

type_extensions = ['.jpg', '.JPG']

ça apparaît deux fois dans ton programme, si tu dois modifier l'un il faut modifier l'autre, boom on remonte ça en tête de programme pour le déclarer une fois

Il y a ensuite moyen de clairement simplifier ta méthode buildUrl. Comme je disais par du cas où il n'y a pas de 0 et ajoutes en quand tu as besoin, zfill() fait tout ce taff à ta place!
Pour te simplifier la vie, par du principe que tu rentres cet url:

http://emilia-clarke.net/gallery/albums/Appearances/2016/05%2025%20Me%20Before%20You%20Premiere%20in%20London/0525_MBYLondonPremiere_

ensuite la fonction est toute simple!

def buildUrl(url, number, type_extension_index):
    type_extension = type_extensions[type_extension_index]
    final_url = url + str(number).zfill(4) + type_extension
    return final_url

La méthode dl_try est améliorable aussi. Déjà un try/except permet de prévenir de quelque chose qui risque de tout casser, il faut impérativement mettre quelque chose qui marche à 100% dans le bloc except surtout pas un urlretrieve !
De plus tu fais comment si jamais tu avais un 3ème type d'extension ? :hap:
Il faut s'inspirer de is_file et faire un code qui ne dépend pas du nombre de type d'extensions

def dl_try(url, number):
    for type_extension_index in range(len(type_extensions)): 
        current_url = buildUrl(url, number, type_extension_index)
        try:
            urlretrieve(current_url, str(number)+".jpg")
            print("image number " + str(number) + " was downloaded")
        except:
            print("Aie... cannot download the image:" + current_url)

len(type_extentions) étant une liste contenant les index de type_extensions, soit [0, 1]

La fonction download peut-être améliorée aussi mais là déjà t'as de quoi faire avec tout ça je pense :hap:

Exacompta Exacompta
MP
Niveau 10
20 mai 2017 à 18:17:20

Salut, déjà merci de ta réponse, ca fait plaisir de voir des gens actifs ici [[sticker:p/1lm9]]

#Permet de tester l'existence d'un fichier
def is_file(number):
    type_extensions = ['.jpg', '.JPG']
    for type_extension in type_extensions:
        if os.path.isfile(str(number)+type_extension):
            return False
    return True

Pourquoi as-tu inversé False etTrue ? Là ce qu'il se passe c'est qu'il va tester la première possibilité et s'il en trouve un bon il va te retourner qu'il y en a pas. Il faut plutôt tout essayer, dès qu'il trouve il te dit "stop j'ai trouvé" et si jamais il a tout essayé en vain il va te dire qu'il a rien trouvé

Au contraire quand je les inverse pas ca me dit qu'elles sont déjà téléchargées c'est pour ça :noel:

type_extensions = ['.jpg', '.JPG']

ça apparaît deux fois dans ton programme, si tu dois modifier l'un il faut modifier l'autre, boom on remonte ça en tête de programme pour le déclarer une fois

Du coup j'viens de le faire je l'ai mis avec la partie Tinker [[sticker:p/1lm9]]

Il y a ensuite moyen de clairement simplifier ta méthode buildUrl. Comme je disais par du cas où il n'y a pas de 0 et ajoutes en quand tu as besoin, zfill() fait tout ce taff à ta place!
Pour te simplifier la vie, par du principe que tu rentres cet url:

http://emilia-clarke.net/gallery/albums/Appearances/2016/05%2025%20Me%20Before%20You%20Premiere%20in%20London/0525_MBYLondonPremiere_

ensuite la fonction est toute simple!

def buildUrl(url, number, type_extension_index):
    type_extension = type_extensions[type_extension_index]
    final_url = url + str(number).zfill(4) + type_extension
    return final_url

Ouai mais du coup je devrai changer s'il y'a des zéros à la main :hap: Alors que maintenant ca essaie de les compter s'il y'en a :hap: Après je sais pas ca me parait plus correct :noel:

La méthode dl_try est améliorable aussi. Déjà un try/except permet de prévenir de quelque chose qui risque de tout casser, il faut impérativement mettre quelque chose qui marche à 100% dans le bloc except surtout pas un urlretrieve !
De plus tu fais comment si jamais tu avais un 3ème type d'extension ? :hap:
Il faut s'inspirer de is_file et faire un code qui ne dépend pas du nombre de type d'extensions

def dl_try(url, number):
    for type_extension_index in range(len(type_extensions)): 
        current_url = buildUrl(url, number, type_extension_index)
        try:
            urlretrieve(current_url, str(number)+".jpg")
            print("image number " + str(number) + " was downloaded")
        except:
            print("Aie... cannot download the image:" + current_url)

len(type_extentions) étant une liste contenant les index de type_extensions, soit [0, 1]

Alors pour cet endroit c'est là que je bloque le plus en ce moment :hap:
En faisant un print(range(len(type_extensions))) j'obtiens "range(0,2)" du coup ca corrèle pas vraiment avec ce que tu dis :hap:
et même en utilisant directement la fonction que tu m'as donné ca ne fonctionne pas :noel:, ca me dit que l'image n'a pas pu être être téléchargée en gros :hap: C'est pour ça que je suis resté sur ce mode assez archaïque du try/except, c'est que j'arrive pas à utilisé le For dans ce moment là :hap:

La fonction download peut-être améliorée aussi mais là déjà t'as de quoi faire avec tout ça je pense :hap:

Ouai après c'est sûr qu'il restera toujours des choses à améliorer mais pour l'instant je m'en tire pas trop mal je trouve, je vais passer un peu à la partie graphique car elle est très "simple" visuellement :hap:

Mon code sans la dernière fonction proposée qui fait que ça ne marche pas (pour ceux qui veulent) :


from tkinter import *
from urllib.request import urlretrieve
import os
from time import sleep
import traceback

#Permet de tester l'existence d'un fichier
def is_file(number):
    for type_extension in type_extensions:
        if os.path.isfile(str(number)+type_extension):
            return False
    return True

#Permet de construire l'URL qui va être utilisée pour DL l'image
def buildUrl(url, number, type_ext):
    nb_zero = 1
    url_modified = url[:-5]
    while url_modified[-1] == "0":
        url_modified = url_modified[:-1]
        nb_zero += 1
    number = str(number)
    new_number = number.zfill(nb_zero)
    final_url = url_modified+new_number+type_extensions[type_ext]

    return final_url


#Permet de telecharger une image, renvoie True si l'image est DL sinon False
def dl_try(url, number):
    try:
        try:
            urlretrieve(buildUrl(url, number, 0), str(number)+".jpg")
            print("image number " + str(number) + " was downloaded")
        except:
            urlretrieve(buildUrl(url, number, 1), str(number) +".jpg")
            print("image number " + str(number) + " was downloaded")
        return True
    except:
        return False

#Fonction demandé par le bouton télécharger
def download():
    number = 1
    time_sleep = 0.001
    url = entree.get()
    while (number < int(nb_image.get())+1):
        sleep(time_sleep)
        if is_file(number):
            if (dl_try(url, number)):
                pass
            else:
                print("A problem occured, trying to download the image again...")
                time_sleep = time_sleep + 0.05
                continue
        else:
                print("image number " + str(number) + " is already downloaded")
        number += 1
    print ("All images downloaded")

type_extensions = ['.jpg', '.JPG']
fenetre = Tk()
texturl = Label(fenetre, text="URL de l'image déjà modifiée")
#première ligne avec l'url de l'image à mettre
text_nb_dimage = Label(fenetre, text="Combien d'images il y a t'il ?")
texturl.pack()
string ="0"

value = StringVar()
value.set("Http://exemple.com/image.jpg")
entree = Entry(fenetre, textvariable=string, width=100)
entree.pack()
text_nb_dimage.pack()
nb_image = Spinbox(fenetre, from_=1, to=9999)
nb_image.pack()

var = IntVar()
boutonZero = Checkbutton(fenetre, text="Des zeros", variable=var)
boutonZero.pack()

#bouton permettant de lancer
download = Button(fenetre, text="Telecharger", command=download)
download.pack()

#Bouton permettant de fermer
closeButton = Button(fenetre, text="Fermer", command=fenetre.quit)
closeButton.pack()


fenetre.mainloop()
Message édité le 20 mai 2017 à 18:17:49 par Exacompta
MrGreez94 MrGreez94
MP
Niveau 10
21 mai 2017 à 11:47:38

Tu rentres quel URL dans ton programme ? :)

Exacompta Exacompta
MP
Niveau 10
21 mai 2017 à 12:11:03

Je mets des URL de ce type par exemple :hap:
http://emilia-clarke.net/gallery/albums/Appearances/2016/05%2025%20Me%20Before%20You%20Premiere%20in%20London/0525_MBYLondonPremiere_0001.JPG

DébutPage précedente
12
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment