Le 10 décembre 2016 à 22:17:22 ViveLaRdk a écrit :
Je crois que le problème vient du fait que pour ne pas importer des choses en double, python met mon second programme à la valeur none et du coup ça fait rien quand je le remporte
L'idée est à peu près là, en effet : http://stackoverflow.com/questions/19077381/what-happens-when-i-import-module-twice-in-python
En gros vu que tu as déjà importé ton module, Python ne va pas le ré-importer, donc la fonction qui était dans choix3 ne sera pas exécutée une nouvelle fois.
Le truc, c'est que tu devrais éviter de mettre des instructions dans la partie racine de choix3, car comme tu l'as compris, celle-ci seront exécutées au moment de l'importation, et c'est rarement un comportement désirable.
Au lieu de ça, tu devrais plutôt mettre le code à exécuter dans une fonction. Ensuite, tu importeras spécifiquement cette fonction tout en haut de ton programme, et lors du choix, tu exécuteras cette fonction importée.
Ainsi, ton module choix3.py ressemblera à ça :
def do_something_3():
print("Something is done.")
Et dans ton programme, tu feras:
from choix3 import do_something_3
...
def groupe2_1():
Mafenetre.destroy()
do_something_3()
Aussi, un principe important de la programmation est nommé "DRY" : "Don't Repeat Yourself".
Quand on regarde ton code, on voit que beaucoup de lignes sont identiques, avec seulement quelques paramètres qui changent. Tu peux donc envisager de faire une fonction qui regroupera ce code à un seul endroit, et tu appelleras par la suite cette fonction au lieu de copier/coller chaque partie (ce qui présente des gros désavantages comme un risque multiplié de faire des erreurs, un code moins lisible, devoir changer chaque ligne si tu veux apporter une modification).
Ton code pourrait ainsi ressembler à ça :
# -*- coding: utf-8 -*-
import os
import Tkinter as tk
from choix1 import do_something_1
from choix2 import do_something_2
from choix3 import do_something_3
from choix4 import do_something_4
def make_buttons(window):
functions = {
(1, 1): do_something_1,
(1, 2): do_something_2,
(2, 1): do_something_3,
(2, 2): do_something_4
}
places = {
(1, 1): (0, 20),
(1, 2): (100, 20),
(2, 1): (0, 50),
(2, 2): (100, 50)
}
for first in range(1, 3):
for second in range(1, 3):
text = "Groupe {}.{}".format(first, second)
function = functions[(first, second)]
x, y = places[(first, second)]
def command():
window.destroy()
function()
button = tk.Button(fenetre, text=text, command=command)
button.place(x=x, y=y)
button.pack()
my_window = tk.Tk()
my_window.title("Choix du groupe")
my_window.geometry("200x80+800-500")
my_window.configure(bg="white")
label_text = "Veuillez choisir un groupe."
label_1 = tk.Label(my_window, text=label, bg='white', fg='black')
label_1.pack()
make_buttons(my_window)
Tu ne pourras probablement pas tout assimiler du premier coup, mais essaye d'y jeter un oeil au fur et à mesure de tes progrès.
Quelques modifications que j'ai apporté :
- Les
import doivent presque toujours se faire tout en haut de ton programme Python. - En Python, les while / for / if n'ont pas besoin d'être entourés de parenthèses
- Importer tous les composants d'un module avec
* est considéré comme mauvais - Pour les arguments lors de l'appel d'une fonction : on met un espace après les
,, mais pas d'espace autour des = - Par contre pour l'initialisation de variable, on met bien des espaces autour des
= - Ta façon de faire une boucle infinie est peu intuitive, préfère un
while True: - Tu peux déclarer beaucoup de tes objets en dehors de la boucle
- Les variables doivent être nommées selon la convention "snake case"
- Ta boucle infinie ne sert à rien car
mainloop() est déjà en soit une boucle infinie - Quand tu as beaucoup de choix différents, tu peux utiliser des dictionnaires pour stocker le résultat attendu en fonction d'un paramètre
- Essaye de prendre l’habitude de nommer tes variables en anglais
Je crois que tu utilises Python 2 ? Essaye plutôt d'installer Python 3, ça t'évitera d'apprendre des choses obsolètes et mal pensées.