Обратный отсчет / таймер для изменения экрана в кивах / питоне - PullRequest
0 голосов
/ 19 января 2020

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

Я пытался использовать Clock из kivy, и я думаю, что он работает, но я ' я получаю сообщение об ошибке:

self.parent.current = "tela_01" 
AttributeError: 'float' object has no attribute 'parent'

Я полагаю, что неправильно пишу ту часть доступа к экрану, которую я хочу go далее. Я видел кучу ответов, видео и учебники о Screen Manager, но ничего не получалось, и я не знаю, что я делаю неправильно. Возможно, потому что я очень плохо знаком с этим языком и еще учусь, но, кажется, так просто.

Чтобы проверить, смогу ли я go на всех экранах, я создал кнопку для проблематики c экран (это комментируется в коде), но я хочу что-то вроде таймера / обратного отсчета, чтобы изменить экран.

.py

import kivy

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.anchorlayout import AnchorLayout
from kivy.core.text import FontContextManager
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Color

#---Screen Manager
class Gerenciador_Telas(ScreenManager):
    pass

#---Opening
class Tela_00(Screen):
#self.parent is the equivalent to app.root
    def switch(self):
        self.parent.current = "tela_01"

    Clock.schedule_once(switch, 2)

#---First Screen
class Tela_01(Screen):
    pass

#---Names Screen
class Tela_02(Screen):

#Save names
    e1n1 = ObjectProperty(None)
    e1n2 = ObjectProperty(None)
    e2n1 = ObjectProperty(None)
    e2n2 = ObjectProperty(None)

    def button(self):
        print(
               "Equipe 1A:", self.e1n1.text,
               "Equipe 1B:", self.e1n2.text,
               "Equipe 2A:", self.e2n1.text,
               "Equipe 2B:", self.e2n2.text
               )
#Clear names
        self.e1n1.text = ""
        self.e1n2.text = ""
        self.e2n1.text = ""
        self.e2n2.text = ""

    pass


#---Score
class Tela_03(Screen):
    pass

#---Add Score
class Tela_04(Screen):
    pass

#---Rules
class Tela_05(Screen):
    pass

#---Run App
iniciar = Builder.load_file("pontos_tranca.kv")

class Pontos_Tranca(App):
    def build(self):
        return iniciar

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

.kv

#:import Clock kivy.clock.Clock

Gerenciador_Telas:
    Tela_00:
    Tela_01:
    Tela_02:
    Tela_03:
    Tela_04:
    Tela_05:

<Tela_00>
    name: "tela_00"

    BoxLayout:
        canvas.before:
            Color:
                rgba: 1, 1, 1, 1
            Rectangle:
                pos: self.pos
                size: self.size
        Image:
            source: "inicial.png"

#    FloatLayout:
#
#        Button:
#            text: "Próximo"
#            background_normal: ""
#            background_color: 0,0,0,1
#            size_hint: .2, .1
#            pos: 325, 50
#            on_release:
#                app.root.current = "tela_01"
#                root.manager.transition.direction = "left"


<Tela_01>
    name: "tela_01"

    GridLayout:
        cols: 1
        size: root.width, root.height
        padding: 200
        spacing: 20

        Label:
            text: "Pontos de Tranca 2.0"

        Button:
            text: "Novo"
            on_release:
                app.root.current = "tela_02"
                root.manager.transition.direction = "left"

        Button:
            text: "Continuar"

        Button:
            text: "Regras"
            on_release:
                app.root.current = "tela_05"
                root.manager.transition.direction = "left"

<Tela_02>
    name: "tela_02"

    e1n1: e1n1
    e1n2: e1n2
    e2n1: e2n1
    e2n2: e2n2

    GridLayout:
        cols: 1
        size: root.width, root.height
        padding: 200, 50, 200, 50
        spacing: 10


        Label:
            text: "Equipe 01"

        TextInput:
            multiline: False
            id: e1n1
        TextInput:
            multiline: False
            id: e1n2


        Label:
            text: "Equipe 02"


        TextInput:
            multiline: False
            id: e2n1
        TextInput:
            multiline: False
            id: e2n2

        Button:
            text: "Prosseguir"
            on_press: root.button()
            on_release:
                app.root.current = "tela_01" if e1n1.text and e1n2.text and e2n1.text and e2n2.text != "" else "tela_03"
                root.manager.transition.direction = "right"

<Tela_03>
    name: "tela_03"

<Tela_04>
    name: "tela_04"

<Tela_05>
    name: "tela_05"

    AnchorLayout:
        padding: 100
        anchor_x: "center"
        anchor_y: "top"

        Label:
            text_size: self.width, None
            text: str("Tranca pode ser jogado um com o outro ou em dupla. São distribuídas 11 cartas para cada jogador, e separados 2 montes de 11 para os mortos, um para cada equipe. O morto é um conjunto de cartas que só podem ser utilizado caso algum jogador da equipe acabe com as cartas de sua mão. Para iniciar uma partida, o primeiro jogador à direita de quem deu as cartas compra uma carta do monte que sobrou e verifica se tem interesse. Caso não queira a carta comprada, ele pode descartar e comprar outra. Para as demais rodadas, o jogador seguinte pode comprar uma carta no monte ou pegar todas as cartas da lixeira, desde que justifique a compra da carta de cima, encaixando-a diretamente em um jogo na mesa, ou juntando com duas cartas ou mais da mão e baixando como um novo jogo. Caso a primeira carta da lixeira seja um 3 preto, não é possível comprá-la, pois essas cartas trancam a mesa. Após o início de cada rodada, o jogador poderá baixar uma combinação de cartas, sendo no mínimo")

    FloatLayout:
        size_hint: .2, .1
        pos: 200, 50

        Button:
            text: "Menu"
            on_release:
                app.root.current = "tela_01"
                root.manager.transition.direction = "right"

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Вы можете использовать событие on_enter, чтобы запустить таймер Clock, добавив метод on_enter() в свой класс Tela_00:

class Tela_00(Screen):
#self.parent is the equivalent to app.root
    def switch(self, *args):
        self.parent.current = "tela_01"

    def on_enter(self, *args):
        # called when this Screen is displayed
        Clock.schedule_once(self.switch, 2)
0 голосов
/ 19 января 2020
class Tela_00(Screen):
#self.parent is the equivalent to app.root
    def switch(self):
        self.parent.current = "tela_01"

    Clock.schedule_once(switch, 2)

Поскольку вы написали Clock.schedule_once вне какого-либо метода или функции, он выполняется сразу же после создания класса. Он автоматически передает аргумент switch, число с плавающей точкой, представляющее время с момента планирования. Вы назвали этот аргумент self. Следовательно, self.parent недопустимо по той причине, которую вы видели.

Необходимо выполнить планирование часов в потоке управления приложением, запланировав метод switch некоторого экземпляра класса.

...