如何获取字典值的Python列表并在Kivy UI中显示为表格(使用ListView窗口小部件)?

克鲁萨德杰克

背景:我正在Red Hat Linux 6上使用Python 2.7.10进行安装。我安装了Kivy 1.9.2,并且正在开发一个应用程序,该应用程序将显示Oracle数据库表中的一些数据。我正在使用cx_Oracle连接和查询我的Oracle数据库。

当前,我能够查询数据库并返回将要转换为字典列表的元组列表。

有关要在ListView小部件中显示的值的字典,请参见下面的“图1”。

问题:我花了一些时间进行搜索,并在以下链接中参考了Kivy的ListProperty,DictProperty以及ListAdapter和DictAdapter的文档:https ://kivy.org/docs/api-kivy.properties.html

https://kivy.org/docs/api-kivy.adapters.adapter.html

我无法在此处找到解释我正在使用的确切案例的资源:

我有一个字典关键字列表,我要返回的数据库中每一行的值对。如何获取字典关键字,值对的列表,并成功显示为ListItemLabels,其格式类似于从数据库返回的结果?

错误:我收到的错误是ValueError: too many values to unpack可以在下面的“图4”中看到的

请让我知道其他信息可能会有帮助。谢谢

=====================================

图1-字典值列表

[{'PLAYER_NAME': 'NAME', 'LOST': 'LOST', 'GP': 'GP', 'CAR': 'CAR', 'LNG': 'LNG', 'TEAM': 'Nebraska', 'YDSG': 'YDS/G', 'TD': 'TD', 'FUM': 'FUM', 'YDS': 'YDS'},
{'PLAYER_NAME': 'Homerecord', 'LOST': '0', 'GP': '7', 'CAR': '262', 'LNG': '55', 'TEAM': 'Nebraska', 'YDSG': '174.3', 'TD': '14', 'FUM': '0', 'YDS': '1220'},
{'PLAYER_NAME': 'Awayrecord', 'LOST': '0', 'GP': '5', 'CAR': '172', 'LNG': '69', 'TEAM': 'Nebraska', 'YDSG': '158.8', 'TD': '6', 'FUM': '0', 'YDS': '794'},
{'PLAYER_NAME': 'vsAPrankedteams', 'LOST': '0', 'GP': '2', 'CAR': '74', 'LNG': '21', 'TEAM': 'Nebraska', 'YDSG': '158', 'TD': '5', 'FUM': '0', 'YDS': '316'},
{'PLAYER_NAME': 'vsUSArankedteams', 'LOST': '0', 'GP': '2', 'CAR': '74', 'LNG': '21', 'TEAM': 'Nebraska', 'YDSG': '158', 'TD': '5', 'FUM': '0', 'YDS': '316'},
{'PLAYER_NAME': 'vs.ConferenceTeams', 'LOST': '0', 'GP': '8', 'CAR': '289', 'LNG': '69', 'TEAM': 'Nebraska', 'YDSG': '154.4', 'TD': '15', 'FUM': '0', 'YDS': '1235'},
{'PLAYER_NAME': 'vs.non-ConferenceTeams', 'LOST': '0', 'GP': '4', 'CAR': '145', 'LNG': '32', 'TEAM': 'Nebraska', 'YDSG': '194.8', 'TD': '5', 'FUM': '0', 'YDS': '779'},
{'PLAYER_NAME': 'Inwins', 'LOST': '0', 'GP': '5', 'CAR': '189', 'LNG': '69', 'TEAM': 'Nebraska', 'YDSG': '211.2', 'TD': '10', 'FUM': '0', 'YDS': '1056'},
{'PLAYER_NAME': 'Inlosses', 'LOST': '0', 'GP': '7', 'CAR': '245', 'LNG': '55', 'TEAM': 'Nebraska', 'YDSG': '136.9', 'TD': '10', 'FUM': '0', 'YDS': '958'},
{'PLAYER_NAME': 'September', 'LOST': '0', 'GP': '4', 'CAR': '145', 'LNG': '32', 'TEAM': 'Nebraska', 'YDSG': '194.8', 'TD': '5', 'FUM': '0', 'YDS': '779'},
{'PLAYER_NAME': 'October', 'LOST': '0', 'GP': '5', 'CAR': '177', 'LNG': '69', 'TEAM': 'Nebraska', 'YDSG': '149', 'TD': '9', 'FUM': '0', 'YDS': '745'},
{'PLAYER_NAME': 'November', 'LOST': '0', 'GP': '3', 'CAR': '112', 'LNG': '38', 'TEAM': 'Nebraska', 'YDSG': '163.3', 'TD': '6', 'FUM': '0', 'YDS': '490'},
{'PLAYER_NAME': 'Finalmargin0-7', 'LOST': '0', 'GP': '6', 'CAR': '214', 'LNG': '55', 'TEAM': 'Nebraska', 'YDSG': '153.8', 'TD': '9', 'FUM': '0', 'YDS': '923'},
{'PLAYER_NAME': 'Finalmargin8-14', 'LOST': '0', 'GP': '3', 'CAR': '106', 'LNG': '28', 'TEAM': 'Nebraska', 'YDSG': '152', 'TD': '5', 'FUM': '0', 'YDS': '456'},
{'PLAYER_NAME': 'Finalmargin15+', 'LOST': '0', 'GP': '3', 'CAR': '114', 'LNG': '69', 'TEAM': 'Nebraska', 'YDSG': '211.7', 'TD': '6', 'FUM': '0', 'YDS': '635'}]

