Tkinter App, Turtle ein JPG Skin zuweisen

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

Ja habe ich gesehen beim suchen. Gut. Hilft mir aber nicht weiter. Ich laufe gerade auf dem Holzweg. Sorry wenn ich euch nerfe, bin aber mit Python relativ unerfahren. Bzw generell mit Programmiersprachen. Vllt könnt ihr mir ja einfach meien Fehler sagen und mir eine Veerbesserung geben.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Ach und mit den Beiträgen, im Thema sind manche Beiträge ienfach nicht da und ich sehe sie dann erst wenn ich mir eure verschickten Beiträge ankucke was relativ unübersichtlich ist.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du davon mal einen screenshot erstellen & posten? Das ist eher ungewoehnlich.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Ok ich habes es herausgefunden. War wohl ein wenig blind.

Code: Alles auswählen

turtle.shape("Bild")
Wie verwende ich das jetzt mit bgpic? register_shape() geht ja jetzt nicht.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

[img]C:\Users\Freddy\Documents\Screenshot.png[/img]

Also bei mir feheln hier mehrere Beiträge. Wenn ich dann aber spezifisch auf eienn antworte bekomme ich allo die danach verfasst wurden.
Wie kann ich hier mein Bild einfügen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Lokale Dateien hier anzeigen zu wollen geht natuerlich nicht. Du musst das irgendwo hochladen, und dann verlinken. Das ist etwas aetzend, aber entzieht sich meiner Kontrolle.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das verwendest Du gar nicht mit `bgpic()`. Das erwartet tatsächlich nur einen Dateinamen. Früher ging hier nur GIF, heute alles was Tk für `PhotoImage` unterstützt, also mindestens GIF, vielleicht auch JPEG und in neuen Tk-Versionen auch PNG. Das Bildobjekt bekommt man dann aber nicht wieder raus, das muss man also noch mal separat laden wenn man an Pixelwerte heran kommen will.

Ich habe mir in meinem Programm ja einfach den `Canvas` geben lassen und da selbst ein Bild-Element drauf erstellt das ich mit PIL geladen habe.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Also ich habe das mit "bgpic()" gemacht da gibt es aber ein paar Probleme:
Die Steurung der Turtle verändert sich. Also bei "setheading()" schaut die Turtle jeweils in die Falsche Richtung. Also 0°=180° usw. Dazu kommt das man das der Turtle Shape unsichtbar wird. Also ich kann die Turtle nicht mehr sehen. "bgpic()" hat bei mir allerdings erst funktioniert als ich register_shape() benutzt habe.
Wie hast du denn dann bei deinem Programm blockagden eingeruichtet? Geht das da auch mit "getpixel()"? Und wie darf ich mir die "Canvas" vorstellen. Habe davon häufiger was gehört allerdings noch nie verwendet.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wie ich das gelöst habe kannst Du Dir doch anschauen. Den Quelltext habe ich in diesem Thema ja gezeigt. Zwar in Hy statt Python, aber es werden ja die selben Module verwendet und sooo viel anders ist der Code in Hy nun auch nicht strukturiert als man das in Python machen würde.

Wenn der Spieler in eine Wand läuft, dann stoppt mein Programm einfach. Eine Wand wird erkannt wenn das Pixel und der Spielerposition weiss ist oder der Spieler versucht das Bild zu verlassen. Wobei man sich noch Gedanken machen muss wie man eine Turtle-Position in Koordinaten für das Bild umrehnet, denn Turtle hat den Ursprung, also (0, 0), in der Mitte und somit auch negative Werte, während Pixel-Koordinaten positiv sind und links oben im Bild anfangen. Zudem ist die Y-Achse bei der Turtlegrafik entgegengesetzt zu der bei den Bilddaten. Also bei Turtle sind grössere Werte für die Y-Koordinate weiter oben, während bei den Bilddaten grössere Werte Pixel weiter unten beschreiben.

So sieht das Programm bei mir mit zwei quick'n'dirty erstellten Bildern aus:
Bild

`Canvas` ist eine `tkinter`-Klasse. Du hast die doch selbst schon verwendet — in Deinem ersten Beitrag hier im Thema.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Naja ich habe sieh nicht verwendet der Code wurde mir gemacht.
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: 13004
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
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: 13004
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: 13004
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!
Antworten