python - 如何在 .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_height
for 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()
任何帮助都非常感谢
解决方案
首先,我不知道使用height: self.minimum_height
inkv
有或没有任何问题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()
推荐阅读
- javascript - 使用循环显示卡引导中的每个 json 数据
- python - 使用 pandas 在同一行中获得 3 年平均值
- database - 跨环境管理多个数据库 ID
- c# - 中断模式下 C# 应用程序中的 XAMLParseException
- sql - 查找 min(records) 和 max(records)
- parallel-processing - 雪花复制到并行 Parquet 文件加载
- c++ - QuickFix C++ 和 SSL:使用 sTunnel 连接到 LMAX 的问题
- flutter - 错误:运行 ios 构建时找不到“Flutter/Flutter.h”文件
- .net - 如果可用,MSBuild 使用本地 .NET 工具,如果没有,则使用全局工具
- ios - 覆盖 heightForRowAtIndexPath 使单元格返回意外的黑色背景