QtWebKit中的JavaScript和异步方法

时间:2015-03-30 09:48:34

标签: javascript python angularjs multithreading qt

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

  • Python:PySide(WebKit)
  • JavaScript:AngularJS

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

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

需要您对优雅解决方案的建议。

非常简单的解决方案

  1. 在Python词典中保存一些标志
  2. 通过计时器:)在JS中请求这个标志的值
  3. 但是,我需要硬编码时间,一旦我有长时间的操作,比如从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_mamager.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 ''
    

1 个答案:

答案 0 :(得分:2)

以下是您可以做的事情:

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