Was bedeutet _,? Eventuell im Zusammenhang mit tempfile

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Code: Alles auswählen

filehandle, icon_path = tempfile.mkstemp()
stehen.
Das Leben ist wie ein Tennisball.
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

Danke für die schnelle Antwort. :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

@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.
BlackJack

Ich würde statt diesem low-level-Kram mit Dateideskriptoren wohl eher `NamedTemporaryFile` verwenden, was das alles vor dem Benutzer versteckt.
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

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 :wink: ):

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?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

@snafu: Nein leider nicht. :(
Habs grade getestet und es kommt die gleiche Fehlermeldung.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Schreib doch mal ein Datei mit richtiger Endung in ein Tempverzeichnis.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

@darktrym: Hat leider auch nicht funktioniert.
Hat noch jemand eine Idee?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Funktioniert def. mit mkdtemp, hab grad getestet,.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Juppiter
User
Beiträge: 9
Registriert: Samstag 22. Februar 2014, 21:52

Ich glaube du meinst mkstemp. :wink:
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
Antworten