Tkinter App, Turtle ein JPG Skin zuweisen

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

Also wenn ich das mit Tkinter machen kann, wie kann ich dann das Turtle modul im Tkinter Fenster verwenden? Das war ja meine Frage von anfang an.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich verstehe nicht was Du Dir davon erhoffst das so herum zu machen. Warum selber um das Tkinter-Fenster kümmern wenn das `turtle`-Modul das schon alles für Dich macht‽ Das `turtle`-Modul erstellt Dir doch schon das Tkinter-Fenster und den Canvas, und die Turtle(s) und man kann die Grafiken von den Turtles damit ändern. Und für das bisher einzige was nicht so einfach geht, ein Hintergrundbild in einem Grafikformat das Tk nicht versteht anzulegen, lässt man sich halt das schon von `turtle` erstellte `Canvas`-Objekt geben und pappt da das Hintergrundbild direkt rein, statt das über eine `turtle`-Funktion zu machen. Das ist weniger Arbeit als Fenster und `Canvas` selbst zu erstellen und da dann einen `turtle`-Screen zu integrieren.
„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

Es gibt also im Turtle Window Canvas und ich muss nur das Bild auf die Canvas Platzieren. Dabei muss ich achten das sich das Bild im Posititven Bereich befindet da sonst getpixel() nicht so einfach funktioniert. Gibt es da irgendwie bsps im Internet? Mit deinem hy code komme ich nicht wirklich klar. Also ic hverstehe ihn schon aber es fällt mir schwer den zu übersetzen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy

Dieser lang gezogene Thread inklusive Lisp-Turtle-Programmierung ist so verwirrend dass bei mir die Lampe nicht zum brennen kommt. Könntest du einmal beschreiben was das Ziel deiner Anwendung beinhaltet? (Projektbeschreibung)

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

Das Ziel ist ein Spiel zu haben in dem Mann die Turtle durch ein Labyrinth steuert das ein PNG Image darstellen soll. Daber soll mit getpixel() immer abgefragt werden ob sich die Turtle auf einem Shwarzen oder weißen Feld befindet.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
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.
„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__
@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: 13103
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.
„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__

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: 17749
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: 13103
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")))
„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__

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