Seite 1 von 1

key_pressed("escape") funktioniert unter linux nicht

Verfasst: Samstag 27. November 2010, 19:44
von Ruhsal
Nabend,

bin gerade über dieses Forum gestolpert als ich auf der Suche nach meinem Problem war.
Und zwar habe ich vor kurzem angefangen python zu lernen, durch tutorials usw., im moment bin ich z.b. bei diesem hier: http://openbookproject.net/thinkCSpy/ch08.html
Ich mache das bei meinem Praktikum immer wenn ich etwas Zeit habe, unter Windows.
Jetzt bin ich endlich mal dazu gekommen das zu Hause zu probieren, hatte schon früher mal Ubuntu installiert weil es ein interessanten Betriebssystem ist... und ich hab halt immer wieder gelesen dass das programmieren mit python unter linux besser ist, so von der oberfläche usw her.
Nun würde ich gerne wissen warum dieses Programm, hier jetzt mal aus der Seite kopiert, weil ich meine version auf dem arbeitsrechner habe:

Code: Alles auswählen

from gasp import *

COMPUTER_WINS = 1
PLAYER_WINS = 0
QUIT = -1


def distance(x1, y1, x2, y2):
    return ((x2 - x1)**2 + (y2 - y1)**2)**0.5


def play_round():
    ball_x = 10
    ball_y = random_between(20, 280)
    ball = Circle((ball_x, ball_y), 10, filled=True)
    dx = 4
    dy = random_between(-5, 5)

    mitt_x = 780
    mitt_y = random_between(20, 280)
    mitt = Circle((mitt_x, mitt_y), 20)

    while True:
        if ball_y >= 590 or ball_y <= 10:
            dy *= -1
        ball_x += dx
        ball_y += dy
        if ball_x >= 810:
            remove_from_screen(ball)
            remove_from_screen(mitt)
            return COMPUTER_WINS
        move_to(ball, (ball_x, ball_y))

        if key_pressed('k') and mitt_y < 580:
            mitt_y += 5
        elif key_pressed('j') and mitt_y > 20:
            mitt_y -= 5

        if key_pressed('escape'):
            return QUIT

        move_to(mitt, (mitt_x, mitt_y))

        if distance(ball_x, ball_y, mitt_x, mitt_y) <= 30:
            remove_from_screen(ball)
            remove_from_screen(mitt)
            return PLAYER_WINS

        update_when('next_tick')


def play_game():
    player_score = 0
    comp_score = 0

    while True:
        pmsg = Text("Player: %d Points" % player_score, (10, 570), size=24)
        cmsg = Text("Computer: %d Points" % comp_score, (640, 570), size=24)
        sleep(3)
        remove_from_screen(pmsg)
        remove_from_screen(cmsg)

        result = play_round()

        if result == PLAYER_WINS:
            player_score += 1
        elif result == COMPUTER_WINS:
            comp_score += 1
        else:
            return QUIT

        if player_score == 5:
            return PLAYER_WINS
        elif comp_score == 5:
            return COMPUTER_WINS


begin_graphics(800, 600, title="Catch", background=color.YELLOW)
set_speed(120)

result = play_game()

if result == PLAYER_WINS:
    Text("Player Wins!", (340, 290), size=32)
elif result == COMPUTER_WINS:
    Text("Computer Wins!", (340, 290), size=32)

sleep(4)

end_graphics()
plötzlich unter linux nicht so läuft wie unter windows?
Und zwar ist es zum einen sehr viel schneller, und zum anderen funktioniert die zeile

Code: Alles auswählen

if key_pressed('escape'):
            return QUIT
garnicht, unter windows komischerweise schon...

Danke im voraus für eure Hilfe^^

Re: key_pressed("escape") funktioniert unter linux nicht

Verfasst: Samstag 27. November 2010, 21:00
von noisefloor
Hallo,

... und willkommen im Forum.

Grundsätzlich solltest du _immer_ die Fehlermeldung, welche Python dir gibt, hier zu posten. Die ist nämlich in der Regel aufschlussreicher als eine verbale Beschreibung. ;-)

BTW: Was heißt "sehr viel schneller"? Wo und wann?

Gruß, noisefloor

Re: key_pressed("escape") funktioniert unter linux nicht

Verfasst: Samstag 27. November 2010, 21:13
von Ruhsal
naja,,ja das ist ja gerade das merkwürdige...
Es gibt keinen Fehler. Also normalerweise müsste er beim drücken der Escape Taste anhalten 4 sekunden warten und dann schließen.
Unter Windows auf meinem Arbeitsrechner macht er das auch, nur hier unter Linux schert es den Interpreter anscheinend nicht.

Mit "sehr viel schneller" meinte ich, dass sich der Ball einfach schneller von links nach rechts bewegt mit "set_speed='wert' " setzt man die Framerate, aber während ich das schreibe erscheint es mir doch logisch, dass er auf diesem Bildschirm anders läuft als auf den Arbeitsrechner Bildschirm, hängt vielleicht einfach von der Frequenz des darstellenden Bildschirms ab.

Re: key_pressed("escape") funktioniert unter linux nicht

Verfasst: Samstag 27. November 2010, 21:38
von BlackJack
@Ruhsal: `gasp` scheint nicht die gleichen Namen/Werte für Tasten auf verschiedenen Plattfomen zu verwenden. Unter Linux (zumindest bei mir) wird die Escape-Taste mit dem ASCII-Wert für ESC erkannt. Also '\x1b' als Zeichenkette geschrieben.

Vielleicht ist es unter Windows langsamer und nicht unter Linux schneller. Die Geschwindigkeitsangabe ist laut Docstring in Frames pro Sekunde, das sollte nicht vom Monitor abhängen. Du hast da 120 eingestellt und bewegst den Ball um 4 Pixel pro Frame, also bewegt sich der Ball in einer Sekunde um 480 Pixel weiter. Das kannst Du ja nachmessen und sehen welches System zu schnell oder zu langsam ist.

Re: key_pressed("escape") funktioniert unter linux nicht

Verfasst: Samstag 27. November 2010, 21:46
von Ruhsal
Ok perfekt, das mit dem ASCII Wert hat wirklich gestimmt.

Vielen Dank, wenn alles funktioniert fühlt man sich gleich ein bisschen besser :D