問題描述
大家,
我想使用 kivy+Python
來顯示 db
文件中的項目.
I want to use kivy+Python
to display items from a db
file.
為此,我之前問過一個問題:Python+kivy+SQLite: How一起使用
To this purpose I have asked a question before: Python+kivy+SQLite: How to use them together
鏈接中的應用程序包含一個屏幕.它工作得很好.
The App in the link contains one screen. It works very well.
今天我已將應用程序更改為 兩個 屏幕.第一屏
沒有特殊要求,只是將App引導到第二屏
.在 second screen
中有一個 label
和一個 button
.通過單擊 button
我想更改 label text
.label text
指的是我在上面鏈接中的 db
文件中的 car type
.
Today I have changed the App to two screens. The first screen
has no special requirement but to lead the App to the second screen
. In the second screen
there is a label
and a button
. By clicking the button
I want to have the label text
changed. The label text
refers to the car type
from the db
file that I have in the link above.
對于這兩個屏幕的設計,我有兩個問題:
For this two screens design, I have two questions:
問題一:點擊按鈕
時如何更新label text
?
我嘗試了兩種方法:
方法一: self.ids.label.text = str(text)
它向我顯示了錯誤消息: AttributeError: 'super' object has no attribute '__getattr__'
我用谷歌搜索了很多,但仍然無法理解.
Method A: self.ids.label.text = str(text)
It shows me the error message: AttributeError: 'super' object has no attribute '__getattr__'
I have googled a lot but still cannot understand.
方法B: self.ids["label"].text = str(text)
它向我顯示錯誤消息: KeyError: 'label'
我很困惑,因為我定義了 label
.
Method B: self.ids["label"].text = str(text)
It shows me the error message: KeyError: 'label'
I am confused because I have the label
defined.
問題2:如何將label origin text
設置為一種車型,這樣每次第二屏顯示時,已經有車型顯示了.
Question 2: How to set the label origin text
to one of the car type, so that everytime the second screen is shown, there is already a car type shown.
代碼如下:(db文件
請參考上面的鏈接)
Here is the code: (For the db file
please refer to the link above.)
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
from kivy.properties import NumericProperty, StringProperty, BooleanProperty, ListProperty
from kivy.base import runTouchApp
from kivy.clock import mainthread
import sqlite3
import random
class MyScreenManager(ScreenManager):
def init(self, **kwargs):
super().__init__(**kwargs)
@mainthread # execute within next frame
def delayed():
self.load_random_car()
delayed()
def load_random_car(self):
conn = sqlite3.connect("C:\test.db")
cur = conn.cursor()
cur.execute("SELECT * FROM Cars ORDER BY RANDOM() LIMIT 1;")
currentAll = cur.fetchone()
conn.close()
currentAll = list(currentAll) # Change it from tuple to list
print currentAll
current = currentAll[1]
print current
self.ids.label.text = str(current) # Method A
# self.ids["label"].text = str(current) # Method B
class FirstScreen(Screen):
pass
class SecondScreen(Screen):
pass
root_widget = Builder.load_string('''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
MyScreenManager:
transition: FadeTransition()
FirstScreen:
SecondScreen:
<FirstScreen>:
name: 'first'
BoxLayout:
orientation: 'vertical'
Label:
text: "First Screen"
font_size: 30
Button:
text: 'Go to 2nd Screen'
font_size: 30
on_release: app.root.current = 'second'
<SecondScreen>:
name: 'second'
BoxLayout:
orientation: 'vertical'
Label:
id: label
text: 'click to get a new car' # I want its text changed when the button is clicked everytime. And its original text value should be one of the random car type from the db file.
font_size: 30
Button:
text: 'Click to get a random car'
font_size: 30
on_release: app.root.load_random_car()
''')
class ScreenManager(App):
def build(self):
return root_widget
if __name__ == '__main__':
ScreenManager().run()
我從互聯網上閱讀了很多內容,但我無法全部理解.:-(
I have read a lot from internet, but I cannot understand them all. :-(
請幫助我更正代碼.非常感謝!
Please help me to correct the code. Thank you so much!
推薦答案
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.widget import Widget
Builder.load_string("""
<ScreenX>
BoxLayout:
orientation: 'vertical'
Label:
text: root.label_text
Button:
text: 'Click Me'
on_release: root.on_clicked_button()
""")
class ScreenX(Widget):
label_text = StringProperty("Default Value")
def on_clicked_button(self):
self.label_text = "New Text!"
class MyApp(App):
def build(self):
return ScreenX()
MyApp().run()
通常是你會這樣做的方式......
is typically how you would do this ...
這篇關于Python+kivy+SQLite:如何設置標簽初始值以及如何更新標簽文本?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!