python - 如何防止小部件重叠?

标签 python kivy kivy-language

如何解决 kivy 框架中小部件重叠的问题,我在 for 循环中添加小部件,因此我有多个小部件,但所有小部件都在一个地方,我该如何防止这种情况?

我的Python代码:

from kivy.app import App
from kivymd.app import MDApp
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.graphics import Color
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivymd.uix.card import MDCard
from kivy.properties import StringProperty
from kivy.lang import Builder
import requests, time, collections

class request_sender():
    return 'DATA'

class CustomLabel(Label):
    pass
class CustomBox(BoxLayout):
    pass

class AuctionCard(Widget):
    auc_timer = ''
    auc_img = ''
    auc_name = ''
    def __init__(self, **kwargs):
        super(AuctionCard, self).__init__(**kwargs)
        with self.canvas.before: Color(1, 0, .4, mode='rgb')
        Clock.schedule_once(self.load_info)

    def load_info(self, dt):
        print(self.auc_name)
        self.size_hint = None, None
        box = BoxLayout(orientation='vertical', size = (800, 600))
        box.size_hint_x = 50;
        box.height = 100
        AuctionName = CustomLabel(text=self.auc_name, pos_hint={'top': 300.9})
        AuctionImage = CustomLabel(text=self.auc_img)
        AuctionTimer = CustomLabel(text=self.auc_name)
        box.add_widget(AuctionName)
        box.add_widget(AuctionTimer)
        box.add_widget(AuctionImage)
        self.add_widget(box)

class MyWidget(Widget):
    prop = StringProperty('')
    array_of_labels = []
    prop1 = StringProperty('Second card')
    n = 0
    all_cards = collections.defaultdict()
    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        self.screen_load()
    def timer_le(self, dt):
        returned_data = request_sender().sender_update('ajax.php')
        for key in self.all_cards:
            for data in returned_data:
                if data['pid'] == key:
                    self.all_cards[key][0].text = str(data['remaining_time'])

    def screen_load(self):
        returned_data = request_sender().sender_update('ajax.php')
        box = GridLayout(cols=2)
        self.size_hint = None, None
        for data in returned_data:
            AucCard = AuctionCard()
            AucCard.auc_name = str(data['auc_name'])+'\n\n'
            AucCard.auc_timer = str(data['remaining_time'])+'\n\n'
            AucCard.auc_img = str(data['auc_img'])+'\n\n'
            box.add_widget(AucCard)
            print('Widget added')
        self.add_widget(box)
            #self.all_cards[str(data['pid'])] = [AucCard]
        #Clock.schedule_interval(self.timer_le, 1/30)

class TestApp(App):
    def build(self):
        box = GridLayout(cols=2)
        return MyWidget()

TestApp().run()

我的kv代码:

<CustomLabel>:
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]

结果:

enter image description here

我想要创建的结果类型:

enter image description here

最佳答案

实际上我找到了解决这个问题的简单方法。问题出在我的 AuctionCard 和 MyWidget 类的父类中,我将父类设置为 Widget,但对于 AuctionCard 来说,它应该是 BoxLayout,对于 MyWidget GridLayout 来说,它应该是 BoxLayout。因此,从那里我设法将 cols = 2 和 size 设置为 window.size。从这里开始,它就完全按照它应该的方式工作。

from kivy.lang import Builder
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.uix.gridlayout import GridLayout


class AuctionCard(BoxLayout):
    auc_timer = ''
    auc_img = ''
    auc_name = ''
    def __init__(self, **kwargs):
        super(AuctionCard, self).__init__(**kwargs)
        Clock.schedule_once(self.load_info)
    def load_info(self, dt):
        self.orientation = 'vertical'
        AuctionName = Label(text=self.auc_name)
        AuctionImage = Label(text=self.auc_img)
        AuctionTimer = Label(text=self.auc_timer)
        self.add_widget(AuctionName)
        self.add_widget(AuctionTimer)
        self.add_widget(AuctionImage)

class MyWidget(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cols = 2
        self.size = (Window.size[0], self.size[1])
        self.load_app()
        print('MyWidget size: '+str(self.size))
    def load_app(self):
        self.size_hint = None, None
        returned_data = [{'auc_name':'name 1', 'remaining_time':'100', 'auc_img':'https://img.src'},
                         {'auc_name':'name 2', 'remaining_time':'200', 'auc_img':'https://img.src'},
                         {'auc_name':'name 3', 'remaining_time':'300', 'auc_img':'https://img.src'}]
        for data in returned_data:
            AucCard = AuctionCard()
            AucCard.auc_name = str(data['auc_name'])+'\n\n'
            AucCard.auc_timer = str(data['remaining_time'])+'\n\n'
            AucCard.auc_img = str(data['auc_img'])+'\n\n'
            self.add_widget(AucCard)
            print('Widget added')


class MyTestApp(App):
    def __init__(self, **kwargs):
        self.title = "My Material Application"
        super().__init__(**kwargs)

    def build(self):
        return MyWidget()


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

结果: Result

关于python - 如何防止小部件重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59326527/

相关文章:

python - 在 Python 中映射模块导入以便于重构

android - 使用 rstdocument 小部件使 kivy 在 android 上崩溃

macos - pkg-config:PKG_PROG_PKG_CONFIG:找不到命令

python - Kivy - 根据 If 语句的结果显示/隐藏矩形

python - Kivy kv 文件不工作

javascript - 将数据从 Python 发送到 Javascript (JSON)

python - 2 个不同的文本 block 合并在一起。如果我知道 1 是什么,我可以将它们分开吗?

Python:多处理 - 一个进程完成后终止其他进程

python - Kivy - 使用从 Python 传递的值更新 Canvas 背景

python - 如何使用bind动态更新Kivy Label的文本属性