Python “为什么我的屏幕对象是”;“不可赎回”;当试图用按钮显示屏幕时?
我想在按下按钮时显示第二个屏幕,但出现错误,TypeError:“kivy.properties.StringProperty”对象不可调用。如果我从代码中删除Python “为什么我的屏幕对象是”;“不可赎回”;当试图用按钮显示屏幕时?,python,kivy,Python,Kivy,我想在按下按钮时显示第二个屏幕,但出现错误,TypeError:“kivy.properties.StringProperty”对象不可调用。如果我从代码中删除ScreenManager.current('ScreenTwo'),那么错误就会消失,但是,在保存输入的数据后,我需要某种方式来显示屏幕。为什么我会出现这个错误,我将如何修复它 这是我的密码: class TwoLayout(GridLayout): def display_btn(self): for key
ScreenManager.current('ScreenTwo')
,那么错误就会消失,但是,在保存输入的数据后,我需要某种方式来显示屏幕。为什么我会出现这个错误,我将如何修复它
这是我的密码:
class TwoLayout(GridLayout):
def display_btn(self):
for key in MainApp.store:
streak_button = Button(text=key)
ids.streak_zone.add_widget(streak_button)
presentation = Builder.load_file("StreakStar.kv")
class MainApp(App):
def build(self): # build() returns an instance
self.store = JsonStore("streak.json")
return presentation
# creates the Streak object
def create(self):
obj = self.root.get_screen('one') # get info from ScreenOne
self.streak = Streak(obj.ids.action_entry.text, obj.ids.streak_entry.text,
obj.ids.day_entry.text, obj.ids.hour_entry.text,
obj.ids.minute_entry.text)
empty_error = "Make sure to fill out all boxes!"
popup = Popup(title="Not filled", content=Label(text=empty_error),
size_hint=(None, None), size=(300, 100))
# error handling and calculating total seconds
parsed = False
try:
total = ((int(self.streak.day) * 86400) + (int(self.streak.hour) * 3600) +
(int(self.streak.minute) * 60)) # convert into seconds
parsed = True
# delete later and replace with return
print("[seconds:", total,']' , "[action:", self.streak.action,']',
"[action number:", self.streak.action_num,']')
self.store.put(self.streak.action, action=self.streak.action,
action_num=self.streak.action_num, seconds=total,
score=self.streak.score)
ScreenManager.current('ScreenTwo')
except ValueError as error:
popup.open()
.kv代码:
ScreenManagement:
transition: SlideTransition()
MainScreen:
ScreenOne:
ScreenTwo:
...
<TwoLayout>
<ScreenTwo>
on_pre_enter: TwoLayout.display_btn()
name: "two"
GridLayout:
cols: 2
rows: 1
BoxLayout:
id: streak_zone
orientation: 'vertical'
AnchorLayout:
anchor_x: "center"
anchor_y: "center"
Label:
id: high_lable
text: "Highest Streak: "
size_hint: None, None
font_size: 20
屏幕管理:
转换:SlideTransition()
主屏幕:
第一屏:
屏幕二:
...
在\u pre\u输入:twoolayout.display\u btn()
姓名:“两个”
网格布局:
科尔斯:2
行数:1
盒子布局:
id:条纹区
方向:“垂直”
主持人安排:
主播x:“中心”
主播:“中心”
标签:
id:高标签
文字:“最高条纹:”
大小提示:无,无
字体大小:20
完全回溯:
Traceback (most recent call last):
File "C:\Users\tonya\Desktop\realProjects\HaStreakual\HaStreakual.py", line 105, in <module>
MainApp().run()
File "C:\Python36\lib\site-packages\kivy\app.py", line 826, in run
runTouchApp()
File "C:\Python36\lib\site-packages\kivy\base.py", line 502, in runTouchApp
EventLoop.window.mainloop()
File "C:\Python36\lib\site-packages\kivy\core\window\window_sdl2.py", line 727, in mainloop
self._mainloop()
File "C:\Python36\lib\site-packages\kivy\core\window\window_sdl2.py", line 460, in _mainloop
EventLoop.idle()
File "C:\Python36\lib\site-packages\kivy\base.py", line 340, in idle
self.dispatch_input()
File "C:\Python36\lib\site-packages\kivy\base.py", line 325, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Python36\lib\site-packages\kivy\base.py", line 231, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\core\window\__init__.py", line 1360, in on_motion
self.dispatch('on_touch_down', me)
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\core\window\__init__.py", line 1376, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\uix\screenmanager.py", line 1191, in on_touch_down
return super(ScreenManager, self).on_touch_down(touch)
File "C:\Python36\lib\site-packages\kivy\uix\widget.py", line 460, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\uix\relativelayout.py", line 288, in on_touch_down
ret = super(RelativeLayout, self).on_touch_down(touch)
File "C:\Python36\lib\site-packages\kivy\uix\widget.py", line 460, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\uix\widget.py", line 460, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Python36\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
self.dispatch('on_press')
File "kivy\_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy\_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
File "C:\Python36\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Users\tonya\Desktop\realProjects\HaStreakual\StreakStar.kv", line 100, in <module>
on_press: app.create()
File "C:\Users\tonya\Desktop\realProjects\HaStreakual\HaStreakual.py", line 84, in create
ScreenManager.current('ScreenTwo')
TypeError: 'kivy.properties.StringProperty' object is not callable
[Finished in 17.269s]
回溯(最近一次呼叫最后一次):
文件“C:\Users\tonya\Desktop\realProjects\HaStreakual\HaStreakual.py”,第105行,在
MainApp().run()
文件“C:\Python36\lib\site packages\kivy\app.py”,第826行,正在运行
runTouchApp()
runTouchApp中第502行的文件“C:\Python36\lib\site packages\kivy\base.py”
EventLoop.window.mainloop()
文件“C:\Python36\lib\site packages\kivy\core\window\window\u sdl2.py”,第727行,在mainloop中
self._mainloop()
文件“C:\Python36\lib\site packages\kivy\core\window\window\u sdl2.py”,第460行,在\u mainloop中
EventLoop.idle()
文件“C:\Python36\lib\site packages\kivy\base.py”,第340行,处于空闲状态
self.dispatch_input()
文件“C:\Python36\lib\site packages\kivy\base.py”,第325行,在dispatch\u输入中
发送后输入(*pop(0))
文件“C:\Python36\lib\site packages\kivy\base.py”,第231行,在post\u dispatch\u输入中
dispatch('on_motion',etype,me)
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\core\window\\uuuu init\uuuu.py”,第1360行,动态
自我派遣(“在我触地时”)
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\core\window\\uuuuu init\uuuuuu.py”,第1376行,在on\u触控下
如果w.dispatch('打开触摸屏',触摸屏):
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\uix\screenmanager.py”,第1191行,在on\u触摸屏上
返回超级(屏幕管理器,自我)。打开触摸(触摸)
文件“C:\Python36\lib\site packages\kivy\uix\widget.py”,第460行,在on\u触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\uix\relativelayout.py”,第288行,在on\U触控下
ret=超级(相对性,自我)。打开触摸(触摸)
文件“C:\Python36\lib\site packages\kivy\uix\widget.py”,第460行,在on\u触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\uix\widget.py”,第460行,在on\u触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“kivy\\ u event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Python36\lib\site packages\kivy\uix\behaviors\button.py”,第151行,在on\u触摸屏中
自动发送('在印刷机上')
文件“kivy\\ u event.pyx”,第703行,在kivy.\u event.EventDispatcher.dispatch中
文件“kivy\\u event.pyx”,第1214行,在kivy.\u event.eventobserver.dispatch中
文件“kivy\\u event.pyx”,第1098行,在kivy.\u event.eventobserver.\u调度
文件“C:\Python36\lib\site packages\kivy\lang\builder.py”,第64行,在自定义\u回调中
exec(\uuuukVLANG\uuuuuuu.co\u值,idmap)
文件“C:\Users\tonya\Desktop\realProjects\HaStreakual\StreakStar.kv”,第100行,in
按:app.create()
文件“C:\Users\tonya\Desktop\realProjects\HaStreakual\HaStreakual.py”,第84行,在create中
ScreenManager.current('ScreenTwo')
TypeError:“kivy.properties.StringProperty”对象不可调用
[以17.269秒完成]
因为根目录是我的屏幕,所以我用它来表示屏幕,下面是两个代码:
def change_screen(self, *args):
self.root.current = 'two'
self.display_btn()
始终将完整的错误消息(回溯)放在问题中(作为文本,而不是屏幕截图)。还有其他有用的信息。请参阅文档-它们使用
.current=“text”
,而不是.current(“text”)
<代码>.current是StringProperty,而不是函数/方法。
parsed = False
try:
total = ((int(self.streak.day) * 86400) + (int(self.streak.hour) * 3600) +
(int(self.streak.minute) * 60)) # convert into seconds
parsed = True
# delete later just used to test
print("[seconds:", total,']' , "[action:", self.streak.action,']',
"[action number:", self.streak.action_num,']')
self.current_time = time.time()
self.count = self.current_time + total
# store streak attributes inside "streak.json"
self.store.put(self.streak.action, action=self.streak.action,
action_num=self.streak.action_num, seconds=total,
score=self.streak.score, delta=self.count)
self.change_screen(self)