Seite 1 von 1
messagebox py3.7.0 - py3.4
Verfasst: Freitag 26. Oktober 2018, 19:07
von DB7WN
Hallo allerseits!
ich habe ein Pythonscript in einem Netzlaufwerk, zu dem ich von zwei verschiedenen PCs zugreife. Auf einem PC ist Py3.7.0 installiert, auf dem anderen Py3.4
In mindestens zwei Fällen reagieren die beiden Pythons unterschiedlich und es tritt sogar ein Fehler auf.
Die Zeile: messagebox.showerror('Fehler', 'kein Dateiname')
ruft unter Py3.7.0 die Fehlermeldung "messagebox ist nicht definiert " hervor. In Py3.4 dagegen funktioniert das wie gewünscht.
Wie gesagt, ist das Script absolut dasselbe.
Ist da ein Kompatibilitätsproblem? Google konnte mir nichts dazu sagen.
Re: messagebox py3.7.0 - py3.4
Verfasst: Freitag 26. Oktober 2018, 22:04
von __blackjack__
@DB7WN: Wie hast Du `messagebox` denn definiert/importiert? Kann es sein, dass sich Dein Skript darauf verlässt das `messagebox` automatisch mit `tkinter` importiert wird? Das ist zumindest bei Python 3.6 nicht der Fall. Das riecht so wie es da steht auch nach einem Sternchen-Import.
Re: messagebox py3.7.0 - py3.4
Verfasst: Freitag 26. Oktober 2018, 22:11
von DB7WN
Ich mache das so: from tkinter import *
Ja, ich hab mal irgendwo gelesen, dass es bei dem Import irgendwelche Probleme geben kann, habs aber nicht richtig kapiert.
Vielleicht bist du so nett und erklärst mir das nochmal.
Re: messagebox py3.7.0 - py3.4
Verfasst: Freitag 26. Oktober 2018, 23:24
von __blackjack__
@DB7WN: Ganz konkret hast Du hier das Problem das `messagebox` ein Modul im `tkinter`-Package ist und das auf diese Weise nicht garantiert ist, dass das importiert wird. Das musst Du schon *explizit* importieren. Und *-Importe sind Böse™, weil man sich da *alles* aus dem importierten Modul in das aktuelle Modul holt und man nicht mehr so leicht nachvollziehen kann was woher kommt und zudem die Gefahr von Namenskollisionen besteht.
Re: messagebox py3.7.0 - py3.4
Verfasst: Samstag 27. Oktober 2018, 09:41
von DB7WN
Ich habs heute Nacht noch ausprobiert. Mit "from tkinter import messagebox" geht es.
Danke für den Tip.
Bei nahezu allen Scriptbeispielen, die ich über Google gefunden habe und auch in meinem kleinen Handbuch "Python Ge-packt" wird der Import mit Sternchen verwendet.
Re: messagebox py3.7.0 - py3.4
Verfasst: Samstag 27. Oktober 2018, 09:59
von __blackjack__
@DB7WN: Beliebige Scriptbeispiele über Google können beliebig schlecht bis falsch sein. Insbesondere seit Python durch den Raspi ähnliche Leute angelockt hat wie PHP und viele Leute die in anderen Sprachen programmieren können, aber Python nur sehr oberflächlich angeschaut haben, mal schnell was zusammen hacken. Und dann schreiben die alle voneinander ab und/oder kopieren einfach Quelltextfragmente. Teilweise ohne zu verstehen was sie da kopiert und verändert/integriert haben.
*-Importe sind praktisch in einer interaktiven Python-Shell oder bei Modulen die explizit vom Programmierer des Moduls für diesen Zweck vorgesehen sind. `pygame.locals` würde mir da spontan einfallen. Ansonsten ist das nicht ganz ungefährlich weil man sich ja nicht nur alles in dem Modul direkt definierte importiert was in der Dokumentation steht, sondern auch alles was das Modul importiert hat. Dann kann es genau zu solchen Situationen kommen die Du hast: Es kann sein, dass man implizit Namen importiert hat, welche gar nicht da sein dürften ohne das man sie explizit von woanders importiert. Und da das nicht Teil der öffentlichen, dokumentierten API ist, kann sich das auch von Version zu Version ändern. In Python 3.6 hast Du nach einem ``from tkinter import *`` auch die Module `enum`, `sys`, und `re` importiert und man könnte die einfach so verwenden. Das ist aber nicht garantiert.
So ein *-Import macht zudem einen guten Teil der Trennung von Namensräumen zunichte, also den Grund warum man überhaupt Module verwendet.
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 17:38
von DB7WN
Ich versuche jetzt mal die Import-Methode zu ändern, also statt "from tkinter import *" "import tkinter as tk".
Dass jetzt das Erzeugen von fenster, widgets etwas anders funktioniert, habe ich bemerkt und im Prinzip geht das auch: Also statt "fenster = Tk()" jetzt "fenster = tk.TK()". Bei Widgets genauso. Was muss ich aber bei Listboxen machen?
#alt
from tkinter import *
fenster = Tk()
box = Listbox(fenster)
box.pack()
box.delete(0, END)
fenster.mainloop()
#Das hat funktioniert
#neu
import tkinter as tk
fenster = tk.Tk()
box = tk.Listbox(fenster)
box.pack()
box.delete(0, END)
fenster.mainloop()
#das funktioniert nicht mehr -> Fehler "NAME END is not defined"
Ich bin nicht zu faul zum suchen, aber ich finde nichts. Im Netz und auch in meinen beiden Büchern wird der "Sternchenimport" von tkinter praktiziert, wobei "box.delete(0, END)" auch funktioniert.
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 17:56
von kbr
Beim Sternchen-Import war END da - und nun rate mal, woher es kam.
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 18:07
von DB7WN
verrat`s mir
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 19:29
von ThomasL
from tkinter import END
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 20:06
von Sirius3
Es muß eben genauso heißen wie bei Tk oder Listbox: tk.END
Re: messagebox py3.7.0 - py3.4
Verfasst: Dienstag 30. Oktober 2018, 20:44
von DB7WN
Ich hab mir den Wolf gesucht im Netz und das gefunden: "from tkinter.constants import *".
Das importiert nicht nur END, sondern wohl auch andere Konstanten wie TOP, LEFT, RIGHT, usw.
Es ist immer schwierig, wenn man nicht weiß, was man suchen soll.
Re: messagebox py3.7.0 - py3.4
Verfasst: Mittwoch 31. Oktober 2018, 08:05
von Sirius3
Du brauchst nicht lange Suchen, sondern nur das ausprobieren, was Du für die anderen Namen auch schon gemacht hast:
Re: messagebox py3.7.0 - py3.4
Verfasst: Mittwoch 31. Oktober 2018, 12:47
von wuf
Hi DB7WN
Du kannst die Konstante auch als klein geschriebener String
tk.END =
'end' verwenden:
Code: Alles auswählen
import tkinter as tk
fenster = tk.Tk()
box = tk.Listbox(fenster)
box.pack()
box.delete(0, 'end')
fenster.mainloop()
Best 73 de wuf

Re: messagebox py3.7.0 - py3.4
Verfasst: Mittwoch 31. Oktober 2018, 13:08
von DB7WN
Danke allerseits, jetzt funktionierts. Dass man auch den String "end" benutzen kann, hatte ich nicht gefunden.
Ich fürchte, dass ich beim Nächstenmal wieder "auf den Schlauch stehe". Aber dafür haben wir ja das Forum. Ich weiß einfach nicht, was sich in tkinter noch alles verbirgt und was man extra aufrufen muss. Das ist ein grundlegendes Verständnisproblem bei mir.
Re: messagebox py3.7.0 - py3.4
Verfasst: Mittwoch 31. Oktober 2018, 13:14
von Sirius3
@DB7WN: nein, Du solltest NICHT den String 'end' benutzen, dafür sind ja die Konstanten, tk.END, usw., da. Ich verstehe nicht, wo konkret Du damit noch Verständnisprobleme hast? Alles was sich im Modul tkinter befindet, läßt sich über tk.xy ansprechen.
Re: messagebox py3.7.0 - py3.4
Verfasst: Mittwoch 31. Oktober 2018, 13:18
von __blackjack__
@DB7WN: Um tkinter zu verstehen muss man letztlich auch Tk lernen. Das ist in Python nicht komplett dokumentiert, weil es ja nur eine Anbindung an eine an sich ganz gut dokumentierte Bibliothek ist. Wenn man Tk richtig verstehen will, muss man sich auch Tk/Tcl anschauen zumindest so weit anschauen das man den GUI-Teil versteht. Eine wichtige Grundlage von Tcl ist, das diese Programmiersprache so ziemlich alles über Zeichenketten löst. Das ist *der* Datentyp in Tcl.
Ich würde in Python dann aber doch lieber die Konstanten verwenden, statt auch da alles über manuell geschriebene Zeichenkettenliterale zu erledigen.