Grouper des pixels

Fermé
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022 - Modifié le 23 avril 2022 à 00:05
mamiemando Messages postés 33369 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 25 avril 2022 à 12:17
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.
A voir également:

4 réponses

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 551
22 avril 2022 à 17:07
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 lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022
22 avril 2022 à 18:21
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551
22 avril 2022 à 20:47
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
22 avril 2022 à 20:59
Tous ces calculs me donnent l'impression que tes données sont mal structurées.
0
mamiemando Messages postés 33369 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 801
23 avril 2022 à 00:08
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 lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022
23 avril 2022 à 14:45
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551
23 avril 2022 à 15:10
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 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551
23 avril 2022 à 15:12
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 33369 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 801
25 avril 2022 à 12:17
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