from tkinter import *

Fragen zu Tkinter.
Antworten
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

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

Code: Alles auswählen

import
und dann den Namen eingibt. Doch dann habe ich gesehen, dass man bei Tkinter immer

Code: Alles auswählen

from tkinter import *
schreiben muss. Warum eigentlich? Könnte man nicht einfach

Code: Alles auswählen

import tkinter
eingeben?
Vielen Dank im vorhinein.
Liebe Grüße,
Krypton514 :mrgreen:
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.
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@BlackJack: Achso, dann werde ich das in zukunft nicht mehr machen. Vielen Dank für die Hilfe!
Liebe Grüße,
Krypton514 :mrgreen:
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@BlackJack: Wie muss ich dann dieses Programm umschreiben, dass es funktioniert? Ich habe es mit

Code: Alles auswählen

import tkinter
und

Code: Alles auswählen

import tkinter as tk
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()
Liebe Grüße,
Krypton514 :mrgreen:
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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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()
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@snauf: Oh ja, es funktioniert! Danke!!!
Liebe Grüße,
Krypton514 :mrgreen:
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@BlackJakck, @snauf: Tut mir leid, dass ich nerve, aber was ist wenn ich es mit

Code: Alles auswählen

import tkinter
machen möchte?
Liebe Grüße,
Krypton514 :mrgreen:
BlackJack

@Krypton514: Na dann bennennst Du es nicht in `tk` um und musst `tkinter.Label` schreiben.
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@BlackJack: Oh, ok. also ist es wirklich mit

Code: Alles auswählen

import tkinter as tk
einfacher! Danke!!
Liebe Grüße,
Krypton514 :mrgreen:
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

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.
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@snauf: Ja, jetzt habe ich es verstanden. Ist eigentlich nicht so kompliziert wie ich dachte. Man mussn es halt erst mal verstehen. :)
Liebe Grüße,
Krypton514 :mrgreen:
Krypton514
User
Beiträge: 15
Registriert: Samstag 23. Juli 2016, 12:24

@all: Danke nochmal für die Hilfe!!! Ich wäre sonstnciht davon gekommen!
Liebe Grüße,
Krypton514 :mrgreen:
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Antworten