0

I am using python-2.7 and kivy-1.9.0.When i run test.py then shows Menu1,Menu2 Menu.
When i click on Menu1 Then shows +Add Menu1 Text . When i click on +Add Menu1 then call function root.add_menu1() . How to make it using ctrl+a keyboard key event instead of mouse click ?
Same if i click on Menu2 then shows +Add Menu2 Text.After that i press ctrl+a key then should be call root.add_menu2()function .

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
Nirdesh Kumawat
  • 386
  • 2
  • 16
  • 56

1 Answers1

4
  1. Combined both methods display_menu1 and display_menu2 to a common method, display_menu.
  2. Renamed both methods add_menu1 and add_menu2 to add_menu.
  3. Added a new ObjectProperty, menu to hook up to either Menu1 or Menu2.
  4. Using a key down binding, check for ctrl+a to invoke add_menu.

Example

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

Output

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

ikolim
  • 15,721
  • 2
  • 19
  • 29