Tkinter App, Turtle ein JPG Skin zuweisen

Fragen zu Tkinter.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy

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

Gruss wuf ;-)
Take it easy Mates!
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wuf: Ja, das sollte möglich sein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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?
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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()
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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?
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Freddyyy: Lass Dir mal die Werte von `x` und `y` ausgeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

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.
Antworten