【问题标题】:JavaScript and async methods in QtWebKitQtWebKit 中的 JavaScript 和异步方法
【发布时间】:2015-03-30 09:48:33
【问题描述】:

我正在开发基于以下内容的桌面软件:

  • Python:PySide (WebKit)
  • JavaScript:AngularJS

现在,我需要实现异步功能:

  • 从 FTP(Python 部分)上传图片时,我需要在 UI (HTML+JS) 上显示一些上传器

需要关于优雅解决方案的建议。

非常简单的解决方案

  1. 在 Python 字典中保存一些标志
  2. 通过计时器在JS中请求此标志的值:)

但是,我需要对时间进行硬编码,一旦我进行了长时间的操作,例如从 FTP 下载文件,这对我来说是个问题

解决方案代码:

templateManager.js

function _loadNewTemplates() {
        var deferred = $.Deferred();

        asyncManager.run($.proxy( _loadNewTemplatesCallback, null, deferred ), "get_new_templates_list" );

        return deferred;
    }

    function _loadNewTemplatesCallback ( deferred, response ) {
        template.newList = response.result;
        deferred.resolve();
    }

app_maager.py

    @QtCore.Slot(int, result=str)
    def get_new_templates_list(self, id):
       thread.start_new_thread(get_new_templates_list,
                                    (id,))

utils.py

def get_new_templates_list(id):
   config.set_response(id, json.dumps({'result': _get_new_templates_list(), 'error': None}, MyEncoder))


def _get_new_templates_list():
    request = {'category': PRODUCT_CODE}
    response = requests.post(URL,
                             data=request,
                             headers=HEADERS)
    return json.loads(response.text)

config.py

def set_response(id, request):
    '''
    Put pair (id, request) to the internal dictionary
    :param id - int, request id:
    :param request - string, request string:
    :return:
    '''
    global _async_request
    _async_request[id] = request

def get_response(id):
    '''
    Returns request or empty string if request does not exist
    :param id - int
    :return - string, request string:
    '''
    global _async_request
    if _async_request.has_key(id):
        return _async_request.pop(id)
    else:
        return ''

【问题讨论】:

标签: javascript python angularjs multithreading qt


【解决方案1】:

你可以这样做:

  1. 使用stat/stat.ST_SIZE检索文件大小,
  2. 决定chunk 的大小,
  3. 使用正确的范围调用PySide.QtGui.QProgressBar.setRange(),对于二进制文件,0 到块数(文件大小/ftp 传输块大小)或文本文件的行数。
  4. 将回调传递给ftplib.FTP.storbinary()ftplib.FTP.storlines(),以便传输的每个块/行都会相应地增加您的进度条PySide.QtGui.QProgressBar.setValue()

【讨论】:

  • 谢谢。我对没有进展的简单 loader.gif 很好,我正在寻找以异步模式在 JS 和 Python 之间进行通信的最佳灵活解决方案。因为我认为(也许我错了)我上面的方法没有我需要的那么好。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2010-11-27
  • 2013-06-12
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多