Seite 4 von 6

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Samstag 16. Juni 2018, 23:05
von Freddyyy
Ok exact das gleiche wie vorher. Du musst wissen beim 1. Code hatte ich das nicht in einem Leeren Programm laufen. Daraus kommt wahrscheinmlich er Fehlercode.

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Samstag 16. Juni 2018, 23:20
von wuf
Hi Freddyyy

Ok Super! Wäre es dir möglich ein ungefähres Hintergrundbild deines Spiels zu zeigen?

Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 10:37
von Freddyyy
Ich habe mir mit Gimp ein Labyrinth erstelt. Wenn du mir sagst wie ich hier ein Bild einfügen kann dann schicke ich dir das.
Ach und ich verwende keinen Editor, also einfach das IDle von Python 3.6.5.

LG Freddy

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 10:58
von wuf
Hi Freddyyy

Zuerst noch das erweiterte Skript mit der Turtle, welche bis jetzt auf dem Hintergrundbild noch nicht sichtbar war. Das Hintergrundbild wurde mit der Turtle eigenen Methode screen.bgpic erstellt. Die Turtle ist angehoben. Könntest du einmal die Bewegung der Turtle bei dir kontrollieren?:

Code: Alles auswählen

import turtle

MOVE_STEP = 10
TURN_ANGLE = 45

def forward():
    turtle.forward(MOVE_STEP)

def backward():
    turtle.backward(MOVE_STEP)

def left():
    turtle.left(TURN_ANGLE)

def right():
    turtle.right(TURN_ANGLE)
  
image_width = 1024 # Hier: Breite deines Hintergrundbides (Pixels)
image_height = 600 # Hier: Höhe deines Hintergrundbides (Pixels)
screen = turtle.Screen()
screen.setup(image_width, image_height)
screen.bgpic("hintergrundbild.gif")

turtle.penup()
turtle.speed(0)
turtle.home()

screen.onkey(forward, "Up")
screen.onkey(backward, "Down")
screen.onkey(left, "Left")
screen.onkey(right, "Right")

screen.listen()
turtle.mainloop()
Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 11:09
von Freddyyy
Also die Turtle ist jetzt im Bild ich kann die Turtle aber nicht steuern. Und wäre es nicht besser wenn ich bei def left/right den befehl setheading() verwende?

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 11:33
von wuf
Hi Freddyyy

