[英]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.