haggisman18
haggisman18

Reputation: 135

How to set spinner values equal to outputted list of a python method in kivy

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.

CODE

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()

my.kv

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"

AssertionError

 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

Answers (1)

John Anderson
John Anderson

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

Related Questions