Mise en place de la bibliothèque Pmw sur python 3.7

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, J’ai téléchargé Python 3.4.3 sur Mac OS pour pouvoir utiliser IDLE. J’ai en réalité besoin de Tkinter pour pouvoir utiliser certains widgets tels que la combo box notamment. Or cette dernière se trouve dans la bibliothèque Pmw, que j’ai téléchargé (version 2.0.0 pour python 3) et placé dans l’application python. Mais malgré ça lorsque je fais :

import Pmw

Je reçois 'Pmw is not defined' J’aimerais résoudre ce problème un peu handicapant pour avancer. Merci beaucoup. Theo

+0 -0

Salut,

J’ai téléchargé Python 3.4.3 sur Mac OS pour pouvoir utiliser IDLE.

Python 3.4 est en fin de vie depuis Mars (et 3.4.3 est une sous version plutôt vieille), à moins d’avoir une contrainte forte sur cette version de Python, utilise une version à jour (la dernière est 3.7).

J’ai en réalité besoin de Tkinter pour pouvoir utiliser certains widgets tels que la combo box notamment. Or cette dernière se trouve dans la bibliothèque Pmw

Je suis pas sûr de comprendre, tu as une combo box disponible dans TkInter, et Pmw est une vieille bibliothèque qui n’est plus en développement actif depuis quelque années.

que j’ai téléchargé (version 2.0.0 pour python 3) et placé dans l’application python

C’est un peu vague, qu’est-ce que tu as fait exactement ?

Je reçois 'Pmw is not defined'

Ce n’est pas le message complet, donne nous l’erreur complète sinon on ne pourra pas t’aider.

PS : j’ai déplacé ton sujet dans le forum "Programmation". Le forum "Vos projets" est là pour que les membres puissent présenter des projets aboutis à la communauté. :)

+1 -0

D’accord, alors tout d’abord j’ai en réalité la version 3.7 de python et non la 3.4.3 comme je l’ai mentionné avant (erreur d’inattention on va dire). Donc si Pmw n’est pas utile je devrais pouvoir utiliser des widgets tels que Combobox sans cette bibliothèque, or ce n’est pas le cas. Plus simplement voici mon programme pour l’instant:

from tkinter import*

fenetre = Tk()
fenetre.title('RATPlan')

texte = Label(fenetre, text='Itinéraire RATP')
texte['fg'] = 'turquoise'  # Création du texte "Itinéraire RATP" de couleur turquoise
texte.pack()

plan_métro = Canvas(fenetre, width=1000, height=670, background='turquoise')
txt = plan_métro.create_text(500,335, text="Substitut au plan", font="Arial 16 italic", fill="black")
plan_métro.pack(side=TOP, padx=5, pady=5)

fermer = Button(fenetre, text="fin du trajet", command=fenetre.destroy, relief=RAISED) 
fermer.pack(side=BOTTOM)  
                          
liste_stations_départ = ComboBox()
liste_stations_départ.insert(0,'station1')
liste_stations_départ.insert(1,'station2')
liste_stations_départ.insert(2,'station3')
liste_stations_départ.pack(side=LEFT, padx=5, pady=5)
 
liste_stations_arrivée = ComboBox()
liste_stations_arrivée.insert(0,'station1')
liste_stations_arrivée.insert(1,'station2')
liste_stations_arrivée.insert(2,'station3')
liste_stations_arrivée.pack(side=LEFT, padx=5, pady=5)

fenetre.mainloop()

Voici ce qu’il me retourne:

Traceback (most recent call last):
  File "/Users/Theo/Documents/python 1.py", line 17, in <module>
    liste_stations_départ = ComboBox()
NameError: name 'ComboBox' is not defined

Pour l’instant, mon but est juste de créer une liste déroulante dans laquelle on peut choisir parmi une liste de stations (1,2 ou 3). J’ai aussi vu qu’il existait une méthode utilisant "StringVar" mais c’est assez mal expliqué.

Je ne sais pas comment tu as cherché, mais en cherchant "tkinter combobox" sur Google, le premier lien me dit que ComboBox est défini dans tkinter.ttk, qu’il faut donc importer.

Au passage, utiliser import * est considéré comme étant une mauvais pratique puisque tu perds l’isolation dans un namespace des objets définis dans le module. Autre point, considère l’adhésion à la PEP 8, ce sont des guides de style largement appliqués par la communauté Python, ce qui permet de rendre ton code plus facilement lisible par d’autres développeurs.

+0 -0

Merci pour ta réponse. J’ai bien importé tkinter.ttk et j’ai essayé de modifier plusieurs choses afin de maîtriser un minimum et ça a très bien fonctionné indépendamment de mon code. En revanche, lorsque je place mon nouveau morceau de code dans mon programme, là ça coince. Apparemment le problème vient du fait que j’utilise .pack pour appeler mes autres widgets. Je mets tout ci dessous:

from tkinter import* #j utilise cette forme car c est la forme conventionnelle sur les ordinateurs de notre lycée 
import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.title('RATPlan')

texte = tk.Label(fenetre, text='Itinéraire RATP')
texte['fg'] = 'turquoise'  # Création du texte "Itinéraire RATP" de couleur turquoise
texte.pack()

plan_métro = Canvas(fenetre, width=1000, height=670, background='turquoise')
txt = plan_métro.create_text(500,335, text="Substitut au plan", font="Arial 16 italic", fill="black")
plan_métro.pack(side=TOP, padx=5, pady=5)

fermer = Button(fenetre, text="fin du trajet", command=fenetre.destroy, relief=RAISED) 
fermer.pack(side=BOTTOM) 
                          
liste_stations_départ = ttk.Combobox(fenetre, values=[
                                    "station 1", 
                                    "station 2",
                                    "station 3"])
print(dict(liste_stations_départ)) 
liste_stations_départ.grid(column=0, row=1)
liste_stations_départ.current(0)

print(liste_stations_départ.current(), liste_stations_départ.get())



liste_stations_arrivée = ttk.Combobox(fenetre, values=[
                                    "station 1", 
                                    "station 2",
                                    "station 3"])
print(dict(liste_stations_arrivée)) 
liste_stations_arrivée.grid(column=0, row=1)
liste_stations_arrivée.current(0)

print(liste_stations_arrivée.current(), liste_stations_arrivée.get())

fenetre.mainloop()

Je récupère:

Traceback (most recent call last):
  File "/Users/Theo/Documents/python 1.py", line 24, in <module>
    liste_stations_départ.grid(column=0, row=1)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 2226, in grid_configure
    + self._options(cnf, kw))
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

PS: Je commence tout juste le code donc je vais avoir du mal avec les guides de style pour le moment désolé!

+0 -0

Hmm, je connais très mal tkinter (je fais jamais d’interface graphique :p), mais ça dit effectivement que tu ne peux pas mélanger pack et grid pour agencer tes objets, pourquoi utiliser grid plutôt que pack ? J’ai essayé en remplaçant les appels à grid par .pack(), et la fenêtre s’ouvre avec deux ComboBox en bas.

PS: Je commence tout juste le code donc je vais avoir du mal avec les guides de style pour le moment désolé!

C’est pas un gros problème pour le moment, surtout que ton code suit déjà la plupart des recommandations, c’était plus une piste pour l’avenir.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte