tkinter Bilder im For Loop

Fragen zu Tkinter.
Antworten
Nil_syo8214
User
Beiträge: 1
Registriert: Donnerstag 20. Oktober 2022, 14:39

Hallo ,
ich versuche Momentan Schach zu Programmieren und hänge gerade an einem Problem bei welchem der Garbage Collector Bilder im For Loop löscht und lediglich das letzte Bild Anzeigt

ca so sieht mein code aus

ich denke mal das Problem liegt in der drawFigures() Methode

Code: Alles auswählen

import tkinter as tk 
import Figures
class Variables:
	figureLst=[Figures.Pawn("1","White",0,1),Figures.Pawn("2","Black",0,2),Figures.Pawn("2","Black",0,6)]
	figureImgLst= []
class Window:
    screenWidth = 850
    screenHeight = 850
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.canvas = tk.Canvas(self.frame, width = self.screenWidth, height = self.screenHeight) 
        self.canvas.pack()
        self.frame.pack()
        
        self.drawFigures()
    def drawFigures(self):
        for figure in Variables.figureLst:
            posInPx= self.gridToPx(figure.getPosition())
            self.figureImg = tk.PhotoImage(file=("Images/Chess_"+figure.getFigureType()+"_"+figure.COLOR+".png"))
            Variables.figureImgLst.append(self.figureImg)
            
            self.canvas.create_image(posInPx[0],posInPx[1], anchor=tk.NW, image=self.figureImg)
    def gridToPx(self,posInGrid):
        posInPx = [posInGrid[0]*100+25,posInGrid[1]*100+25]
        return posInPx
        
def main(): 
    root = tk.Tk()
    app = Window(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Einrückung ist uneinheitlich. Man rückt immer mit vier Leerzeichen pro Ebene ein. Ein paar Leerzeilen an den richtigen Stellen würde auch die Lesbarkeit erhöhen.
Module werden wie Methodennamen und Variablennamen komplett klein geschrieben. Nur Klassen haben einen großen Anfangsbuchstaben. Konstanten (auch Klassenkonstanten) schreibt man KOMPLETT_GROSS.
Die Klasse Variables ist keine, denn eine Klasse ohne Attribute oder Methoden ist unsinnig. Du misbrauchst hier eine Klasse, als Container für globale Variablen. Globale Variablen darf man aber nicht verwenden, weil sie ein Programm fehleranfällig macht. Da Du ja eine richtige Klasse Window hast, ist das aber auch völlig unnötig.
Man benutzt keine Abkürzungen. ImgLst, Px? Vokale kosten nichts.
`gridToPx` benutzt self gar nicht, ist also gar keine Methode der Klasse.
Strings stückelt man nicht mit + zusammen, sondern nutzt Formatstrings.
Das Attribut `figureImg` wird in drawFigures angelegt, dabei sollten alle Attribute bereits in __init__ angelegt werden. Aber eine Attribut in einer for-Schleife zu setzen ist immer ein Hinweis darauf, dass etwas falsch läuft, denn Attribute sollen ja Werte über das Ende der Funktion hinaus speichern, werden aber in einer Schleife ständig überschrieben.

Code: Alles auswählen

import tkinter as tk 
import figures


def grid_to_pixel(grid_position):
    return grid_position[0]*100+25, grid_position[1]*100+25

class Window:
    SCREEN_WIDTH = 850
    SCREEN_HEIGHT = 850

    def __init__(self, master):
        self.master = master
        self.figures = [
            figures.Pawn("1", "White", 0, 1),
            figures.Pawn("2", "Black", 0, 2),
            figures.Pawn("2", "Black", 0, 6),
        ]
        self.figure_images = []

        self.frame = tk.Frame(self.master)
        self.canvas = tk.Canvas(self.frame, width=self.SCREEN_WIDTH, height=self.SCREEN_HEIGHT) 
        self.canvas.pack()
        self.frame.pack()
        self.draw_figures()

    def draw_figures(self):
        for figure in self.figures:
            position_x, position_y = self.grid_to_pixel(figure.get_position())
            filename = f"Images/Chess_{figure.get_figure_type}_{figure.COLOR}.png"
            image = tk.PhotoImage(file=filename)
            self.figure_images.append(image)
            self.canvas.create_image(position_x, position_y, anchor=tk.NW, image=image)
        
def main(): 
    root = tk.Tk()
    app = Window(root)
    root.mainloop()

if __name__ == '__main__':
    main()
In dem Circa-Code sehe ich kein Problem. Wie sieht Dein richtiger Code aus?
Antworten