Python: добавление кнопок в boxlayout, которые можно прокручивать одним нажатием кнопки - PullRequest
0 голосов
/ 27 апреля 2018

хорошо, так что это может показаться странным, но я хотел бы добавить данные, полученные из mysql, а затем сделать их стеком кнопок внутри BoxLayout, который можно прокручивать. Но в этой проблеме нет ошибок, но после нажатия кнопки она не работает.

    def a_but(self):
        nodes = ObjectProperty()
        db = mysql.connector.connect(user='****', password='*******', host='localhost', db='***')
        cursor = db.cursor()
        cursor.execute("SELECT Cos_name FROM costumerinfo WHERE Cos_name LIKE 'A%'")
        result = cursor.fetchall()
        if result:
            for i in result:
                self.nodes.add_widget(Button(text=i, height='200sp'))
                self.nodes.size = (1, None)

вот файл kv

     BoxLayout:
         Button:
             text: "A"
             background_color: (1, 1, 1, 0.8)
             on_release: root.a_but()
             size_hint: 1, .5
     #this is the part where the buttons should appear but in this case it doesnt 
     BoxLayout:
         orientation:'vertical'
         size_hint: 1, 1
         ScrollView:
             id: scrlv
             bar_width: 10
             BoxLayout:
                 id: nodes
                 orientation: 'vertical'
                 size_hint: 1, None

1 Ответ

0 голосов
/ 30 апреля 2018

1) Удалите следующее, потому что это приведет к ошибке, ValueError: None is not allowed for BoxLayout.height

self.nodes.size = (1, None)

2) Установите минимальную высоту для раскладки коробки, чтобы было, что прокрутить.

layout.bind(minimum_height=layout.setter('height'))

Пример - Kivy, SQLite

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
import sqlite3 as lite


class RootWidget(BoxLayout):
    nodes = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        self.nodes.bind(minimum_height=self.nodes.setter('height'))

    def a_but(self):
        ''' Retrieve from database'''

        db = lite.connect('chinook.db')
        cursor = db.cursor()
        cursor.execute("SELECT FirstName FROM customers ORDER BY CustomerId ASC")
        result = cursor.fetchall()

        if result:
            for row in result:
                for col in row:
                    self.nodes.add_widget(Button(text=col, size_hint_y=None, height='200sp'))


class TestApp(App):

    def build(self):
        return RootWidget()


if __name__ == "__main__":
    TestApp().run()

test.kv

#:kivy 1.10.0

<RootWidget>:
    nodes: nodes

    BoxLayout:
        Button:
            text: "A"
            background_color: (1, 1, 1, 0.8)
            on_release: root.a_but()
            size_hint: 1, .5

    BoxLayout:
        orientation:'vertical'
        size_hint: 1, 1
        ScrollView:
            id: scrlv
            bar_width: 10
            BoxLayout:
                id: nodes
                orientation: 'vertical'
                size_hint: 1, None

выход

Img01 - App Startup Img02 - Scrollview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...