簡體   English   中英

Python Kivy。 為什么我的函數無法通過.kv文件的ID獲取布局?

[英]Python Kivy. Why can't my function get the layout by it's id from the .kv file?

我正在嘗試創建一個PageLayout。 第二頁必須有一些按鈕和滾動視圖,一切似乎都正常。 但是,錯誤是:

     layout = self.ids.gridLay
   File "kivy\properties.pyx", line 841, in     kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

據我了解-這意味着它無法在.kv文件中找到ID“ gridLay”? 我想該函數在創建GridLayout之前啟動。

蟒蛇:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.config import Config
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window

screen_width = 450
screen_height = 800

Config.set("graphics", "resizable","1")
Config.set("graphics", "width", screen_width)

Config.set("graphics", "height", screen_height)

class MainScreen(Screen):
    def on_enter(self, *args):
        layout = self.ids.gridLay
        layout.bind(minimum_height=layout.setter('height'))

        scroll = ScrollView(size_hint=(1, 1))
        scroll.add_widget(layout)

class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("final.kv")

class MainApp(App):
    def build(self):
        return presentation

if __name__ == "__main__":
    MainApp().run()

Kivy:

ScreenManagement:
    MainScreen:

<MainScreen>:
    name: "main"

    BoxLayout:
        orientation: "horizontal"

        BoxLayout:
            Widget:

        PageLayout:
            border: 15 
            orientation: "vertical"

            Widget:

            GridLayout:
                id: gridLay

                canvas:
                    Color:
                        rgba: (.156, .172, .24, 0.7)
                    Rectangle:
                        pos: self.pos
                        size: self.size


                cols: 1

                BoxLayout:
                    size_hint: (.45 , None)
                    size: (100, 300)

                    orientation: "vertical"

                    Widget:
                        size_hint: (1, .7)

                    Button:
                        background_color: (.2, .6, 0, 0.7)
                        text: "Button"  
                        size_hint: (1, .3)


                BoxLayout:
                    size_hint: (.45 , None)
                    size: (100, 300)

                    orientation: "vertical"

                    Widget:
                        size_hint: (1, .7)

                    Button:
                        background_color: (.2, .6, 0, 0.7)
                        text: "Button"  
                        size_hint: (1, .3)

                BoxLayout:
                    size_hint: (.45 , None)
                    size: (100, 300)

                    orientation: "vertical"

                    Widget:
                        size_hint: (1, .7)

                    Button:
                        background_color: (.2, .6, 0, 0.7)
                        text: "Button"  
                        size_hint: (1, .3)

我相信on_enter事件的分發時間過早是正確的。 根據文檔

on_enter:()顯示屏幕時觸發事件:輸入的動畫已完成。

但是Screen顯示尚未完成( ids填寫ids字典所證明)。

這是一個繞過我認為是Kivy漏洞的技術。 將要執行的代碼分成一個新方法,然后像這樣從on_enter調用該方法:

def on_enter(self, *args):
    if len(self.ids) == 0:
        Clock.schedule_once(self.do_on_enter_stuff)
    else:
        self.do_on_enter_stuff()

def do_on_enter_stuff(self, *args):
    layout = self.ids.gridLay
    layout.bind(minimum_height=layout.setter('height'))

    scroll = ScrollView(size_hint=(1, 1))
    scroll.add_widget(layout)

確實很丑,但我認為它會起作用。 順便說一下,您的scroll.add_widget(layout)調用將失敗,因為該layout已經是PageLayout的子級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM