Ich habe die Übungen in "Die einfachste Python-Einführungsklasse" [^ 1] empfohlen. In diesem Text wird sorgfältig erläutert, wie sich die einzelnen Codes dort befinden. Daher ist es ein sehr guter Text für Anfänger, ihn sorgfältig zu lesen, um die Codierung zu verstehen. Es gibt jedoch einige Abweichungen von der allgemeinen Weisheit der Codierung, wahrscheinlich weil sie den Fluss der Logik betont. Dies ist die Korrektur.
[^ 1]: "Die einfachste Python-Einführungsklasse" von Fumitaka Osawa (Sotec Publishing, 2017).
Der Code hier ist schlecht.
Wenn Sie es für eine lange Zeit tun oder viel tun, werden Sie es genießen können. Zuerst habe ich wegen CPU aufgegeben, aber es war zu spät. .. ..
Ich hatte irgendwo eine Idee für eine Lösung, aber ich habe sie vor langer Zeit behoben, daher weiß ich nicht, was das Original war.
Das Problem ist,
example07-08-01.py
canvas.create_oval(self.x - 20, self.y - 20,
self.x + 20, self.y + 20, fill="white", width=0)
ist. Ich habe es mit "Weiß" überschrieben und gelöscht. Dies ist die übliche Art, ein Bild mit Code zu zeichnen. Es ist effizient beim Schreiben, indem der gesamte Bildschirm als Bild verwaltet wird. Wenn Sie dies jedoch für ein Objekt tun, wird sich das Objekt immer mehr vermehren. Infolgedessen erhöht sich der erforderliche Speicher und das Zeichnen wird träge. vielleicht
Warum Objekt richtig löschen.
Erstellen Sie zunächst ein Tag zur Identifizierung mit create_oval.
canvas.create_oval(self.x - 20, self.y - 20,
self.x + 20, self.y + 20,
fill=self.color, width=0,
tag=self.color)
Anstatt es mit "Weiß" zu überschreiben, löschen Sie es wie folgt.
canvas.delete(self.color)
Bitte versuchen Sie dies. Es sollte sehr schnell gehen.
In Fenstern kann die Form jedoch verzerrt erscheinen. Dies scheint an der Zeichnungsbibliothek zu liegen. Es ist perfekt für die Mac-Version.
Darüber hinaus scheint die Idee, das Objekt zu löschen, besser zu sein, als es mit einem Tag zu identifizieren.
Grundsätzlich,
canvas.delete(self.ball)
...Unterlassung...
self.ball = canvas.create_oval(self.x - 20, self.y - 20,
self.x + 20, self.y + 20,
fill=self.color, width=0)
Machen Sie es einfach zu einem Objekt namens self.ball und löschen Sie es. Gegenüber dem Originaltext ist es jedoch erforderlich, die Reihenfolge der Codes erheblich zu ändern.
Ich werde ein ausgefülltes Formular hinzufügen. Wenn Sie also Zeit haben, machen Sie sich bitte Gedanken darüber, was los ist. Die Reihenfolge ist
import tkinter as tk
speed = 10
class Ball:
global speed
def __init__(self, x, y, dx, dy, color):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.color = color
self.ball = canvas.create_oval(self.x - 20, self.y - 20,
self.x + 20, self.y + 20,
fill=self.color, width=0)
def test(self):
print(self.x)
print(self.y)
def move(self, canvas):
canvas.delete(self.ball)
self.x = self.x + self.dx
self.y = self.y + self.dy
self.ball = canvas.create_oval(self.x - 20, self.y - 20,
self.x + 20, self.y + 20,
fill=self.color, width=0)
if self.x >= canvas.winfo_width():
self.dx = -speed
if self.x < 0:
self.dx = +speed
if self.y >= canvas.winfo_height():
self.dy = -speed
if self.y < 0:
self.dy = +speed
root = tk.Tk()
root.geometry("600x400")
canvas = tk.Canvas(root, width=600, height=400, bg="white")
canvas.place(x=0, y=0)
balls = [
Ball(300, 400, 1, 1, "red"),
Ball(200, 400, 2, 1, "green"),
Ball(300, 200, 1, 2, "blue")
]
def loop():
for b in balls:
b.move(canvas)
root.after(10, loop)
root.after(10, loop)
root.mainloop()
Recommended Posts