Turtle steuern?

Fragen zu Tkinter.
Antworten
Dorian
User
Beiträge: 1
Registriert: Mittwoch 24. Januar 2007, 15:59

Kann die Turtle mit einem einfachen Befehl steuern (also auf "a" z.b. wendet sie sich nach links) ohne dass ich curses oder pygame benutzen muss? Die Möglichkeit mit raw_input ist mir bekannt, jedoch möchte ich sie direkt steuern ohne zuerst "enter" drücken zu müssen
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Wie willst du das denn machen? Enter sagt doch, dass der Befehl da zu Ende ist und bestätigt die Eingabe. Ohne Enter(oder anderen "Absenden" Button) wäre das IMHO unlogisch =/
BlackJack

Ich hab's mal in das Tkinter-Forum verschoben.

Grundsätzlich müsste es gehen, da es sich um eine Tkinter-Anwendung handelt. Du könntest zum Beispiel eine Unterklasse von `turtle.Pen()` schreiben, die nach dem Aufruf der `__init__()`-Methode von `Pen()` die entsprechenden Tasten und Funktionen an das Tk-Fenster bindet.

Wie man an das Fenster kommt, kannst Du im Quelltext vom `turtle`-Modul sehen.
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

So wie du das machen wolltest müsstest du am Besten mit Tkinter ein Fenster mit Buttons erzeugen...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Code: Alles auswählen

import time
import turtle as t
import Tkinter as tk
from random import randint as rnd

colors = ["blue","red","green","yellow","grey","orange"] #moegliche farben
t.width (4) # linien staerke
speed = 0 # aktuelle geschwindigkeit
go = [0, 5, 10]
winkel = [5, 5, 5]

def move():
    t.color(colors[rnd(0,len(colors)-1)])
    t.forward(go[speed])
    time.sleep(0.01)

def left(self):
    t.left(winkel[speed])
    
def right(self):
    t.right(winkel[speed])

def set_speed(value):
    global speed
    speed = value

# Programm ablauf
root = tk.Tk()
root.bind('a',left)
root.bind('d',right)
root.bind('1',lambda(self): set_speed(0))
root.bind('2',lambda(self): set_speed(1))
root.bind('3',lambda(self): set_speed(2))

while True:
    move()
Anleitung:
.py datei ausführen das leere tk Fenster an klicken so das man beide TK fenster sieht. Dann taste 2drücken damit die Turtle los turtelt und 1 zum anhalten drücken. Um sie zu lenken a und d drücken.

Wer weiß wie ich die zwei Tk fenster zusammen lege kanns gerne mal sagen.
BlackJack

Argh, zweimal Tk() ist keine gute Idee, da können die merkwürdigsten Dinge passieren. Das `turtle`-Modul erstellt doch schon ein Fenster auf das man auch zugreifen kann. Einfach mal im Quelltext vom `turtle`-Modul nachsehen.

Mir gehen die Abkürzungen etwas zu weit. `turtle` statt `t` und `randint` statt `rnd` zu tippen bringt einen nun wirklich nicht um, ist aber um Längen klarer beim lesen. Letzteres kann man auch mit ``random.choice(colors)`` etwas einfacher schreiben.

Das unbenutzte `self` bei den ``lambda``-Funktionen ist überflüssig.

Edit: Eine Lösung mit Vererbung:

Code: Alles auswählen

import random
import turtle

COLORS = ('blue', 'red', 'green', 'yellow', 'grey', 'orange')
SPEEDS = (0, 5, 10)

class MovingPen(turtle.Pen):
    def __init__(self):
        turtle.Pen.__init__(self)
        self.width(4)
        self.speed = 0
        assert turtle._root is not None
        for key, function in (('a', lambda dummy: self.left(5)),
                              ('d', lambda dummy: self.right(5)),
                              ('1', lambda dummy: self.set_speed(0)),
                              ('2', lambda dummy: self.set_speed(1)),
                              ('3', lambda dummy: self.set_speed(2))):
            turtle._root.bind(key, function)
        self._move()
        turtle._root.mainloop()
    
    def _move(self):
        self.color(random.choice(COLORS))
        self.forward(SPEEDS[self.speed])
        if turtle._root is not None:
            turtle._root.after(10, self._move)
    
    def set_speed(self, speed):
        self.speed = speed


def main():
    MovingPen()


if __name__ == '__main__':
    main()
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Das self ist nur ein dummy string weil da was übergeben wird . Du hast das miut dummy gelöst. Ich habs einfach self gennant, weils ja nicht in ner Klasse steht.
Danke dir das du mir gezeigt hast wie ich an das Tkinter in turtle ran komme.
Antworten