图2-我正在使用的Python代码

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.listview import * #ListItemLabel, ListItemButton
from kivy.lang import Builder
from kivy.properties import *
from kivy.event import *
import cx_Oracle
import os
import json
from decimal import Decimal
os.environ["ORACLE_HOME"] = "/u01/app/oracle..." #related to cx_Oracle
os.environ["LD_LIBRARY_PATH"] = "/u01/app/oracle..." #related to cx_Oracle
print(os.environ["ORACLE_HOME"])
print(os.environ["LD_LIBRARY_PATH"])


class TabData(TabbedPanel): #Root Widget
    first = ListProperty()
    search_input = ObjectProperty()

    def on_enter(self):
        self.return_data()

    def query(self):
        search = TabData()
        con = cx_Oracle.connect('SCOTT/*******@localhost/j1db') #cx_Oracle connection object
        cur = con.cursor()
        statement = 'select * from FBS_SPLT_RUSH where TEAM = :t'
        exe = cur.execute(statement, {'t': str(self.search_input.text)})
        columns = [i[0] for i in cur.description]
        exe2 = [dict(zip(columns, row)) for row in cur]
        return exe2

    def return_data(self):
        for row in self.query():
            self.first.append(row)

        print(self.first)
        print self.search_input
        return self.first

    def args_converter(self, index, data_item):
        key, value = data_item
        for key, value in data_item:
            return {'text': (key, value)}


class TeamStatsApp(App):
    def build(self):
        return Builder.load_file('/usr/games/team stats/TeamStats.kv')

if __name__ == '__main__':
    TeamStatsApp().run()

图3-我设置的.kv kivy文件显示ListView和其他一些小部件

#: kivy 1.0
#: import main main
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import DictAdapter kivy.adapters.dictadapter.DictAdapter
#: import sla kivy.adapters.simplelistadapter
#: import Label kivy.uix.label
#: import ListItemLabel kivy.uix.listview.ListItemLabel
#: import ListItemButton kivy.uix.listview.ListItemButton
#: import CompositeListItem kivy.uix.listview.CompositeListItem
#: import ut kivy.utils

TabData:
    id: rootrun
    do_default_tab: False
    search_input: search_box
    TabbedPanelItem:
        text: "hello"
        BoxLayout:
            orientation: "vertical"
            TextInput:
                id: search_box
                focus: True
                size_hint_y: .1
                multiline: False
                on_text_validate: root.on_enter()
            Button:
                size_hint_y: .1
                text: "Return"
                on_press: root.return_data()
            GridLayout:
                cols: 5
                ListView:
                    adapter:
                        ListAdapter(data=root.first, cls=ListItemButton, args_converter=root.args_converter)

图4-运行此代码后出现错误日志

