全局和函数......和Kivy(Python 2.7.10)(Kivy 1.9.1)

时间:2016-02-15 17:07:50

标签: python kivy globals

我正在尝试使用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)

2 个答案:

答案 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)

我不确定为什么这有效,但它现在......对于任何处于我职位的人,我很遗憾我无法提供任何进一步的信息。