40962


Kivyにてこのプログラムを実行すると、

[code]

     TypeError: _on_keyboard_up() takes exactly 5 arguments (3 given)
    
[/code]

と出てしまうのですが、何か間違っているところがあれば指摘お願い致します。  
on_key_up、_on_keyboard_up等が使用できないのであれば、キーを押している間やまたはキーを離した後という事をKivy内で判定できる他の方法を教えていただければ幸いです。

# main.py

[code]

    #-*- coding: utf-8 -*-
    from kivy.config import Config
    Config.set('graphics', 'width', '800')
    Config.set('graphics', 'height', '600')
    
    from kivy.app import App
    from kivy.uix.widget import Widget
    from kivy.core.window import Window
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.properties import NumericProperty, ReferenceListProperty,\
    ObjectProperty, ListProperty
    from kivy.clock import Clock
    
    
    sm = ScreenManager()
    keyrpush = 0 #右キーが押されているか
    
    class Player(Widget):
          pass
    
    class FirstScreen(Screen):
    
         player = ObjectProperty(None)
         shots = ListProperty()
    
         def __init__(self, **kwargs):
             super(FirstScreen, self).__init__(**kwargs)
             self._keyboard = Window.request_keyboard(
                                                 self._keyboard_closed, self, 'text')
        if self._keyboard.widget:
            self._keyboard.bind(on_key_down=self._on_keyboard_down)
            self._keyboard.bind(on_key_up=self._on_keyboard_up)
    
        def _keyboard_closed(self):
            print('My keyboard have been closed!')
            self._keyboard.unbind(on_key_down=self._on_keyboard_down)
            self._keyboard.unbind(on_key_up=self._on_keyboard_up)
            self._keyboard = None
    
        def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
            print('The key', keycode, 'have been pressed')
            print(' - text is %r' % text)
    
            if keycode == (275, 'right') :
                keyrpush = 1
                print self.player.center_x
    
            if keycode == (276, 'left') :
                print "左"
                self.player.center_x = self.player.center_x - 1
    
            if keycode == (273, 'up') :
                print "上"
                self.player.center_y = self.player.center_y + 1
    
            if keycode == (274, 'down') :
                self.player.center_y = self.player.center_y - 1
                print "下"
    
            if keycode == (122, 'z'):
                if len(modifiers) == 1:
                    if modifiers[0] == "shift":
                        print "アイテムショット"
                else:
                    print "通常ショット"
    
            return True
    
        def _on_keyboard_up(self, keyboard, keycode, text, modifiers):
            print('終わり')
            return True
    
        def update(self, dt):
            pass
    
    class MainApp(App):
        def build(self):
            game = FirstScreen()
            sm.add_widget(FirstScreen(name="first"))
            Clock.schedule_interval(game.update, 1.0 / 60.0)
            return sm
    
    
    
    if __name__ == '__main__':
        MainApp().run()
    
[/code]

# main.kv

[code]

    <player>:
    canvas:
        Rectangle:
            size: 21,38
            pos: self.pos
            source: 'img/player.png'
    
    <Shot>:
        size: 10, 30
        canvas:
            Ellipse:
                pos: self.pos
                size: self.siz
    <FirstScreen>:
        player: player
        canvas:
            Rectangle:
                pos: 500, -42.5
                size: 303,640
                source: 'img/frame.png'
        Label:
            font_size: 20
            pos: 350, 120
            text: "/1000"
            font_name: 'fonts/Optical A Normal.ttf'
    
        Label:
            font_size: 20
            pos: 350, 172.5
            text: "0"
            font_name: 'fonts/Optical A Normal.ttf'
    
        Label:
            font_size: 20
            pos: 350, 220
            text: "未実装"
            font_name: 'fonts/NotoSansCJKjp-Thin.ttf'
    
        Label:
            font_size: 20
            pos: 275, 120
            text: "100"
            font_name: 'fonts/Optical A Normal.ttf'
    
        Player:
            id: player
            center_x: root.center_x - 87.5
            center_y: 150
    
[/code]

# 使用環境

[code]

    macOS 10.13.2
    pyenvのPython 2.7.10（Kivy on iOS等を使用する為）
    
[/code]


CC BY-SA 3.0
2018-01-14T08:44:17.147
40951
2018-07-31T13:37:59.263
2018-07-31T13:37:59.263
19110
26850
question
python python2 kivy
Python 2.7.10 Kivyにてon_key_up、_on_keyboard_up等が使用できない？


ご回答させていただきます。  
Kivyのon_key_upイベントに結び付くメソッドの引数として  
keyboardとkeycodeのみとなります。つまり、text, modifiersを指定する必要はありません。

なので  
`def _on_keyboard_up(self, keyboard, keycode, text, modifiers):`  
ではなく  
`def _on_keyboard_up(self, keyboard, keycode):`  
となります。

APIのリファレンスなどを参考にするとよいかもしれません。  
<https://kivy.org/docs/api-kivy.core.window.html>


CC BY-SA 3.0
2018-01-14T13:19:46.770
40962
2018-01-14T13:19:46.770
26999
40951
answer