npyscreen和threading:在另一个线程中更改表单

时间:2015-11-17 17:29:37

标签: python multithreading

所以我们走了。我正在开发一个有趣的项目,其目的是登录界面(标准用户名/密码输入):

class LoginDisplay(npyscreen.Form):

    def create(self):
        self.name = Config.welcome_message
        self.wgUsername = self.add(npyscreen.TitleText, name="Username :")
        self.wgPassword = self.add(TitlePassword, name="Password :")

    def beforeEditing(self):
        self.parentApp.unlog_user()
        self.wgUsername.value = ""
        self.wgPassword.value = ""

    def afterEditing(self):
        self.parentApp.log_user(self.wgUsername.value, self.wgPassword.value)

听起来很酷,工作正常。

我的问题是我正在使用其他方式使用NFC阅读器登录。代码很简单:

def badge(myApp):
    """ Target function of a Thread """
    device = serial.Serial('/dev/ttyUSB0',timeout=60)
    device.setTimeout(1)
    buff = ''
    while myApp.isAlive: 
        s = device.read(1)
        if s == '':
            sleep(1)
        elif s == '\r' :
            # buff var containing the badge id
            myApp.login_by_badge(buff)
        else:
            buff = buff + s

因此,如果登录正确,目标是更改当前表单(当前表单),如下所示:

class MyApplication(npyscreen.NPSAppManaged):

     # .../...

     def log_user(self, username, password):
         if self._valid_login(username, password):
             self.switchForm("ANOTHER_FORM")

     def login_by_badge(self, badge_id):
         if self._valid_badge(badge_id):
             self.switchForm("ANOTHER_FORM")

当然,在子线程中切换表单的确如此。我深入了解资料来源,看起来图书馆npyscreen绝对不是为这类事物设计的。

问题:我应该实现我拥有的windgets,表单和应用程序的一部分来管理它,还是有一种常见的方法来处理npyscreen中的线程交互?

1 个答案:

答案 0 :(得分:1)

我是npyscreen的作者。

您应该查看使用最新版本中添加的事件系统。我添加了部分内容,允许您在线程之间发送消息。