python kivy, почему моя кнопка "enter" с "on_keyboard_down" не работает - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над тем же вопросом из моего предыдущего поста. Теперь я добавил менеджер экрана, и я могу переключаться на разные страницы.

почему моя программа kivy не вызывает функцию из другого класса?

Я все еще не совсем понимаю, что такое OOP с графическим интерфейсом, однако я пробовал следующее, но ни один из них сработало.

Я попытался добавить экземпляр Screen 1 () в основное приложение (), но ничего не получилось. Затем я попытался добавить метод подрядчика init в Screen_1 (), и он говорит, что у меня нет метода сборки. И несколько других идей, которые не сработали вообще.

Затем я понял, что нет никакой связи между Screen_Manager () и Screen_1 (), потому что все мои методы находятся в Screen_1 (), но метод сборки возвращает Screen_Manager (). В моем файле kv есть такой код:

<Screen_Manager>:
    Screen_1:
    Screen_2:

Разве не здесь программа "связывает" класс Screen_Manager () с другими классами?

, если кто-то может помочь Я понимаю, что я не понимаю, и помогите мне исправить мою проблему, это поможет мне узнать о киви. Я понимаю, <> это как применять к правилам, которые имеют 2 виджета экран 1 и экран 2, а также имеют свои собственные правила.

вот мой main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.lang.builder import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.modules import keybinding
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen

class Screen_Manager(ScreenManager):
    pass

class Screen_1(Screen):

    main_display = ObjectProperty()
    text_input = ObjectProperty()

    def plus_1(self):
        self.value = int(self.main_display.text)
        self.main_display.text = str(self.value + 1)

    def minus_1(self):
        self.value = int(self.main_display.text)
        self.main_display.text = str(self.value - 1)

    def up(self):
        self.main_display.text = self.text_input.text
        self.text_input.text = ''

class Keyboard(Widget):

    def __init__(self, instance):
        super().__init__()
        self.a = instance

        self.keyboard = Window.request_keyboard(None, self)
        self.keyboard.bind(on_key_down=self.on_keyboard_down)

    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'enter':
            self.a.up()
        return True

class Screen_2(Screen):
    pass

class MainApp(App):
    def build(self):
        self.title = "Number Control App"
        self.sm = Screen_Manager()
        key = Keyboard(self.sm)
        return self.sm

if __name__=="__main__":
    MainApp().run()

мой файл kv

<Screen_Manager>:
    Screen_1:
    Screen_2:

<Screen_1>:
    name: "first"
    main_display: display_1
    text_input: text_input_1

#------inherenting from BoxLayout
    BoxLayout:
        orientation: "vertical"
  #------begining of conent--
        BoxLayout:
            size_hint_y: 1
       #-nexted content------
            Label:
                id: display_1
                text: "0"
                font_size: "150sp"
                background_color: 0.1, 0.5, 0.6,
    #--------
        BoxLayout:
            size_hint_y: .35
            orientation: "horizontal"
        #-nexted content------
            Button:
                text:  "-"
                font_size : "60sp"
                on_press: root.minus_1()
        #-nexted content------
            Button:
                text: "+"
                font_size : "35sp"
                background_color: (0, 1, 0, 1)
                on_press: root.plus_1()
    #--------
        BoxLayout:
            size_hint_y: .15
            orientation: "horizontal"
        #-nexted content-------
            Button:
                text: "Config"
                size_hint_x: .25
                on_release:
                    root.manager.current = "second"
                    root.manager.transition.direction = "left"
        #-nexted content-------
            TextInput:
                id: text_input_1
                size_hint_x: 1
                hint_text: "Enter your initial # here"
                multiline: False
        #-nexted content-------
            Button:
                text: "Up"
                size_hint_x: .25
                on_press: root.up()

<Screen_2>:
    name: "second"

    Button:
        text: "Go Back"
        on_press:
            app.root.current = "first"
            root.manager.transition.direction = "right"enter code here

еще раз спасибо, что нашли время помочь.

1 Ответ

1 голос
/ 16 апреля 2020

Не уверен, что я понимаю ваш вопрос, но нажатие Enter в вашем TextInput выполнило ваш код:

self.a.up()

, но a в вашем KeyBoard - это Screen_Manager, как установлено в строка:

    self.sm = Screen_Manager()
    key = Keyboard(self.sm)

и Screen_Manager не имеет метода up. Это можно исправить, изменив код в KeyBoard коде на:

self.a.current_screen.up()

Обратите внимание, что это будет работать, только если текущий экран Screen_1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...