मैं रंगीन लेबलों की एक सूची बनाना चाहता हूं। बात यह है कि मैं इसे केवी फ़ाइल के साथ कर सकता था, लेकिन मुझे इसे बिल्ड() विधि के माध्यम से करने की ज़रूरत है। इसलिए मैंने जो किया है उसे दोहराने की कोशिश की, लेकिन यह काम नहीं करता है। और मुझे समझ में नहीं आता क्यों।
यही मैंने कोड किया है
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 रंगीन लेबलों की एक सूची है।
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()
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
source=
कोRectangle
में सेट कर सकते हैं।