key_pressed("escape") funktioniert unter linux nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ruhsal
User
Beiträge: 3
Registriert: Samstag 27. November 2010, 19:25

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^^
Zuletzt geändert von Anonymous am Samstag 27. November 2010, 21:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Ruhsal
User
Beiträge: 3
Registriert: Samstag 27. November 2010, 19:25

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.
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.
Ruhsal
User
Beiträge: 3
Registriert: Samstag 27. November 2010, 19:25

Ok perfekt, das mit dem ASCII Wert hat wirklich gestimmt.

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