Yang ingin saya lakukan adalah menunjukkan layar pertama dengan gambar selama 2 detik dan kemudian beralih ke layar lain.

Saya mencoba menggunakan Jam dari kivy, dan saya pikir itu berfungsi, tetapi saya menerima kesalahan:

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

Yang saya kira saya salah menulis bagian akses ke layar yang ingin saya tuju selanjutnya. Saya melihat banyak jawaban, video, dan tutorial tentang Screen Manager, tetapi tidak ada yang berhasil dan saya tidak tahu apa yang saya lakukan salah. Mungkin karena saya sangat baru dalam bahasa ini dan belum belajar, tetapi tampaknya sangat sederhana.

Untuk menguji apakah saya bisa pergi ke semua layar, saya membuat tombol untuk layar yang bermasalah (dikomentari dalam kode), tetapi saya ingin sesuatu seperti penghitung waktu/hitung mundur untuk mengubah layar.

.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"

Terima kasih sebelumnya atas bantuan apa pun!

1
Rodrigo Gobatto 19 Januari 2020, 02:44

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan peristiwa on_enter untuk memulai pewaktu Clock dengan menambahkan metode on_enter() ke kelas Tela_00 Anda:

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
John Anderson 19 Januari 2020, 03:29
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)

Karena Anda menulis Clock.schedule_once di luar metode atau fungsi apa pun, itu langsung dieksekusi saat kelas dibuat. Secara otomatis meneruskan argumen ke switch, float yang mewakili waktu sejak penjadwalan. Anda telah menamai argumen itu self. Oleh karena itu, self.parent tidak valid untuk alasan yang Anda lihat.

Anda perlu melakukan penjadwalan jam dalam alur kontrol aplikasi, menjadwalkan metode switch dari beberapa instance kelas.

0
inclement 18 Januari 2020, 23:51