2016-04-13 7 views
0

diesen einfachen Code Bedenken Sie:warum tut tkinter ttk zeigt "Name ttk ist nicht definiert" in Python 3.5.1

from tkinter import * 
from tkinter.ttk import * 
root= Tk() 
ttk.Label(root, text='Heading Here').grid(row=1, column=1) 
ttk.Separator(root,orient=HORIZONTAL).grid(row=2, columnspan=5) 
root.mainloop() 

, wenn ich diesen Code ausführen es zeigt Fehler

ttk.Label(root, text='Heading Here').grid(row=1, column=1) 
NameError: name 'ttk' is not defined 

Antwort

2

Wenn Sie import X tun, Sie ein Modul namens X importieren. Ab diesem Zeitpunkt wird X definiert.

Wenn Sie from X import * tun, sind Sie nicht Import X, Sie sind die Dinge nur importieren, die innerhalb von X sind. X selbst wird nicht definiert.

Wenn Sie also from tkinter.ttk import * tun, sind Sie nicht ttk importieren, die Sie importieren, nur die Dinge in ttk. Dies wird Dinge wie Label, Button usw. importieren, aber nichtttk selbst.

Der richtige Weg ttk in python3 zu importieren ist mit der folgenden Aussage:

from tkinter import ttk 

Damit Sie das TTK-Label mit ttk.Label verweisen können, die TTK-Taste als ttk.Button usw.

Hinweis: tun from tkinter.ttk import * ist gefährlich. Leider exportieren ttk und tkinter beide Klassen mit dem gleichen Namen. Wenn Sie beide from tkinter import * und from tkinter.ttk import * tun, werden Sie eine Klasse mit einer anderen überschreiben. Die Reihenfolge der Importe ändert die Verhaltensweise Ihres Codes.

Aus diesem Grund sollten - insbesondere bei tkinter und ttk, die jeweils mehrere überlappende Klassen haben - Wildcard-Importe vermieden werden. PEP8, die offizielle Python Style Guide, schreckt offiziell Wildcard Importe:

Wildcard imports (from import *) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools.


Hinweis: Ihre Frage impliziert, Sie verwenden Python 3, aber im Falle verwenden Sie 2 Python einfach import ttk tun können, eher als from tkinter import ttk. ttk in Python 3 verschoben.

+0

Ich stimme der Antwort zu, aber wenn ich die Zeile von tkinter import ttk benutze, bekomme ich denselben Fehler 'Separator (self, orient = HORIZONTAL) .grid (row = 0, columspan = 5, sticky = "ew") NameError: name 'Separator' ist nicht definiert ', können Sie mir vorschlagen, diesen Fehler zu überwinden @ BryanOakley – sujit

+0

@sujit: Verwenden 'ttk.Separator' –

+0

Ich habe versucht, dass ich bekomme Fehler' Name ttk ist nicht definiert '@ Bryan – sujit

1

ttk So importieren ersetzen der folgenden Zeile:

from tkinter.ttk import * 

mit:

Andernfalls werden die Attribute des Moduls tkinter.ttk in den aktuellen Modulnamespace anstelle von ttk selbst geladen.

+0

Ich tat, aber immer noch zeigt es den gleichen Fehler – sujit

0
ttk.Label(root, text='HeadingHere').grid(row=1, column=1) 
NameError: name 'ttk' is not defined 
In this remove ttk as follows.  
Label(root, text='HeadingHere').grid(row=1, column=1 

Jetzt funktioniert es gut

+0

Dies beantwortet nicht die Frage, die gefragt wurde, es bietet nur einen Workaround. –

Verwandte Themen