AH et oui excuse moi j'ai conscience que ca soit sale, j'ai fait ça à la va vite car je découvre tkinter
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
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 ?
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 ? c'est accessible pour mon niveau ? J'ai pas fait d'orienté objet pour l'instant
c'est ça, bouarf rien est impossible mais je pense que ce serait sauter les étapes
D'accord bin je vais continuer en cherchant d'autres projets car c'était mon seul objectif
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
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
Si possible qui pourrait m'introduire à la POO classe toussa car j'ai aucune idée comment les commencer
Merci d'avance
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
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
Merci et pour l'histoire des fonctions je vois désormais ce que tu veux dire C'est vrai que ca fait tout de suite plus propre 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
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
Salut Aujourd'hui j'ai un peu travaillé dessus, j'ai répartie en plusieurs fonctions différentes mais j'ai pas mal galéré Surtout pour la partie fill pour une histoire de string et int
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
Merci d'avance pour toutes vos suggestions vu que je débute
Déjà on peut dire que ton programme commence à avoir une bonne tête
#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 ?
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
Salut, déjà merci de ta réponse, ca fait plaisir de voir des gens actifs ici
#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
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
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 Alors que maintenant ca essaie de les compter s'il y'en a Après je sais pas ca me parait plus correct
La méthode
dl_try
est améliorable aussi. Déjà untry/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 blocexcept
surtout pas unurlretrieve
!
De plus tu fais comment si jamais tu avais un 3ème type d'extension ?
Il faut s'inspirer deis_file
et faire un code qui ne dépend pas du nombre de type d'extensionsdef 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
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
et même en utilisant directement la fonction que tu m'as donné ca ne fonctionne pas , ca me dit que l'image n'a pas pu être être téléchargée en gros 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à
La fonction download peut-être améliorée aussi mais là déjà t'as de quoi faire avec tout ça je pense
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
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()
Tu rentres quel URL dans ton programme ?
Je mets des URL de ce type par exemple
http://emilia-clarke.net/gallery/albums/Appearances/2016/05%2025%20Me%20Before%20You%20Premiere%20in%20London/0525_MBYLondonPremiere_0001.JPG