Kivy RecycleView – Elementattribute dynamisch aktualisierenPython

Python-Programme
Anonymous
 Kivy RecycleView – Elementattribute dynamisch aktualisieren

Post by Anonymous »

Ich möchte das Erscheinungsbild von Elementen in einem Kivy RecycleView bedingt ändern, zum Beispiel durch Hervorheben eines Elements, wenn es bestimmten Text enthält.
Ich habe das veröffentlichte Beispiel von hier übernommen: https://github.com/kivy/kivy/blob/maste ... ic_data.py
Ich habe es leicht modifiziert, indem ich eine MyLabel-Klasse hinzugefügt habe, die Text implementiert Hervorhebung:

Code: Select all

from random import sample, randint
from string import ascii_lowercase

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.graphics import Color, Rectangle

kv = '''
:
canvas.before:
Color:
rgba: [1, .85, .85, 1]
Rectangle:
size: self.size
pos: self.pos

:
canvas.before:
Color:
rgba: 0.5, 0.5, 0.5, 1
Rectangle:
size: self.size
pos: self.pos
value: ''
Label:
id: name
MyLabel:
text: root.value

:
canvas:
Color:
rgba: 0.3, 0.3, 0.3, 1
Rectangle:
size: self.size
pos: self.pos
rv: rv
orientation: 'vertical'
GridLayout:
cols: 3
rows: 2
size_hint_y: None
height: dp(108)
padding: dp(8)
spacing: dp(16)
Button:
text: 'Populate list'
on_press: root.populate()
Button:
text: 'Sort list'
on_press: root.sort()
Button:
text: 'Clear list'
on_press: root.clear()
BoxLayout:
spacing: dp(8)
Button:
text: 'Insert new item'
on_press: root.insert(new_item_input.text)
TextInput:
id: new_item_input
size_hint_x: 0.6
hint_text: 'value'
padding: dp(10), dp(10), 0, 0
BoxLayout:
spacing: dp(8)
Button:
text: 'Update first item'
on_press: root.update(update_item_input.text)
TextInput:
id: update_item_input
size_hint_x: 0.6
hint_text: 'new value'
padding: dp(10), dp(10), 0, 0
Button:
text: 'Remove first item'
on_press: root.remove()

RecycleView:
id: rv
scroll_type: ['bars', 'content']
scroll_wheel_distance: dp(114)
bar_width: dp(10)
viewclass: 'Row'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
spacing: dp(2)
'''

Builder.load_string(kv)

class MyLabel(Label):

def on_text(self, _, newtext):
if newtext == 'Pass':
self.canvas.before.clear()
self.canvas.before.add(Color(0, .5, 0, 1))
self.canvas.before.add(Rectangle(size=self.size, pos=self.pos))

class Test(BoxLayout):

def populate(self):
self.rv.data = [
{
'name.text': ''.join(sample(ascii_lowercase, 6)),
'value': str(randint(0, 2000))
}
for x in range(50)
]
self.rv.data.append({'name.text': 'testparam', 'value': 'Pass'})

def sort(self):
self.rv.data = sorted(self.rv.data, key=lambda x: x['name.text'])

def clear(self):
self.rv.data = []

def insert(self, value):
self.rv.data.insert(0, {
'name.text': value or 'default value',
'value':  'unknown'
})

def update(self, value):
if self.rv.data:
self.rv.data[0]['name.text'] = value or 'default new value'
self.rv.refresh_from_data()

def remove(self):
if self.rv.data:
self.rv.data.pop(0)

class TestApp(App):
def build(self):
return Test()

if __name__ == '__main__':
TestApp().run()
Dies funktioniert jedoch nicht wie erwartet. Wenn ich nach oben oder unten scrolle, werden die Canvas-Anweisungen auf die falschen Elemente angewendet.
Image

Gibt es eine Möglichkeit, dass dies korrekt funktioniert?
Ich verwende Kivy v2.3.1, Python v3.13.9 (64-Bit) und Windows 10.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post