![](/img/trans.png)
[英]Why does Kivy ScreenManager not recognize my screen in Kivy?
[英]Kivy, screenmanager, sqlite. Screen does not update as I switch to new screen
此代碼的功能應該是您輸入一個值並按“添加”。 並將數據保存到 sqlite 數據庫並切換到“下一步”屏幕。 此屏幕應顯示添加的值列表,但是...當您切換屏幕時,我無法使其從數據庫中更新(包括新的“添加”)。 然后我嘗試制作一個“更新”按鈕。 這可行,但它很煩人,以至於在我切換屏幕時它不會更新。 我嘗試了“Clock.schedule_interval”和其他幾個愚蠢的出軌。 我真的希望你能幫我解決這個問題
代碼分為三部分。 test.py、kvtest.kv 和 db_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()
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}
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
您可以使用Screen
的on_enter()
方法。 請參閱文檔。 例如:
class Next(Screen):
def on_enter(self, *args):
self.out1()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.