簡體   English   中英

Kivy,屏幕管理器,sqlite。 切換到新屏幕時屏幕不更新

[英]Kivy, screenmanager, sqlite. Screen does not update as I switch to new screen

此代碼的功能應該是您輸入一個值並按“添加”。 並將數據保存到 sqlite 數據庫並切換到“下一步”屏幕。 此屏幕應顯示添加的值列表,但是...當您切換屏幕時,我無法使其從數據庫中更新(包括新的“添加”)。 然后我嘗試制作一個“更新”按鈕。 這可行,但它很煩人,以至於在我切換屏幕時它不會更新。 我嘗試了“Clock.schedule_interval”和其他幾個愚蠢的出軌。 我真的希望你能幫我解決這個問題

代碼分為三部分。 test.py、kvtest.kv 和 db_test.py

  • 測試.py
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.clock import Clock
import db_test

db_test.sq_crea()

print(db_test.sq_crea())


class Main(Screen):
    inp = ObjectProperty(None)
    attempt = 1

    def btn(self):
        self.attempt = self.attempt + 1

        inp = self.inp.text
        db_test.insert_data(inp)
        self.inp.text = f"Attempt {self.attempt}"

        print(inp)


class Next(Screen):

    def out1(self):
        updtdb = self.reset_text()
        self.ids.out1.text = updtdb
        return self.ids.out1.text

    def reset_text(self):
        updtdb = str(db_test.data_out())
        return updtdb

    def up(self):
        Clock.schedule_interval(self.reset_text, 1)


class WindowManager(ScreenManager):
    pass


gui = Builder.load_file("kvtest.kv")


class MainApp(App):
    def build(self):
        access_to_next_class = Next()
        access_to_next_class.out1()
        return gui


if __name__ == "__main__":
    MainApp().run()
  • kvtest.kv
WindowManager:
    Main:
    Next:

<Label>
    font_size : 0.08*self.width
    color: 1,1,1,1
    size_hint: 0.3, 0.1

<Button>
    font_size : 0.08*self.width
    color: 1,1,1,1
    size_hint: 0.3, 0.1

<TextInput>
    font_size : 0.08*self.width
    color: 1,1,1,1
    size_hint: 0.3, 0.1

<Main>
    name: "main"
    inp : inp

    FloatLayout:
        cols:2
        Button:
            text: 'Add to database'
            pos_hint: {"x": 0.1, "bottom": 1}
            on_release:
                root.btn()
                app.root.current = "next"
                root.manager.transition.direction = "left"

        TextInput:
            id:inp
            pos_hint: {"x": 0.5, "bottom": 0.8}
            text: 'Attempt 1'

<Next>
    name: "next"
    FloatLayout:
        Button:
            text: "Back"
            pos_hint: {"x": 0.1, "bottom": 0.8}
            on_release:
                app.root.current = "main"
                root.manager.transition.direction = "right"

        Button:
            id: upd
            text: "Update"
            pos_hint: {"center_x": 0.7, "bottom": 0.8}
            on_release:
                root.out1()

        Label:
            id: out1
            text: root.out1()
            pos_hint: {"x": 0.1, "center_y": 0.5}

  • db_test.py
import sqlite3

def sq_crea():
    conn = sqlite3.connect("db_test.db")
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS db_test(        
        info text NOT NULL     
        )''')
    conn.commit()
    conn.close()
    return 'Connected to db_test.db'




def insert_data(inp):
    with sqlite3.connect("db_test.db") as conn:
        c = conn.cursor()
        c.execute("INSERT INTO db_test(info) VALUES(?)",
                  (inp,))
        conn.commit()


def data_out():
    with sqlite3.connect("db_test.db") as conn:
        c = conn.cursor()
        c.execute("SELECT *, oid FROM db_test")
        conn.commit()
        items = c.fetchall()
        i = 0
        out_list = ""
        for item in items:
            string = items[i][0]
            out_list = f"{out_list} \n {string}"
            i += 1
        return out_list


您可以使用Screenon_enter()方法。 請參閱文檔 例如:

class Next(Screen):

    def on_enter(self, *args):
        self.out1()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM