Kivy, screenmanager, sqlite.切换到新屏幕时,屏幕没有更新



此代码的功能应该是您输入一个值并按下"Add."并将数据保存到sqlite数据库中,然后切换到"下一步";屏幕上。这个屏幕应该显示添加的值列表,但是…我不能使它从数据库更新(包括新的"添加")当你切换屏幕。然后我试着做一个"更新"。按钮。这是有效的,但它是如此恼人,它不更新,因为我切换屏幕。我尝试了" clock .schedule_interval;还有其他一些愚蠢的行为。我真的希望你能帮我解决这个问题

代码由三部分组成。test.py kvtest。Kv和db_test.py

  • test.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()

最新更新