Seite 5 von 6
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 19:36
von wuf
Hi Freddyyy
Deine Feststellung mit den Farben stimmt. Weiss = (255, 255, 255) und Schwarz = (0, 0, 0). Die Position der Turtle solltest du mit:
xpos, ypos = turtle.position()
abfragen können. Die Position der Turtle muss aus den Funktionen
forward und
backward abfragen werden.
Jetzt kommt das ein wenig verwirrende! Dein Turtle-Fenster enthält ein Vier-Quadranten Koordinatensystem. Das heisst links oben ist der Koordinatenpunkt (-500, 500), rechts unten (500, -500), in der Mitte ist dann (0, 0). Das mit tk.PhotoImage erzeugte Bild besitzt ein Ein-Quadranten Koordinatensystem. Hier ist links oben der Koordinatenpunkt (0, 0) und rechts unten (1000, 1000). Hier kannst du das Hirn ein wenig warm laufen lassen.
(Ohne Gewähr ich bin Mathematiker)
Das automatische vorwärts bewegen der Turtle würde ich nicht mit einer
while Schleife sondern mit
canvas.after realisieren.
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 19:47
von Freddyyy
Der umrechnungs faktor den ich verwende (xcor()+500 ,ycor+500) funktioniert nur bei xcor().Also wenn ich die Turle sich nach links oder Rechts bewegt dann ist der Wert auf weißen Feldern (255, 255, 255, 255) und auf Schwarzen (0, 0, 0, 255). Aber wenn sich die turtle nach oben oder nach unten bewegt, dann ist der wert manchmal (0, 0, 0, 255auf weißen Feldern. Jemand ne idee woran das liegen kann?
LG Freddy
(PS ich bin jetzt bis DO weg und kann daher nicht auf Python zugreifen nur hier auf das Forum. Es sei denn man kann python auf hy installieren)
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 19:48
von wuf
N.B. das mit:
(Ohne Gewähr ich
bin Mathematiker 
)
war natürlich nur ein Witz.
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 19:50
von Freddyyy
Den vorherigen Beitrag habe ich geschrieben bevor ich deinen gelesen habe
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 19:51
von Freddyyy
Verstanden

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 20:06
von Freddyyy
Wenn ich ycor() so lasse dann habe ic hdas gleiche problem nur andersherum.
Das könnte etwas komplizierter werden als ich gedacht habe.
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 20:15
von Freddyyy
Also ehrlich gesagt verstehe ich das nicht. Ich habe die Punkte: -500, -500 (links unten); -500, 500 (links oben); 500, -500 (rechts unten); 500, 500 (rechts oben)
Wenn ich zu xcor() und ycor() immer 500 addiere dann habe ich dien Punkte: 0, 0 (links unten); 0, 1000 (links oben); 1000, 0 (rechts unten); 1000, 1000 (rechts oben)
Also wo liegt da der Fehler?
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 20:44
von wuf
Hi Freddyyy
Die Bildbearbeitung wird ohne:
from PIL import Image, ImageTkdurchgeführt. An Stelle verwende ich
tk.PhotoImage und erstelle damit ein normales
tk-Bild, welches unter
bg_image abgelegt ist. Für die Anzeige in Turtle wird es auf die mit
canvas = screen.getcanvas() auf die Turtle-Canvas mittels
canvas.create_image(0, 0, image=bg_image) gelegt. Die Abfrage nach den Pixelfarben erfolgt dann nicht mehr auf dem Turtle-Canvas-Bild sondern auf dem Abbild dessen, welches unter
bg_image gespeichert ist. Für dessen Abfrage kannst du nicht die PIL-Modul-Methode
img.getpixel((x, y) sondern du musst die Methode
bg_image.get(x, y) hierfür verwenden!
Die folgenden Methoden:
Code: Alles auswählen
def forward():
turtle.setheading(NORTH)
def backward():
turtle.setheading(SOUTH)
würde ich belassen auf:
Code: Alles auswählen
def forward():
turtle.forward(MOVE_STEP)
def backward():
turtle.backward(MOVE_STEP)
Die Schrittdistanz musst du dann mit der Konstante
MOVE_STEP festlegen. Die Fortbewegung der Turtle musst du dann durch Aufruf der Methode
forward bewerkstelligen! Du siehst es wird langsam aber sicher komplex und Zeitaufwendig.
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 20:56
von Freddyyy
Jetzt bekomme ich diese Fehlermeldung:
Code: Alles auswählen
init__.py", line 3575, in get
return self.tk.call(self.name, 'get', x, y)
_tkinter.TclError: expected integer but got "3.0"
Und wieso nicht die PIL Methode ? Bis auf die Umrechnung funmktioniert die doch ziemlich gut oder?
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 21:02
von __blackjack__
Das mit der Y-Koordinate hatte ich vor vielen Beiträgen ja schon mal geschrieben: Die Werte im Canvas werden nach oben hin grösser, während sie im Bild nach unten hin grösser werden.
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 21:04
von Freddyyy
@ blackjack und deswegen soll ich get(x,y) verwenden?
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 21:14
von wuf
Hi Freddyyy
Hier noch der Zaubertrick für die Umwandlung der Turtle-Position in die Bild-Position für die Abfrage der Pixelwerte des Bildes:
Code: Alles auswählen
def border_check():
xpos, ypos = turtle.position()
bg_img_xpos = int(xpos + bg_width_offset)
bg_img_ypos = int(bg_image_height - bg_width_offset - ypos)
print("Border Check:", bg_img_xpos, bg_img_ypos)
pixel_color = bg_image.get(bg_img_xpos, bg_img_ypos)
print("Farbe:", pixel_color)
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Sonntag 17. Juni 2018, 21:21
von wuf
Hi Freddyyy
Hier noch als Ergänzung die Bestimmung der XY-Offsetwerte:
Code: Alles auswählen
bg_image = tk.PhotoImage(file="labyrinth.png")
bg_image_width = bg_image.width()
bg_width_offset = bg_image_width / 2
bg_image_height = bg_image.height()
bg_height_offset = bg_image_height / 2
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 07:23
von Freddyyy
Ok Danke

Funktioniert jetzt. Habe nochmal das Bild angepasst da viel zu wenig wege vorhanden waren.
Ich kann aber goto() nicht verwenden. Also wenn ich bzw turtle.goto(-500, 500) eingebe bewegt sich die Turtle kein Stück.
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 08:22
von wuf
Hi Freddyyy
Bei mir wird die Turtle in der linken oberen Ecke platziert. Um die Ursache des Fehlverhalten bei dir herauszufinden müsste man schon dein Skript sehen.
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 13:46
von Freddyyy
Code: Alles auswählen
import turtle
from turtle import register_shape, Shape
import tkinter as tk
from PIL import Image, ImageTk
NORTH = 90
SOUTH = 270
EAST = 0
WEST = 180
MOVE_STEP = 10
ANGLE_STEP = 90
def forward():
turtle.setheading(90)
def backward():
turtle.setheading(270)
def left():
turtle.setheading(180)
def right():
turtle.setheading(0)
screen = turtle.Screen()
#img = ImageTk.PhotoImage(Image.open("Turtle.png"))
#register_shape("Bild", Shape("image", img))
# turtle.shape("Bild")
bg_image = tk.PhotoImage(file="Labyrinth.png")
bg_image_width = bg_image.width()
bg_image_height = bg_image.height()
bg_image = tk.PhotoImage(file="labyrinth.png")
bg_image_width = bg_image.width()
bg_width_offset = bg_image_width / 2
bg_image_height = bg_image.height()
bg_height_offset = bg_image_height / 2
screen.setup(bg_image_width, bg_image_height)
canvas = screen.getcanvas()
canvas.create_image(0, 0, image=bg_image)
def border_check():
xpos, ypos = turtle.position()
bg_img_xpos = int(xpos + bg_width_offset)
bg_img_ypos = int(bg_image_height - bg_width_offset - ypos)
#print("Border Check:", bg_img_xpos, bg_img_ypos)
pixel_color = bg_image.get(bg_img_xpos, bg_img_ypos)
#print("Farbe:", pixel_color)
if pixel_color == (0, 0, 0):
turtle.goto(0, 0)
def coordinates():
xpos, ypos = turtle.position()
bg_img_xpos = int(xpos + bg_width_offset)
bg_img_ypos = int(bg_image_height - bg_width_offset - ypos)
pixel_color = bg_image.get(bg_img_xpos, bg_img_ypos)
print("Farbe:", pixel_color)
turtle.penup()
turtle.speed(0)
turtle.goto(-500, 500)
turtle.setheading(EAST)
turtle.showturtle()
# Keyboard actions
screen.listen()
screen.onkey(forward, "w")
screen.onkey(backward, "s")
screen.onkey(left, "a")
screen.onkey(right, "d")
screen.onkey(coordinates, "c")
fd = 1
x = turtle.xcor()
y = turtle.ycor()
ende = False
while not ende:
turtle.forward(fd)
border_check()
screen.listen()
turtle.mainloop()
#0.0 203.0
#999.0 0.0
#turtle.forward(fd)
#x = turtle.xcor()#+500
#y = turtle.ycor()#+500
#a = bg_image.get(x, y)
#if a == (0, 0, 0, 255):
#print("Schwarz")
#else:
#print("weiß")
#if a == (0, 0, 0, 0) or a == (0, 0, 0, 255):
#turtle.goto(0, 0)
#print(a)
Hier der Code. Wenn ich der Turtle einen Shape geben will dann funktioniert das übrigesn auch nicht. Aber das ist ja eig. unwichtig.
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 14:54
von wuf
Hi Freddyyy
Also bei mir bewegt sich die Turtle rasend Richtung Osten gegen die Mauer. Springt dann wieder auf ihre Ausgangsposition (0,0) zurück. Dies unter Ubuntu 18.04 & Windows 10. Jetzt verstehe ich nicht genau was bei dir das Problem ist? Kannst du uns bitte etwas über den Bedienungsablauf der Turtle verraten?
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 16:11
von Freddyyy
Ich würde gerne mit der Turtle von eienm anderen Punkt aus starten. Habe mein Labyrinth nochmal mit gimp verändertt und möchte jetzt von -500, 500 starten und auch ein Ziel setzen. Das funktioniert abe rwie du denek ich im Code gesheen hast nicht.
Code: Alles auswählen
turtle.penup()
turtle.speed(0)
turtle.goto(-500, 500)
turtle.setheading(EAST)
turtle.showturtle()
Liegt das vllt an deiner Erweiterung?
Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 17:20
von wuf
Hi Freddyyy
Irgendwie willst du mir nicht erklären wie schlussendlich die Bedienung deines Spieles abläuft. Ich schaue hier bei mir in die Glaskugel und versuche herauszufinden was du eigentlich willst!
Für die Bedienung des Headings brauchts du folgende Tastaturtasten:
Taste
a: Dreht Turtle Richtung
Westen
Taste
d: Dreht Turtle Richtung
Osten
Taste
w Dreht Turtle Richtung
Norden
Taste
s: Dreht Turtle Richtung
Süden
Der Code fürs Heading
Code: Alles auswählen
def nord():
turtle.setheading(NORTH)
def south():
turtle.setheading(SOUTH)
def west():
turtle.setheading(WEST)
def east():
turtle.setheading(EAST)
Für die Bewegung habe ich einmal die Tasten rechts <- & links -> eingesetzt:
Taste
<-: Turtle bewegt sich
rückwärts
Taste
->: Turtle bewegt sich
vorwärts
Der Code für die Bewegung:
Code: Alles auswählen
def forward():
turtle.forward(MOVE_STEP)
def backward():
turtle.backward(MOVE_STEP)
Der Code für die Auslesung des Pixelfarbwertes aus dem Hintergrundbild:
Taste
c: Liest
Pixelfarbwert und gibt in ins
Terminal aus
Meine Frage was soll dieser Code in deinem Skript? (Dieser verhindert das die Turtle auf position (-500/500) gesetzt wird!)
Code: Alles auswählen
fd = 1
x = turtle.xcor()
y = turtle.ycor()
ende = False
while not ende:
turtle.forward(fd)
border_check()
WICHTIG: Du muss uns offenbaren wie die endgültige Bedienung deines Spieles abläuft sonst kann ich dir leider aus Zeitaufwands-Günden nicht mehr weiterhelfen!
Hier noch der modifizierte Code deines Skriptes:
Code: Alles auswählen
import turtle
from turtle import register_shape, Shape
import tkinter as tk
from PIL import Image, ImageTk
NORTH = 90
SOUTH = 270
EAST = 0
WEST = 180
MOVE_STEP = 10
ANGLE_STEP = 90
def forward():
turtle.forward(MOVE_STEP)
def backward():
turtle.backward(MOVE_STEP)
def nord():
turtle.setheading(NORTH)
def south():
turtle.setheading(SOUTH)
def west():
turtle.setheading(WEST)
def east():
turtle.setheading(EAST)
screen = turtle.Screen()
#img = ImageTk.PhotoImage(Image.open("Turtle.png"))
#register_shape("Bild", Shape("image", img))
# turtle.shape("Bild")
bg_image = tk.PhotoImage(file="labyrinth.png")
bg_image_width = bg_image.width()
bg_image_height = bg_image.height()
bg_image = tk.PhotoImage(file="labyrinth.png")
bg_image_width = bg_image.width()
bg_width_offset = bg_image_width / 2
bg_image_height = bg_image.height()
bg_height_offset = bg_image_height / 2
screen.setup(bg_image_width, bg_image_height)
canvas = screen.getcanvas()
canvas.create_image(0, 0, image=bg_image)
def border_check():
xpos, ypos = turtle.position()
bg_img_xpos = int(xpos + bg_width_offset)
bg_img_ypos = int(bg_image_height - bg_width_offset - ypos)
#print("Border Check:", bg_img_xpos, bg_img_ypos)
pixel_color = bg_image.get(bg_img_xpos, bg_img_ypos)
#print("Farbe:", pixel_color)
if pixel_color == (0, 0, 0):
turtle.goto(0, 0)
def coordinates():
xpos, ypos = turtle.position()
bg_img_xpos = int(xpos + bg_width_offset)
bg_img_ypos = int(bg_image_height - bg_width_offset - ypos)
pixel_color = bg_image.get(bg_img_xpos, bg_img_ypos)
print("Farbe:", pixel_color)
turtle.penup()
turtle.speed(0)
turtle.goto(0, 0)
#turtle.goto(-500, 500)
turtle.setheading(EAST)
turtle.showturtle()
# Keyboard actions
#screen.listen()
#screen.onkey(forward, "w")
#screen.onkey(backward, "s")
#screen.onkey(left, "a")
#screen.onkey(right, "d")
#screen.onkey(coordinates, "c")
screen.listen()
# Tastatureingabe für die Richtung
screen.onkey(nord, "w")
screen.onkey(south, "s")
screen.onkey(west, "a")
screen.onkey(east, "d")
screen.onkey(coordinates, "c")
# Tastatureingabe für die Bewegung
screen.onkey(forward, "Right")
screen.onkey(backward, "Left")
#fd = 1
#x = turtle.xcor()
#y = turtle.ycor()
#ende = False
#while not ende:
#turtle.forward(fd)
#border_check()
screen.listen()
turtle.mainloop()
#0.0 203.0
#999.0 0.0
#turtle.forward(fd)
#x = turtle.xcor()#+500
#y = turtle.ycor()#+500
#a = bg_image.get(x, y)
#if a == (0, 0, 0, 255):
#print("Schwarz")
#else:
#print("weiß")
#if a == (0, 0, 0, 0) or a == (0, 0, 0, 255):
#turtle.goto(0, 0)
#print(a)
Gruss wuf

Re: Tkinter App, Turtle ein JPG Skin zuweisen
Verfasst: Donnerstag 21. Juni 2018, 17:58
von Freddyyy
Die Turtle soll sich in eienr Schleife Permanent in die Richtung, in die Sie ausgerichtet ist bewegen. Sie soll aber nicht in der Mitte, sondern links obene starten.
Dazu muss ich noch einene Punkt/Quadrat auswählen die Turtle erreichen muss um das Programm abzuschließen der dann auch spezifisch mit Gimp markiert wird.
Inwiefern blockiert "while not ende:" die funktion goto()? Welche schleife kann ich denn verwenden ohne das "goto()" blockiert wird?