繁体   English   中英

QtWebKit中的JavaScript和异步方法

[英]JavaScript and async methods in QtWebKit

我正在开发桌面软件基于:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM