2017-01-21 10 views
1

Tkinterを使用して小惑星のバージョン(https://en.wikipedia.org/wiki/Asteroids_(video_game))をプログラミングしています。これは先に移動する船を聞かせてコードの一部であるTkinter:キーボードのダブルクリック防止を削除する

:あなたが押すと

def avanti(self, event): 
    self.s = -2.5 
    x = self.s * math.sin(math.radians(self.angle)) * -1 
    y = self.s * math.cos(math.radians(self.angle)) 
    self.move(x, y) 

上矢印:

def move(self, sx=0, sy=0, ms=2): 
    try: 
     self.root.after_cancel(self.m) 
    except AttributeError: 
     pass 
    ms += 1 
    if ms > 30: 
     return 
    self.parent.move(self.ship, sx, sy) 
    self.m = self.root.after(ms, lambda sx1=sx, sy1=sy, millisec=ms: self.move(sx1, sy1, ms)) 

そしてここで、上矢印が押されたときに実行される実際のfuctionがありますコードがうまく機能していますが、唯一の問題は、船を一度動かしてから0.2秒のような小さな休憩があり、それから鍵を離すまで定期的に進めることです。私は、コンピュータがあなたが実際にしたいと思っているときに、あなたがダブルクリックするのを妨げると思っています。

最初のプレスからこのブロックを削除する方法はありますか?

EDIT:あなたが実際にキーボードの上に行くことによって計算された全体のタイピングの遅延を変更することができます - >遅延を入力しますが、私がやりたいことだけ Pythonプログラム上の遅延を削除することです。

+0

あなたは変数すなわちを設定するために '' を使用することができます。 'move_up = True'と' 'を使って' move_up = False'を設定します。そして、 'after'を使って' move_up'とmoveオブジェクトをチェックする関数を実行することができます。 – furas

答えて

1

あなたはmove_up = Falseを設定した後、あなたがmove_upをチェックして、オブジェクトを移動する機能を実行するためにafterを使用することができますmove_up = True<KeyRelease-Up>を設定する<Up>を使用することができます。

の作業例 - 他の質問から(プラットホームを動かす程度)コード

import tkinter as tk 

# --- constants --- 

DISPLAY_WIDTH = 800 
DISPLAY_HEIGHT = 600 

CENTER_X = DISPLAY_WIDTH//2 
CENTER_Y = DISPLAY_HEIGHT//2 

# --- functions --- 

# for smooth move of platform 

def up_press(event): 
    global platform_up 
    platform_up = True 

def up_release(event): 
    global platform_up 
    platform_up = False 

def down_press(event): 
    global platform_down 
    platform_down = True 

def down_release(event): 
    global platform_down 
    platform_down = False 

def eventloop(): 

    # move platform 
    if platform_up: 
     # move 
     canvas.move(platform, 0, -20) 
     # check if not leave canvas 
     x1, y1, x2, y2 = canvas.coords(platform) 
     if y1 < 0: 
      # move back 
      canvas.move(platform, 0, 0-y1) 
    if platform_down: 
     # move 
     canvas.move(platform, 0, 20) 
     # check if not leave canvas 
     x1, y1, x2, y2 = canvas.coords(platform) 
     if y2 > DISPLAY_HEIGHT: 
      # move back 
      canvas.move(platform, 0, -(y2-DISPLAY_HEIGHT)) 

    root.after(25, eventloop) 

# --- main --- 

# - init - 

root = tk.Tk() 

canvas = tk.Canvas(root, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT) 
canvas.pack() 

# - objects - 

platform = canvas.create_rectangle(CENTER_X-15, CENTER_Y-15, CENTER_X+15, CENTER_Y+15, fill="green") 

platform_up = False 
platform_down = False 

root.bind('<Up>', up_press) 
root.bind('<KeyRelease-Up>', up_release) 
root.bind('<Down>', down_press) 
root.bind('<KeyRelease-Down>', down_release) 

# - mainloop - 

root.after(25, eventloop) 
root.mainloop() 
関連する問題