Python / Kivy:如何在ctrl +键盘事件上调用函数

时间:2018-04-09 06:30:05

标签: python-2.7 kivy kivy-language

我正在使用python-2.7kivy-1.9.0。当我运行test.py时,会显示Menu1Menu2菜单。
当我点击Menu1然后显示+Add Menu1文字。当我点击+Add Menu1然后调用函数root.add_menu1()。如何使用ctrl+a键盘键事件而不是鼠标点击它? 如果我点击Menu2然后显示+Add Menu2文字,则相同。之后按ctrl+a键,然后应调用root.add_menu2()功能。

test.py

import kivy

kivy.require('1.9.0')
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty, ListProperty, ObjectProperty,NumericProperty
from kivy.uix.dropdown import DropDown
from kivy.core.window import Window
Window.maximize()


class MENU1(BoxLayout):

    def add_menu1(self):
        pass


class MENU2(BoxLayout):

    def add_menu2(self):
        pass

class MainMenu(BoxLayout):
    test1_or_test2 = ObjectProperty()
    def display_menu1(self):
        self.remove_widgets()
        self.menu1 = MENU1()
        self.test1_or_test2.add_widget(self.menu1)

    def display_menu2(self):
        self.remove_widgets()
        self.menu2 = MENU2()
        self.test1_or_test2.add_widget(self.menu2)

    def remove_widgets(self):
        self.test1_or_test2.clear_widgets()

class Test(App):
    title = "test"

    def build(self):
        return MainMenu()



if __name__ == '__main__':
    Test().run()

test.kv

<MENU1>:
    BoxLayout:
        orientation: "vertical"

        Button:
            size_hint: .06, .03
            text: "+Add Menu1"
            on_press: root.add_menu1()


        GridLayout:
            size_hint: 1, None
            size_hint_y:None
            height: 25
            cols: 5

        BoxLayout:
            Label:
                text:""

<MENU2>:
    BoxLayout:
        orientation: "vertical"

        Button:
            size_hint: .06, .03
            text: "+Add Menu2"
            on_press: root.add_menu2()


        GridLayout:
            size_hint: 1, None
            size_hint_y:None
            height: 25
            cols: 5

        BoxLayout:
            Label:
                text:""

<MenuButton@Button>:
    text_size: self.size
    valign: "middle"
    padding_x: 5
    size : (80,30)
    size_hint : (None, None)
    background_color: 90 , 90, 90, 90
    background_normal: ''
    color: 0, 0.517, 0.705, 1
    border: (0, 10, 0, 0)


<MainMenu>:
    test1_or_test2: test1_or_test2

    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size

            size_hint_y: 1

            MenuButton:
                id: btn
                text: 'Menu1'
                size : (60,30)
                on_release: root.display_menu1()

            MenuButton:
                id: btn
                text: 'Menu2'
                size : (60,30)
                on_release: root.display_menu2()



        BoxLayout:
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size

                Color:
                    rgb: (1,1,1)

            Label:
                size_hint_x: 45

        BoxLayout:
            id: test1_or_test2
            size_hint_y: 10

        Label:
            size_hint_y: 1

1 个答案:

答案 0 :(得分:2)

  1. display_menu1 display_menu2 两种方法合并到一个常用方法 display_menu
  2. add_menu1 add_menu2 两种方法重命名为 add_menu
  3. 添加了新的 ObjectProperty 菜单以连接 Menu1 Menu2
  4. 使用键向下绑定,检查 ctrl + a 以调用 add_menu
  5. 实施例

    main.py

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import BooleanProperty, ListProperty, ObjectProperty, NumericProperty, StringProperty
    from kivy.uix.dropdown import DropDown
    from kivy.core.window import Window
    Window.maximize()
    
    
    class MENU1(BoxLayout):
    
        def add_menu(self):
            print("MENU1.add_menu")
    
    
    class MENU2(BoxLayout):
    
        def add_menu(self):
            print("MENU2.add_menu")
    
    
    class MainMenu(BoxLayout):
        test1_or_test2 = ObjectProperty(None)
        menu = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(MainMenu, self).__init__(**kwargs)
            Window.bind(on_key_down=self._on_keyboard_down)
    
        def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
            if len(modifiers) > 0 and modifiers[0] == 'ctrl' and text == 'a':  # Ctrl+a
                print("\nThe key", keycode, "have been pressed")
                print(" - text is %r" % text)
                print(" - modifiers are %r" % modifiers)
                self.menu.add_menu()
    
        def display_menu(self, instance):
            self.remove_widgets()
            if instance.text == 'Menu1':
                self.menu = MENU1()
            elif instance.text == 'Menu2':
                self.menu = MENU2()
            self.test1_or_test2.add_widget(self.menu)
    
        def remove_widgets(self):
            self.test1_or_test2.clear_widgets()
    
    
    class Test(App):
        title = "test"
    
        def build(self):
            return MainMenu()
    
    
    if __name__ == '__main__':
        Test().run()
    

    test.kv

    #:kivy 1.10.0
    
    <MENU1>:
        BoxLayout:
            orientation: "vertical"
    
            Button:
                size_hint: .06, .03
                text: "+Add Menu1"
                on_press: root.add_menu()
    
    
            GridLayout:
                size_hint: 1, None
                size_hint_y:None
                height: 25
                cols: 5
    
            BoxLayout:
                Label:
                    text:""
    
    <MENU2>:
        BoxLayout:
            orientation: "vertical"
    
            Button:
                size_hint: .06, .03
                text: "+Add Menu2"
                on_press: root.add_menu()
    
    
            GridLayout:
                size_hint: 1, None
                size_hint_y:None
                height: 25
                cols: 5
    
            BoxLayout:
                Label:
                    text:""
    
    <MenuButton@Button>:
        text_size: self.size
        valign: "middle"
        padding_x: 5
        size : (80,30)
        size_hint : (None, None)
        background_color: 90 , 90, 90, 90
        background_normal: ''
        color: 0, 0.517, 0.705, 1
        border: (0, 10, 0, 0)
    
    
    <MainMenu>:
        test1_or_test2: test1_or_test2
    
        BoxLayout:
            orientation: 'vertical'
    
            BoxLayout:
                canvas.before:
                    Rectangle:
                        pos: self.pos
                        size: self.size
    
                size_hint_y: 1
    
                MenuButton:
                    id: btn
                    text: 'Menu1'
                    size : (60,30)
                    on_release: root.display_menu(self)
    
                MenuButton:
                    id: btn
                    text: 'Menu2'
                    size : (60,30)
                    on_release: root.display_menu(self)
    
            BoxLayout:
                canvas.before:
                    Rectangle:
                        pos: self.pos
                        size: self.size
    
                    Color:
                        rgb: (1,1,1)
    
                Label:
                    size_hint_x: 45
    
            BoxLayout:
                id: test1_or_test2
                size_hint_y: 10
    
            Label:
                size_hint_y: 1
    

    输出

    Img01 - App Startup Img02 - Ctrl+a @ Menu1 Img03 - Ctrl+a @ Menu2