Seite 1 von 1
Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Donnerstag 27. Februar 2014, 22:17
von Juppiter
Hallo,
ich habe im Internet dieses Codestück gefunden, das als Lösung angegeben war, wenn man bei tkinter ein transparentes Icon in Python erstellen und dann benutzen möchte.
Code: Alles auswählen
import tkinter
import tempfile
ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64
_, ICON_PATH = tempfile.mkstemp()
with open(ICON_PATH, 'wb') as icon_file:
icon_file.write(ICON)
tk = tkinter.Tk()
tk.iconbitmap(default=ICON_PATH)
label = tkinter.Label(tk, text="Window with transparent icon.")
label.pack()
tk.mainloop()
Grundsätzlich geht es mir aber nicht um das Icon, sondern um die Bedeutung und Verwendung von dem _, in z.9.
Ich habe das auch schon mit zwei Unterstrichen gesehen. Ich würde mich sehr freuen, wenn mir jemand die Bedeutung und Verwendung erklären könnte, da ich nicht einfach etwas übernehmen möchte, ohne es zu verstehen. Im Internet und auch auf python-forum habe ich schon gesucht, aber nichts gefunden.
Ich weiß nicht, ob das im Zusammenhang mit tempfile hängt oder allgemein bei Dateizugriffen gebraucht werden kann, daher wäre eine Erklärung hilfreich.
Mfg Juppiter
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Donnerstag 27. Februar 2014, 22:25
von EyDu
Der einzelne Unterstrich ist ein ganz normaler Name, wie jeder beliebige andere (zum Beispiel icon_file oder tk) auch. Allerdings ist es Konvention dass der Unterstrich dann verwendet wird, wenn man das daran gebundene Objekt nicht mehr verwendet. ``tempfile.mkstemp()`` gibt ein Tuple aus Filehandle und Dateiname zurück. Das Filehandle soll hier verworfen werden, da der Autor des Codes nur am Dateinamen interessiert ist. Das links vom Gleichheitszeichen ist ganz normales Tuple-Unpacking. Da könnte genau so gut
stehen.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Donnerstag 27. Februar 2014, 22:32
von Juppiter
Danke für die schnelle Antwort.

Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Donnerstag 27. Februar 2014, 22:42
von Sirius3
@Juppiter: mal wieder ein Beispiel, dass man keine Codeschnipsel aus dem Internet ungesehen verwenden sollte, wenn man nicht versteht, was sie machen. Der Unterstrich ist nur eine Konvention, die sagt, dass das Rückgabeargument der Funktion nicht verwendet wird. Da es sich bei mkstemp aber um ein Filehandle handelt, ist es blöd, ihn einfach wegzuwerfen. Filehandle sind normalerweise eine wertvolle Resource, da die Anzahl der Handles beschränkt ist. Wenn ein Handle geöffnet wird, muß es auch wieder geschlossen werden.
Richtig wäre also:
Code: Alles auswählen
import os
import tempfile
filehandle, filename = tempfile.mkstemp()
with os.fdopen(filehandle, 'wb') as icon:
icon.write(ICON)
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 14:33
von Juppiter
@Sirius3: Deswegen habe ich ja gefragt. Außerdem habe ich doch in meinem vorigen Post gesagt, dass ich genau deshalb frage, weil ich es nicht verstanden habe und es deshalb nicht einfach übernehmen möchte.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 14:50
von BlackJack
Ich würde statt diesem low-level-Kram mit Dateideskriptoren wohl eher `NamedTemporaryFile` verwenden, was das alles vor dem Benutzer versteckt.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 15:02
von Juppiter
Ich bin grade dabei so etwas zu machen, da mir NamedTemporaryFile praktischer vorkommt.
Leider habe ich ein kleines Problem (es könnte ein wenig in richtung tkinter rutschen

):
Code: Alles auswählen
import tkinter
from tempfile import NamedTemporaryFile
tk=tkinter.Tk()
icon=(b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64
with NamedTemporaryFile(mode="wb") as iconfile:
iconfile.write(icon)
tk.iconbitmap(default=iconfile.name)
tk.mainloop()
Leider kommt dabei eine Fehlermeldung, die Folgendes besagt:
Code: Alles auswählen
Traceback (most recent call last):
File "xxxx", line 13, in <module>
tk.iconbitmap(default=iconfile.name)
File "C:\Program Files (x86)\Python\lib\tkinter\__init__.py", line 1635, in wm_iconbitmap
return self.tk.call('wm', 'iconbitmap', self._w, '-default', default)
_tkinter.TclError: bitmap "c:\users\xxx\appdata\local\temp\tmp3947ge" not defined
Was mache ich falsch?
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 15:21
von snafu
Soweit ich weiß existiert das Tempfile nur innerhalb des `with`-Blocks. Nach dem Verlassen des Blocks wird es also gelöscht. Da du aber erst anschließend den Mainloop von TKinter startest, macht dies vermutlich Probleme.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 15:25
von Juppiter
@snafu: Nein leider nicht.
Habs grade getestet und es kommt die gleiche Fehlermeldung.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 16:52
von darktrym
Schreib doch mal ein Datei mit richtiger Endung in ein Tempverzeichnis.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 16:59
von Juppiter
@darktrym: Hat leider auch nicht funktioniert.
Hat noch jemand eine Idee?
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 18:30
von darktrym
Funktioniert def. mit mkdtemp, hab grad getestet,.
Re: Was bedeutet _,? Eventuell im Zusammenhang mit tempfile
Verfasst: Freitag 28. Februar 2014, 19:02
von Juppiter
Ich glaube du meinst mkstemp.
Ich weiß, dass es damit funktioniert, aber ich möchte, dass sich die Datei alleine wieder löscht. Bzw. automatisch gelöscht wird, ohne dass ich extra für das Icon os importieren muss.
Mfg Juppiter