python - 输入键检测丢失焦点(Python-Kivy)
问题描述
我想提高我的 Python-Kivy 程序的可用性。在下面的程序示例中,我想让用户即使没有鼠标也可以操作它。(通过键盘输入。)(1)在第一个对话框(MyLayout2)中,用户在文本框中轻松输入,因为文本框有焦点(2)按 Enter 键盘键转到下一个对话框(MyLayout1)(3)按 Enter 键盘键转到(1)(再次MyLayout2)但是在第2(1)中,在(3)之后,Textbox的焦点丢失了。知道如何解决这个问题吗?
主文件
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>:
解决方案
这与您之前的问题完全相同。只是改变:
Window.bind(on_key_down=self._keydown)
到:
Window.bind(on_key_up=self._keydown)
同样,为了避免on_key_up
事件(几乎总是在on_key_down
事件之后)从你的TextInput
.
推荐阅读
- javascript - 在 Vue JS 组件中使用同步的两种方式 prop 数据绑定
- sql - SSRS。如何将多个参数之一传递给钻取报表?
- mysql - 如何获取每天的时间并在日期范围之间的查询中计算它?
- python - 在线程中拥有具有队列优势的双端队列
- python - 从 Python 中的视频元数据 (MXF) 获取视频时长
- r - 将对数正态分布采样为精确均值和 sd
- powershell - Pester如何模拟“测试存在(未找到)-创建-再次测试以确认创建”模式中的“测试”功能?
- python-3.x - 使用蒙版更改 BGR 图像颜色?
- html - 如何编写正则表达式以删除具有不同措辞的简码
- python - 格式化乘法表