it-swarm.com.de

Fenstersymbol festlegen

Als ich versuchte, das Fenstersymbol in der oberen linken Ecke vom hässlichen roten "TK" in mein eigenes Favicon zu ändern, warf Python=================================

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

Dies sollte das Icon auf 'favicon.ico' setzen (laut vielen Forenbeiträgen im ganzen Web). Leider wird in dieser Zeile nur der folgende Fehler ausgegeben:

Traceback (most recent call last):
  File "d:\ladvclient\mainapp.py", line 85, in <module>
    root.iconbitmap(bitmap='favicon.ico')
  File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "favicon.ico" not defined

Was ich schon gemacht habe:

  • Ich habe den Pfad überprüft - alles ist zu 100% korrekt
  • Ich habe versucht, andere Dateiformate wie .png oder .bmp - keiner hat funktioniert
  • Ich habe dieses Problem auf vielen Websites nachgeschlagen

Und zum dritten Punkt sagte mir effbot.org, meine Lieblingsseite über Tkinter, dass Windows die Funktion iconbitmap ignoriert. Aber das erklärt nicht, warum es einen Fehler auslöst!

Es gibt einige "hackische" Möglichkeiten, um dieses Problem zu umgehen, aber keine davon wurde für Python 3.x geschrieben.

Meine letzte Frage lautet also: Gibt es eine Möglichkeit, ein benutzerdefiniertes Symbol mit Python 3.x und Tkinter zu erhalten?

Sagen Sie mir auch nicht, dass ich eine andere GUI-Bibliothek verwenden soll. Ich möchte, dass mein Programm auf jeder Plattform funktioniert. Ich möchte auch eine codierte Version, keine py2exe oder sth Lösung.

42
CrushedPixel

Sie dürfen favicon.ico Nicht im selben Ordner wie Ihr Skript oder auf Ihrem Pfad haben. Geben Sie den vollständigen Pfadnamen ein. Das funktioniert zum Beispiel:

from tkinter import *
root = Tk()

root.iconbitmap(r'c:\Python32\DLLs\py.ico')
root.mainloop()

Dies geht jedoch mit demselben Fehler in die Luft:

from tkinter import *
root = Tk()

root.iconbitmap('py.ico')
root.mainloop()
48
iCodez

Auf keinen Fall funktioniert das, was hier vorgeschlagen wird - der Fehler "Bitmap xxx nicht definiert" ist immer vorhanden. Und ja, ich habe den richtigen Weg dazu festgelegt.

Was es getan hat ist dies:

imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif'))
root.tk.call('wm', 'iconphoto', root._w, imgicon)  

dabei ist sp der Skriptpfad und root das Tk-Stammfenster.

Es ist schwer zu verstehen, wie es funktioniert (ich habe es schamlos aus fedoraforums kopiert), aber es funktioniert

18
alessandro

Das funktioniert für mich mit Python3 unter Linux:

import tkinter as tk

# Create Tk window
root = tk.Tk()

# Add icon from GIF file where my GIF is called 'icon.gif' and
# is in the same directory as this .py file
root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.gif'))
4
Steve Daulton
#!/usr/bin/env python
import tkinter as tk

class AppName(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

app = AppName()
app.master.title('Title here ...!')
app.master.iconbitmap('icon.ico')
app.mainloop()

es sollte so funktionieren!

1
Malek B.

Habe auch daran festgehalten ...

Endlich ist es mir gelungen, das gewünschte Symbol mit folgendem Code zu setzen:

from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
1
Yuval Farkash

Beide Codes funktionieren gut mit mir auf python 3.7 ..... Hoffnung wird auch für Sie funktionieren

import tkinter as tk
m=tk.Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

und vergessen Sie nicht, "myfavicon.ico" in demselben Ordner zu speichern, in dem sich Ihre Projektskriptdatei befindet

Eine andere Methode

from tkinter import *
m=Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

[* HINWEIS: - python Version-3 funktioniert mit Tkinter und niedriger als Version-3, dh Version-2 funktioniert mit Tkinter]

1
Er M S Dandyan

Stellen Sie sicher, dass auch die ICO-Datei nicht beschädigt ist. Ich habe den gleichen Fehler erhalten, der behoben wurde, als ich eine andere .ico-Datei ausprobierte.

0
Daniel

Es sieht also so aus, als ob root.iconbitmap() nur ein festes Verzeichnis unterstützt.
sys.argv[0] gibt das Verzeichnis zurück, aus dem die Datei gelesen wurde, sodass mit einem einfachen Code ein festes Verzeichnis erstellt werden kann.

import sys
def get_dir(src):
    dir = sys.argv[0]
    dir = dir.split('/')
    dir.pop(-1)
    dir = '/'.join(dir)
    dir = dir+'/'+src
    return dir

Dies ist die Ausgabe

>>> get_dir('test.txt')
'C:/Users/Josua/Desktop/test.txt'

BEARBEITEN:
Das einzige Problem ist, dass diese Methode unter Linux nicht funktioniert

[email protected]:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.argv[0]
''
>>>
0
Josua Robson
from tkinter import *
from PIL import ImageTk, Image

Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))

Das oben hat bei mir funktioniert.

0
Tarun Kolla