【问题标题】:Python : Close popup using enter keyPython:使用回车键关闭弹出窗口
【发布时间】:2018-04-27 09:22:44
【问题描述】:

如何使用回车键关闭popup.dismiss()。 当我在单击ok 按钮后运行test.py 然后打开一个弹出窗口。
有人可以告诉我如何使用回车键关闭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()

【问题讨论】:

    标签: python-2.7 kivy kivy-language


    【解决方案1】:

    在下面的示例中,完成了以下步骤:

    1. 使用WindowBase.request_keyboard()返回的键盘界面来检测是否按下了ENTER或NUMPENTERPAD键。
    2. 使用ObjectProperty 连接到TextInput
    3. auto_dismiss 设置为 False 以便我们调用 dismiss_callback 方法将 focus 赋予 TextInput (id: name) 当弹出窗口关闭时。
    4. 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()
    

    输出

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多