ich spiele ein wenig mit tkinter rum und versuche ein Level Layout für ein primitiven Tower Defense zu erstellen, dass aus mehreren Elementen besteht. Da ich ein Python Anfänger bin, bin ich auf einige Fragen gestossen und hoffe, dass ich hier dazu die Antworten finden werde.
Kurz dazu, was ich erreichen möchte:
- Mehrere Canvas(e?) in einem Frame platzieren
- Erfahren wie man vielleicht Ein großen Canvas mit kleineren Canvasen füllt (wenn es überhaupt Sinn macht)
Bisher sieht das ganze so aus:
- das Layout wird als String aus einer Datei ausgelesen.
Code: Alles auswählen
def loadLevel(self):
self.fobj = open("maps/level", "r")
return [line.strip() for line in self.fobj]
Wie verhält sich eigentlich Python an dieser Stelle. Wird der Data Stream bei return geschlossen, oder muss das fobj.close() explizit aufgerufen werden?
- loadLevel erstellt eine Liste und liefert diese zurück. Hier kommt das renderBoard ins Spiel():
Code: Alles auswählen
def renderBoard(self):
newBoard = self.loadLevel()
for i in range(len(newBoard)):
for j in range(len(newBoard[0])):
if newBoard[i][j] == "1":
self.canvas = self.defineTileType("black", i, j)
else:
self.canvas = self.defineTileType("green", i, j)
Wie kann ich die generierte Elemente (evtl. schöner, wie ein Pythonista) an ein (master)Canvas ranhängen und diesen Zurückgeben, so dass ich den nachher an den SpielerBoard ranhängen kann? Macht das überhaupt Sinn? Was würde sich hier besser empfehlen?
Hier der gesamte Code noch zu besseren Übersicht.
Code: Alles auswählen
class Board(tkinter.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
self.renderBoard()
def renderBoard(self):
newBoard = self.loadLevel()
for i in range(len(newBoard)):
for j in range(len(newBoard[0])):
if newBoard[i][j] == "1":
self.canvas = self.defineTileType("black", i, j)
else:
self.canvas = self.defineTileType("green", i, j)
def loadLevel(self):
self.fobj = open("maps/level", "r")
return [line.strip() for line in self.fobj]
def defineTileType(self, color, row, column):
return tkinter.Canvas(self, width=50, height=50, highlightbackground="black", background=color).grid(row=row, column=column)
def renderGambeBoard(self):
pass
Ich würde mich auch freuen über allgemeine Kritik zum Code, wenn es etwas zu bemängeln gibt.
Vielen Dank im Voraus
winter-mute