Python 3.x 如何将小部件添加到现有屏幕?
我的应用程序是基于.kv文件构建的 我想从python文件向Python 3.x 如何将小部件添加到现有屏幕?,python-3.x,kivy,Python 3.x,Kivy,我的应用程序是基于.kv文件构建的 我想从python文件向屏幕添加按钮 class Profiles(Screen): def suh(self): for i in range(5): self.add_widget(Button(text=i)) suh功能似乎没有效果。这是因为函数是在应用程序生成后调用的吗?有更好的方法吗 通过应用程序类而不是屏幕添加小部件。因此,您必须创建一个创建小部件的函数,并且在构建函数中,您必须使用Clock.s
屏幕添加按钮
class Profiles(Screen):
def suh(self):
for i in range(5):
self.add_widget(Button(text=i))
suh
功能似乎没有效果。这是因为函数是在应用程序生成后调用的吗?有更好的方法吗 通过应用程序
类而不是屏幕
添加小部件。因此,您必须创建一个创建小部件的函数,并且在构建函数中,您必须使用Clock.schedule\u once
从Clock
模块运行另一个函数。例如:
class TestApp(App):
def build(self):
Clock.schedule_once(self.yoyo, 0)
return MainWin()
def yoyo(self, *args):
for i in memu_acc:
self.root.ids["prof"].ids["pro"].add_widget(Button(text=i))
解决方案1
由于屏幕是一个相对的窗口,请在inovke方法suh()中使用输入前的或输入后的加上添加size
和pos
解决方案2
在屏幕顶部使用容器,例如BoxLayout或GridLayout
注
无论何时通过进入前的或进入后的将小部件添加到屏幕,请使用离开前的或离开后的删除小部件。这是为了防止每次进入屏幕时将小部件加倍
如果小部件清除得太快,请按时间间隔使用
注1:屏幕事件
Kivy屏幕有以下事件
在预输入时输入:()
即将使用屏幕时激发的事件:输入
动画开始
输入:()
屏幕显示时激发的事件:输入的动画为
完成
休假前:()
将要删除屏幕时激发的事件:离开
动画开始
请假:()
移除屏幕时激发的事件:正在离开的动画
完成了
注2:屏幕是一个相对的窗口
请注意,默认情况下,a不显示任何内容:它只是
A.您需要将该类用作
您自己的屏幕,最好的方法是子类化
警告
作为一个例子,理解是很重要的
这个
示例-解决方案1
main.py
从kivy.app导入应用
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.button导入按钮
从kivy.lang导入生成器
生成器。加载\u字符串(“”)
:
#输入:self.suh()
on_enter:self.suh()
""")
班级简介(屏幕):
def suh(自我):
对于范围(5)中的i:
self.add_小部件(按钮(text=str(i),size_-hint=(0.1,0.1),pos=(i*100,i*100)))
sm=屏幕管理器()
sm.add_小部件(Profiles(name='Profiles'))
类TestApp(应用程序):
def生成(自):
返回sm
如果名称=“\uuuuu main\uuuuuuuu”:
TestApp().run()
产出-解决方案1
示例-解决方案2
main.py
从kivy.app导入应用
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.button导入按钮
从kivy.lang导入生成器
生成器。加载\u字符串(“”)
:
#输入:self.suh()
on_enter:self.suh()
盒子布局:
id:集装箱
""")
班级简介(屏幕):
def suh(自我):
对于范围(5)中的i:
self.ids.container.add_小部件(按钮(text=str(i),size_-hint=(0.1,0.1)))
sm=屏幕管理器()
sm.add_小部件(Profiles(name='Profiles'))
类TestApp(应用程序):
def生成(自):
返回sm
如果名称=“\uuuuu main\uuuuuuuu”:
TestApp().run()
产出-解决方案2
您正在尝试向屏幕添加多个小部件。您的意思是将多个小部件添加到布局
对象(如浮动布局
,网格布局
,或框布局
)并将该布局添加到屏幕上。屏幕只能有一个子部件。@Erik啊,这是有道理的。因此,我在.kv文件的Profiles
屏幕中创建了一个名为pro
的GridLayout
。在我的.py文件中,我没有使用self.add\u小部件(按钮)
而是使用root.ids[“pro”]。add\u小部件(按钮)
,但没有定义root。为什么?如果在Profiles
类中有pro
的id,则需要通过self.ids['pro']
而不是root.ids
引用它self.root
指树中self
所在的最高级别小部件root
在这一点上只是一个未定义的变量注1,您的答案总体上非常有用。非常感谢。假设我只想创建一次按钮。我是否必须创建一个函数来清除containter
的小部件,并将其链接到离开时的,或者有更好的方法吗?如果我在离开时使用并在屏幕之间快速切换,则清除小部件功能不会执行。当我在离开前使用时,它会过快地清除小部件,从而导致屏幕过渡不好。每当通过on_pre_enter或on_enter将小部件添加到屏幕时,请使用on_pre_leave或on_leave删除小部件。这是为了防止每次进入屏幕时将小部件加倍。如果小部件清除得太快,请按时间间隔使用Clock.schedule_一次。
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.lang import Builder
Builder.load_string("""
<Profiles>:
# on_pre_enter: self.suh()
on_enter: self.suh()
""")
class Profiles(Screen):
def suh(self):
for i in range(5):
self.add_widget(Button(text=str(i), size_hint=(0.1, 0.1), pos=(i*100, i*100)))
sm = ScreenManager()
sm.add_widget(Profiles(name='profiles'))
class TestApp(App):
def build(self):
return sm
if __name__ == "__main__":
TestApp().run()
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.lang import Builder
Builder.load_string("""
<Profiles>:
# on_pre_enter: self.suh()
on_enter: self.suh()
BoxLayout:
id: container
""")
class Profiles(Screen):
def suh(self):
for i in range(5):
self.ids.container.add_widget(Button(text=str(i), size_hint=(0.1, 0.1)))
sm = ScreenManager()
sm.add_widget(Profiles(name='profiles'))
class TestApp(App):
def build(self):
return sm
if __name__ == "__main__":
TestApp().run()