ich habe folgendes Problem: Ich möchte innerhalb meines Tk- Fensters ein Canvas- Image einbinden. Durch Benutzerinteraktion wird immer wieder ein anderes Bild geladen.
Nun wird aber, wenn ich ein Canvas- Image lade immer nur der gelbe Hintergrund angezeigt. Das eigentliche Bild wird nur angezeigt, wenn ich mainloop() neu aufrufe (Zeile 32). Dies führt dazu, dass ich dann mehrere Mainloops laufen habe. Wenn man z.B. 10 mal die Fkt. Change() aufruft, muss man danach auch 10 mal auf "Beenden" klicken, bis das Fenster schließt.
Um das zu umgehen rufe ich nach jedem Aufruf von mainloop() auch quit() auf, so dass der vorherige mainloop() beendet wird (Zeile 33).
Ich kann mir wirklich nicht vorstellen, dass das eine akzeptable und performante Lösung ist.
Hier mal der Code:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
sys.path.append("..")
from Tkinter import *
class tkApp:
def __init__(self):
self.mainWindow=Tk()
self.mainWindow.protocol("WM_DELETE_WINDOW", self.quit)
self.make_ui()
def run( self ):
#ereignisverarbeitung
self.mainWindow.mainloop()
def quit( self ):
#beenden
self.mainWindow.destroy()
self.mainWindow.quit()
def change(self):
img = PhotoImage(file='bilder/4D Stunts.gif')
self.can.itemconfig(self.bild, image=img, anchor=NW)
self.run()
self.quit()
def make_ui(self):
self.can = Canvas(self.mainWindow, bg="yellow")
img = PhotoImage(file='bilder/4D Stunts.gif')
self.can.config(width=img.width(), height=img.height())
self.bild = self.can.create_image(0, 0, image=img, anchor=NW)
self.can.grid(row=1, column=0) #(expand=YES, fill=BOTH)
self.button = Button(self.mainWindow, text = "Beenden", command=self.mainWindow.quit)
self.button.grid(row=0, column=0, sticky=E)
self.button2 = Button(self.mainWindow, text = "Change", command=self.change)
self.button2.grid(row=0, column=0, sticky=W)
self.run()
if __name__ == "__main__":
applikation = tkApp()
Ich gehe davon aus, dass der Fehler irgendwo bei mir liegt, habe aber gerade keine Idee und wäre für jeden Hinweis dankbar. Selbst wenn ich allen Objekten ein "mainWindow" voranstelle, bleibt das Problem bestehen (es ist also egal, ob da nun steht self.can = XXX oder self.mainWindow.can = XXX)
vielen Dank schonmal,
Barabbas