Python (кивы) - непрерывное нажатие клавиши вызывает цикл?
Мой код работает нормально, когда я нажимаю пробел по одному. Однако при непрерывном нажатии он создает какой-то цикл и вылетает. В чем может быть причина и как я могу это исправить? Спасибо!!
import kivy
import csv
import time
# import xlsxwriter
import sys
kivy.require('1.0.8')
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window, Keyboard
from kivy.graphics import *
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty, ObjectProperty
from scipy.spatial import distance
from kivy.clock import Clock
import numpy
Window.size = (1280, 1024)
Window.fullscreen = True
a = 78.3
b = 156.6
c = 234.9
q = 30
L = 250
R = 1015
O = 630
stim_list = [1, a, q, c, q, b, q, b, q, c, q, c, q, c, q, a, q, b, q, b, q, c, q, a, q, a, q, b, q, a, q, a, q, b, q, c,
q, a, q, b, q, a, q, c, q, c, q, a, q, b, q, b, q, c, q, a, q, a, q, b, q, b, q, a, q, c, q, c, q, c, q, b,
q, b, q, c, q, c, q, a, q, b, q, a, q, b, q, b, q, b, q, a, q, c, q, a, q, c, q, c, q, c, q, b, q, b, q, b,
q, c, q, b, q, c, q, a, q, a, q, a, q]
side_list = [1, R, O, L, O, L, O, R, O, R, O, R, O, L, O, R, O, L, O, R, O, L, O, R, O, L, O, R, O, R, O, L, O, L, O, R,
O, R, O, R, O, L, O, L, O, R, O, R, O, R, O, L, O, L, O, L, O, L, O, L, O, R, O, L, O, L, O, L, O, R, O, L,
O, L, O, R, O, R, O, L, O, L, O, L, O, L, O, R, O, R, O, R, O, L, O, R, O, L, O, R, O, L, O, R, O, R, O, R,
O, L, O, L, O, R, O, L, O, R, O, R, O]
side_list_b = side_list[::-1]
stim_list_b = stim_list[::-1]
i = 0
stimwidth = 45
initialx = 650
# workbook = xlsxwriter.Workbook('MT.xlsx')
# worksheet = workbook.add_worksheet()
# row = 0
# col = 0
class MyKeyboardListener(Widget):
def __init__(self, **kwargs):
super(MyKeyboardListener, self).__init__(**kwargs)
keyboard = Window.request_keyboard(self._keyboard_released, self)
self._keyboard = keyboard
keyboard.bind(on_key_down=self._keyboard_on_key_down)
self._keyboard = Window.request_keyboard(
self._keyboard_closed, self, 'text')
if self._keyboard.widget:
# If it exists, this widget is a VKeyboard object which you can use
# to change the keyboard layout.
pass
# self._keyboard.bind(on_key_down=self._on_keyboard_down)
self._keyboard.bind(on_key_up=self._on_keyboard_up)
self.startTime = time.time()
self.endTime = time.time()
self.stage = 0
self.firstTouch = []
self.isPressed = False
self.stimPresented = time.time()
self.fileName = sys.argv[1]
f = open(self.fileName, 'w+')
f.close()
def _keyboard_closed(self):
print('My keyboard have been closed!')
self._keyboard.unbind(on_key_down=self._on_keyboard_down)
self._keyboard = None
# def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
# print('The key', keycode[0], 'have been pressed')
# # print(' - text is %r' % text)
# # print(' - modifiers are %r' % modifiers)
# if (keycode[0] == 32):
# print("sapce is printed")
def _on_keyboard_up(self, keyboard, keycode):
print('The key', keycode[0], 'have been pressed')
# print(' - text is %r' % text)
# print(' - modifiers are %r' % modifiers)
#space key is up
if (keycode[0] == 32):
print("sapce is released")
self.stage = 1
self.startTime = time.time()
self.add_diff_row(self.startTime,self.stimPresented)
self.isPressed = False
def on_touch_down(self, touch):
# if touch.is_double_tap:
print("touch")
touch.multitouch_sim = False
if (self.stage == 2):
# print(touch.pos)
# dst = distance.euclidean(self.firstTouch, touch.pos)
# print(dst)
a = numpy.array(touch.pos)
b = numpy.array(self.firstTouch)
dist = numpy.linalg.norm(a - b)
print(dist)
self.add_diff_row(dist*0.02554, 0)
self.stage = 3
# screen first press
if (self.stage == 1):
self.stage = 2
self.endTime = time.time()
self.add_diff_row(self.endTime, self.startTime)
#print(touch.pos)
self.firstTouch = touch.pos
### Make the keyboard operatble
def _keyboard_released(self):
self.focus = False
### replace stim with the next one when the keyboard is pressed
def present_stim(self, keyboard, keycode, text, modifiers):
self.keycode = 36
initialy = 400 - (stim_list_b[i] / 2)
xlab = Label(text='X', pos=(side_list_b[i], 650))
self.remove_widget(xlab)
stimPresented = time.time()
with self.canvas:
self.canvas.clear()
self.add_widget(xlab)
Color(1., 1, 1)
Rectangle(pos=(initialx, initialy), size=(stimwidth, stim_list_b[i]))
#see above
self.add_diff_row(self.endTime,self.startTime)
###
def _keyboard_on_key_down(self, keyboard, keycode, text, modifiers):
global i
if(keycode[0] == 32 and self.isPressed):
i = i + 1
Clock.schedule_once(lambda dt: self.present_stim(keyboard, keycode, text, modifiers), 3)
# the space key is first down
if (keycode[0] == 32 and not(self.isPressed)):
self.isPressed = True
# add row of time different
# self.add_diff_row(self.endTime,self.startTime)
###
def add_diff_row(self, value1, value2):
data = [value1 - value2]
with open(self.fileName, 'a') as f:
print (data)
writer = csv.writer(f)
writer.writerow(data)
###Move the stim togetehr with fingers
def on_touch_move(self, touch):
initialy = 400 - (stim_list_b[i] / 2)
self.canvas.clear()
self.myWidget = Widget(size=(100, 100))
self.add_widget(self.myWidget)
# calculating fingers space only for stage 1.
# if (self.stage == 2):
# #self.add_diff_row(touch.pos[0],0)
# print(touch.pos)
# self.stage = 3
#
# if (self.stage == 3):
# print(touch.pos)
# self.stage = 4
#adding differenc in rows.
#print touch.pos[1]
if (touch.pos[1] > initialy + stim_list_b[i] + 70) or (touch.pos[1] < initialy - 20):
with self.myWidget.canvas:
self.add_widget(Label(text='X', pos=(side_list_b[i], 650)))
Rectangle(pos=(initialx, initialy), size=(stimwidth, stim_list_b[i]))
else:
goodposx = touch.pos[0]
goodposy = initialy
with self.myWidget.canvas:
self.add_widget(Label(text='X', pos=(side_list_b[i], 650)))
Rectangle(pos=((goodposx - (stimwidth / 2)), initialy), size=(stimwidth, stim_list_b[i]))
# if 'multitouch_sim' in touch.profile:
# print ('multi touch pressed ')
# touch.multitouch_sim = False
# self.endTime = datetime.datetime.now()
# data = [self.startTime,self.endTime]
# with open(r'res.csv', 'a') as f:
# writer = csv.writer(f)
# writer.writerow(data)
# workbook.close()
if __name__ == '__main__':
from kivy.base import runTouchApp
runTouchApp(MyKeyboardListener())
1 ответ
Возможно ошибка в функции present_stim
, Эта строка:
initialy = 400 - (stim_list_b[i] / 2)
Индекс массива i
вне диапазона из-за долгого нажатия клавиши пробела.