首页 > 解决方案 > 如何在 .py 文件中为 BoxLayout 编写 `height : self.minimum_height` -- kivy

问题描述

我遇到了一个问题。我有一个 BoxLayout,其高度在 .kv 文件中设置为 self.minimum_height 。但是我得到一个错误,Nonetype Object has no attribute 'add_widget'基本上Nonetype是指 BoxLayout 。当我开始使用 Screens 时出现了问题。但是我想这只是kivy的一个错误(如果我错了,请纠正我)。所以我在 .py 文件中编写了代码,当我想到使用self.minimum_heightfor BoxLayout 时,我记得在 .py 文件self.中指的是 FloatLayout(这是我继承的类)。所以我尝试使用 Clock 来安排一个函数来更新BoxLayout 以每秒 300 次的速度重复自身的高度。虽然它工作正常,但每当它们增加时,Boxlayout 的大小就会增加{我在具有 y_scroll 的 Boxlayout 中的文本输入很少,因此它们会导致 Boxlayout 的增加}整个屏幕会抖动,我想避免这样的问题.. 那么他们height = self.minimum_height在 .py 文件中没有此类故障的情况下运行 BoxLayout的更好方法是...

我试过的代码:

def modifyy(self,dt):
    self.boxxy = self.boxxy.minimum_height
Clock.schedule_interval(self.modiffy , 1/300)

在kivy中是

BoxLayout:
    orientation : 'vertical'
    size_hint : 1,None
    height : self.minimum_height

编辑:添加了我的代码

from kivymd.app import MDApp
from kivymd.uix.card import MDCard
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivymd.uix.textfield import MDTextField
from kivy.clock import Clock

class Main(FloatLayout):

    def modify_update(self,dt):                       #this is the method
        self.boxxy.height = self.boxxy.minimum_height #

    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)

        Clock.schedule_interval(self.modify_update, 1/300) #this method

        self.main_body_card = MDCard(pos_hint = {'x':0.056 , 'top':0.836}, size_hint = (0.88,0.82))
        self.add_widget(self.main_body_card)

        self.scrlv_main = ScrollView(do_scroll_y = True , do_scroll_x = False , bar_width = 10)
        self.main_body_card.add_widget(self.scrlv_main)

        self.boxxy = BoxLayout(orientation = 'vertical' , size_hint = (1,None) , spacing = 15 ,padding = 55)
        self.scrlv_main.add_widget(self.boxxy)
        #self.boxxy.height = self.boxxy.minimum_height

        self.obj_1_ = MDTextField(size_hint = (0.7,None),mode = 'rectangle',multiline = True)
        self.boxxy.add_widget(self.obj_1_)
        self.obj_1_.hint_text = 'Box 1   '

        self.obj_2_ = MDTextField(size_hint = (0.7,None),mode = 'rectangle',multiline = True)
        self.boxxy.add_widget(self.obj_2_)
        self.obj_2_.hint_text = 'Box 2    '

class MinimalExecutableCode(MDApp):
    def build(self):
        return Main()

MinimalExecutableCode().run()

任何帮助都非常感谢

标签: pythonkivy

解决方案


首先,我不知道使用height: self.minimum_heightinkv有或没有任何问题Screens。我建议使用显示该问题的代码发布另一个问题。

至于self.minimum_height在 python 中使用,更好的方法是在需要时调用您的modify_update()方法(就像在中使用它kv一样)。这是执行此操作的代码的修改版本:

from kivymd.app import MDApp
from kivymd.uix.card import MDCard
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivymd.uix.textfield import MDTextField
# from kivy.clock import Clock

class Main(FloatLayout):

    # Note the modified args
    def modify_update(self, *args):                       #this is the method
        print('update height')
        self.boxxy.height = self.boxxy.minimum_height #

    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)

        #  Do not call this method when it is not needed
        # Clock.schedule_interval(self.modify_update, 1/300) #this method

        self.main_body_card = MDCard(pos_hint = {'x':0.056 , 'top':0.836}, size_hint = (0.88,0.82))
        self.add_widget(self.main_body_card)

        self.scrlv_main = ScrollView(do_scroll_y = True , do_scroll_x = False , bar_width = 10)
        self.main_body_card.add_widget(self.scrlv_main)

        self.boxxy = BoxLayout(orientation = 'vertical' , size_hint = (1,None) , spacing = 15 ,padding = 55)
        self.scrlv_main.add_widget(self.boxxy)
        #self.boxxy.height = self.boxxy.minimum_height

        self.obj_1_ = MDTextField(size_hint = (0.7,None),mode = 'rectangle',multiline = True)
        self.boxxy.add_widget(self.obj_1_)
        self.obj_1_.hint_text = 'Box 1   '
        self.obj_1_.bind(height=self.modify_update)  # call modify_update() when this MDTextField changes size

        self.obj_2_ = MDTextField(size_hint = (0.7,None),mode = 'rectangle',multiline = True)
        self.boxxy.add_widget(self.obj_2_)
        self.obj_2_.hint_text = 'Box 2    '
        self.obj_2_.bind(height=self.modify_update)  # call modify_update() when this MDTextField changes size

class MinimalExecutableCode(MDApp):
    def build(self):
        return Main()

MinimalExecutableCode().run()

推荐阅读