CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Besoin d'aide python

Pseudo supprimé
Pseudo supprimé 10 décembre 2016 à 20:12:14

Salut j'ai du faire un programme qu'on appelera base qui en importe un autre appelé choix3

Au début du programme base je dois choisir un groupe de personne et si je choisis le troisième il importe le programme choix3 et l'exécute. Quand il a finit d'exécuter le programme choix3, il repart sur le programme base et de la je re choisis un groupe de personnes. Cependant, quand je re sélectionne le groupe 3, il ne relance pas le programme choix3 et me redemande de choisir un groupe en boucle... Quelqu'un sait pourquoi ? Merci

Pseudo supprimé
Pseudo supprimé 10 décembre 2016 à 21:01:01

Voici le code du programme de base
-*- coding: utf-8 -*-
r=0
while(r==0):
import os
from Tkinter import *
Mafenetre = Tk()
def groupe1_1():
Mafenetre.destroy()
choix1
def groupe1_2():
Mafenetre.destroy()
import choix2
def groupe2_1():
Mafenetre.destroy()
import choix3
def groupe2_2():
Mafenetre.destroy()
import choix4
Label1 = Label(Mafenetre, text = 'Veuillez choisir un groupe.',bg='white', fg = 'black')
Mafenetre.title('Choix du groupe')
Mafenetre.geometry("200x80+800-500")
Mafenetre.configure(bg = "white")
Label1.pack()
Bouton1 = Button(Mafenetre, text = 'Groupe 1.1',command = groupe1_1)
Bouton1.pack()
Bouton1.place(x=0,y=20)
Bouton2 = Button(Mafenetre,text = 'Groupe 1.2',command = groupe1_2)
Bouton2.pack()
Bouton2.place(x=100,y=20)
Bouton3 = Button(Mafenetre, text = 'Groupe 2.1', command = groupe2_1)
Bouton3.pack()
Bouton3.place(x=0,y=50)
Bouton4 = Button(Mafenetre, text = 'Groupe 2.2',command = groupe2_1)
Bouton4.pack()
Bouton4.place(x=100,y=50)
Mafenetre.mainloop()

Et le code du second programme très basique que je viens de créer mais qui ne change rien au problème
x=0
while(x!=1):
print'Y=',x
x=x+0.5

Je lance le programme de base, je choisis groupr 2.1, le sous programme se lance, j'obtiens x=0, x=0.5 puis si je sélectionne groupe 2.1, le sous programme ne se reaffiche pas
PS: Les tab ne s'affichent pas

Message édité le 10 décembre 2016 à 21:02:17 par Pseudo supprimé
Blaff4
Blaff4
Niveau 10
10 décembre 2016 à 21:09:02

Le 10 décembre 2016 à 21:01:01 ViveLaRdk a écrit :
PS: Les tab ne s'affichent pas

Il faut que tu utilises la balise < code> code() < /code>.

Message édité le 10 décembre 2016 à 21:09:35 par Blaff4
Pseudo supprimé
Pseudo supprimé 10 décembre 2016 à 21:10:03

http://pastebin.com/eRDMq95m
Je pense que ce sera mieux

Pseudo supprimé
Pseudo supprimé 10 décembre 2016 à 21:15:17

Ps ne faites pas attention à l'oublie import devant choix1

Pseudo supprimé
Pseudo supprimé 10 décembre 2016 à 22:17:22

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

Blaff4
Blaff4
Niveau 10
10 décembre 2016 à 23:58:02

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.

Message édité le 11 décembre 2016 à 00:01:34 par Blaff4
Pseudo supprimé
Pseudo supprimé 11 décembre 2016 à 00:13:21

Merci beaucoup pour ta réponse, tu as du en passer du temps à tout écrire. Je vais essayer de suivre tes conseils par rapport aux fonctions et oui j'utilise python 2.7 mais je n'ai pas le choix j'utilise un capteur d'empreintes sur rasberry qui a été codé pour python 2 et le code qui sert à initialiser le capteur, à rendre lisible une empreinte et toutes les autres fonctions ont déjà été codé en python 2 et il ne fonctionne pas quand j'utilise python 3 :(

Blaff4
Blaff4
Niveau 10
11 décembre 2016 à 00:46:27

Le 11 décembre 2016 à 00:13:21 ViveLaRdk a écrit :
Merci beaucoup pour ta réponse, tu as du en passer du temps à tout écrire. Je vais essayer de suivre tes conseils par rapport aux fonctions et oui j'utilise python 2.7 mais je n'ai pas le choix j'utilise un capteur d'empreintes sur rasberry qui a été codé pour python 2 et le code qui sert à initialiser le capteur, à rendre lisible une empreinte et toutes les autres fonctions ont déjà été codé en python 2 et il ne fonctionne pas quand j'utilise python 3 :(

Ah oui effectivement, les bibliothèques compatibles uniquement 2.7 sont un des rares cas où l'on ne peut pas faire autrement que de programmer avec une ancienne version de Python.

Retiens pas tout ce que je t'ai dit mais essaye effectivement de penser "en fonctions", pour décomposer plus facilement ton code, ça te facilitera la vie.

Bon courage pour ton projet. :ok:

Pseudo supprimé
Pseudo supprimé 11 décembre 2016 à 00:53:48

Merci beaucoup pour ton aide :)

Pseudo supprimé
Pseudo supprimé 11 décembre 2016 à 12:08:33

J'ai une autre question
Comment empêcher le redimensionemment d'un bouton de tkinter ?
Je leur mets une taille spécifique mais ils se remettent plus grand à chaque fois :(
En plus je ne peux pas faire
Bouton.resizable(width=False,height=False) ça ne marche que sur la fenêtre

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment