如何将微调器值设置为等于 kivy 中 python 方法的输出列表
How to set spinner values equal to outputted list of a python method in kivy
所以我正在构建一个给定输入网站的应用程序,能够允许用户选择标签(例如 div、正文、文章)、属性(例如 class, style, id), 和一个属性的值,并输出相关网站的相关HTML代码。现在,在我的 kivy 应用程序的一个屏幕中,我需要让我的微调器(代码中的 id: tag
)有一个网站中所有可能标签的列表。所有可能标签的列表是名为 updateTagSpinner
的方法的输出
该代码说明了我尝试做的事情,它返回了一个 AssertionError
。我不知道该怎么做,或者如何解决这个问题。任何帮助将不胜感激:)
干杯。
代码
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"
断言错误
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)
在您的 updateTagSpinner
方法中,您在行 sw = SecondWindow()
上创建了一个新的 SecondScreen
,然后您在该新的 SecondScreen
上调用方法。问题是您在不属于 App
显示的 Screen
上调用方法。我怀疑您应该在属于 App
显示的 SecondScreen
上调用这些方法。
尝试将您的 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
文件)。
所以我正在构建一个给定输入网站的应用程序,能够允许用户选择标签(例如 div、正文、文章)、属性(例如 class, style, id), 和一个属性的值,并输出相关网站的相关HTML代码。现在,在我的 kivy 应用程序的一个屏幕中,我需要让我的微调器(代码中的 id: tag
)有一个网站中所有可能标签的列表。所有可能标签的列表是名为 updateTagSpinner
该代码说明了我尝试做的事情,它返回了一个 AssertionError
。我不知道该怎么做,或者如何解决这个问题。任何帮助将不胜感激:)
干杯。
代码
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"
断言错误
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)
在您的 updateTagSpinner
方法中,您在行 sw = SecondWindow()
上创建了一个新的 SecondScreen
,然后您在该新的 SecondScreen
上调用方法。问题是您在不属于 App
显示的 Screen
上调用方法。我怀疑您应该在属于 App
显示的 SecondScreen
上调用这些方法。
尝试将您的 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
文件)。