Как установить значения счетчика равными выводимому списку метода питона в киве - PullRequest
3 голосов
/ 20 июня 2019

Итак, я создаю приложение, в котором указан входной веб-сайт, и который позволяет пользователю выбирать тег (например, div, body, article), атрибут (например, class, style, id) и значение. атрибута и вывести соответствующий HTML-код соответствующего веб-сайта. Теперь на одном из моих экранов в приложении kivy мне нужно, чтобы у моего счетчика (id: tag в коде) был список всех возможных тегов на веб-сайте. Этот список всех возможных тегов является результатом метода с именем updateTagSpinner

Код иллюстрирует то, что я пытался сделать, и он возвращает AssertionError. Я понятия не имею, что делать или как это решить. Любая помощь будет оценена :) 1006 *

Приветствие.

код

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)

1 Ответ

1 голос
/ 21 июня 2019

В вашем методе updateTagSpinner вы создаете новый SecondScreen в строке sw = SecondWindow(), а затем вызываете методы для этого нового SecondScreen.Проблема в том, что вы вызываете методы на Screen, который не является частью вашего App дисплея.Я подозреваю, что вы должны вызывать этот метод на SecondScreen, который является частью вашего App дисплея.

Попробуйте изменить свой updateTagSpinner метод на:

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

Не 100%уверен, что это решит вашу проблему, потому что я не могу это проверить (у меня нет файла storeUrl.txt).

...