Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为更新exe创建下载栏_Python_Python 3.x_Progress Bar_Pyinstaller_Download - Fatal编程技术网

Python 为更新exe创建下载栏

Python 为更新exe创建下载栏,python,python-3.x,progress-bar,pyinstaller,download,Python,Python 3.x,Progress Bar,Pyinstaller,Download,我试图为我的更新脚本包括一个下载栏,但我不知道如何做到这一点。奇怪的是,在调试过程中出现了一个下载条: 我查看了他们的downloader.py,并尝试创建一个进度条。关于如何实现这一点,有什么想法吗? 此时会显示一个进度条(已完成),但没有进度条来显示它需要运行多长时间 def check_for_update(): bar = progressbar.ProgressBar() for i in bar(range(100)): time.sleep(0.0

我试图为我的更新脚本包括一个下载栏,但我不知道如何做到这一点。奇怪的是,在调试过程中出现了一个下载条:

我查看了他们的downloader.py,并尝试创建一个进度条。关于如何实现这一点,有什么想法吗? 此时会显示一个进度条(已完成),但没有进度条来显示它需要运行多长时间

def check_for_update():
    bar = progressbar.ProgressBar()
    for i in bar(range(100)):
        time.sleep(0.0)

    def cb(status):
        zz = status['downloaded'] * 100.0 / status['total']

        zz = bar.update(status.the_dwad)

        print(zz)

    import os
    import sys
    from contextlib import contextmanager


    import sys
    import os
    stdout_save = sys.stdout
    sys.stdout = open(os.devnull, 'w')

    client = Client(ClientConfig(), refresh=True, progress_hooks=[cb], headers={'basic_auth': 'brofewfefwefewef:EKAXsWkdt5H6yJEmtexN'})
似乎:def cb(状态):未被调用


如果需要复制代码中的一些问题,我还提供了完整的脚本和其他信息

  • 您不应该启用调试日志,否则会妨碍进度条
  • 你没有启动进度条
  • 您在进度条回调
    状态中出错。_dwad
  • 由于progressbar存在一些问题,代码可能无法在IDE中很好地运行,因此您应该在终端中运行它

下面是我运行的代码

import urllib3.poolmanager

orig_urlopen = urllib3.poolmanager.PoolManager.urlopen


def new_urlopen(self, method, url, redirect=True, **kw):
    if "s3.amazonaws.com" in url and 'authorization' in self.headers:
        self.headers.pop('authorization')
    return orig_urlopen(self, method, url, redirect, **kw)


urllib3.poolmanager.PoolManager.urlopen = new_urlopen

import logging

# logging.basicConfig(level=logging.DEBUG)

import http.client as http_client

# http_client.HTTPConnection.debuglevel = 1

import logging
from selenium import webdriver

# logging.basicConfig(level=logging.DEBUG)

from client_config import ClientConfig
from pyupdater.client import Client, AppUpdate

import progressbar
import sys

bar = None


def check_for_update():

    def cb(status):
        global bar

        if bar is None:
            bar = progressbar.ProgressBar(widgets=[progressbar.Percentage(), progressbar.Bar()], fd=sys.stdout).start()
        zz = float(status['percent_complete'])

        bar.update(zz)

    # sys.stdout = open(os.devnull, 'w')

    client = Client(ClientConfig(), refresh=True,
                    headers={'basic_auth': 'brofewfefwefewef:EKAXsWkdt5H6yJEmtexN'})

    client.platform = "win"
    app_update = client.update_check(ClientConfig.APP_NAME, ClientConfig.APP_VERSION, channel='stable')
    if app_update is not None:
        app_update.progress_hooks.append(cb)
        if app_update.download():
            if isinstance(app_update, AppUpdate):
                app_update.extract_restart()
                return True
            else:
                app_update.extract()
                return True
    return False


def main():
    print('Current version is ', ClientConfig.APP_VERSION)
    if check_for_update():
        print('there\'s a new update :D')
    driver = webdriver.Firefox()
    driver.get('https://www.youtube.com/')


if __name__ == "__main__":
    main()

你能给我指一下构建
客户端配置库的网址/pip关键字吗?@DanielR.Livingston看一下-self.progress\u hooks=kwargs.get('progress\u hooks',[])。这就是你的意思吗?对不起,我应该澄清一下;我正在尝试运行您链接到的完整脚本,但尝试导入客户端配置时脚本失败。我正在尝试确定这是哪个库以及我可以在哪里构建它,以便运行您的代码。@DanielR.Livingston请检查:。还有我的其他文件,我也包括了我使用的文件。我应该提到,对于main.py,我会使用它,而不是一步一步地使用它,因为它有一个修复urllib3 bug的monkey补丁。否则会出现错误400。为什么它会打印授权4次并打印两个下载条?我想知道有一个密钥下载,然后是清单更新下载,然后是实际下载。这就是为什么您会看到progressbar下载两次。如果你需要避免的话。您应该在
app\u update.download()
之前设置回调函数。您可以在示例中演示如何执行此操作吗?更新了代码。另外,页眉打印是pyudater中的一个bug,它不应该出现在那里。它似乎仍然显示N/A%以及下载栏-
import urllib3.poolmanager

orig_urlopen = urllib3.poolmanager.PoolManager.urlopen


def new_urlopen(self, method, url, redirect=True, **kw):
    if "s3.amazonaws.com" in url and 'authorization' in self.headers:
        self.headers.pop('authorization')
    return orig_urlopen(self, method, url, redirect, **kw)


urllib3.poolmanager.PoolManager.urlopen = new_urlopen

import logging

# logging.basicConfig(level=logging.DEBUG)

import http.client as http_client

# http_client.HTTPConnection.debuglevel = 1

import logging
from selenium import webdriver

# logging.basicConfig(level=logging.DEBUG)

from client_config import ClientConfig
from pyupdater.client import Client, AppUpdate

import progressbar
import sys

bar = None


def check_for_update():

    def cb(status):
        global bar

        if bar is None:
            bar = progressbar.ProgressBar(widgets=[progressbar.Percentage(), progressbar.Bar()], fd=sys.stdout).start()
        zz = float(status['percent_complete'])

        bar.update(zz)

    # sys.stdout = open(os.devnull, 'w')

    client = Client(ClientConfig(), refresh=True,
                    headers={'basic_auth': 'brofewfefwefewef:EKAXsWkdt5H6yJEmtexN'})

    client.platform = "win"
    app_update = client.update_check(ClientConfig.APP_NAME, ClientConfig.APP_VERSION, channel='stable')
    if app_update is not None:
        app_update.progress_hooks.append(cb)
        if app_update.download():
            if isinstance(app_update, AppUpdate):
                app_update.extract_restart()
                return True
            else:
                app_update.extract()
                return True
    return False


def main():
    print('Current version is ', ClientConfig.APP_VERSION)
    if check_for_update():
        print('there\'s a new update :D')
    driver = webdriver.Firefox()
    driver.get('https://www.youtube.com/')


if __name__ == "__main__":
    main()