Tkinter импорт без *?

Привет, я хотел задать вопрос. в моем прошлом программировании я использовал

from tkinter import * Gui = Tk() 

но кто-то сказал мне, что импорт * не подходит по многим причинам, но теперь, когда я хочу импортировать

 from tkinter import geometry 

он говорит, что геометрия – это не предмет модуля (имя).

и когда я это делаю:

  import tkinter tkinter.geometry(500x500) 

он говорит, что объект 'module' не имеет атрибута 'geometry'

может кто-нибудь объяснить мне, как импортировать с tkinter все разные способы не только для геометрии, но и большинства модулей tkinter … ???? пожалуйста

Это связано с тем, что модуль tkinter не имеет функции geometry . Это экземпляры Tk .

Вот хороший способ выполнить то, что вы пытаетесь сделать:

 import tkinter as TK # TK is a convenient, easy to type alias to use for tkinter. gui = TK.Tk() gui.geometry("500x500") # don't forget the quotes 

Почему from tkinter import * является неидеальным способом импорта tkinter

В стороне, кто сказал вам, что from tkinter import * была плохая идея, было правильно – когда вы это делаете, вы загружаете все пространство имен tkinter в пространство имен вашего модуля.

Если вы это сделаете, вы можете столкнуться с неприятными конфликтами пространства имен, например:

 from tkinter import * gui = Tk() Label = "hello" Label1 = Label(gui, text=Label) # Traceback (most recent call last): # File "stackoverflow.py", line 98, in <module> # Label1 = Label(gui, text=Label) # TypeError: 'str' object is not callable 

Вы перезаписали ссылку на виджет Label tkinter – так что вы больше не можете создавать ярлыки! Конечно, вы не должны зацикливаться на таких локальных переменных, как это в любом случае, но зачем беспокоиться об избежании этих проблем пространства имен, когда вы можете это сделать:

 import tkinter as TK 

Этот метод импорта ^^^^ также предпочтительнее, потому что если в какой-то момент вы захотите поменять Tkinter на другой модуль с аналогичной реализацией, вместо того, чтобы расчесывать свой код для всех элементов модуля Tkinter, вы можете просто так:

 #import tkinter as TK import newTkinter as TK 

И все готово. Или, если вы хотите использовать другой модуль, который имеет одни и те же имена для своих классов и методов, следующее приведет к хаосу:

 from tkinter import * from evilOverlappingModule import * 

но это было бы хорошо:

 import tkinter as TK import evilOverlappingModule as evil 

Причина, по которой from module import * считается вредной, заключается в том, что она загрязняет основное пространство имен с каждым открытым именем в модуле. В лучшем случае это делает код менее явным, в худшем случае он может вызвать конфликты имен. Например, модульные codecs имеют open метод, и есть встроенная версия, которая принимает разные аргументы. Если я напишу

 from codecs import * f = open(…) 

который open , я получу? Tkinter имеет много символов, и программы на основе tkinter имеют тенденцию использовать их очень сильно. лучше, чем import *

 import tkinter as tk 

который затем позволяет – все еще явным, но проще вводить и читать:

 tk.Tk().geometry(…) 

Если вы * импортировали tkinter, по существу tkinter. находится в пространстве имен, что означает, что для доступа к модулям tkinter, не беспокоясь о префиксах с помощью tkinter. , В этом случае geometry("500x500") является методом Tk() , поэтому вы будете использовать ее так

 from Tkinter import * Gui = Tk() Gui.geometry("500x500") Gui.mainloop() 

Аналогичные объекты, такие как различные виджеты и т. Д., Используются одинаково. Например, ярлык будет выглядеть следующим образом:

 from Tkinter import * Gui = Tk() label= Label(Gui, text="Hello World!") label.pack() Gui.mainloop()