Reputation: 135
So I am building an application which given an input website, is able to allow the user to choose a tag (eg. div, body, article), an attribute (eg. class, style, id), and a value of an attribute and output the related HTML code of the relevant website. Now, in one of my screens in the kivy application, I need to have my spinner (id: tag
in the code) have a list of all the possible tags in a website. This list of all the possible tags is the output of a method called updateTagSpinner
The code illustrates what I tried to do and it returned an AssertionError
. I have no idea what to do, or how to solve this. Any help would be appreciated :)
Cheers.
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
class MainWindow(Screen):
pass # assume everything works fine here
# SecondWindow is the screen where I am having a problem
# tags_list is the list of tags (updateTagSpinner works fine)
# storeUrl.txt just has the URL in question
class SecondWindow(Screen):
tag = ObjectProperty(None)
def urlaccess(self):
with open("storeUrl.txt", "r") as f:
url = f.read()
return url
def populateTags(self,url):
tags_list = HTMLReturner.tagRetriever(url)
return tags_list
def updateTagSpinner(self):
self.tag.text = 'Tag Type'
sw = SecondWindow()
url2scrape = sw.urlaccess()
tags_list = sw.populateTags(url2scrape)
return tags_list
class WindowManager(ScreenManager):
pass
class MyApp(App):
def build(self):
return Builder.load_file('my.kv')
if __name__ == "__main__":
MyApp().run()
WindowManager:
MainWindow:
SecondWindow:
<MainWindow>
name: "first"
GridLayout:
cols: 1
choice: choice
url: url
Label:
text: "Scraper for Developers (EY)"
font_size: 40
pos_hint: {"center": (0.5, 0.95)}
GridLayout:
cols: 2
Label:
text: "URL"
font_size: 24
TextInput:
id: url
font_size: 14
multiline: True
Spinner:
id: choice
values: ['Headings', 'URLs', 'Images', 'Custom']
text: 'Scraping Type'
Button:
id: btn
size: 100, 44
pos_hint: {"x": 0.87, "top": 0.08}
text: 'Continue'
on_release:
root.actionURL(url.text) if choice.text == "URLs" else None
root.actionHEADING(url.text) if choice.text == "Headings" else None
root.actionIMG(url.text) if choice.text == "Images" else None
app.root.current = "second" if choice.text == "Custom" else "first"
root.filewriter(url.text) if choice.text == "Custom" else None
root.manager.transition.direction = "left"
<SecondWindow>
name: "second"
tag: tag
GridLayout:
cols:1
Label:
text: "CUSTOM SETTINGS"
font_size: 25
GridLayout:
cols:2
Label:
text: "TAG TYPE"
font_size: 14
Spinner:
id: tag
text: 'Tag Type'
values: root.updateTagSpinner()
Label:
text: "ATTRIBUTE TYPE"
font_size: 14
Spinner:
id: attribute
values: ['a','b','c','d']
text: 'Att. Type'
Label:
text: "Value of Attribute"
font_size: 14
TextInput:
id: value_bute
font_size: 14
multiline: False
Button:
text: "Go Back"
on_release:
app.root.current = "first"
root.manager.transition.direction = "left"
Button:
text: "Show Me The Code"
on_release:
app.root.current = "first"
root.manager.transition.direction = "left"
Traceback (most recent call last):
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 692, in _apply_rule
rctx['ids'])
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 254, in create_handler
cause=tb)
kivy.lang.builder.BuilderException: Parser: File "C:\Users\saxon\PycharmProjects\PythonMobileApplication\my.kv", line 60:
...
58: id: tag
59: text: 'Tag Type'
>> 60: values: root.updateTagSpinner()
61: Label:
62: text: "ATTRIBUTE TYPE"
...
AssertionError:
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\saxon\PycharmProjects\PythonMobileApplication\my.kv", line 60, in <module>
values: root.updateTagSpinner()
File "C:/Users/saxon/PycharmProjects/PythonMobileApplication/flayoutapp.py", line 75, in updateTagSpinner
sw = SecondWindow()
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\uix\relativelayout.py", line 265, in __init__
super(RelativeLayout, self).__init__(**kw)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\uix\floatlayout.py", line 65, in __init__
super(FloatLayout, self).__init__(**kwargs)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
super(Layout, self).__init__(**kwargs)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 361, in __init__
rule_children=rule_children)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
rule_children=rule_children)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 538, in apply
rule_children=rule_children)
File "C:\Users\saxon\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 554, in _apply_rule
assert(rule not in self.rulectx)
Upvotes: 3
Views: 634
Reputation: 39052
In your updateTagSpinner
method you create a new SecondScreen
on the line sw = SecondWindow()
, and then you call methods on that new SecondScreen
. The problem is that you are calling methods on a Screen
that is not part of your App
display. I suspect you should be calling those method on the SecondScreen
that is part of your App
display.
Try changing your updateTagSpinner
method to:
def updateTagSpinner(self):
self.tag.text = 'Tag Type'
url2scrape = self.urlaccess()
tags_list = self.populateTags(url2scrape)
if tags_list is None:
tags_list = []
return tags_list
Not 100% sure this will fix your problem, because I can't test it (I don't have the storeUrl.txt
file).
Upvotes: 1