每次尝试初始化kivy屏幕时,即使经过研究,我仍然总是收到错误消息,这表明我正在按照正确的方式进行操作。我想从我的ProjectListScreen class
访问实例,将实例初始化为None,但是将屏幕初始化为ApplyPage无法正常工作,我尝试使用Factory实例化类到ApplyPage class
中,但是它仍然可以不返回实例的值。下面是我的代码,其后是我尝试初始化屏幕类时的回溯。我将不胜感激任何帮助。请我整天都在为此苦苦挣扎。
class ProjectListScreen(Screen):
project_list = ObjectProperty(None)
def __init__(self, **kwargs):
super(ProjectListScreen, self).__init__(**kwargs)
self.thelocalId = None
self.placementtext = None
def on_pre_enter(self, *args):
placements = database.child("placements").get()
placementslist = placements.val()
placementslist.items()
for key, value in placementslist.items():
self.key = key
key_list = []
key_list.append(key)
for key in key_list:
name = database.child("placements").child(str(key)).child("placement name").get()
description = database.child("placements").child(str(key)).child("placement description").get()
location = database.child("placements").child(str(key)).child("placement location").get()
date = database.child("placements").child(str(key)).child("placement date").get()
price = database.child("placements").child(str(key)).child("placement price").get()
thelocalId = database.child("placements").child(str(key)).child("localId").get()
self.thelocalId = thelocalId.val()
self.project_list.adapter.data.extend([ "\n" + "\n" + str(name.val()) + '\n' + str(description.val()) + "\n" + str(location.val()) + '\n' + str(date.val()) + '\n' + '\n' + str(price.val())])
def gettext(self):
self.placementtext = self.project_list.adapter.selection[0].text
class ApplyPage(Screen):
projectlistscreen = ObjectProperty(None)
def __init__(self, projectlistscreen, **kwargs):
super(ApplyPage, self).__init__(**kwargs)
self.projectlistscreen = projectlistscreen
self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.1,"y":0.05}, size_hint= [0.2, 0.1])
self.add_widget(self.yes)
self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.7, "y":0.05}, size_hint= [0.2, 0.1])
self.no.bind(on_pressed=self.nopressed)
self.add_widget(self.no)
def nopressed(self, instance):
sm.current = "placements"
class MyApp(App):
refresh_token_file = "refresh_token.txt"
members_list = "members_list.txt"
def build(self):
self.refresh_token_file = self.user_data_dir + self.refresh_token_file
self.thefirebase = MyFireBase()
return sm
projectlistscreen = ProjectListScreen()
wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))
sm = Builder.load_file("kivy.kv")
奇异果文件
#:import Factory kivy.factory.Factory
#: import mainfile mainfile
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import ListItemButton kivy.uix.listview.ListItemButton
#: import FileChooserIconView kivy.uix.filechooser.FileChooserIconView
WindowManager:
id: window manager
ApplyPage:
id: applyingpage
name: "applyingpage"
ProjectListScreen:
id: project_list_screen
name: "project_list_screen"
<ApplyPage>:
name: "applyingpage"
canvas.before:
Color:
rgba: 1, 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
<ProjectListScreen>:
project_list: project_list_view
canvas.before:
Color:
rgba: 1, 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
Image:
source: "icons/m.png"
pos_hint: {"center_x": 0.5, "center_y": 0.95}
BoxLayout:
orientation: 'vertical'
pos_hint: {"center_x": 0.3, "center_y": 0.3}
ListView:
id: project_list_view
adapter:
ListAdapter(data=[], cls = mainfile.ProjectListButton)
下面是我的回溯
Traceback (most recent call last):
File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 836, in <module>
sm = Builder.load_file("kivy.kv")
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
return self.load_string(data, **kwargs)
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 368, in load_string
parser = Parser(content=string, filename=fn)
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 392, in __init__
self.parse(content)
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 498, in parse
self.execute_directives()
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 462, in execute_directives
mod = __import__(package)
File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 836, in <module>
sm = Builder.load_file("kivy.kv")
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
return self.load_string(data, **kwargs)
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 400, in load_string
self._apply_rule(widget, parser.root, parser.root)
File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 582, in _apply_rule
child = cls(__no_builder=True)
TypeError: __init__() missing 1 required positional argument: 'projectlistscreen'
新错误代码
File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 834, in <module>
wm.add_widget(ApplyPage(projectlistscreen))
TypeError: __init__() takes 1 positional argument but 2 were given
如果有人能确定屏幕初始化不正确的原因。谢谢
答案 0 :(得分:0)
您的__init__()
类的ApplyPage
方法需要位置参数projectlistscreen
。加载kv
文件并遇到ApplyPage:
时,将调用该__init__()
方法而没有必需的projectlistscreen
参数。我建议修改该__init__()
方法,使projectlistscreen
成为kwarg
参数,如下所示:
def __init__(self, **kwargs):
self.projectlistscreen = kwargs.pop('projectlistscreen', None)
super(ApplyPage, self).__init__(**kwargs)
self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.1,"y":0.05}, size_hint= [0.2, 0.1])
self.add_widget(self.yes)
self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.7, "y":0.05}, size_hint= [0.2, 0.1])
self.no.bind(on_pressed=self.nopressed)
self.add_widget(self.no)
此外,我从先前的问题中识别出您的代码,并且您再次犯下与先前文章中所指出的错误相同的错误。您的代码:
projectlistscreen = ProjectListScreen()
wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))
正在创建ProjectListScreen
,WindowManager
和ApplyPage
。都没有实际使用。
代码:
sm = Builder.load_file("kivy.kv")
构建与上述相同的Widgets
,但是由于sm
由您的build()
方法返回,因此实际上已使用它们。
答案 1 :(得分:0)
我将从.kv文件中删除该内容
WindowManager:
id: window manager
ApplyPage:
id: applyingpage
name: "applyingpage"
ProjectListScreen:
id: project_list_screen
name: "project_list_screen"
然后从Python中删除它
wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))
sm = Builder.load_file("kivy.kv")
然后将其从ApplyPage类中删除
def nopressed(self, instance):
sm.current = "placements"
您需要的是这个
class WindowManager(ScreenManager):
def __init__(self, **kwargs):
super(WindowManager, self).__init__(**kwargs)
class MyApp(App):
...
def build(self):
self.refresh_token_file = self.user_data_dir + self.refresh_token_file
self.thefirebase = MyFireBase()
# I think you will need these objects later, so better to do it accessable for the whole class
self.sm = WindowManager()
self.pls = ProjectListScreen()
self.applypage = ApplyPage(self.pls)
# then add that screens to screen manager (it's even more simple than to do it in .kv)
self.sm.add_widget(self.pls)
self.sm.add_widget(self.applypage)
return self.sm
# if you need a transition to another screen, you can create method here
def toapplypage(self):
self.sm.transition.direction = 'left'
self.sm.current = "applyingpage"
您可以使用方法来更改其他类中的屏幕,但是您需要将在build方法中创建的对象发送到那里。因此,调用该方法就像:
# it's only an example!
self.applypage.nopressed(self.sm)
别忘了在.kv文件中写上ProjectListScreen类的名称。