Da ich noch nie etwas mit Turtle programmiert habe muss ich mich selber zuerst auf Google ein wenig schlau machen ausser du kannst mir schon verraten was setheading besser macht. (N.B. Wie du vielleicht bemerkt hast hatte bei meinem letzten Skript das Hintergrundbild .gif Format. Du kannst natürlich weiterhin das .png Format benutzen.

Apropos Bild im Forum platzieren. Eventuell kennt hier im Forum jemand eine gute Adresse bei welcher man nicht total mit Werbung zugedeckt wird.

Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 11:57
von __blackjack__
@wuf: Es soll bei 'Left'' nach links gegangen werden und nicht links gedreht werden. Und bei 'Up' nicht vorwärts gegangen werden, sondern nach oben. Das ist nicht besser, sondern einfach nur anders anders.

Edit: Ich verwende Imgur.com um Bilder hoch zu laden. Keine Ahnung ob die Werbung haben — mit Werbeblocker-Plugin sehe ich keine. Und ohne Werbeblocker-Plugin mag ich mich nicht im Netz bewegen. :-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 12:38
von wuf
Hi __blackjack__

Besten Dank für deine Tipps. Mit dem setheading muss ich noch ein wenig herumspielen.

Freddyyy du kannst ja einmal versuchen mittels der uns von __blackjack__ angegebenen Adresse Imgur.com dein Hindergrundbildchen in unser Forum hochzuladen.

Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 12:51
von Freddyyy
Ich kan nirgendwie kein Konto bnei Imgur erstellen also habe ich das jetzt hier hin hoch geladen: https://picload.org/view/dopowplr/labyrinth.png.html.
Ic hahbe immer setheading benutzt weil sich die turtle dann in richtung 90° bewegt und nicht um 90°

LG Freddy

(sehe gerade das picload viel Werbung hat. Da funktioniert mein Addblocker nicht)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 16:47
von wuf
Hi Freddyyy

Super!!! Konnte deine Labyrinth-Grafik labyrinth.png hier problemlos runter laden. Deine Bildübergabelösung ist keine schlechte. Unser Forumfenster wäre mit den Abmessungen des Bildes von 1000x1000 eventuell überladen worden. :lol: Ok! Ich habe mich ein wenig in Turtle eingearbeitet. Dabei ist folgendes Skript entstanden:

Code: Alles auswählen

import turtle

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 left():
    angle = turtle.heading()
    angle += ANGLE_STEP
    turtle.setheading(angle)

def right():
    angle = turtle.heading()
    angle -= ANGLE_STEP
    turtle.setheading(angle)

# Initial setup  
image_width = 1000  # Hier: Breite deines Hintergrundbides (Pixels)
image_height = 1000 # Hier: Höhe deines Hintergrundbides (Pixels)
screen = turtle.Screen()
screen.setup(image_width, image_height)
screen.bgpic("labyrinth.png")

turtle.penup()
turtle.speed(0)
turtle.goto(0, 0)
turtle.setheading(EAST)
turtle.showturtle()

# Keyboard actions
screen.onkey(forward, "Up")
screen.onkey(backward, "Down")
screen.onkey(left, "Left")
screen.onkey(right, "Right")

screen.listen()
turtle.mainloop()
Habe es nur unter Ubuntu ausgetestet. Könntest du es bei dir einmal mit Windows 10 unter die Lupe nehmen? Da gibt es sicher noch gute Ideen um das Ganze zu verbessern. Noch eine Frage habe ich: Gibt es in Turtle eine Methode um die Pixelfarbe aus dem Bild, welches mit screen.bgpic angelegt wurde herauszulesen? Wäre dies nicht der Fall müsste man die Variante mit screen.getcanvas() ins Auge fassen. Good testing!

Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 16:54
von __blackjack__
@wuf: Wie schon gesagt ist `bgpic()` eine ”Einbahnstrasse”. Man kann da nur einen Dateinamen übergeben, das `PhotoImage` bekommt man da nicht mehr raus ohne in den ”privaten” Teilen des `Screen`-Objekts herum zu pfuschen. Man könnte einfach mit dem Dateinamen noch mal ein `PhotoImage` erstellen, ausserhalb vom `Screen`.

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 17:09
von wuf
Ok __blackjack__

Verstehe ich. Dann könnten die Pixelfarbwerte aus dem Tk-PhotoImage erstellten Bild mittels der PhotoImage-Methode get(x,y) synchron mit der umgerechneten Turtel-Koordinaten (Vier Quantranten) aus dem Bild (Ein Quadrant) herausgelesen werden. Sehe ich das richtig?

Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 17:25
von __blackjack__
@wuf: Ja, das sollte möglich sein.

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 17:37
von wuf
Ok!

Dann würde das Skript angepasst mittels tk.PhotoImage extern erstelltem Bildobjekt wie folgt aussehen. Jetzt noch ohne Auslesung der Pixelfarbwerte :

Code: Alles auswählen

import turtle
import tkinter as tk

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 left():
    angle = turtle.heading()
    angle += ANGLE_STEP
    turtle.setheading(angle)

def right():
    angle = turtle.heading()
    angle -= ANGLE_STEP
    turtle.setheading(angle)

# Initial setup
screen = turtle.Screen()

bg_image = tk.PhotoImage(file="labyrinth.png")
bg_image_width = bg_image.width()
bg_image_height = bg_image.height()
#print("Grösse des Hintergrundbildes: {}x{}".format(
    #bg_image_width, bg_image_height))
screen.setup(bg_image_width, bg_image_height)
canvas = screen.getcanvas()
canvas.create_image(0, 0, image=bg_image)

turtle.penup()
turtle.speed(0)
turtle.goto(0, 0)
turtle.setheading(EAST)
turtle.showturtle()

# Keyboard actions
screen.onkey(forward, "Up")
screen.onkey(backward, "Down")
screen.onkey(left, "Left")
screen.onkey(right, "Right")

screen.listen()
turtle.mainloop()
Gruss wuf ;-)

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 18:01
von Freddyyy
O kso funktioniert das schonmal besser. Ich werde jetzt mal eine while-schleife erstellen in der sich die Turtle immer um 3 nach vorne bewegt. Dabei wird immer die Pixel farbe mit getpixel() abgefragt. Welche Farbcodierung hat denn .png? Also was ist da schwarz und was weiß. Muss ich dei while-Shcleife innerhalb von 'mainloop()' schreiben?

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 18:17
von Freddyyy
Also die while-schleife muss wohl in die mainloop() Bei meinem Proframm gibt mir 'img.getpixel((x, y))' nur 0, 0, 0, 0. Wie kann ich das beheben?

