如何将Python控制台输出重定向到QTextBox

4 投票
3 回答
5865 浏览
提问于 2025-04-15 22:51

我正在开发一个图形界面(GUI),目的是为了重新编译Linux内核。为此,我需要在Python中实现4到5个Linux命令。我使用Qt来设计这个图形界面。我已经成功地通过os.system()来执行这些命令,但输出结果是在控制台上显示的。真正的问题是,这些命令的输出是一个长长的列表,打印出来几乎需要20到25分钟。我们该如何把这个控制台的输出转移到Qt设计的文本框里呢?有没有人能帮我在Qt中实现setSource()操作,让它的源是实时的控制台输出?

3 个回答

0

可以考虑使用管道。你可以用一个后台线程来读取程序的输出,并在每次添加新行时向图形界面发送事件。

所以基本的想法是这样的:

os.chdir("/usr/src/linux-2.6.34")

p = os.popen("make", "r")
try:
    while True:
        line = p.readline()
        if not line:
            break

        # Replace this with a GUI update event (don't know anything about Qt, sorry)
        print line
finally:
    # Cf. http://docs.python.org/library/os.html#os.popen
    programReturnValue = p.close() or 0
1

我主要使用wxPython,但这个链接里的方法能用吗?

从页面上看:

问题:你想运行一个程序,这个程序会在控制台上打印很多信息,同时你希望能把这些输出显示在文本编辑器或浏览器里,但结果是界面会卡住,直到这个程序运行完。

解决方案(众多可能方案之一):创建一个QProcess对象,把它的信号连接到你类里的某些槽(处理函数),然后给它传入需要的参数并启动它。这样,程序的标准输出和错误输出就会发送到你的槽里。

继续阅读...

7
self.process = QProcess()
self.connect(self.process, SIGNAL("readyReadStdout()"), self.readOutput)
self.connect(self.process, SIGNAL("readyReadStderr()"), self.readErrors)
tarsourcepath="sudo tar xvpf "+ self.path1
self.process.setArguments(QStringList.split(" ",tarsourcepath))
self.process.start()



def readOutput(self):

    self.textBrowser2.append(QString(self.process.readStdout()))
    if self.process.isRunning()==False:
        self.textBrowser2.append("\n Completed Successfully")




def readErrors(self):
    self.textBrowser2.append("error: " + QString(self.process.readLineStderr()))

这个方法对我来说效果很好。谢谢大家。

撰写回答