Grouper des pixels

Joseph_Hocquet Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je cherche à programmer un petit jeu en pixel 160*144 avec
tkinter
. Je groupe donc mes pixels de l'écran en carré de 6*6.
c=[] #liste de tous les "groupe de pixels"
for y in range(144):
    c.append([])
    for x in range(160):
        c[y].append(canv.create_rectangle(
            x * 6 + 1,
            y * 6 + 1,
            x * 6 + 7,
            y * 6 + 7,
            outline=""
        ))

Mais le processus et très long pour rafraîchir l'écran. J'imagine que à chaque fois que demande à l'ordi :
canv.itemconfig(c[y][x],fill="black")
par exemple, il recalcule tous les pixels qu'il doit modifier.

Est-possible de les grouper afin qu'ils ne forment qu'une seul entité ? Ou alors d'utiliser une autre technique pour accélérer le calcul ?

Merci.

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
difficile de deviner ce que tu essaies de faire à partir d'un extrait de ton programme.
peux-tu partager un programme que nous pouvons tester?
0
Joseph_Hocquet Messages postés 17 Date d'inscription   Statut Membre Dernière intervention  
 
Oui bien sûr :
from tkinter import *
from time import*
from math import*
from random import*

def presse(aaa) :
global touche
if not aaa.keysym in touche : touche.append(aaa.keysym)

def depresse(aaa) :
global touche
if aaa.keysym in touche : touche.remove(aaa.keysym)

def init() :
global c, touche, sol, map, px,py
px,py=0,0
lx,ly=20,18
touche=[]

sol=[]
a=1 #normalement je récupère un fichier mais pour ne pas importer, j'ai recrée ces fichier en minimaliste : ce ne sera que des traits
if a==0 :
q=open("data/sol.txt","r")
for i in range(2) : sol.append(q.readline())
map=open("data/map.txt","r").readline()
else :
for i in range(2) :
sol.append("00000000111111110000000011111111000000001111111100000000111111110000000011111111")
map=""
for i in range(20) :
for z in range(18) : map=map+"0"

c=[]
for y in range(144) :
c.append([])
for x in range(160) : c[y].append(canv.create_rectangle(x*6+1,y*6+1,x*6+7,y*6+7,outline=""))
refresh()
boucle()

def boucle() :
global px, py
if "Up" in touche :
py=py-1
refresh()
if "Down" in touche :
py=py+1
refresh()


canv.after(10,boucle)


def refresh() :
for y in range(144) :
for x in range(160) :
canv.itemconfig(c[y][x],fill=["black","white"][eval(sol[eval(map[(x+px)//8+(y+py)//8*8])][(x+px)%8+(y+py)%8*8])])

fen=Tk()
fen.geometry("961x865")
canv=Canvas(fen)
canv.place(x=0,y=0,height=865,width=961)

fen.bind("<Key>",presse)
fen.bind("<KeyRelease>",depresse)

init()
fen.mainloop()
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Peux-tu préciser le langage quand tu utilises les balises de code?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Quand je teste ton programme, un refresh() prend 350 msec, dont 250 pour faire tous les calculs.
Ensuite l'affichage va se faire.

Tu pourrais donc gagner du temps en optimisant tes calculs.
Je n'ai pas essayé de comprendre ce que tu calculais.
eval() n'est peut-être pas nécessaire.
je vois que tu recalcules dans la boucle des x des formules que tu pourrais calculer dans la boucle des y.

Tous les petits rectangles sont ils modifiés à chaque fois? Sinon, il n'est peut-être pas nécessaire d'appeler itemconfig() pour chacun des rectangles.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Tous ces calculs me donnent l'impression que tes données sont mal structurées.
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Bonjour,

Comme l'explique cette discussion, tu peux utiliser la classe
PhotoImage
qui te permettra de travailler à l'échelle du pixel "en live", ce qui t'évite d'avoir à tout rafraîchir.

Bonne chance
0
Joseph_Hocquet Messages postés 17 Date d'inscription   Statut Membre Dernière intervention  
 
OK je vais enlever tout les calculs de quel pixels où que le programme répète à chaque fois. Au début du programme, dans init(), il va créer une matrice. Mais dois-je la faire sous forme d'une énorme liste ou directement une image où je chercherai les infos avec getpixel ? Si c'est en une image, pourriez-vous me dire s'il existe un format noir et blanc où un pixel=un bit ? Pour l'instant j'ai trouvé seulement BMP mais ce ne marche pas avce mon python.
Merci
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Tu n'as pas expliqué ce que ton programme allait faire, donc difficile de te conseiller.
Moi j'utiliserais une matrice de booléens, pour indiquer si chaque pixel est blanc ou noir.
Quand cette matrice est modifiée, tu modifies en même temps le petit rectangle correspondant.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Pourquoi utiliser getpixel() pour "interroger" l'image, alors que c'est ton programme qui a créé l'image? N'est-il pas plus logique de mémoriser l'image dans ton programme, via une matrice de booléens?
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Mais dois-je la faire sous forme d'une énorme liste ou directement une image où je chercherai les infos avec getpixel ?

Si tu prends le temps de regarder le lien que je t'ai donné, tu verras que tu peux interagir directement avec l'objet
PhotoImage
et que tu n'as pas besoin de manipuler un autre objet.

Si c'est en une image, pourriez-vous me dire s'il existe un format noir et blanc où un pixel=un bit

Ce sera plus qu'un bit dans les fait. Rien qu'en bitmap, chaque pixel coûte 3 ou 4 octets. Mais quoi qu'il en soit, peu importe la manière dont le format encode l'image, toi à ton niveau tu ne fais qu'interagir avec un objet
PhotoImage
.

Pour l'instant j'ai trouvé seulement BMP mais ce ne marche pas avce mon python.

Comme le souligne yg_be, "ça ne marche pas" est une information trop vague sur un forum. Sans code, sans message d'erreur, impossible de t'en dire plus. Mais quoi qu'il en soit, tu n'as pas à te poser des questions existentielles sur comment fonctionne un format d'image : il y a généralement un objet (au hasard...
PhotoImage
) qui s'occupe de tout gérer pour toi.

Bonne chance
0