如何在实例类(后端)和Kivy图形元素(前端)之间共享数据?

时间:2016-06-28 16:18:07

标签: python kivy

我是Kivy的初学者,我正在尝试为python app创建gui。 我有一个在python中编程的后端,单独工作(键盘作为输入),现在我想要kivy的前端。我有两个问题:   - 如何一次运行两个组件(后端和前端)?   - 如何在后端共享现有类的对象以在前端显示信息(kivy)?

classtest.py

class Test(object):
  def __init__(self, attr):
    self.attr = attr

gui.py

class LoginScreen(GridLayout):
  def __init__(self, **kwargs):
    super(LoginScreen, self).__init__(**kwargs)
    self.cols = 2
    self.add_widget(Label(text='User Name'))
    self.username = TextInput(multiline=False)
    self.add_widget(self.username)
    self.add_widget(Label(text='password'))
    self.password = TextInput(password=True, multiline=False)
    self.add_widget(self.password)
    print self.username.text

class Login(App):

  def build(self):
    Window.borderless = True
    return LoginScreen()    

main.py

import classtest, gui
users = ['user_name1', 'user_name2', 'user_name3']    
gui.Login().run()
for u in users:
  test = classtest.Test(u) # this should update the user text field on the windows login automatically, but how?

在示例中,如何在实例属性值更改时更新登录窗口的元素?

多次感谢!

1 个答案:

答案 0 :(得分:0)

它不会更新因为...循环:P Kivy为每个App().run()或类似的“run”命令启动一个循环并且你的:

for u in users:
    test = classtest.Test(u)

在循环后写入。所以基本上它甚至不会在你的应用程序运行时执行。只需将print('something')放入for循环,您就会看到。

示例:

while True:
    <do something>
<change a variable in that loop>  # == nope

对你来说意味着你需要:

  • 将其写入gui.py文件
  • 在classtest.py
  • 中设置正确的内容

第二个选项还取决于何时使用该类。如果在主循环之外,那么您现在处于相同的情况,因此 - 在Test()内使用gui.py

在应用运行时,您将无法在run()之后使用任何代码。也许有一些肮脏的伎俩,但那只会给你带来麻烦。您编写的代码可用于某些“清理”,您也可以在App.on_stop方法(主循环内)中执行此操作。