Python(kivy)-连续按键导致循环?

Python(kivy)-连续按键导致循环?,python,keyboard,key,kivy,pressed,Python,Keyboard,Key,Kivy,Pressed,每次按一次空格键时,我的代码工作正常。然而,当持续按下时,它会产生某种循环并崩溃。 原因可能是什么?我该如何解决?谢谢 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 Bu

每次按一次空格键时,我的代码工作正常。然而,当持续按下时,它会产生某种循环并崩溃。 原因可能是什么?我该如何解决?谢谢

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())
导入kivy
导入csv
导入时间
#导入xlsxwriter
导入系统
kivy.require('1.0.8')
从kivy.core.window导入窗口
从kivy.uix.widget导入widget
从kivy.uix.button导入按钮
从kivy.app导入应用程序
从kivy.uix.widget导入widget
从kivy.uix.floatlayout导入floatlayout
从kivy.core.window导入窗口,键盘
从kivy.graphics导入*
从kivy.uix.label导入标签
从kivy.uix.textinput导入textinput
从kivy.properties导入StringProperty、ObjectProperty
从scipy.spatial导入距离
从kivy.clock导入时钟
进口numpy
Window.size=(12801024)
Window.fullscreen=True
a=78.3
b=156.6
c=234.9
q=30
L=250
R=1015
O=630
刺激列表=[1,a,q,c,q,b,q,b,q,c,q,c,c,q,a,q,b,q,c,q,q,a,a,q,b,q,b,q,q,b,q,q,b,q,
q、 a,q,b,q,a,q,c,q,c,q,a,q,b,q,c,q,a,q,a,q,a,q,b,q,b,q,a,a,q,c,q,c,q,c,q,c,c,q,c,c,c,
q、 b,q,c,q,c,q,a,q,b,q,a,q,b,q,b,b,q,a,q,c,q,c,q,c,q,c,q,b,q,b,b,
q、 c,q,b,q,c,q,a,q,a,q,a,q]
侧列表=[1,R,O,L,O,L,O,R,O,R,O,L,O,R,O,L,O,R,O,L,O,R,O,
O、 R,O,R,O,L,O,R,O,R,O,R,O,L,O,L,O,L,O,L,O,R,O,
O、 L,O,R,O,R,O,L,O,L,O,L,O,R,O,R,O,L,O,O,R,O,O,O,O,O,O,O,O,O,O,O,O,R,O,
O、 L,O,L,O,R,O,L,O,R,O,R,O]
side_list_b=side_list[:-1]
刺激列表=刺激列表[:-1]
i=0
宽度=45
首字母X=650
#工作簿=xlsxwriter.workbook('MT.xlsx')
#工作表=工作簿。添加工作表()
#行=0
#col=0
类MyKeyboardListener(小部件):
定义初始(自我,**kwargs):
超级(MyKeyboardListener,self)。\uuuuuu初始化(**kwargs)
键盘=窗口。请求键盘(自我。键盘释放,自我)
self.\u键盘=键盘
键盘绑定(按键盘上下=自身。\按键盘上下)
self.\u键盘=Window.request\u键盘(
self.\u键盘\u关闭,self,“文本”)
如果是self.\u keyboard.widget:
#如果它存在,这个小部件是一个VKeyboard对象,您可以使用它
#更改键盘布局。
通过
#self.\u keyboard.bind(按键盘上下=按键盘上下)
self.\u keyboard.bind(在键盘上=self.\u在键盘上)
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=打开(self.fileName,“w+”)
f、 关闭()
def_键盘_关闭(自身):
打印('我的键盘已关闭!')
self.\u keyboard.unbind(按键盘上下=self.\u键盘上下)
self.\u键盘=无
#键盘上下定义(self、键盘、键码、文本、修改器):
#打印('按键',键码[0],'已按下')
##打印('-文本为%r'%text)
##print('-修饰符是%r%修饰符)
#如果(键码[0]==32):
#打印(“sapce已打印”)
键盘上的定义(自身、键盘、键码):
打印('按键',键码[0],'已按下')
#打印('-text为%r'%text)
#打印('-modifiers是%r'%modifiers)
#空格键打开了
如果(键码[0]==32):
打印(“sapce发布”)
self.stage=1
self.startTime=time.time()
self.add_diff_行(self.startTime、self.stimposted)
self.isPressed=False
def on_触控向下(自身,触控):
#如果touch.is_双击:
打印(“触摸”)
touch.multi-touch_sim=False
如果(self.stage==2):
#打印(touch.pos)
#dst=距离。欧几里德(self.firstTouch,touch.pos)
#打印(dst)
a=numpy.array(touch.pos)
b=numpy.array(self.firstTouch)
dist=numpy.linalg.norm(a-b)
打印(区)
自添加差异行(dist*0.02554,0)
self.stage=3
#屏幕首次按下
如果(self.stage==1):
self.stage=2
self.endTime=time.time()
self.add_diff_行(self.endTime、self.startTime)
#打印(touch.pos)
self.firstTouch=touch.pos
###使键盘可操作
def_键盘_已释放(自身):
self.focus=False
###按下键盘时,将stim替换为下一个
def present_stim(自身、键盘、键码、文本、修改器):
self.keycode=36
初始值=400-(刺激列表[i]/2)
xlab=标签(text='X',pos=(侧列表[i],650))
self.remove_小部件(xlab)
stimPresented=time.time()
使用self.canvas:
self.canvas.clear()
self.add_小部件(xlab)
颜色(1,1,1)
矩形(pos=(initialx,initialy),size=(stimwidth,stim\u list\u b[i]))
#见上文
self.add_diff_行(self.endTime、self.startTime)
###
定义键盘打开键关闭(自身、键盘、键码、文本、修改器):
全球i
如果(keycode[0]==32且已按下self.isPressed):
i=i+1
时钟。时间表一次(lambda dt:self.present\u stim(键盘、键码、文本、修改器),3)
#空格键先按下
如果(keycode[0]==32且未(self.isPressed)):
self.isPressed=True
#添加不同时间的行
#self.add_diff_行(self.endTime、self.startTime)
###
def add_diff_行(自身、值1、值2):
initialy = 400 - (stim_list_b[i] / 2)