[ [1;32mINFO [0m   ] [Base        ] Leaving application in progress...

 Traceback (most recent call last):
   File "/usr/games/team stats/main.py", line 57, in <module>
     TeamStatsApp().run()
   File "/usr/local/lib/python2.7/site-packages/kivy/app.py", line 828, in run
     runTouchApp()
   File "/usr/local/lib/python2.7/site-packages/kivy/base.py", line 487, in runTouchApp
     EventLoop.window.mainloop()
   File "/usr/local/lib/python2.7/site-packages/kivy/core/window/window_sdl2.py", line 622, in mainloop
     self._mainloop()
   File "/usr/local/lib/python2.7/site-packages/kivy/core/window/window_sdl2.py", line 365, in _mainloop
     EventLoop.idle()
   File "/usr/local/lib/python2.7/site-packages/kivy/base.py", line 327, in idle
     Clock.tick()
   File "/usr/local/lib/python2.7/site-packages/kivy/clock.py", line 515, in tick
     self._process_events()
   File "/usr/local/lib/python2.7/site-packages/kivy/clock.py", line 647, in _process_events
     event.tick(self._last_tick, remove)
   File "/usr/local/lib/python2.7/site-packages/kivy/clock.py", line 406, in tick
     ret = callback(self._dt)
   File "/usr/local/lib/python2.7/site-packages/kivy/uix/listview.py", line 950, in _spopulate
     self.populate()
   File "/usr/local/lib/python2.7/site-packages/kivy/uix/listview.py", line 998, in populate
     item_view = self.adapter.get_view(index)
   File "/usr/local/lib/python2.7/site-packages/kivy/adapters/listadapter.py", line 211, in get_view
     item_view = self.create_view(index)
   File "/usr/local/lib/python2.7/site-packages/kivy/adapters/listadapter.py", line 228, in create_view
     item_args = self.args_converter(index, item)
   File "/usr/games/team stats/main.py", line 47, in args_converter
     key, value = data_item
 ValueError: too many values to unpack
耶利格萨

我建议不要使用listview,这对于刚接触kivy的人来说可能更清楚。这是从字典列表中创建表的简单示例:

test.kv:

#:kivy 1.9.0

<PlayerRecord>:
    size_hint_y: None
    height: '30dp'
    width: '100dp'

    canvas.before:
        Color:
            rgb: 0.2, 0.2, 0.2
        Rectangle:
            pos: self.pos
            size: self.size

<TableHeader>
    size_hint_y: None
    height: '30dp'
    width: '100dp'

    canvas.before:
        Color:
            rgb: 0.5, 0.5, 0.5
        Rectangle:
            pos: self.pos
            size: self.size

AnchorLayout:
    anchor_x: 'center'
    anchor_y: 'center'

    ScrollView:
        size_hint_y: None
        height: '200dp'

        MyGrid:
            cols: 3
            size_hint_y: None
            height: self.minimum_height
            spacing: '1dp'

main.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label


class TableHeader(Label):
    pass


class PlayerRecord(Label):
    pass


class MyGrid(GridLayout):

    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.fetch_data_from_database()
        self.display_scores()

    def fetch_data_from_database(self):
        self.data = [
            {'name': 'name', 'score': 'score', 'car': 'car'},
            {'name': 'przyczajony', 'score': '1337', 'car': 'Fiat 126p'},
            {'name': 'Krusader Jake', 'score': '777', 'car': 'Ford'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'},
            {'name': 'dummy', 'score': '0', 'car': 'none'}
        ]

    def display_scores(self):
        self.clear_widgets()
        for i in xrange(len(self.data)):
            if i < 1:
                row = self.create_header(i)
            else:
                row = self.create_player_info(i)
            for item in row:
                self.add_widget(item)

    def create_header(self, i):
        first_column = TableHeader(text=self.data[i]['name'])
        second_column = TableHeader(text=self.data[i]['score'])
        third_column = TableHeader(text=self.data[i]['car'])
        return [first_column, second_column, third_column]

    def create_player_info(self, i):
        first_column = PlayerRecord(text=self.data[i]['name'])
        second_column = PlayerRecord(text=self.data[i]['score'])
        third_column = PlayerRecord(text=self.data[i]['car'])
        return [first_column, second_column, third_column]


class Test(App):
    pass


Test().run()

为了根据一行中的键数设置列数,只需将cols属性从kv移到py文件,然后将键数附加到它:

main.py(片段):

from kivy.properties import NumericProperty
...
class MyGrid(GridLayout):

    cols = NumericProperty()

    def fetch_data_from_database(self):
        self.data = [{...},...]
        self.cols = len(self.data[0].keys())
...
    def create_header(self, i):
        cols = []
        row_keys = self.data[i].keys()
        row_keys.reverse()
        for key in row_keys:
            cols.append(TableHeader(text=self.data[i][key]))
        return cols

    def create_player_info(self, i):
        cols = []
        row_keys = self.data[i].keys()
        row_keys.reverse()
        for key in row_keys:
            cols.append(PlayerRecord(text=self.data[i][key]))
        return cols

...

密钥是按car-score-name顺序返回的,因此我将.reverse()其修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python在列表中获取字典值

来自分类Dev

python在列表中获取字典值

来自分类Dev

获取字典列表中字典的值

来自分类Dev

当值是python中的值列表时如何获取字典键

来自分类Dev

从键列表中获取字典的值

来自分类Dev

如何在Python中获取字典值

来自分类Dev

如何在Python中获取字典值

来自分类Dev

Python:从列表内元组中的字典中获取字典值并对其进行处理

来自分类Dev

python:获取字典值中的键值

来自分类Dev

从字典内的列表中获取字典值

来自分类Dev

如何从字典列表中获取字典数据

来自分类Dev

如何从字典列表中获取字典数据

来自分类Dev

如何在tkinter的顶级小部件中输入值并在主窗口中使用它来显示?

来自分类Dev

如何使用 kivy 中的弹出窗口小部件更改屏幕?

来自分类Dev

获取字典列表中重复值的计数

来自分类Dev

更快的解决方案来获取字典列表中的值并在pandas数据框中添加行以用于具有多个字典的观测

来自分类Dev

获取命令窗口输出以使用tkinter在小部件中显示

来自分类Dev

获取命令窗口输出以使用tkinter在小部件中显示

来自分类Dev

如何在python中获取字典排序列表的索引?

来自分类Dev

如何在python的字典中获取字典

来自分类Dev

如何在Python的字典中获取字典的路径?

来自分类Dev

如何在Flutter中使用小部件从文件中读取文本并将其显示为列表?

来自分类Dev

如何从python中的字典列表中获取重复值

来自分类Dev

如何从元组对象列表中获取字典对象?

来自分类Dev

如何在Python中获取字典中非空值的位置

来自分类Dev

如何获取字典数组中特定键的值?

来自分类Dev

在数组中获取字典值的向量python

来自分类Dev

在数组中获取字典值的向量python

来自分类Dev

Python-从文件中获取字符串,转换为列表,将多个值添加到字典中

Related 相关文章

  1. 1

    python在列表中获取字典值

  2. 2

    python在列表中获取字典值

  3. 3

    获取字典列表中字典的值

  4. 4

    当值是python中的值列表时如何获取字典键

  5. 5

    从键列表中获取字典的值

  6. 6

    如何在Python中获取字典值

  7. 7

    如何在Python中获取字典值

  8. 8

    Python:从列表内元组中的字典中获取字典值并对其进行处理

  9. 9

    python:获取字典值中的键值

  10. 10

    从字典内的列表中获取字典值

  11. 11

    如何从字典列表中获取字典数据

  12. 12

    如何从字典列表中获取字典数据

  13. 13

    如何在tkinter的顶级小部件中输入值并在主窗口中使用它来显示?

  14. 14

    如何使用 kivy 中的弹出窗口小部件更改屏幕?

  15. 15

    获取字典列表中重复值的计数

  16. 16

    更快的解决方案来获取字典列表中的值并在pandas数据框中添加行以用于具有多个字典的观测

  17. 17

    获取命令窗口输出以使用tkinter在小部件中显示

  18. 18

    获取命令窗口输出以使用tkinter在小部件中显示

  19. 19

    如何在python中获取字典排序列表的索引?

  20. 20

    如何在python的字典中获取字典

  21. 21

    如何在Python的字典中获取字典的路径?

  22. 22

    如何在Flutter中使用小部件从文件中读取文本并将其显示为列表?

  23. 23

    如何从python中的字典列表中获取重复值

  24. 24

    如何从元组对象列表中获取字典对象?

  25. 25

    如何在Python中获取字典中非空值的位置

  26. 26

    如何获取字典数组中特定键的值?

  27. 27

    在数组中获取字典值的向量python

  28. 28

    在数组中获取字典值的向量python

  29. 29

    Python-从文件中获取字符串,转换为列表,将多个值添加到字典中

热门标签

归档