2013-08-21 2 views
0

Это мой код:Как это показывает ошибку?

import sys 
import tkinter as tk 
import os 
mGui = tk.Tk() 
mGui.geometry("300x300") 
mGui.title("YourBowlingSpeed") 
mlabel1 = Label (text = "my label") 
mlabel1.place (x = 50,y = 150) 

я изменил свои привычки импорта с *, но это не работает, показывает мне ошибку. Traceback (последний последний вызов): Файл «C: \ Python33 \ Projects \ YorBowlingSpeed-.py», строка 7, в mlabel1 = Ярлык (текст = "mylabel") NameError: имя 'Label' не определено

ответ

2

Вы не импортировали напрямую класс Label в глобальное пространство имен, вы только импортировали модуль. Для того, чтобы ссылаться на него, вы должны сделать:

tk.Label(text = "my label") 

Или, вы можете импортировать класс:

from tkinter import Tk, Label 

Хотя я никогда не работал с Tkinter, я часто видел синтаксис :

from tkinter import * 

который импортирует каждый класс и, таким образом, вам не нужно ставить tk. за именами классов. Обратите внимание, что это может быть рискованным, как если бы у вас уже есть переменная с именем Label, она будет переопределена.

+0

Gah, не упоминайте об ужасном 'из импорта tkinter *'/rant +1 для правильного ответа вверх :) – Brionius

+0

Так что для каждого класса мне придется писать tk ...... но почему в моем коде Я написал mGui = tk.Tk(), так что не должно быть mGui ....? –

+1

Вправо - всякий раз, когда вы хотите получить доступ к имени tkinter, вам нужно начать с 'tk.'. Это займет немного работы, чтобы пройти через ваш код и добавить все 'tk.', но это того стоит. Он избегает беспорядка пространства имен, и это делает ваш код более читаемым - если вы или кто-то еще читаете ваш код, и вы не очень хорошо знакомы с API tkinter, тогда легко определить, какие ссылки исходят от tkinter. – Brionius

2

Теперь, когда вы используете

import tkinter as tk 

Вы должны ссылаться tk создать tkinter виджетов, поэтому вместо

mlabel1 = Label (text = "my label") 

использование

mlabel1 = tk.Label (text = "my label") 
#   ^^^ 

Рад, что вы перешли на этот шаблон! Теперь каждый, кто читает ваш код, мгновенно знает, что Label является функцией от tkinter. Это однозначно, легко читается, не вызывает конфликтов пространства имен и упрощает ведение кода.

+0

Спасибо, но не могу сделать mGui.Label, потому что я ставлю mGui = tk.Tk()? –

+0

Nope - 'mGui' - ссылка на объект' tk.Tk', а 'Label' принадлежит' tk', а не 'tk.Tk'. – Brionius

Смежные вопросы