Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将小部件添加到现有屏幕?_Python 3.x_Kivy - Fatal编程技术网

Python 3.x 如何将小部件添加到现有屏幕?

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

我的应用程序是基于.kv文件构建的

我想从python文件向
屏幕添加按钮

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()