Python 如何防止小部件重叠?

Python 如何防止小部件重叠?,python,kivy,kivy-language,Python,Kivy,Kivy Language,如何解决kivy框架中的小部件重叠问题,我正在为cycle添加小部件,所以我有多个小部件,但它们都在一个地方,我如何防止这种情况 我的python代码: 从kivy.app导入应用 从kivymd.app导入MDApp 从kivy.uix.label导入标签 从kivy.clock导入时钟 从kivy.graphics导入颜色 从kivy.uix.widget导入widget 从kivy.uix.boxlayout导入boxlayout 从kivy.uix.button导入按钮 从kivy.ui

如何解决kivy框架中的小部件重叠问题,我正在为cycle添加小部件,所以我有多个小部件,但它们都在一个地方,我如何防止这种情况

我的python代码:

从kivy.app导入应用
从kivymd.app导入MDApp
从kivy.uix.label导入标签
从kivy.clock导入时钟
从kivy.graphics导入颜色
从kivy.uix.widget导入widget
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.button导入按钮
从kivy.uix.gridlayout导入gridlayout
从kivymd.uix.card导入MDCard
从kivy.properties导入StringProperty
从kivy.lang导入生成器
导入请求、时间、集合
类请求\发送方():
返回“数据”
类别自定义标签(标签):
通过
类CustomBox(BoxLayout):
通过
类拍卖卡(小部件):
auc_定时器=“”
auc_img=“”
auc_名称=“”
定义初始(自我,**kwargs):
超级(拍卖卡,自我)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
使用self.canvas.before:Color(1,0,4,mode='rgb')
时钟。计划一次(自加载信息)
def加载信息(自身,dt):
打印(self.auc_名称)
self.size\u hint=无,无
长方体=长方体布局(方向=垂直”,尺寸=(800600))
box.size\u hint\u x=50;
高度=100
AuctionName=CustomLabel(text=self.auc\u name,pos\u hint={'top':300.9})
AuctionImage=CustomLabel(text=self.auc\u img)
AuctionTimer=CustomLabel(text=self.auc_name)
box.add_小部件(AuctionName)
box.add_小部件(AuctionTimer)
box.add_小部件(拍卖图像)
self.add_小部件(框)
类MyWidget(小部件):
prop=StringProperty(“”)
_标签的数组_=[]
prop1=StringProperty(“第二张卡”)
n=0
all_cards=collections.defaultdict()
定义初始(自我,**kwargs):
超级(MyWidget,self)。\uuuuu初始化(**kwargs)
self.screen_load()
def定时器(自身,dt):
返回的\u data=request\u sender().sender\u update('ajax.php'))
对于键入的self.all_卡:
对于返回的_数据中的数据:
如果数据['pid']==键:
self.all_cards[key][0]。text=str(数据['剩余_时间])
def屏幕_加载(自):
返回的\u data=request\u sender().sender\u update('ajax.php'))
框=网格布局(cols=2)
self.size\u hint=无,无
对于返回的_数据中的数据:
AucCard=AuctionCard()
AucCard.auc_name=str(数据['auc_name'])+'\n\n'
AucCard.auc_timer=str(数据['剩余_时间])+'\n\n'
AucCard.auc_img=str(数据['auc_img'])+'\n\n'
box.add_小部件(AucCard)
打印('已添加小部件')
self.add_小部件(框)
#self.all_卡[str(数据['pid'])]=[AucCard]
#时钟计划间隔(自动定时器,1/30)
类TestApp(应用程序):
def生成(自):
框=网格布局(cols=2)
返回MyWidget()
TestApp().run()
我的kv代码:

<CustomLabel>:
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]
:
尺寸提示:无
文本大小:self.width,无
高度:自身纹理大小[1]
结果:

我想要创建的结果类型:


事实上,我找到了解决这个问题的简单方法。问题是在我的AuctionCard和MyWidget类的父类中,我将父类设置为Widget,但对于AuctionCard,它应该是BoxLayout,对于MyWidget GridLayout。因此,从那里我成功地将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()
结果:
事实上,我找到了解决这个问题的简单方法。问题是在我的AuctionCard和MyWidget类的父类中,我将父类设置为Widget,但对于AuctionCard,它应该是BoxLayout,对于MyWidget GridLayout。因此,从那里我成功地将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()
结果: