Reputation: 19
I'm new to Kivy and am kind of learning on the job. I've a basic understanding of how to utilise various widgets and nest layouts. The code is as follows (saved as GUI.py):-
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ListProperty, NumericProperty, StringProperty
class TestScreen(Screen):
pass
class VariableScreen(Screen):
pass
class SummaryScreen(Screen):
pass
class ProgressScreen(Screen):
pass
class CompletedResultsScreen(Screen):
pass
class SavedResultsScreen(Screen):
pass
class ScreenManagement(ScreenManager):
pass
GUI_code = Builder.load_file("GUI.kv")
class GUIWindow(App): #App class is inherited
sampletext = StringProperty("Five times Five")
def build(self):
return GUI_code
if __name__ == "__main__":
GUIWindow().run()
The GUI.kv file contains the following:
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
transition: FadeTransition()
TestScreen:
VariableScreen:
SummaryScreen:
ProgressScreen:
CompletedResultsScreen:
SavedResultsScreen:
<TestScreen>:
name: "Test_Screen"
FloatLayout:
Label:
text: "Test"
size_hint: 0.1,0.1
pos_hint: {"right":0.5,"top":1}
Label:
text: app.sampletext
size_hint: 0.1,0.1
pos_hint: {"right":0.1,"top":1}
Button:
on_release: app.root.current = "Saved_Results_Screen"
text: "Saved Results"
size_hint: 0.1,0.1
pos_hint: {"left":1,"bottom":1}
font_size: 15
Button:
on_release: app.root.current = "Variable_Screen"
text: "Variable"
size_hint: 0.1,0.1
pos_hint: {"right":1,"bottom":1}
font_size: 15
Only the relevant part of the .kv file is posted. Some strings have to be passed from the .py file to the .kv file. The question was addressed in the below link:
Pass variable value from main.py to .kv file
Based on the suggestion there, I placed sampletext in the GUIWindow class using the StringProperty class. (Also tried a simple string sampletext = "Five times Five". Gives the same error)
The code does not run when the text property under the second label in is set to text: app.sampletext (An application window with white space opens. It is non responsive. The python kernel needs to be reloaded to shut it)
The following error message is displayed
18: pos_hint: {"right":0.5,"top":1}
19: Label:
>> 20: text: app.sampletext
21: size_hint: 0.1,0.1
22: pos_hint: {"right":0.1,"top":1}
...
AttributeError: 'NoneType' object has no attribute 'bind'
It runs properly when the text property is set to text: "Five times Five"
Could someone be kind enough to explain what is going wrong?
Upvotes: 0
Views: 1629
Reputation: 8213
I can't find any documentation describing why, but it seems like the parser is trying to access app.sampletext
when you parse the file, which you are doing before your App
class is even defined, let alone created.
Move the Builder.parse
line into your build(self):
function and it will work fine.
Upvotes: 1