Untuk proyek Kivy pertama saya, saya ingin membuat aplikasi dasar yang akan menyimpan kata sandi saya. Jika Anda mendapatkan kode akses yang salah, akan muncul popup yang mengatakan "Sandi Salah". Setiap kali saya memasukkan kata sandi dengan benar, pertama-tama coba transisi berfungsi tanpa masalah, tetapi jika kata sandi salah dan munculan muncul, setiap upaya selanjutnya akan menghasilkan dua halaman yang tumpang tindih.

Main.py:

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout

class PassWindow(Screen):
    pass

class MainWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class PassPopup(FloatLayout):
    pass

def openPopup():
    show = PassPopup()

    global popupWin
    popupWin = Popup(title="Error", content=show, size_hint=(None, None), size=(400, 400))

    popupWin.open()

def closePopup():
    popupWin.dismiss()



kv = Builder.load_file("my.kv")

class MyApp(App):
    def build(self):
        return kv

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

Saya.kv:

#:import openPopup main.openPopup
#:import closePopup main.closePopup

WindowManager:
    PassWindow:
    MainWindow:

<Button>:
    font_size: 30
    color: 0.33, 0, 0.51, 1

<Label>:
    color: 1, 1, 1, 1

<PassWindow>:
    name: "passWin"
    id: passWin
    Label:
        text: "Password Storage"
        pos_hint: {"top": 1}
        font_size: 50
        size_hint: 1, 0.2

    Label:
        text: "Please Input Code to Access"
        pos_hint: {"top": .8}
        font_size: 50
        size_hint: 1, 0.2

    TextInput:
        id: codeInput
        multiline: False
        password: True
        font_size: 55
        size_hint: 0.6, 0.2
        pos_hint: {"x": .2, "top": .6}

    Button:
        text: "Submit"
        size_hint: 0.5, 0.2
        pos_hint: {"x": .25, "top": .35}
        
        on_release:
            app.root.current = "mainWin" if codeInput.text == "1234" else openPopup()
            app.root.transition.direction = "left"
            codeInput.text = ""

<PassPopup>:
    Label:
        text: "Incorrect Password"
        size_hint: 0.6, 0.2
        pos_hint: {"x": 0.2, "top": 0.8}
        font_size: 30

    Button:
        text: "Close"
        size_hint: 0.8, 0.2
        pos_hint: {"x": 0.1, "top": 0.3}

        on_release:
            closePopup()


<MainWindow>:
    name: "mainWin"

    Button:
        text: "Exit"
        size_hint: 1, 0.2

        on_release: 
            app.root.current = "passWin"
            root.manager.transition.direction = "right"
0
Chrissant 30 Oktober 2020, 00:27

1 menjawab

Jawaban Terbaik

Logika dalam on_release: Anda dari Submit Button salah. Garis:

app.root.current = "mainWin" if codeInput.text == "1234" else openPopup()

Menyetel layar saat ini ke "mainWin" jika kata sandi yang diberikan adalah "1234", jika tidak, layar saat ini akan disetel ke nilai kembalian openPopup() (yaitu Tidak Ada). Saya menduga itulah penyebab perilaku aneh itu. Untuk memperbaikinya, gunakan yang berikut ini untuk on_release:

    on_release:
        if codeInput.text == "1234": app.root.current = "mainWin"
        else: openPopup()
        app.root.transition.direction = "left"
        codeInput.text = ""

Lihat dokumentasi.

1
John Anderson 30 Oktober 2020, 01:56