TextInput внезапно перестал работать в приложении Kivy - PullRequest
0 голосов
/ 03 мая 2020

Я создаю простое приложение Kivy с парой экранов. На первом экране есть пара кнопок, которые при нажатии перемещаются на второй экран. На втором экране есть виджет для ввода текста и кнопка внутри Float Layout. Макет загружается как виджет root при явном вызове файла kv через Builder.

Все работало нормально, и я добавил тег 'focus: True' в атрибуты ввода текста. Приложение работало нормально, и я мог ввести текстовое поле ввода с фокусом True. Однако поле ввода текста внезапно перестало работать без каких-либо изменений в коде или макете. Я не был уверен и искал в Google пару вероятных решений, ни одно из которых не сработало:

  1. Удалил атрибут 'focus: True' и перезагрузил приложение, но поле для ввода текста все еще работало не отвечает. Мне не удалось ничего набрать с клавиатуры.

  2. В другом посте указывалось, что файл kv загружался дважды, что приводило к ошибочному поведению c. Я попытался удалить явный вызов файла Builder и вернул виджет root (Screen Manager) в основной код. Однако оно испортило все мое приложение и показало только черный пустой экран.

Не могли бы вы посоветовать, что я могу делать не так? Код указан ниже:

Python Код:

from kivy.config import Config
Config.set('kivy','window_icon','sivaicon.png')
Config.set('graphics', 'resizable', True)
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.lang.builder import Builder


class SivaLoginScreen(Screen):
    def twitter_authentication(self):
        App.get_running_app().root.current='verify_screen'

    def linkedin_authentication(self):
        App.get_running_app().root.current='verify_screen'


class SivaVerifyScreen(Screen):
    pass


class SivaTabbedScreen(Screen):
    pass


class SivaScreenManager(ScreenManager):
    pass


class ImageButton(ButtonBehavior, Image):
    pass


# Tell Kivy to directly load a file. If this file defines a root widget, it will be returned by the method.
root_widget = Builder.load_file('siva.kv')

class SivaApp(App):
    def build(self):
        # Initialize root widget
        return root_widget


if __name__ == '__main__':
    # Run application
    SivaApp().run()

kv файл:

SivaScreenManager:
    SivaLoginScreen:
    SivaVerifyScreen:
    SivaTabbedScreen:


<ImageButton>:
    keep_ratio: True


<SivaLoginScreen>:
    name: 'login_screen'
    canvas.before:
        Color:
            rgba: 195/255, 60/255, 35/255, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        size: root.width, root.height
        Image:
            id: login_logo_siva
            source: 'images/sivalogo1.png'
            keep_ratio: True
            size_hint: 0.3, 0.3
            pos_hint: {'center_x':0.5, 'center_y':0.75}
        Label:
            id: login_label_siva
            pos: self.x*0.5-4, self.y*0.5+15
            markup: True
            font_name: 'roboto/Roboto-Medium.ttf'
            text: '[color=#FDFD98]S.[/color][color=#B29DD9]I[/color][color=#FDFD98].[/color][color=#77DD77]V[/color][color=#FDFD98].[/color][color=#779ECB]A[/color]'
            font_size: '40sp'
        Label:
            id: login_label_slogan1
            pos: self.x*0.5-3, self.y*0.5-6
            markup: True
            font_name: 'roboto/Roboto-Regular.ttf'
            text: '[color=#FDFD98]SLOGAN TEXT[/color]'
            font_size: '13sp'
        Label:
            id: login_label_slogan2
            pos: self.x*0.5-3, self.y*0.5-20
            markup: True
            font_name: 'roboto/Roboto-Regular.ttf'
            text: '[color=#FDFD98]HEADLINE TEXT[/color]'
            font_size: '13sp'
        BoxLayout:
            id:login_button_layout
            orientation: 'horizontal'
            size_hint: 0.2, 0.2
            pos_hint: {'center_x':0.5, 'center_y':0.25}
            ImageButton:
                id: twitter_button
                source: {'normal': 'images/twitter-96.png', 'down': 'images/twitter-96.png'} [self.state]
                on_release: root.twitter_authentication()
            ImageButton:
                id: linkedin_button
                source: {'normal': 'images/linkedin-96.png', 'down': 'images/linkedin-96.png'} [self.state]
                on_release: root.linkedin_authentication()


<SivaVerifyScreen>:
    name: 'verify_screen'
    canvas.before:
        Color:
            rgba: 195/255, 60/255, 35/255, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        size: root.width, root.height
        Label:
            id: verify_label
            markup: True
            font_name: 'roboto/Roboto-Regular.ttf'
            text: 'Paste the verification code'
            font_size: '16sp'
            pos_hint: {'center_x':0.5, 'center_y':0.7}
            size_hint: 1, 0.4
        TextInput:
            id: verify_input
            multiline: False
            font_size: '30sp'
            pos_hint: {'center_x':0.5, 'center_y':0.55}
            size_hint: 0.5, 0.1
        ImageButton:
            id: verify_button
            source: {'normal': 'images/lock-96.png', 'down': 'images/lock-96.png'} [self.state]
            pos_hint: {'center_x':0.5, 'center_y':0.35}
            size_hint: 0.5, 0.5


<SivaTabbedScreen>:
    name: 'tabbed_screen'
    FloatLayout:
        size: root.width, root.height
        Label:
            pos: self.x*0.5, self.y*0.5
            text: 'SECOND SCREEN'
            font_size: '50sp'

Пожалуйста, порекомендуйте. Я беспомощно застрял. : (

Заранее спасибо

1 Ответ

0 голосов
/ 06 мая 2020

Хорошо, вот в чем проблема: некоторые из моих виджетов накладывались друг на друга, что делало виджеты внизу не отвечающими. В моем случае виджет кнопки перекрывал мой виджет ввода текста, из-за чего мне не удалось ввести текст в виджет ввода текста.

Я использовал инструмент инспектора Kivy, чтобы определить размер измерений виджетов:

python3 main.py -m inspector

Используйте Ctrl + e, чтобы запустить инспектор во время работы приложения, и щелкните каждый виджет, чтобы проверить его размер, положение и родительский элемент. Я уменьшил размер виджета кнопки и преобразовал макет с плавающей точкой в ​​макет с накоплением, и это решило проблему.

...