Python 3.6.8 on linux Abhängige Pakete: PIL (Pillow 5.1.0)
Es ist auf [GitHub] verfügbar (https://github.com/bluejenga/xmastree). Im Folgenden werden nur die Punkte vorgestellt.
Verwenden Sie die Module Image und ImageTk des PIL-Pakets, um PNG-Bilder anzuzeigen. Zuerst lade ich eine Reihe von Bildern mit "Image.open ()". Der Grund für "resize ()" ist, dass ich es in Zukunft auf dem Touch-Display von Raspeye verschieben möchte, damit ich die Anzeigegröße flexibel ändern kann.
app_tk.py
IMG_STAR_OFF = Image.open('image/star_off.png').resize(STAR_SIZE, Image.BILINEAR)
IMG_STAR_ON = Image.open('image/star_on.png').resize(STAR_SIZE, Image.BILINEAR)
Das geladene Bild wird auf der Leinwand von Tkinter angezeigt. Verwenden Sie zu diesem Zeitpunkt den Konstruktor PhotoImage ()
.
Es scheint, dass das PhotoImage-Objekt beibehalten werden muss. Es wurde bei Verwendung einer lokalen Variablen nicht angezeigt.
Der Rückgabewert von "create_image ()" ist die ID des Objekts auf der Zeichenfläche. Sie benötigen es, wenn Sie während des Spiels Bilder wechseln oder Rotationsanimationen anzeigen.
app_tk.py
self.canvas = tk.Canvas(self, width=w, height=h)
self.star_img = ImageTk.PhotoImage(IMG_STAR_ON)
self.star_id = self.canvas.create_image(STAR_OFFSET_X,
STAR_OFFSET_Y,
image=self.star_img,
anchor=tk.NW)
Um das Bild zu ändern, erstellen Sie ein neues PhotoImage und verwenden Sie die Zeichenfläche "itemcomfigure ()".
app_tk.py
if tree.is_complete():
self.star_img = ImageTk.PhotoImage(IMG_STAR_ON)
else:
self.star_img = ImageTk.PhotoImage(IMG_STAR_OFF)
self.canvas.itemconfigure(self.star_id, image=self.star_img)
In Tkinter gibt es keine Animationsmethode, daher können Sie das Bild regelmäßig aktualisieren, um die Animation zu erzielen.
Um den Prozess regelmäßig aufzurufen, können Sie after ()
verwenden, eine gängige Methode des Tkinter-Widgets.
app_tk.py
def rotate_cell(self, x, y):
info = self.img_info[x][y]
info.angle -= 15 #15 Grad Drehung
info.photo_img = ImageTk.PhotoImage(info.img.rotate(info.angle)) #Erstellen Sie gedrehtes PhotoImage
self.canvas.itemconfigure(info.id, image = info.photo_img) #Bild ersetzen
if info.angle % 90 == 0:
#Animation abgeschlossen
#Aktualisierungsprozess des Spielstatus usw.
else:
self.after(15, self.rotate_cell, x, y) #Aktualisieren Sie das Bild nach 15 Millisekunden erneut
Sie können ein Widget mit der Methode "create_window ()" der Zeichenfläche platzieren. Verwenden Sie Frame, wenn Sie mehrere Widgets gleichzeitig verarbeiten möchten.
app_tk.py
frame = tk.Frame(self, bg='#e5f8cf', padx=5)
start = tk.Button(frame, text='Start', command=self.start_new_game,
fg='#345834', font=('', 22, 'bold'))
start.pack(side=tk.LEFT, padx=5, pady=10)
self.counter_text = tk.StringVar()
self.counter_text.set('00:00')
self.counter_label = tk.Label(frame, textvariable=self.counter_text,
bg='#e5f8cf', fg='#345834',
font=('', 22, 'bold'))
self.counter_label.pack(side=tk.LEFT, padx=5, pady=10)
self.canvas.create_window(20, 20, window=frame, anchor=tk.NW)
Weisen Sie eine Rückrufmethode mit "bind ()" zu. Das Ereignis wird als Argument an die Rückrufmethode übergeben, und Sie können die Koordinaten abrufen, bei denen das Klickereignis in .x, .y aufgetreten ist.
app_tk.py
self.canvas.bind('<ButtonRelease-1>', self.on_click_canvas)
def on_click_canvas(self, event):
# event.x, event.Holen Sie sich Koordinaten mit y
x = (event.x - TREE_OFFSET_X) // CELL_LENGTH
y = (event.y - TREE_OFFSET_Y) // CELL_LENGTH
#wird bearbeitet
Der elektrische Pfad kann als Labyrinth beschrieben werden, das an der Basis des Baumes beginnt. Es gibt verschiedene Algorithmen zum Erstellen eines Labyrinths, aber ich habe es auf meine eigene Weise erstellt. Einfach ausgedrückt lautet der Algorithmus wie folgt.
Ich denke, wir werden eine Labyrinthroute machen, indem wir die Quadrate des quadratischen Papiers verbinden.
Es sieht so aus, wenn Sie ein Video darüber machen, wie das Labyrinth fertiggestellt ist.
Ich wollte eine weihnachtliche Hintergrundmusik spielen, und als ich nachschaute, wie man eine MP3-Datei mit Python abspielt, stellte ich fest, dass es ein Pygame gab. Natürlich können Sie auch Bilder anzeigen, also hätte ich das vielleicht von Anfang an verwenden sollen ...
Recommended Posts