Tkinter App, Turtle ein JPG Skin zuweisen

Fragen zu Tkinter.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Freddyyy: Ja es gibt Beispiele im Internet. Zum Beispiel in diesem Thema im ersten Beitrag von Dir, da sieht man wie man ein Bild auf einem `Canvas`-Objekt erzeugt. Jetzt musst Du an das `Canvas` vom Turtlemodul heran kommen. Da gibt's eine Funktion bzw. Methode auf `Screen`-Objekten. Die ist eigentlich sehr offensichtlich benannt und man findet sie in der Dokumentation vom `turtle`-Modul.

Ich würde das Bild nicht in den positiven Quadranten platzieren, denn dann ist die obere linke Ecke im Mittelpunkt der Anzeige vom Turtlefenster. Und die Y-Achse läuft auch immer noch entgegengesetzt, Du musst die Koordinaten also so oder so in einer eigenen Funktion von Turtle-Koordinaten auf Bildkoordinaten umrechnen.

Nach der Projektbeschreibung: Also soll sich der Spieler gar nicht so frei bewegen können wie in meinem Beispielprogramm? Da ist die Labyrinth-Grafik ja komplett frei von irgendwelchen Einschränkungen und der Spieler bewegt sich da in recht kleinen Schritten. Schon etwas mehr als Pixel, 3 um genau zu sein, aber eben ein Bruchteil von der Wanddicke die ich da gezeichnet habe. Deine Beschreibung klingt jetzt eher nach einem Gitter aus grösseren Quadraten die jeweils die Mauern und die Schrittweite/Bewegungsfreiheit des Spielers einschränken. In dem Fall würde es vielleicht Sinn machen zwischen Weltkoordinaten und Anzeigekoordinaten zu unterscheiden.

@wuf: Ist das Hy-Programm wirklich so schwer zu lesen? Das kann man fast 1:1 auf Python umsetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi __blackjack__
@wuf: Ist das Hy-Programm wirklich so schwer zu lesen? Das kann man fast 1:1 auf Python umsetzen.
Für mich ist es schwer verdauliche Kost. Wie kann man dieses Skript ausführen?

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

Also muss ich einj Canvas objekt mit dieser Funktion erzeugen und dann mein Image darauf legen. Dafür kann ich also die FKT am anfange benutzen ok. (die FKT am anfang ist übrigens von wuf)
Also ich wollte imprenzip einen anfangspunkt und eienen Endpunkt haben und derspieler muss dann vom einen zum anderen. Das ganze auf basis eines Labyrinths das ich mir mit gimp erzeugt habe. Ich habe häufiger irgendwas von Rawturtle gelesen und auch das das was mit Canvas zu tuhen hat.
[*]"RawTurtle (alias: RawPen) defines Turtle objects which draw on a TurtleScreen. Its constructor needs a Canvas, ScrolledCanvas or TurtleScreen as argument, so the RawTurtle objects know where to draw.
Derived from RawTurtle is the subclass Turtle (alias: Pen), which draws on “the” Screen - instance which is automatically created, if not already present.
All methods of RawTurtle/Turtle also exist as functions, i.e. part of the procedure-oriented interface."
Und es gibt noch "getcanvas()"
Mit beiden weiß ich aber wenig anzufangen.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wuf: Hy ist im Package Index, kann also einfach mit `pip` installiert werden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi __blackjack__

Habe hier das hv mit Hilfe von synaptic installiert. Deinem Skript gab ich folgenden Namen turtle_trial.hy. Führe das Skript im Terminal mit hy turtle_trial.hy aus. Es wird folgende Exeption geworfen:
File "turtle_trial.hy", line 7, column 1

