Skip to content
Snippets Groups Projects
Commit a8b7b232 authored by BIGANZOLI Arnauld's avatar BIGANZOLI Arnauld
Browse files

Validation de l'interface sous tkinter

parent 68a0ea0f
No related branches found
No related tags found
No related merge requests found
......@@ -18,3 +18,4 @@ dist/
TODO.md
FIXME.md
resultats_diviseur_tension*.txt
This diff is collapsed.
......@@ -477,10 +477,29 @@ Fonction pour calculer les valeurs de résistance d'un pont diviseur.
## Conception de l'application graphique
Voici un aperçu de la conception d'une application graphique pour le calcul des valeurs de résistances d'un pont diviseur de tension :
L'idée est de créer une interface utilisateur simple et intuitive pour permettre à l'utilisateur de saisir les valeurs d'entrée du pont diviseur (Vin, Vout, série de résistances, etc.) et d'obtenir les valeurs de résistances calculées en sortie.
Voici un aperçu de l'étude de la conception pour l'application graphique pour le calcul des valeurs de résistances d'un pont diviseur de tension :
![design-app-for-voltage-divider-bridge](images/global-design-app-for-voltage-divider-bridge.drawio.png)
Une première version de l'application graphique pour le calcul des valeurs de résistances d'un pont diviseur de tension :
![app-tkinter-for-voltage-divider-bridge](images/app-tkinter-for-voltage-divider-bridge.png)
Pour lancer l'application graphique, vous pouvez exécuter le script `main.py` dans le répertoire `src` :
```bash
(.env) > python src/main.py
```
A comparer avec les scripts du répertoire `examples` :
```bash
(.env) > python examples/simple_example_resistance_calculation.py # pré rempli avec des valeurs de test
(.env) > python examples/example_resistance_calculation.py # demande à l'utilisateur de saisir les différentes valeurs
```
---
<br />
......@@ -516,3 +535,5 @@ Ce projet est sous licence [GNU GPLv3](https://www.gnu.org/licenses/quick-guide-
🏆 _La GNU GPLv3 vous garantit la liberté d'utilisation, de modification et de distribution de ce projet, à l'exception de distribuer des versions à code source fermé._
Merci de consulter le fichier [LICENCE](LICENSE) pour plus d'informations.
https://www.gnu.org/licenses/gpl-3.0.txt
......@@ -72,6 +72,22 @@ if __name__ == "__main__":
# et une erreur minimale de 0.6 V qui permettant de valider les valeurs de resistances calculées.
# Changer la valeur de l'erreur minimale pour voir l'impact sur les valeurs de resistances calculées.
# Les valeurs de resistances calculées seront affichées dans le terminal.
#
# Voici la sortie attendue de cette exemple simple :
# -------------------------------------------------
# Pour une tension d'alimentation de 5 V et une tension de sortie de 4 V,
# si l'on prend des valeurs de résistances entre 4.0 k à 10.0 k dans la série E6, soit [4700, 6800, 10000] en ohms,
# et que l'on souhaite que la somme maximale de R1 + R2 ne dépasse pas 15 kohms, avec une erreur minimale de 0.6 V,
# alors les valeurs de résistances retournées sont :
#
# R1 = 4700 ohms
# R2 = 10000 ohms
#
# La tension de sortie calculée est de 3.401 V
# L'erreur de calcul est de 0.5986 V
# L'erreur maximale autorisée était de 0.600 V
#
# L'erreur de calcul est inférieure à l'erreur maximale autorisée, les valeurs de résistances sont validées
Vin = 5 # Tension d'alimentation
Vout = 4 # Tension de sortie
......@@ -119,7 +135,7 @@ if __name__ == "__main__":
# Calcul de la tension de sortie avec les valeurs de résistances trouvées
Vout_calc = Vin * R2 / (R1 + R2)
print(f"La tension de sortie calculée est de {Vout_calc:.3f} V")
print(f"L'erreur de calcul est de {abs(Vout_calc - Vout):.3f} V")
print(f"L'erreur de calcul est de {abs(Vout_calc - Vout):.4f} V")
print(f"L'erreur maximale autorisée était de {erreur_min:.3f} V\n")
# Comparaison de l'erreur de calcul avec l'erreur maximale autorisée
......
images/app-tkinter-for-voltage-divider-bridge.png

111 KiB

......@@ -147,8 +147,8 @@ if __name__ == "__main__":
[4020, 4220, 4420, 4640, 4870, 5110, 5360, 5620, 5900, 6190, 6490, 6810, 7150, 7500, 7870, 8250, 8660, 9090, 9530, 10000]
```
"""
r_start = 16000 # Minimum resistance value
r_end = 17000 # Maximum resistance value
r_start = 1000 # Minimum resistance value
r_end = 10000 # Maximum resistance value
serie = "E96" # Test the function with E48 series
print("\nAvailable E series:", get_available_e_series())
......
......@@ -50,7 +50,23 @@ __status__ = "Development"
import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageTk # Bibliothèque pour manipuler les images
import PIL
import os
import sys
# Ajoute un chemin au sys.path, pour permettre à Python de trouver et d'importer des modules
# situés dans des répertoires parents :
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
from src.calculator.e_series_gererator import (
generate_e_series_resistor,
get_available_e_series,
)
from src.calculator.voltage_divider import (
get_resistor_bridge_values,
get_output_voltage_bridge,
)
from src.display.table_formatting import print_list_items_by_line
def calculate_resistances():
......@@ -58,20 +74,37 @@ def calculate_resistances():
try:
vin = float(entry_vin.get())
vout = float(entry_vout.get())
error = float(entry_error.get())
erreur_min = float(entry_error.get())
r_min = int(entry_rmin.get())
r_max = int(entry_rmax.get())
serie_selectionnee = series_combobox.get()
print(f"Valeur série sélectionnée : {serie_selectionnee}")
max_somme = 2 * r_max
# Simule un calcul simple
r1 = r_min
r2 = r_max
calculated_vout = vin * (r2 / (r1 + r2))
# r1 = r_min
# r2 = r_max
# calculated_vout = vin * (r2 / (r1 + r2))
# error_percent = abs(calculated_vout - vout) / vout * 100
resistor_in_serie = generate_e_series_resistor(
r_min, r_max, serie_selectionnee
) # Generate resistors values from E série
# Trouver les valeurs résistances du pont diviseur
r1, r2 = get_resistor_bridge_values(
vin, vout, max_somme, resistor_in_serie, erreur_min
)
calculated_vout = get_output_voltage_bridge(vin, r1, r2)
error = abs(calculated_vout - vout) # Calcul de l'erreur
error_percent = abs(calculated_vout - vout) / vout * 100
label_r1.config(text=f"{r1} Ohms")
label_r2.config(text=f"{r2} Ohms")
label_vout.config(text=f"{calculated_vout:.3f} Volts")
label_error.config(text=f"±{error:.3f} Volts, soit ±{error_percent:.2f} %")
label_vout.config(text=f"{calculated_vout:.4f} Volts")
# label_error.config(text=f"±{erreur_min:.3f} Volts, soit ±{error_percent:.2f} %")
label_error.config(text=f"{error:.4f} Volts, soit {error_percent:.2f} %")
except ValueError:
messagebox.showerror(
"Erreur", "Veuillez entrer des valeurs numériques valides."
......@@ -99,10 +132,53 @@ Erreur : {label_error.cget("text")}
messagebox.showerror("Erreur", f"Impossible de sauvegarder : {e}")
def redimensionner_image(img, largeur, hauteur):
"""Redimensionne une image en utilisant la méthode appropriée en fonction de la version de Pillow."""
try:
# Vérifie la version de Pillow
if PIL.__version__ >= "10.0.0":
# Utilise LANCZOS pour les versions >= 10.0.0
img = img.resize((largeur, hauteur), Image.LANCZOS)
else:
# Utilise ANTIALIAS pour les versions < 10.0.0
img = img.resize((largeur, hauteur), Image.ANTIALIAS)
except AttributeError:
# Gère les erreurs si Image.LANCZOS n'est pas disponible (versions très anciennes)
img = img.resize((largeur, hauteur), Image.ANTIALIAS) # Méthode de repli
return img
def redimensionner_image_proportionnellement(img, largeur_max, hauteur_max):
"""Redimensionne une image en conservant les proportions et en respectant les dimensions maximales."""
largeur_originale, hauteur_originale = img.size
# print(f"Dimensions originales : {largeur_originale}x{hauteur_originale}") # Debug
ratio_original = largeur_originale / hauteur_originale
# print(f"Ratio original : {ratio_original}") # Debug
if largeur_originale > largeur_max or hauteur_originale > hauteur_max:
if largeur_max / hauteur_max > ratio_original:
nouvelle_hauteur = hauteur_max
nouvelle_largeur = int(nouvelle_hauteur * ratio_original)
else:
nouvelle_largeur = largeur_max
nouvelle_hauteur = int(nouvelle_largeur / ratio_original)
# img = img.resize((nouvelle_largeur, nouvelle_hauteur), Image.LANCZOS) # ou Image.ANTIALIAS
img = redimensionner_image(img, nouvelle_largeur, nouvelle_hauteur)
return img
# Création de la fenêtre principale
root = tk.Tk()
root.title("Calcul des résistances R1 et R2")
root.geometry("600x700")
# Définir la taille minimale de la fenêtre
root.minsize(340, 480)
# Définir une taille initiale (facultatif)
root.geometry("400x500")
# Code pour les widgets et la logique de l'application
# Entrées utilisateur
frame_inputs = tk.Frame(root)
......@@ -124,7 +200,8 @@ entry_error.grid(row=2, column=1)
tk.Label(frame_inputs, text="Volts").grid(row=2, column=2)
tk.Label(frame_inputs, text="Série :").grid(row=3, column=0)
series_combobox = ttk.Combobox(frame_inputs, values=["E12", "E24", "E48", "E96"])
# series_combobox = ttk.Combobox(frame_inputs, values=["E12", "E24", "E48", "E96"])
series_combobox = ttk.Combobox(frame_inputs, values=get_available_e_series())
series_combobox.grid(row=3, column=1)
series_combobox.set("E48")
......@@ -166,10 +243,15 @@ frame_image.pack(pady=10)
try:
image_path = os.path.join("assets", "voltage-divider.png")
img = Image.open(image_path)
img = img.resize((400, 200), Image.ANTIALIAS) # Redimensionner l'image
img_tk = ImageTk.PhotoImage(img)
canvas = tk.Canvas(frame_image, width=400, height=200)
# AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
# https://stackoverflow.com/questions76616042/attributeerror-module-pil-image-has-no-attribute-antialias
# img = img.resize((400, 200), Image.ANTIALIAS) # Redimensionner l'image
img_redimensionnee = redimensionner_image_proportionnellement(img, 300, 150)
largeur_img_tk, hauteur_img_tk = img_redimensionnee.size
img_tk = ImageTk.PhotoImage(img_redimensionnee)
canvas = tk.Canvas(frame_image, width=largeur_img_tk, height=hauteur_img_tk)
canvas.create_image(0, 0, anchor="nw", image=img_tk)
canvas.pack()
except Exception as e:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment