mirror of https://github.com/kivy/kivy.git
Added custom keyboard example
This commit is contained in:
parent
a5b19f1558
commit
435729f2f2
|
@ -0,0 +1,3 @@
|
|||
title=Keyboard
|
||||
author=ZenCODE
|
||||
orientation=landscape
|
|
@ -0,0 +1,221 @@
|
|||
"""
|
||||
Custom Keyboards
|
||||
================
|
||||
|
||||
This demo shows how to create and display custom keyboards on screen. Note that
|
||||
the new "layout" property of the TextInput means that this is rarely needed.
|
||||
We provide this demo for the sake of completeness.
|
||||
"""
|
||||
# Author: Zen-CODE
|
||||
from kivy.app import App
|
||||
from kivy.lang import Builder
|
||||
from kivy.core.window import Window
|
||||
from kivy.uix.vkeyboard import VKeyboard
|
||||
from kivy.properties import ObjectProperty
|
||||
from kivy.uix.button import Button
|
||||
from functools import partial
|
||||
from kivy.config import Config
|
||||
from kivy.uix.screenmanager import Screen, ScreenManager
|
||||
from kivy import require
|
||||
|
||||
# This example uses features introduced in Kivy 1.8.0, namely being able to load
|
||||
# custom json files from the app folder
|
||||
require("1.8.0")
|
||||
|
||||
Builder.load_string(
|
||||
'''
|
||||
<KeyboardScreen>:
|
||||
displayLabel: displayLabel
|
||||
kbContainer: kbContainer
|
||||
BoxLayout:
|
||||
orientation: 'vertical'
|
||||
Label:
|
||||
size_hint_y: 0.15
|
||||
text: "Available Keyboard Layouts"
|
||||
BoxLayout:
|
||||
id: kbContainer
|
||||
size_hint_y: 0.2
|
||||
orientation: "horizontal"
|
||||
padding: 10
|
||||
Label:
|
||||
id: displayLabel
|
||||
size_hint_y: 0.15
|
||||
markup: True
|
||||
text: "[b]Key pressed[/b] - None"
|
||||
halign: "center"
|
||||
Button:
|
||||
text: "Back"
|
||||
size_hint_y: 0.1
|
||||
on_release: root.parent.current = "mode"
|
||||
Widget:
|
||||
# Just a space taker to allow for the popup keyboard
|
||||
size_hint_y: 0.5
|
||||
|
||||
<ModeScreen>:
|
||||
center_label: center_label
|
||||
mode_spinner: mode_spinner
|
||||
FloatLayout:
|
||||
BoxLayout:
|
||||
orientation: "vertical"
|
||||
size_hint: 0.8, 0.8
|
||||
pos_hint: {"x": 0.1, "y": 0.1}
|
||||
padding: "5sp"
|
||||
spacing: "5sp"
|
||||
Label:
|
||||
canvas:
|
||||
Color:
|
||||
rgba: 0, 0, 1, 0.3
|
||||
Rectangle:
|
||||
pos: self.pos
|
||||
size: self.size
|
||||
|
||||
text: "Custom Keyboard Demo"
|
||||
size_hint_y: 0.1
|
||||
Label:
|
||||
id: center_label
|
||||
markup: True
|
||||
size_hint_y: 0.6
|
||||
BoxLayout:
|
||||
orientation: "horizontal"
|
||||
size_hint_y: 0.1
|
||||
padding: "5sp"
|
||||
Widget:
|
||||
size_hint_x: 0.2
|
||||
Label:
|
||||
text: "Current keyboard mode :"
|
||||
Spinner:
|
||||
id: mode_spinner
|
||||
values: "''", "'dock'", "'system'", "'systemanddock'",\
|
||||
"'systemandmulti'"
|
||||
Button:
|
||||
text: "Set"
|
||||
on_release: root.set_mode(mode_spinner.text)
|
||||
Widget:
|
||||
size_hint_x: 0.2
|
||||
Widget:
|
||||
size_hint_y: 0.1
|
||||
BoxLayout:
|
||||
orientation: "horizontal"
|
||||
size_hint_y: 0.1
|
||||
Button:
|
||||
text: "Exit"
|
||||
on_release: exit()
|
||||
Button:
|
||||
text: "Continue"
|
||||
on_release: root.next()
|
||||
|
||||
''')
|
||||
|
||||
|
||||
class ModeScreen(Screen):
|
||||
"""
|
||||
Present the option to change keyboard mode and warn of system-wide
|
||||
consequences.
|
||||
"""
|
||||
center_label = ObjectProperty()
|
||||
mode_spinner = ObjectProperty()
|
||||
|
||||
keyboard_mode = ""
|
||||
|
||||
def on_pre_enter(self, *args):
|
||||
""" Detect the current keyboard mode and set the text of the main
|
||||
label accordingly. """
|
||||
|
||||
self.keyboard_mode = Config.get("kivy", "keyboard_mode")
|
||||
self.mode_spinner.text = "'{0}'".format(self.keyboard_mode)
|
||||
|
||||
p1 = "Current keyboard mode: '{0}'\n\n".format(self.keyboard_mode)
|
||||
if self.keyboard_mode in ['dock', 'system', 'systemanddock']:
|
||||
p2 = "You have the right setting to use this demo.\n\n"
|
||||
else:
|
||||
p2 = "You need the keyboard mode to 'dock', 'system' or '"\
|
||||
"'systemanddock'(below)\n in order to "\
|
||||
"use custom onscreen keyboards.\n\n"
|
||||
|
||||
p3 = "[b][color=#ff0000]Warning:[/color][/b] This is a system-wide " \
|
||||
"setting and will affect all Kivy apps. If you change the\n" \
|
||||
" keyboard mode, please use this app" \
|
||||
" to reset this value to it's original one."
|
||||
|
||||
self.center_label.text = "".join([p1, p2, p3])
|
||||
|
||||
def set_mode(self, mode):
|
||||
""" Sets the keyboard mode to the one specified """
|
||||
Config.set("kivy", "keyboard_mode", mode.replace("'", ""))
|
||||
Config.write()
|
||||
self.center_label.text = "Please restart the application for this\n" \
|
||||
"setting to take effect."
|
||||
|
||||
def next(self):
|
||||
""" Continue to the main screen """
|
||||
self.manager.switch_to(KeyboardScreen())
|
||||
|
||||
|
||||
class KeyboardScreen(Screen):
|
||||
"""
|
||||
Screen containing all the available keyboard layouts. Clicking the buttons
|
||||
switches to these layouts.
|
||||
"""
|
||||
displayLabel = ObjectProperty()
|
||||
kbContainer = ObjectProperty()
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(KeyboardScreen, self).__init__(**kwargs)
|
||||
self._add_keyboards()
|
||||
self._keyboard = None
|
||||
|
||||
def _add_keyboards(self):
|
||||
""" Add a buttons for each available keyboard layout. When clicked,
|
||||
the buttons will change the keyboard layout to the one selected. """
|
||||
layouts = VKeyboard().available_layouts.keys()
|
||||
layouts.append("numeric.json") # Add the file in our app directory
|
||||
# Note the .json extension is required
|
||||
for key in layouts:
|
||||
self.kbContainer.add_widget(
|
||||
Button(
|
||||
text=key,
|
||||
on_release=partial(self.set_layout, key)))
|
||||
|
||||
def set_layout(self, layout, button):
|
||||
""" Change the keyboard layout to the one specified by *layout*. """
|
||||
kb = Window.request_keyboard(
|
||||
self._keyboard_close, self)
|
||||
if kb.widget:
|
||||
# If the current configuration supports Virtual Keyboards, this
|
||||
# widget will be a kivy.uix.vkeyboard.VKeyboard instance.
|
||||
self._keyboard = kb.widget
|
||||
self._keyboard.layout = layout
|
||||
else:
|
||||
self._keyboard = kb
|
||||
|
||||
self._keyboard.bind(on_key_down=self.key_down,
|
||||
on_key_up=self.key_up)
|
||||
|
||||
def _keyboard_close(self, *args):
|
||||
""" The active keyboard is being closed. """
|
||||
if self._keyboard:
|
||||
self._keyboard.unbind(on_key_down=self.key_down)
|
||||
self._keyboard.unbind(on_key_up=self.key_up)
|
||||
self._keyboard = None
|
||||
|
||||
def key_down(self, keyboard, keycode, text, modifiers):
|
||||
""" The callback function that catches keyboard events. """
|
||||
self.displayLabel.text = "Key pressed - {0}".format(text)
|
||||
|
||||
def key_up(self, keyboard, keycode, text, modifiers):
|
||||
""" The callback function that catches keyboard events. """
|
||||
self.displayLabel.text += " (up {0})".format(text)
|
||||
|
||||
|
||||
class KeyboardDemo(App):
|
||||
sm = None # The root screen manager
|
||||
|
||||
def build(self):
|
||||
self.sm = ScreenManager()
|
||||
self.sm.add_widget(ModeScreen(name="mode"))
|
||||
self.sm.add_widget(KeyboardScreen(name="keyboard"))
|
||||
self.sm.current = "mode"
|
||||
return self.sm
|
||||
|
||||
if __name__ == "__main__":
|
||||
KeyboardDemo().run()
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"title" : "Numeric",
|
||||
"description" : "A numeric keypad",
|
||||
"cols" : 3,
|
||||
"rows": 4,
|
||||
"normal_1": [
|
||||
["7", "7", "7", 1],
|
||||
["8", "8", "8", 1],
|
||||
["9", "9", "9", 1]],
|
||||
"normal_2": [
|
||||
["4", "4", "4", 1],
|
||||
["5", "5", "5", 1],
|
||||
["6", "6", "6", 1]],
|
||||
"normal_3": [
|
||||
["1", "1", "1", 1],
|
||||
["2", "2", "2", 1],
|
||||
["3", "3", "3", 1]],
|
||||
"normal_4": [
|
||||
["0", "0", "0", 1],
|
||||
[".", ".", ".", 1],
|
||||
["\u232b", null, "backspace", 1]],
|
||||
"shift_1": [
|
||||
["7", "7", "7", 1],
|
||||
["8", "8", "8", 1],
|
||||
["9", "9", "9", 1]],
|
||||
"shift_2": [
|
||||
["4", "4", "4", 1],
|
||||
["5", "5", "5", 1],
|
||||
["6", "6", "6", 1]],
|
||||
"shift_3": [
|
||||
["1", "1", "1", 1],
|
||||
["2", "2", "2", 1],
|
||||
["3", "3", "3", 1]],
|
||||
"shift_4": [
|
||||
["0", "0", "0", 1],
|
||||
[".", ".", ".", 1],
|
||||
["\u232b", null, "backspace", 1]]
|
||||
}
|
Loading…
Reference in New Issue