(def *white* (, 255 255 255)
^---------------------------
*wall-color* *white*
-------------------------
*move-distance* 3
----------------------
*fast-distance* 10
-----------------------
*fast-key* "f"
-------------------
*move-delay* 100 ; In milliseconds.
-----------------------------------------
*background-image* (-> (Image.open "test.png") (.convert "RGB")))
---------------------------------------------------------------------^
HyTypeError: `def' needs 2 arguments, got 14


Muss annehmen, dass hy alle für Python installierte Module wie:
functools
turtle
PIL

selber findet.

Gruss wuf ;-)
Take it easy Mates!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Schade, kein Spiel für Frau.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Schade, kein Spiel für Frau??????????. :roll:
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wuf: Das ist dann wohl eine ältere Version von `def` und `setv` nur jeweils *einen* Namen an einen Wert binden konnte.

Code: Alles auswählen

$ hy --version
hy 0.13.0
Wobei aktuell stabil glaube ich sogar 0.14.0 ist.

Wird es besser wenn Du das einzelne `def` durch das hier ersetzt?

Code: Alles auswählen

(def *white* (, 255 255 255)
(def *wall-color* *white*)
(def *move-distance* 3)
(def *fast-distance* 10)
(def *fast-key* "f")
(def *move-delay* 100)  ; In milliseconds.
(def *background-image* (-> (Image.open "test.png") (.convert "RGB")))
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi __blackjack__

Danke für deinen Feedback. Meine hy-Version hier ist 0.11.1-1.
Ich bekomme mit deiner Änderung jetzt noch folgende Fehlermeldung:
LexException: Premature end of input

Irgendwie kann ich mich mit dem Lisp-Syntax nicht so richtig anfreunden. Den er weicht zu stark von Python und C ab. Lisp ist sicher eine interessante Sprache. Aber wie es so ist, wenn sich im Hirn über Jahrzehnte einmal etwas eingebrannt hat lässt es sich nur schwer überschreiben.

Frage an Freddyyy:
Gibt es schon ein ähnliches Spiel welches deinem geplanten entspricht an dem man sich über den Spielablauf orientieren kann?

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

@wuf Ja gibt es. Freunde von mir haben das gemacht (mit mir) indem wir ein Lybyrinth gemalt haben mit dem Turtle modul und dann jeden pixel den wir gemalt haben in einer liste mit den koordinaten der Turle vergleicht haben. Ich kann dir den Code mal schicken aber ich habe ihn leider nicht hier und muss ihn mir erst besorgen. Das kann etwas dauern.

Aber wieder zu den Canvas. Wie kann ich ein Bild auf die Turtle-Canvas legen und welche FKT brauche ich dafür?

LG Freddy
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy
Ich kann dir den Code mal schicken
Den Code brauchen wir vorläufig nicht. Wie verhält sich das folgende Skript bei dir:

Code: Alles auswählen

import turtle

image_width = 1024 # Breite deines Hintergrundbides (Pixels)
image_height = 600 # Höhe deines Hintergrundbides (Pixels)
screen = turtle.Screen()
screen.setup(image_width, image_height)
screen.bgpic("hintergrundbild.png")

turtle.mainloop()
Trage die Abmessungen (Breite & Höhe) deines Hintergrundbildes in das Skript ein. Das Bild sollte im .png oder .gif Format vorhanden sein. Mein setup hier ist Ubuntu 18.04, Python 3.5

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

Dein Skript hamoniert leider nicht mit meinem. Also die Turtle ist nicht sichtbar, aber ich kann sie auch nicht bewegen. Es gibt aber auch kein Fehler code
btw ich benutze Windows 10 und Python 3.6.5

Vllt ist ja wichtig für euch das wenn ich das Programm schließe, folgender Error kommt:

Code: Alles auswählen

 raise RuntimeError('Too early to create image')
RuntimeError: Too early to create image
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy

Wird bei dir das Hintergrundbild aber angezeigt? Stimmt die Grösse des Turtle-Fensters mit der Bildgrösse überein? Es ist richtig das bei diesem Versuch die Turtle nicht sichtbar ist. Habe das Skript bei mir auch unter Windows 10 & Python 3.5 ausprobiert. Ich bekomme zwar die von dir erwähnte Fehlermeldung beim schliessen des Fensters nicht aber es funktioniert richtig.

OK! Wie verhält sich das nächst folgende Skript bei dir:

Code: Alles auswählen

import turtle
import tkinter as tk

screen = turtle.Screen()
bg_image = tk.PhotoImage(file="hintergrundbild.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.mainloop()
Gruss wuf ;-)
Take it easy Mates!
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Ist imprinzip genau das gleiche. Ich sehe das Bild aber ansonsten kann ich nichts machen. Bekomme jetzt aber beim schließen diese Fehlermeldung:

Code: Alles auswählen

File "<string>", line 5, in fd
turtle.Terminator
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy

Soweit ist das Verhalten richtig. Das mit der Fehlermeldung beim schliessen versuche ich hier nach zu vollziehen.

Hier noch ein weiteres Skript zum ausprobieren wie verhält sich das?:

Code: Alles auswählen

import turtle
from PIL import Image, ImageTk

screen = turtle.Screen()

bg_image = ImageTk.PhotoImage(Image.open("hintergrundbild.png"))
bg_image_width = bg_image.width()
bg_image_height = bg_image.height()
screen.setup(bg_image_width,bg_image_height)
print("Grösse des Hintergrundbildes: {}x{}".format(
    bg_image_width, bg_image_height))
canvas = screen.getcanvas()
canvas.create_image(0, 0, image=bg_image)

turtle.mainloop()
Welchen Editor verwendest du unter Windows um deine Skripts zu erstellen? Startest du das Skript aus dem Editor heraus?
Gruss wuf ;-)
Take it easy Mates!
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?
Antworten