首页 > 解决方案 > Kivy 选择焦点

问题描述

我试图让 kivy 在焦点上选择 TextInput 小部件的文本,但是当我尝试它时,它似乎在它取消焦点并保留选择时选择了它。有什么想法我可以在焦点上选择它并在取消焦点时选择它吗?如果有人想玩,我在下面附上了我的代码。

.kv 文件:

<TextInput>:
    size_hint: 0.9, 0.5
    pos_hint: {'center_x': 0.5, 'center_y': 0.5}
    multiline: False

<Button>:
    text: "Press Me"
    size_hint: (0.1, 0.5)
    pos_hint: {'center_x': 0.5, 'center_y': 0.5}

<MainLayout>:
    canvas.before:
        Color:
            rgba: 0.15, 0.15, 0.16, 1
        Rectangle:
            pos: self.pos
            size: self.size

    BoxLayout:
        orientation: 'vertical'
        padding: 10

        BoxLayout:
            padding: 10
            TextInput:
                text: "Directory"
            Button:
                text: "Browse"
                on_press: root.browse_btn()

        BoxLayout:
            padding: 10
            TextInput:
                text: "Prefix"
                on_focus: self.select_all()
            TextInput:
                text: "File"
                on_focus: self.select_all()
            TextInput:
                text: "Suffix"
                on_focus: self.select_all()

        BoxLayout:
            padding: 10
            Button:
                id: button_one
                text: "Confirm"
                on_press: root.confirm_btn()
            Button:
                text: "Cancel"
                on_press: root.cancel_btn()

蟒蛇文件:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.core.window import Window
from kivy.config import Config

Config.set('graphics', 'resizable', 0)


class MainLayout(BoxLayout):
    button_id = ObjectProperty(None)

    def browse_btn(self):
        print("Hey")

    def confirm_btn(self):
        print("Confirm")

    def cancel_btn(self):
        print("Cancel")


class BatchRenameApp(App):
    def build(self):
        self.title = "Batch File Rename"
        Window.size = (750, 250)
        return MainLayout()


if __name__ == '__main__':
    app = BatchRenameApp()
    app.run()

标签: pythonkivykivy-language

解决方案


很好地隐藏在TextInput文档中:

当 TextInput 获得焦点时,选择被取消。如果您需要在 TextInput 获得焦点时显示选择,您应该延迟(使用 Clock.schedule)对用于选择文本的函数(select_all、select_text)的调用。

因此,在您的 中kv,首先导入Clock

#: import Clock kivy.clock.Clock

TextInput然后你可以在规则中使用它:

        TextInput:
            text: "Prefix"
            on_focus: Clock.schedule_once(lambda dt: self.select_all()) if self.focus else None

if self.focus确保只有在获得焦点select_all时才会发生。TextInput


推荐阅读