【问题标题】:Lost focus by Enter Key detection (Python-Kivy)输入键检测丢失焦点(Python-Kivy)
【发布时间】:2019-08-02 20:58:06
【问题描述】:

我想提高我的 Python-Kivy 程序的可用性。在下面的程序示例中,我想让用户即使没有鼠标也可以操作它。 (通过键盘输入。) (1)在第一个对话框(MyLayout2)中,用户在文本框中输入很容易,因为文本框有焦点 (2) 按 Enter 键盘键转到下一个对话框 (MyLayout1) (3) 按 Enter 键盘键转到 (1) (MyLayout2 再次) 但是在第二(1),在(3)之后,文本框的焦点丢失了。知道如何解决这个问题吗?

Main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.core.window import Window

sm = ScreenManager()
class MyLayout1(BoxLayout):
    pass

class MyLayout2(BoxLayout):
    pass

class MyScreen(Screen):
    dialog_number = 0
    def __init__(self, **kwargs):
        super(MyScreen, self).__init__(**kwargs)
        self.gridlayout = None
        self.gridlayout = MyLayout2()
        self.add_widget(self.gridlayout)
        Window.bind(on_key_down=self._keydown)

    def _keydown(self,*args):   
        if (args[2] == 40):
            if self.dialog_number == 0:
                self.button2_clicked()
            elif self.dialog_number == 1:
                self.button1_clicked()

    def _create_layout(self):
        if self.gridlayout is not None:
            self.remove_widget(self.gridlayout)
        self.add_widget(self.gridlayout)

    def button1_clicked(self, *args):
        if self.gridlayout is not None:
            self.remove_widget(self.gridlayout)
        self.gridlayout = MyLayout2()
        self.add_widget(self.gridlayout)
        self.dialog_number = 0

    def button2_clicked(self, *args):
        if self.gridlayout is not None:
            self.remove_widget(self.gridlayout)
        self.gridlayout = MyLayout1()
        self.add_widget(self.gridlayout)
        self.dialog_number = 1

    def find_instance(self, layout):
        c = None
        for c in list(self.children):
            if isinstance(c, layout): 
                break
        return c

class myApp(App):
    def build(self):  
        self.anschoi = MyScreen(name = 'anschoi') 
        sm.add_widget(self.anschoi)
        sm.current = 'anschoi'
        return sm

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

我的.kv

<MyScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 10,40,10,40 
        spacing: 40 

<MyLayout1>:
    Button1:
        id: btn1
        text: 'OK or ENTER key'
        on_release: root.parent.button1_clicked()  


<MyLayout2>:
    txtinput: txtinput
    orientation: 'vertical'
    TextInput:
        id: txtinput
        text: ''
        multiline: False
        focus: True
    button2:
        id:Button2
        text: 'OK or ENTER key'
        on_release: root.parent.button2_clicked()  

<Button0@Button>:
<Button1@Button>:
<button2@Button>:

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    这与您之前的问题完全相同。只需更改:

    Window.bind(on_key_down=self._keydown)
    

    到:

    Window.bind(on_key_up=self._keydown)
    

    再次,为了避免 on_key_up 事件(几乎总是在 on_key_down 事件之后)从您的 TextInput 中窃取焦点。

    【讨论】:

    • 太好了,效果很好!非常感谢!!你帮了我两次!
    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多