首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用ScreeManager和Kivy-按钮布局不再工作时出现问题

当使用ScreeManager和Kivy-按钮布局不再工作时出现问题
EN

Stack Overflow用户
提问于 2017-06-30 02:16:29
回答 1查看 222关注 0票数 2

因此,我在尝试使用屏幕管理器时遇到了问题。例如,由于我必须创建屏幕类,所以现在要使用屏幕管理器而不是(GridLayout)来使用屏幕管理器,所以按钮/布局管理不能再在python中控制了吗?它过去为屏幕上总共15个按钮布置了5列3行。现在,它只是显示一个大的(屏幕),而不是网格布局。

代码语言:javascript
复制
class LandingScreen(Screen):
def build(self):
    return presentation
def __init__(self, **kwargs):
    super(LandingScreen, self).__init__(**kwargs)
    self.cols = 5
    self.buttons = []  # add references to all buttons here

    # Loop to make 20 different buttons on screen
    for x in range(15):
        self.buttons.append(Button(text='button ' + str(x)))  # make a reference to the button before adding it in
        self.add_widget(self.buttons[x])
        self.buttons[x].background_normal = 'YOUTUBE.png'

这里的按钮和列设置用于使用此循环创建3行5行按钮,因为我将(屏幕)添加到类而不是(GridLayout)中。我不希望创建.kv文件中的所有按钮,因为我认为在.py中更容易管理,而且对我来说更有意义。

这是我的.kv文件:

代码语言:javascript
复制
<GridLayout>:
    cols: 5
    height: 480
    width: 800
    spacing: 25, 20
    padding: 25,25

<MyScreenManager>:
    LandingScreen:
    InputScreen:

<InputScreen>:
    AnchorLayout:

<LandingScreen>:
    GridLayout:
        cols: 5
        height: 480
        width: 800
        spacing: 25, 20
        padding: 25,25

这显然是多余的,因为我试图弄清楚如何使所有15个按钮再次显示,而不仅仅是一个按钮。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-30 11:48:02

您希望将按钮添加到GridLayout内部的Screen中,而不是直接添加到Screen。要做到这一点,请使用id引用GridLayout

但是,您不能在__init__方法中使用ids,因为在kv文件中定义的规则在完全初始化相应的小部件之前不会被应用。Ryan在这个问题中正确地提供了解决方案:

为什么我不能访问Screen.ids?

另一方面,要在以后更改屏幕,必须在屏幕中定义name属性。

您的代码应该是:

代码语言:javascript
复制
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.clock import Clock


kv_text='''\

<MyScreenManager>:
    LandingScreen:
    InputScreen:

<InputScreen@Screen>:
    name: 'input_sc'
    AnchorLayout:
        id: anchor_1

<LandingScreen@Screen>:
    name: 'landing_sc'
    GridLayout:
        id: grid_1
        cols: 5
        height: 480
        width: 800
        spacing: 25, 20
        padding: 25,25
'''

class MyScreenManager(ScreenManager):
    pass


class LandingScreen(Screen):
    def __init__(self, **kwargs):
        super(LandingScreen, self).__init__(**kwargs)
        self.buttons = [] # add references to all buttons here
        Clock.schedule_once(self._finish_init)

    def _finish_init(self, dt):
        self.ids.grid_1.cols = 5

        # Loop to make 20 different buttons on screen
        for x in range(15):
            self.buttons.append(Button(text='button {}'.format(x)))
            self.ids.grid_1.add_widget(self.buttons[x])
            self.buttons[x].background_normal = 'YOUTUBE.png'

class MyKivyApp(App):
    def build(self):
        return MyScreenManager()

def main():
    Builder.load_string(kv_text)
    app = MyKivyApp()
    app.run()

if __name__ == '__main__':
    main()

如果您想使用Properties而不是ids方法(请参阅文档),您应该执行如下操作:

代码语言:javascript
复制
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.properties import ObjectProperty


kv_text='''\

<MyScreenManager>:
    LandingScreen:
    InputScreen:

<InputScreen@Screen>:
    name: 'input_sc'
    AnchorLayout:
        id: anchor_1

<LandingScreen@Screen>:
    name: 'landing_sc'
    grid_1: grid_1
    GridLayout:
        id: grid_1
        cols: 5
        height: 480
        width: 800
        spacing: 25, 20
        padding: 25,25
'''

class MyScreenManager(ScreenManager):
    pass


class LandingScreen(Screen):

    grid_1 = ObjectProperty(None)    #<<<< Propertie

    def __init__(self, **kwargs):
        super(LandingScreen, self).__init__(**kwargs)
        self.buttons = [] # add references to all buttons here
        Clock.schedule_once(self._finish_init)

    def _finish_init(self, dt):
        self.grid_1.cols = 5
        # Loop to make 20 different buttons on screen
        for x in range(15):
            self.buttons.append(Button(text='button{}'.format(x)))
            self.grid_1.add_widget(self.buttons[x])
            self.buttons[x].background_normal = 'star.png'

class MyKivyApp(App):
    def build(self):
        return MyScreenManager()

def main():
    Builder.load_string(kv_text)
    app = MyKivyApp()
    app.run()

if __name__ == '__main__':
    main()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44837609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档