Python:使用回车键关闭弹出窗口

时间:2018-04-27 09:22:45

标签: python-2.7 kivy kivy-language

如何使用回车键关闭popup.dismiss()。 当我在点击test.py按钮后运行ok然后打开一个弹出窗口。
有人可以告诉我如何使用回车键关闭popup并在关闭弹出设置后{{1}进入focus=True TextInput。

test.py

name

test.kv

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()

1 个答案:

答案 0 :(得分:0)

在下面的示例中,执行了以下步骤:

  1. 使用WindowBase.request_keyboard()返回的键盘界面来检测按下的ENTER或NUMPENTERPAD键。
  2. 使用ObjectProperty连接 TextInput
  3. auto_dismiss 设置为 False ,以便我们调用 dismiss_callback 方法将焦点提供给 TextInput <当弹出消失时,/ em>( id:name )。
  4. Class Alert 已经是 Popup 小部件,您不想创建另一个弹出窗口。
  5.   

    通常认为使用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