python数据库列表显示,如何从数据库中获取数据并在kivy + python中显示在表中

list.py

import kivy

kivy.require('1.9.0') # replace with your current kivy version !

import sqlite3 as lite

from kivy.uix.screenmanager import Screen

from kivy.app import App

from kivy.lang import Builder

from kivy.uix.boxlayout import BoxLayout

from kivy.core.window import Window

Window.clearcolor = (0, 0.517, 0.705, 1)

Window.size = (500, 330)

from easygui import msgbox

con = lite.connect('demo.db')

con.text_factory = str

cur = con.cursor()

class TestScreen(Screen):

pass

def get_user(self):

cur.execute("SELECT * FROM `user` order by id asc")

self.rows = cur.fetchall()

print(self.rows)

class List(App):

def build(self):

self.root = Builder.load_file('list.kv')

return TestScreen().get_user()

if __name__ == '__main__':

List().run()

above code fetch result but i dont know how to list like table

How to retrieve data from database and list in table like

id Name

1 abc

2 def

When click on row then it show in new window contain text type with edit value.

Thanks in advance

解决方案

The solution is to use RecycleView with SelectableButton, SelectableRecycleGridLayout, Popup and TextInput. Please refer to the example below for details.

Example

main.py

import sqlite3

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout

from kivy.uix.recycleview.views import RecycleDataViewBehavior

from kivy.uix.button import Button

from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty

from kivy.uix.recyclegridlayout import RecycleGridLayout

from kivy.uix.behaviors import FocusBehavior

from kivy.uix.recycleview.layout import LayoutSelectionBehavior

from kivy.uix.popup import Popup

class TextInputPopup(Popup):

obj = ObjectProperty(None)

obj_text = StringProperty("")

def __init__(self, obj, **kwargs):

super(TextInputPopup, self).__init__(**kwargs)

self.obj = obj

self.obj_text = obj.text

class SelectableRecycleGridLayout(FocusBehavior, LayoutSelectionBehavior,

RecycleGridLayout):

''' Adds selection and focus behaviour to the view. '''

class SelectableButton(RecycleDataViewBehavior, Button):

''' Add selection support to the Button '''

index = None

selected = BooleanProperty(False)

selectable = BooleanProperty(True)

def refresh_view_attrs(self, rv, index, data):

''' Catch and handle the view changes '''

self.index = index

return super(SelectableButton, self).refresh_view_attrs(rv, index, data)

def on_touch_down(self, touch):

''' Add selection on touch down '''

if super(SelectableButton, self).on_touch_down(touch):

return True

if self.collide_point(*touch.pos) and self.selectable:

return self.parent.select_with_touch(self.index, touch)

def apply_selection(self, rv, index, is_selected):

''' Respond to the selection of items in the view. '''

self.selected = is_selected

def on_press(self):

popup = TextInputPopup(self)

popup.open()

def update_changes(self, txt):

self.text = txt

class RV(BoxLayout):

data_items = ListProperty([])

def __init__(self, **kwargs):

super(RV, self).__init__(**kwargs)

self.get_users()

def get_users(self):

connection = sqlite3.connect("demo.db")

cursor = connection.cursor()

cursor.execute("SELECT * FROM Users ORDER BY UserID ASC")

rows = cursor.fetchall()

# create data_items

for row in rows:

for col in row:

self.data_items.append(col)

class TestApp(App):

title = "Kivy RecycleView & SQLite3 Demo"

def build(self):

return RV()

if __name__ == "__main__":

TestApp().run()

test.kv

#:kivy 1.10.0

:

title: "Popup"

size_hint: None, None

size: 400, 400

auto_dismiss: False

BoxLayout:

orientation: "vertical"

TextInput:

id: txtinput

text: root.obj_text

Button:

size_hint: 1, 0.2

text: "Save Changes"

on_release:

root.obj.update_changes(txtinput.text)

root.dismiss()

Button:

size_hint: 1, 0.2

text: "Cancel Changes"

on_release: root.dismiss()

:

# Draw a background to indicate selection

canvas.before:

Color:

rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)

Rectangle:

pos: self.pos

size: self.size

:

BoxLayout:

orientation: "vertical"

GridLayout:

size_hint: 1, None

size_hint_y: None

height: 25

cols: 2

Label:

text: "User ID"

Label:

text: "User Name"

BoxLayout:

RecycleView:

viewclass: 'SelectableButton'

data: [{'text': str(x)} for x in root.data_items]

SelectableRecycleGridLayout:

cols: 2

default_size: None, dp(26)

default_size_hint: 1, None

size_hint_y: None

height: self.minimum_height

orientation: 'vertical'

multiselect: True

touch_multiselect: True

Output

w7oC3.png

ndski.png

r2cEc.png

7v3co.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值