web-dev-qa-db-fra.com

ImportError lors de l'importation de Tkinter dans Python

J'essaie de tester le code GUI en utilisant Python 3.2 avec la bibliothèque standard Tkinter mais je ne peux pas importer la bibliothèque.

Voici mon code de test:

from Tkinter import *

root = Tk()
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()

Le shell signale cette erreur:

Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
from Tkinter import *
ImportError: No module named Tkinter
19
Carry All

La racine du problème est que le module Tkinter est nommé Tkinter (majuscule "T") dans python 2.x, et tkinter (minuscule "t ") dans python 3.x.

Pour faire fonctionner votre code dans les deux Python 2 et 3, vous pouvez faire quelque chose comme ceci:

try:
    # for Python2
    from Tkinter import *
except ImportError:
    # for Python3
    from tkinter import *

Cependant, PEP8 a ceci à dire sur les importations de caractères génériques:

Les importations de caractères génériques (depuis <module> import *) doivent être évitées

Malgré d'innombrables tutoriels qui ignorent PEP8, la façon d'importer conforme à PEP8 serait quelque chose comme ceci:

import tkinter as tk

Lors de l'importation de cette manière, vous devez préfixer toutes les commandes tkinter avec tk. (Par exemple: root = tk.Tk(), etc.). Cela rendra votre code plus facile à comprendre au détriment d'un peu plus de frappe. Étant donné que tkinter et ttk sont souvent utilisés ensemble et importent des classes du même nom, c'est une bonne chose. Comme l'indique Zen of python : "explicite vaut mieux qu'implicite".

Remarque: La partie as tk Est facultative, mais vous permet de taper un peu moins: tk.Button(...) vs tkinter.Button(...)

31
Ben Gates

Le module s'appelle tkinter, pas Tkinter, dans 3.x.

16
Cat Plus Plus

Réécrivez le code comme suit avec Tkinter en tkinter (minuscule) pour 3.x:

from tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()
9
Musaab