Python中的线程化未将UI与工作线程分离

Python中的线程化未将UI与工作线程分离,python,multithreading,pyqt,pyqt4,Python,Multithreading,Pyqt,Pyqt4,我错过了一些东西。尽管在两个独立的线程中运行,UI仍然没有按预期更新。它仍然滞后于dd工作线程 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

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

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错误?无论UI类定义在哪里,它都保持不变。

您没有在任何地方运行主eventloop-如果没有它,您将无法显示gui()。试一试

没有while循环。
如果您的while循环应该创建一个不确定的进度条,那么可以通过将
QProgressBar
最小值和最大值设置为零来轻松实现。我在第二个线程中有它,即_ui_progress_set():程序运行正常,只有ui更新缓慢,就像线程没有分开一样。这就是问题所在。但是连接两个线程的唯一东西是一个称为out int的进度变量,它是一个从0到100的整数。我在代码中找不到任何
exec
调用!?另外,如果它在那里,
exec\uu
会阻止进一步的执行,直到应用程序结束-所以你实际上不会到达while循环。对不起,我错过了它。但是我有一个新的问题,在代码停止时,我不能更新状态栏。但是,如果我将状态栏更新分离到另一个函数中,那么它将无法到达第一个函数中声明的“ui”元素。我应该如何继续?可能重复的注意,Qt只应该从主线程访问,这可能也解释了您在其他一些问题中看到的崩溃。您需要重新构建程序,使Qt在主线程中运行,并使用
QThread
s将信号发送回主线程以更新GUI。
app = QtGui.QApplication(sys.argv)
ui = MainWindow()
ui.show()
app.exec_()