मैं रंगीन लेबलों की एक सूची बनाना चाहता हूं। बात यह है कि मैं इसे केवी फ़ाइल के साथ कर सकता था, लेकिन मुझे इसे बिल्ड() विधि के माध्यम से करने की ज़रूरत है। इसलिए मैंने जो किया है उसे दोहराने की कोशिश की, लेकिन यह काम नहीं करता है। और मुझे समझ में नहीं आता क्यों।

यही मैंने कोड किया है

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import *

class RL(RelativeLayout): # Creates the background colour for each label
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        with self.canvas:
            Color(.7, 0, .5, 1)
            Rectangle(size_hint=self.size)

class MainMenu(BoxLayout):
    
    N_LBLS = 8
    labels_text = []
    RL_list = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        button = Button(text='do something')
        button.bind(on_release=self.change_text)
        box = BoxLayout(orientation='vertical', padding= 10, spacing = 15)
        for i in range(0, self.N_LBLS):
            self.RL_list.append(RL())
            self.labels_text.append(Label(text=f'{i}º label', size_hint=self.size))
            self.RL_list[i].add_widget(self.labels_text[i])
            box.add_widget(self.RL_list[i])
        self.add_widget(button)
        self.add_widget(box)

    def change_text(self, instance):
        for lbl in self.labels_text:
            if lbl.text[0] == '5':
                lbl.text = 'Text changed'

class MainApp(App):
    def build(self):
        return MainMenu()

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

यह बाईं ओर एक बटन बनाने वाला है, और दाईं ओर 8 रंगीन लेबलों की एक सूची है।

0
Ingeniería Quilmes 7 जिंदा 2022, 16:54

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि आप प्रत्येक लेबल में size_hint=self.size सेट कर रहे हैं। self.size, MainMenu के आकार का है, जो उस कोड के निष्पादित होने पर [100,100] होता है। ध्यान दें कि size_hint एक गुणक है जो विगेट्स के आकार की गणना करने के लिए माता-पिता के आकार पर लागू होता है। तो size_hint का [100,100] प्रत्येक Label को MainMenu से 100 गुना बड़ा बनाता है। तो आपका कोड काम कर रहा है, लेकिन Labels इतने बड़े हैं कि टेक्स्ट स्क्रीन से दूर है। केवल size_hint=self.size को हटाकर प्रारंभ करें।

और, एक Label पर पृष्ठभूमि रंग सेट करने के लिए, आप किसी कंटेनर के बजाय, उस Label के canvas का उपयोग कर सकते हैं। यहां आपके कोड का एक संस्करण है जो ऐसा करता है:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout


class ColorLabel(Label):
    pass


Builder.load_string('''
<ColorLabel>:
    canvas.before:
        Color:
            rgba: .7, 0, .5, 1
        Rectangle:
            pos: self.pos
            size: self.size
''')


class MainMenu(BoxLayout):
    N_LBLS = 8
    labels_text = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        button = Button(text='do something')
        button.bind(on_release=self.change_text)
        box = BoxLayout(orientation='vertical', padding=10, spacing=15)
        for i in range(0, self.N_LBLS):
            self.labels_text.append(ColorLabel(text=f'{i}º label'))
            box.add_widget(self.labels_text[i])
        self.add_widget(button)
        self.add_widget(box)

    def change_text(self, instance):
        for lbl in self.labels_text:
            if lbl.text[0] == '5':
                lbl.text = 'Text changed'


class MainApp(App):
    def build(self):
        return MainMenu()


if __name__ == '__main__':
    MainApp().run()
0
John Anderson 7 जिंदा 2022, 17:41
अद्यतन उत्तर देखें। पृष्ठभूमि के लिए एक छवि निर्दिष्ट करने के लिए आप बस source= को Rectangle में सेट कर सकते हैं।
 – 
John Anderson
7 जिंदा 2022, 17:43