Wie mache ich ein PhotoImage weg?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Das funktioniert nicht:
widget['image'] = None

Das PhotoImage in den Garbagekollector zu werfen, hatte bei tkinter widgets funktioniert:
widget.image = None

Aber bei ttk Widgets führt das bald zur Exception

Diese Lösung ist auch keine:
widget['image'] = PhotoImage(data='')

Da ist zwar dann ein PhotoImage nicht mehr sichtbar, der Text des Buttons aber auch nicht

Wie sage ich einem widget, dass es kein Image mehr haben soll?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Hier etwas zum ausprobieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
    import ttk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk
    from tkinter import ttk
    
APP_TITLE = "Flash Image"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200


class Application(tk.Frame):

    def __init__(self, master):
        self.master = master
        tk.Frame.__init__(self, master)
        
        self.image = tk.PhotoImage(file="test_image.gif")

        self.tk_label = tk.Label(self, text='Hi!', image=self.image)
        self.tk_label.pack()

        self.ttk_label = ttk.Label(self, text='Hi!', image=self.image)
        self.ttk_label.pack()
        
        self.flash_image()
        
    def flash_image(self, state=False):
        
        if state:
            state = False
            self.tk_label['image'] = self.image
            self.ttk_label['image'] = self.image
        else:
            state = True
            self.tk_label['image'] = ''
            self.ttk_label['image'] = ''

        self.after(500, self.flash_image, state)
    
    
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = Application(app_win).pack(expand=True)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()      
Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@wuf: Danke, es ist also '' und nicht None

Man macht halt irgendwann Änderungen und wundert sich dann, wenn es auf einmal nicht mehr geht, hatte wohl '' durch None ersetzt.
Antworten