Python中的线程化没有将UI与worker线程分开

2024-03-28 13:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我错过了一些东西。尽管UI运行在两个独立的线程中,但它仍然没有按预期进行更新。它仍然落后于dd worker线程。在

from ui import Ui_main_window
from PyQt4 import QtGui, QtCore

import sys
import subprocess
import commands
import threading

from time import sleep

out_int = 0

def _dd_thread_run(_if, _of, _bs, _size):
    _dd_subprocess_command_format = "dd if=%s bs=%s | pv -n --size %s | dd of=%s" % (_if, _bs, _size, _of)
    _dd_subprocess_command = [_dd_subprocess_command_format]
    _dd_progress = subprocess.Popen(_dd_subprocess_command, shell=True, stderr=subprocess.PIPE)
    while _dd_progress.poll() is None:
        out = _dd_progress.stderr.readline().replace("\n", "")
        global out_int 
        out_int = int (out)

def _ui_progress_set():
    class MainWindow(QtGui.QMainWindow, Ui_main_window):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.setupUi(self)

    app = QtGui.QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    while True:
        for i in range(100):
            ui.progressBar.setValue(out_int)
            sleep(.1)


t1 = threading.Thread(target=_dd_thread_run, args = ["/dev/urandom", "/dev/null", "100K", "100M"])
t1.start()
t2 = threading.Thread(target=_ui_progress_set, args = [])
t2.start()

我怀疑是Python或PyQt bug?而且无论在哪里定义UI类,它都保持不变。在


Tags: offromimportselfuiifdefout
1条回答
网友
1楼 · 发布于 2024-03-28 13:17:21

主eventloop在任何地方都不能运行-没有它,gui就无法显示出来(see doc)。试试看

app = QtGui.QApplication(sys.argv)
ui = MainWindow()
ui.show()
app.exec_()

没有while循环。 如果while循环应该创建一个不确定的progressbar-可以通过将QProgressBar的最小值和最大值设置为零来轻松实现。在

相关问题 更多 >