当功能失败时,tkinter gui冻结

时间:2013-10-24 04:21:13

标签: python tkinter paramiko

背景:为了练习,我正在编写一个允许帮助台用户进行工作的应用程序尾部日志,无需执行SSH /终端工作。这些用户在Windows机器上运行,否则我会使用子进程。某些服务器使用系统帐户(并且这些帐户已预先填入脚本中),但其他服务器则要求用户输入凭据。

当运行脚本(详细信息如下)并且用户输入的凭据不正确时,应用程序在抛出“无法找到记录程序的处理程序”paramiko.transport“'错误后挂起。当用户选择没有预填充凭证的选项时,系统会提示他们输入用户名和密码。凭据将附加到相应的列表中,弹出窗口将被销毁并调用日志检查功能。抛出错误时可能导致窗口挂起的原因,以及处理此类问题的最佳方法是什么?

我试图添加logging.basicConfig(),但应用程序仍然挂起。

完整脚本:http://pastebin.com/TUvs92yN

当用户第一次点击提交按钮时,将调用以下内容:

lambda: credentials() if hosts[log.get()][0] in needs_pass else log_check()

如果在列表中找到主机名,则会出现凭据框。用户输入用户名和密码后,将调用submit_cred()函数:

def submit_cred():
    if len(hosts[log.get()]) < 3:
        hosts[log.get()].append(username_prompt.get())
        hosts[log.get()].append(password_prompt.get())
    prompt.destroy()
    log_check()

这就是麻烦开始的地方。如果凭据正确,则应用程序按预期显示结果,但如果不是,则在销毁窗口后调用log_check()时会收到错误并且应用程序挂起。我试图在log_check()中处理身份验证问题,但此时似乎没有足够的重要性。

1 个答案:

答案 0 :(得分:1)

我认为问题在于你的paramiko ssh connect方法调用。该方法采用可选的超时参数,但默认情况下超时设置为None,因此永远不会返回。如果您将此值设置为对用户更合理的值,则为5秒(您可能希望在实践中将其设置得更长):

# Verify connectivity/authenticate.
    try:
        ssh.connect(host, username=user, password=passwd, timeout=5)

现在你会注意到你会点击你的except子句。异常消息将“超时”,因此您可以在那里添加检查。

此外,在Thread中的GUI中包装这样的函数以防止整个应用程序冻结并不是一个坏主意,它很容易实现。在您的情况下,您可以执行诸如将当前log_check函数重命名为_log_check之类的操作,然后编写一个小包装器,如:

def log_check(self):
    t = Thread(target=_log_check)
    t.start()

希望这有帮助!