1

我有的

我有一个带有两个表的 sqlite 数据库。第一个有 42 项,包含 typeID、typeName、description、maxPrice 和 groupID 等字段,其中有 4 个不同的 groupID。然后还有另外 6 个左右的字段,稍后其他计算需要这些字段,但树视图不需要这些字段。第二个具有类似的结构,每个项目都有 typeID、groupID、typeName、description、price,然后是 8 个附加字段。关键是两个表都将项目集中在一起分组。

我想要的是

我想从这些表中的每一个填充一个kivy 树视图。groupID 字段应作为父级,所有具有该 groupID 的 typeID 应为子级。我可以硬编码,但我的数据可能会改变(并且将它们全部输入会很痛苦)所以我想保持这种动态,这样如果我的表格更新,我可以自动重新制作树视图。

大图

我的目标是让用户能够从从第一个表制作的树视图中选择一个项目,然后从第二个表制作的树视图中选择许多项目(包括特定项目的重复项)。我目前正在考虑这样做的方式是,当用户从第一个树视图中选择一个项目时,它会显示在其他一些小部件的顶部,然后当用户从第二个树视图中选择一个项目时,它会显示在下面该项目从第一个以及用户可以更改的数量计数器。限制是树视图 2 中所有项目的总价格不得超过树视图 1 中所选项目的 maxPrice。

一个粗略的示例如下所示:

Item 3 from Tree View 1 maxPrice 10000
Item 1 from Tree View 2 price 1000 Qty 2
Item 3 from Tree View 2 price 3000 Qty 1
Item 4 from Tree View 2 price 500 Qty 4
Item 9 from Tree View 2 price 1000 Qty 2
price remaining 1000

在此示例中,价格为 (2*1000)+(1*3000)+(4*500)+(2*1000)=9000,低于 Tree View 1 中项目 3 的 maxPrice 10000,因此可以. 例如,如果用户现在尝试将第 3 项的数量从树视图 2 更改为 2,它应该显示剩余价格为 -2000(并且可能将其更改为红色或其他东西以使其突出。)

一旦我让两个树视图启动并运行,我想我可以弄清楚如何让其余的工作(或者我会发布另一个问题!)我只是想提供这个“大图”看看我的最终目标帮助为我的问题提供一些背景信息。

4

1 回答 1

2

我已经为此奋斗了几个小时,终于得到了一些大致有效的东西!我仍然很想听听如何简化它。此外,它在屏幕上相当笨拙,带有大按钮且没有滚动条(因此,当您打开一些子树时,树会从屏幕底部移出,您无法到达它。)哦,这就是 jsut对于我想要制作的两个树视图中的第二个,但它更难,所以另一个应该很容易从中制作。除了这些免责声明,这里是代码:

from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.treeview import TreeView, TreeViewNode
from kivy.uix.treeview import TreeViewLabel
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.button import Button
import sqlite3
import os

POSdb = "C:\Users\User\Path\To\My\Database.db"

class TreeViewButton(Button, TreeViewNode):
    pass

modGroups = []
modItems = []
modDict = dict()
modDictUnique = dict()

def populate_tree_view(tv):
    conn = sqlite3.connect(POSdb)
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute('select * from ModuleTable')
    r = c.fetchall()
    for entry in r:
        modGroups.append(entry['groupID'])
        modItems.append(entry['typeName'])
    modDict = zip(modGroups, modItems)
    for k, v in modDict:
        if k not in modDictUnique:
            modDictUnique[k] = [v]
        else:
            modDictUnique[k].append(v)
    sortedGroups = modDictUnique.keys()
    sortedGroups.sort()
    #print modItems
    #print modDictUnique
    n = tv.add_node(TreeViewLabel(text='POS Mods', is_open=True))
    for group in sortedGroups:
        g = tv.add_node(TreeViewLabel(text='%s' % group), n)
        for item in modDictUnique[group]:
            tv.add_node(TreeViewButton(text='%s' % item), g)


class POSFM(FloatLayout):
    def __init__(self, **kwargs):
        super(POSFM, self).__init__(**kwargs)

        tv = TreeView(root_options=dict(text='Tree One'),
                      hide_root=True,
                      indent_level=4)

        populate_tree_view(tv)

        self.add_widget(tv)


class POSFMApp(App):

    def build(self):
        return POSFM()

if __name__ == '__main__':
    POSFMApp(width=800).run()
于 2013-03-23T05:07:26.210 回答