我正在尝试使用Kivy
向某些脚本添加GUI。但是,以下内容让我非常失望:
class SearchScreen(Screen):
search_input = ObjectProperty()
users_dic = {}
def search_user(self):
globals()["users_dic"] = GetSessionToken.find_user(
self.search_input.text, agent_head)
print globals()['users_dic']
users = [key for key in users_dic.iterkeys()]
self.search_results.item_strings = users
self.search_results.adapter.data[:]
self.search_results.adapter.data.extend(users)
self.search_results._trigger_reset_populate()
class userButton(ListItemButton):
pass
def getUserSession(self, user):
global current_user, user_header, session_token
current_user = user
users_dic = globals()['users_dic']
print users_dic
try:
user_header, session_token = GetSessionToken.UserSession(
users_dic[user], agent_head)
return self.root.changeScreen("operations")
except ValueError:
return self.root.changeScreen("denied")
它产生了这个错误:
KeyError: 'users_dic'
我不明白为什么这适用于"search_user"
但不适用于"getUserSession"
。为了确认,“search_user”打印出字典:
{u'user1': u'202703', u'user2': u'202702', u'user3': u'201105'}
当我运行“getUserSession('user1')”时,我想要提供“202703”。关于Globals
,我错过了什么?函数处理“users_dic”的方式有何不同?
编辑:
在Kivy语言文件中调用 search_user
,如下所示:
<SearchScreen@Screen>:
search_input: search_box
search_results: search_results_list
BoxLayout:
orientation: "vertical"
BoxLayout
height: root.height/10
size_hint_y: None
TextInput:
id: search_box
size_hint_x: 75
Button:
text:"Search"
size_hint_x: 25
on_press: root.search_user()
在Kivy语言文件中调用 getUserSession
,如下所示:
<userButton>:
on_press: main.SearchScreen().getUserSession(self.text)
答案 0 :(得分:1)
在<p><%= link_to "App 1", "#{ENV['APP_1_URL']}/users/#{@user.urn}", :target => "_blank" %> </p>
中,您已将值设置为search_user
,因此当您的代码到达时Globals["users_dic"]
getUserSession
尚未在{user_dic
中定义时,您可以访问该值1}}。
如果您在致电Globals
之前致电search_user
,则应该能够getUserSession
作为users_dic
的一部分进行访问,如下例所示:
Globals
为了清楚起见,在类范围内设置class Foo():
def test(self):
globals()['test'] = 'test'
def post_test(self):
print globals()['test']
foo = Foo()
foo.test()
foo.post_test()
>>test
并不会使其成为users_dic
的一部分。
答案 1 :(得分:0)
对于任何可能偶然发现类似于我的问题的人,我通过将函数移动到根小部件中来解决问题,并改变事件以引用它。
这意味着将函数从以下位置移开:
class SearchScreen(Screen):
以下:
class AgentAppRoot(BoxLayout):
然后从:
更改事件on_press: root.getUserSession(self.text)
为:
on_press: main.SearchScreen().getUserSession(self.text)
我不确定为什么这有效,但它现在......对于任何处于我职位的人,我很遗憾我无法提供任何进一步的信息。