Code: Alles auswählen

import turtle
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(NORTH)

def backward():
    turtle.setheading(SOUTH)

def left():
    angle = turtle.heading()
    angle += ANGLE_STEP
    turtle.setheading(angle)

def right():
    angle = turtle.heading()
    angle -= ANGLE_STEP
    turtle.setheading(angle)

# Initial setup
screen = turtle.Screen()

bg_image = tk.PhotoImage(file="Labyrinth.png")
bg_image_width = bg_image.width()
bg_image_height = bg_image.height()
#print("Grösse des Hintergrundbildes: {}x{}".format(
    #bg_image_width, bg_image_height))
screen.setup(bg_image_width, bg_image_height)
canvas = screen.getcanvas()
canvas.create_image(0, 0, image=bg_image)

turtle.penup()
turtle.speed(0)
turtle.goto(0, 0)
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")

fd = 1
x = turtle.xcor()
y = turtle.ycor()
ende = False
while not ende:
    turtle.forward(fd)
    img = Image.open("Labyrinth.png")
    a = img.getpixel((x, y))
    print(a)

screen.listen()
turtle.mainloop()

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 18:21
von Freddyyy
Bei JPG hatte ich das Problem nicht. So wie ich das jetzt im Internewt lese hat PNG auch noch einen "Alphakanal". Liegt das vllt daran?

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 18:25
von Freddyyy
Ich habe mir jetzt mal eine komplett schwarzes Bild erstellt (Black.png) und für Labyrinth.png eingesetzt. Hier erhalte ich jetzt nur noch 3 Ziffern aber jede Ziffer hat den wert 0. Danach habe ich mir ein halb shwarz, halb weiß gefärbtes bild erstellt und hier bekam ich wieder nur 3 zahlen aber dafür hatten jetzt alle ziffern den wert 255. Ich bin jetzt wirklich verwirrt. 255 255 255 steht doch für weiß und 0 0 0 für Schwarz. Wieso verändern sich denn beim bewegen der turtle die Zahlen nicht?

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 18:37
von __blackjack__
@Freddyyy: Lass Dir mal die Werte von `x` und `y` ausgeben.

Re: Tkinter App, Turtle ein JPG Skin zuweisen

Verfasst: Sonntag 17. Juni 2018, 19:17
von Freddyyy
Habe jetzt die Variablen x und y in die shcliefe gepackt. Jetzt bekomme ich vernünftige werte. Aber die werte stimmen nicht mit dem Bild überein. Also manchmal bekomme ich 0 0 0 0 obwohl ich auf einem weißen Feld bin und andersherum.