Seite 1 von 1
from tkinter import *
Verfasst: Donnerstag 18. August 2016, 09:28
von Krypton514
Ich habe etwa vor einem halben Jahr mit dem Buch "Python Kinderleicht" begonnen und bin gerade damit fertig geworden. Dabei habe ich gelernt, dass es Sachen gibt, die man importieren muss, indem man
und dann den Namen eingibt. Doch dann habe ich gesehen, dass man bei Tkinter immer
schreiben muss. Warum eigentlich? Könnte man nicht einfach
eingeben?
Vielen Dank im vorhinein.
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 09:46
von BlackJack
@Krypton514: Man *muss* nicht ``from tkinter import *`` schreiben — man sollte das sogar dringend sein lassen. Ja man kann auch nur das Modul selbst in den Namensraum holen. Oder man importiert explizit die Namen die man verwendet. Üblich ist es das Modul zu importieren und dann mit ``as`` an den kürzeren Namen `tk` zu binden: ``import tkinter as tk``. Dann spart man sich viel Tipparbeit. Normalerweise sollte man das nicht machen, auf Kosten einer kryptischen Abkürzung Tipparbeit sparen, aber von dieser Faustregel gibt es ein paar Ausnahmen. Normalerweise Module in denen wirklich *viele* Namen sind, von denen man auch relativ viele verwendet. `ctypes` → `ct` und `numpy` → `np`, sind Beispiele bei denen man dieses Vorgehen häufig sieht.
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 10:40
von Krypton514
@BlackJack: Achso, dann werde ich das in zukunft nicht mehr machen. Vielen Dank für die Hilfe!
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 10:48
von Krypton514
@BlackJack: Wie muss ich dann dieses Programm umschreiben, dass es funktioniert? Ich habe es mit
und
versucht, aber es gibt nur Fehlermeldungen, dass es z.B. kein Label gibt.
Code: Alles auswählen
from tkinter import *
root = Tk()
w = Label(root, text="Hello Tkinter!")
w.pack()
root.mainloop()
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 10:57
von BlackJack
@Krypton514: Du musst `Label` das im `tkinter`-Modul ist, dann über das Modul referenzieren, denn Du importierst ja nicht mehr alle ca. 190 Namen aus dem `tkinter`-Modul, sondern nur noch das Modul selbst. Also entweder `tkinter.Label` oder `tk.Label`, je nach dem unter welchem Namen Du das Modul über die ``import``-Zeile zur Verfügung stellst.
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 11:00
von snafu
Du musst überall "tk." davor schreiben, damit Python weiß, welcher Namensraum gemeint ist.
Alter Code:
Code: Alles auswählen
from tkinter import *
root = Tk()
w = Label(root, text="Hello Tkinter!")
w.pack()
root.mainloop()
...wird zu:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
w = tk.Label(root, text="Hello Tkinter!")
w.pack()
root.mainloop()
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 11:03
von Krypton514
@snauf: Oh ja, es funktioniert! Danke!!!
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 11:09
von Krypton514
@BlackJakck, @snauf: Tut mir leid, dass ich nerve, aber was ist wenn ich es mit
machen möchte?
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 11:11
von BlackJack
@Krypton514: Na dann bennennst Du es nicht in `tk` um und musst `tkinter.Label` schreiben.
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 11:17
von Krypton514
@BlackJack: Oh, ok. also ist es wirklich mit
einfacher! Danke!!
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 13:40
von snafu
Man muss in Python immer explizit den Namensraum (Name des Moduls oder eben der Alias) mit angeben, wenn man in Python ein Modul als Ganzes importiert. Nur bei "from"-Importen wird es weg gelassen, da die Namen dann im globalen Namensraum landen. Sooo kompliziert ist das jetzt eigentlich nicht...
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 17:34
von coethen25
stimmt auch nicht ganz: wenn ich als Beispiel schreibe:
Code: Alles auswählen
from tkinter import filedialog as fd
folder = fd.askdirectory() # als Beispiel
muss ich trotzdem fd. davor schreiben, wo es hingehört.
Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 17:54
von Krypton514
@snauf: Ja, jetzt habe ich es verstanden. Ist eigentlich nicht so kompliziert wie ich dachte. Man mussn es halt erst mal verstehen.

Re: from tkinter import *
Verfasst: Donnerstag 18. August 2016, 17:55
von Krypton514
@all: Danke nochmal für die Hilfe!!! Ich wäre sonstnciht davon gekommen!
Re: from tkinter import *
Verfasst: Freitag 19. August 2016, 00:04
von snafu
coethen25 hat geschrieben:stimmt auch nicht ganz: wenn ich als Beispiel schreibe:
Code: Alles auswählen
from tkinter import filedialog as fd
folder = fd.askdirectory() # als Beispiel
muss ich trotzdem fd. davor schreiben, wo es hingehört.
Ja, klar. Wenn in dem Namensraum ein weiterer Namensraum steckt (z.B. ein Modul in einem Package) und ich den "Unter-Namensraum" als ganzes importiere, dann muss ich auch den weiteren Namensraum wieder explizit ansprechen. Es ist halt immer dann nötig, wenn ich sozusagen eine Ebene tiefer gehen möchte.
Ein "from"-Import sorgt natürlich nicht dafür, dass auf magische Weise jeder erdenkliche Name aus der untergeordneten Namensraum-Hirarchie plötzlich auf globaler Ebene verfügbar ist. Soviel Mitdenken hatte ich an dieser Stelle einfach mal vorausgesetzt...