Simulation de l'évolution d'une maladie avec des logos

Fermé
philolophi - Modifié le 21 avril 2023 à 20:40
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 21 avril 2023 à 21:00

Bonjour,

Je voudrais modéliser l'évolution d'une maladie grâce à python en représentant cette évolution grâce à des logos de bonhomme qui changent de couleurs (plusieurs images). Tout ça dans une frame avec tkinter.

Malgré tout, plusieurs problèmes se posent, dont un en particulier. Je n'arrive pas à afficher un nombre d'images correspondant à, par exemple, le nombre de personnes malades à tel jour puis de faire évoluer ce nombre-là.

(Pour précision : j'ai évidemment télécharger les images). Pour l'instant, voilà à quoi ressemble mon code avec des aides que j'ai pu trouver un peu partout sur internet:

#Télécharger PILLOW PIL dans les outils 
from tkinter import *   
from tkinter import ttk   
from PIL import Image, ImageTk

def SJHD(
    vecteurdedonnees,
    t,
    N,
    tauxmortalité,
    tauxvaccination,
    tauxcontamination,
    tauxhospitalisation,
    tauxdeces
):
    S, J, H, D = vecteurdedonnees
    dSdt = tauxmortalité * (N - S) - tauxcontamination * ((S * H) / N) - tauxvaccination * S
    dJdt = tauxcontamination * ((S * H) / N) - (tauxmortalité + tauxhospitalisation) * J
    dHdt = (tauxhospitalisation * J) - (tauxmortalité + tauxdeces) * H
    dDdt = (tauxdeces * H) + tauxmortalité * D + tauxvaccination * S
    return dSdt, dJdt, dHdt, dDdt
  
root = Tk()   
root.title("Pneumatite")   
root.config(bg="grey")   
root.geometry("640x480")   
   
mainframe = ttk.Frame(root, padding="10 20 10 20")   
mainframe.grid()   
  
ttk.Label(mainframe, text="Nombre total : ").grid(column=1, row=0, sticky=(W,))  
ttk.Label(mainframe, text="Nombre de malades ?").grid(column=1, row=1, sticky=(W,))    
ttk.Label(mainframe, text="300 ").grid(column=2, row=0, sticky=(N,))  
  
button = ttk.Button(mainframe, text="Cliquer",command=SJHD)   
button.grid(column=2, row=2, sticky=(W), padx=60, pady=60) 
      
malades = StringVar()   
malades_entry = ttk.Entry(mainframe, width=7, textvariable=malades)   
malades_entry.grid(column=2, row=1, padx=5, pady=5)   

#Télécharger les fichiers joints dans le même dossier que pneumatite.py
img1_pil = Image.open('monimage.png')  
mainframe = ttk.Frame(root, padding="10 20 10 20")    
mainframe.grid(row=2)  
  
for colonne in range(50):  
    for rang in range(6):  
        img1_pil.thumbnail((15, 15), Image.LANCZOS)  
        img1 = ImageTk.PhotoImage(img1_pil)  
        label = ttk.Label(mainframe, image=img1)  
        label.image = img1  
        label.grid(column=colonne, row=rang)

N = 300
tauxmortalité = 0
tauxvaccination = 1/100
tauxcontamination = 1/3
tauxhospitalisation = 1/9
tauxdeces = 1/27
nombrejoursdesimu = 30


J0 = input(malades.get())
H0 = 0
D0 = 0
S0 = N-J0-H0-D0

#Télécharger scipy, matplotlib, numpy dans les outils 
from scipy.integrate import odeint
import numpy as np

vecteurTemporel = np.linspace(0, nombrejoursdesimu, nombrejoursdesimu)
datas = np.array([S0, J0, H0, D0])
solutions = odeint(
    SJHD,
    datas,
    vecteurTemporel,
    args=(
        N,
        tauxmortalité,
        tauxvaccination,
        tauxcontamination,
        tauxhospitalisation,
        tauxdeces
    )
)
S, J, H, D = solutions.T
S
int(S.get())

import matplotlib.image as mpimg
import numpy as np
img2 = mgimg.imread("monimage.png")
if img2.dtype == np.float32 :
    img2 = (img2*255).astype(np.uint8)

int(J.get())

import matplotlib.image as mpimg
import numpy as np

img3 = mgimg.imread("jaune.png")
if img3.dtype == np.float32 :
    img3 = (img3*255).astype(np.uint8)
        
int(H.get())

import matplotlib.image as mpimg
import numpy as np
img4 = mgimg.imread("orange.png")
if img4.dtype == np.float32:
    img4= (img4 * 255).astype(np.uint8)
        
int(D.get())

import matplotlib.image as mpimg
import numpy as np

img5 = mgimg.imread("rouge.png")
if img5.dtype == np.float32 :
    img5= (img5 * 255).astype(np.uint8)
  
root.mainloop()

Merci énormément aux personnes qui pourraient m'aiguiller sur ce thème.

P.S. : c'est plutôt assez urgent malheureusement, un peu dernier espoir.
 


Macintosh / Safari 15.3

A voir également:

1 réponse

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
21 avril 2023 à 21:00

Bonjour,

Avant de rentrer dans le vif du sujet

  • évite les caractère accentués dans le code
  • suis le style PEP8, notamment:
    • espace après les virgules
    • espace autour des opérateurs
    • les noms de variables et de fonction sont sous la forme ma_fonction ou ma_variable
    • lignes pas trop longue
  • merci de mettre en forme ton code (sans oublier de choisir le langage)

J'ai corrigé ton message en conséquence.

Ensuite, concernant ton code, la manière ton code est rédigé, je suspecte que tu as travaillé dans un notebook et que tu as posté toutes tes cellules de code. Si tu veux faire une application tkinter, il va falloir arranger tout ça.

Généralement les imports sont en début de fichier. Tu peux organiser ton code en plusieurs fichiers python si tu le souhaites et les importer les uns les autres. Rien ne t'empêche de tout mettre dans un fichier python et mettant tout ton code source comme tu l'as fait mais :

  • les instructions que tu utilises pour afficher le contenu d'une variable sans print ne servent plus à rien en dehors d'un notebook. En fait ces instructions n'ont d'utilité que dans un notebook qui fait implicitement un print de la dernière valeur retournée.
  • il serait mieux de réorganiser ton fichier (import en début fichier, puis les fonction auxiliaires, et enfin le lancement du programme principal)
  • dans une application tkinter, il faut revoir la manière est organisé ton programme : tu n'es plus dans un paradigme où tu exécutes des cellules les unes après les autres. Tu crées une application, qui s'initialise, puis qui une fois lancée,réagit à des événements (par exemple lorsque l'utilisateur clique sur un bouton). Je t'invite à commencer par un exemple simple  le temps de comprendre, puis après tu verras comment adapter ton programme.

Je t'invite également à chercher comment charger et afficher une image dans tkinter (voir par exemple ce tutoriel). En outre, pas besoin de matplotlib.

Je pense également qu'il y a une confusion dans les imports. Par exemple en début de programme tu charges tous les objets tkinter (from tkinter import *). Un import * n'est pas une très bonne pratique en soi, mais surtout, la suite de ton programme montre que la signification de cette instruction t'a échappée. Tu devrais

  • soit charger spécifiquement les objets dans le namespace global :
from tkinter import Label, Entry

entry = Entry(...)
label = Label(...)
  • soit en important tout tkinter mais en gardant le namespace
import tkinter as ttk

entry = ttk.Entry(...)
label = ttk.Label(...)

Bonne chance

0