Python: закрыть всплывающее окно, используя клавишу ввода - PullRequest
0 голосов
/ 27 апреля 2018

Как отклонить popup.dismiss() с помощью клавиши ввода. когда я запускаю test.py после нажатия кнопки ok, затем открываю всплывающее окно.
Может кто-нибудь сказать мне, как закрыть popup, используя клавишу ввода, и после закрытия всплывающего окна установить focus=True в name TextInput.

test.py

import kivy

kivy.require('1.9.0')  # replace with your current kivy version !
from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout

Window.size = (500, 150)


class TestScreen(Screen):

    def insert_data(self):
        Alert(title='yeah!', text='inputs are invalid')

class Alert(Popup):

    def __init__(self, title, text):
        super(Alert, self).__init__()

        box = BoxLayout(orientation='vertical', padding=(5))
        box.add_widget(Label(text=text))
        btn1 = Button(text="Close")
        box.add_widget(btn1)

        popup = Popup(title=title, title_size=(30),
                      title_align='center', content=box,
                      size_hint=(None, None), size=(300, 200),
                      auto_dismiss=True)

        btn1.bind(on_press=popup.dismiss)
        popup.open()


class Test(App):
    def build(self):
        self.root = Builder.load_file('test.kv')
        return self.root



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

test.kv

TestScreen:

    GridLayout:
        cols: 2
        padding: 30, 30
        spacing: 10, 10
        row_default_height: '30dp'

        Label:
            text: 'Name'
            text_size: self.size
            valign: 'middle'
            #padding_x: 50

        TextInput:
            id: name

        Button:
            text: 'Ok'
            on_press: root.insert_data()

        Button:
            text: 'Cancel'
            on_press: app.stop()

1 Ответ

0 голосов
/ 27 апреля 2018

В приведенном ниже примере были выполнены следующие шаги:

  1. Используйте интерфейс клавиатуры, возвращаемый WindowBase.request_keyboard () , чтобы обнаружить нажатие клавиши ENTER или NUMPENTERPAD.
  2. Используйте ObjectProperty для подключения к TextInput .
  3. Установите auto_dismiss на False , чтобы мы вызывали dismiss_callback метод для focus на TextInput ( id: name ) когда всплывающее окно закрывается.
  4. Class Alert уже является виджетом Popup , и вы не хотите создавать другое всплывающее окно.

обычно считается «наилучшей практикой» использования ObjectProperty. Это создает прямую ссылку, обеспечивает более быстрый доступ и более Явный.

Пример

main.py

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

Window.size = (500, 150)


class TestScreen(Screen):
    name = ObjectProperty(None)

    def insert_data(self):
        Alert(title='yeah!', text='inputs are invalid')


class Alert(Popup):

    def __init__(self, title, text):
        super(Alert, self).__init__()
        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)

        box = BoxLayout(orientation='vertical', padding=(5))
        box.add_widget(Label(text=text))
        btn1 = Button(text="Close")
        box.add_widget(btn1)

        self.title = title
        self.title_size = 30
        self.title_align = 'center'
        self.content = box
        self.size_hint = (None, None)
        self.size = (300, 200)
        self.auto_dismiss = False

        btn1.bind(on_press=self.dismiss_callback)
        self.open()

    def _keyboard_closed(self):
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] in ('enter', 'numpadenter'):
            print("keycode=", keycode)
            self.dismiss_callback()

        # Keycode is composed of an integer + a string
        # If we hit escape, release the keyboard
        if keycode[1] == 'escape':
            keyboard.release()

        # Return True to accept the key. Otherwise, it will be used by
        # the system.
        return True

    def dismiss_callback(self, instance=None):
        self.dismiss()
        App.get_running_app().root.name.focus = True


class Test(App):
    def build(self):
        self.root = Builder.load_file('test.kv')
        return self.root


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

выход

Img01 - Text entered Img02 - ENTER pressed Img03 - NUMPENTERPAD pressed

...