Python 废话,PyQt

Python 废话,PyQt,python,pyqt,beautifulsoup,Python,Pyqt,Beautifulsoup,我一直在编写一个非常简单的脚本,它从stackoverflow中的python标记获取问题标题,并在QTextBrowser中显示它们 应用程序按预期工作(至少在最短时间内),但窗口直到加载完网页才显示,刷新按钮将程序冻结,直到加载完毕。是否有办法解决此问题?以下是完整的代码: #! usr/bin/env python from PyQt4.QtGui import * import requests from bs4 import BeautifulSoup import lxml fro

我一直在编写一个非常简单的脚本,它从stackoverflow中的python标记获取问题标题,并在QTextBrowser中显示它们

应用程序按预期工作(至少在最短时间内),但窗口直到加载完网页才显示,刷新按钮将程序冻结,直到加载完毕。是否有办法解决此问题?以下是完整的代码:

#! usr/bin/env python

from PyQt4.QtGui import *
import requests
from bs4 import BeautifulSoup
import lxml
from threading import Thread

class Form(QWidget):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)

        self.url = "http://www.stackoverflow.com/questions/tagged/python"

        self.browser = QTextBrowser() 
        self.connectionlabel = QLabel()

        self.refreshBtn = QPushButton("Refresh")
        self.refreshBtn.clicked.connect(self.get)

        layout = QGridLayout()
        layout.addWidget(self.connectionlabel, 0, 0)
        layout.addWidget(self.refreshBtn, 0, 1)
        layout.addWidget(self.browser, 1, 0,1,2)

        self.setLayout(layout)
        self.setWindowTitle("StackOverflow: Python")


    def get(self):
        self.browser.clear()
        self.connectionlabel.setText("Connecting.....")
        try:
            response = requests.get(self.url)
            soup = BeautifulSoup(response.content, 'lxml')

            self.connectionlabel.setText("Connected.")

            questions = soup.find_all("a", {"class": "question-hyperlink"})

            for i, questionTitle in enumerate(questions):
                try:
                    self.browser.append("\n"+str(i+1)+". "+questionTitle.text)
                except:
                    pass

        except:
            self.connectionlabel.setText("Couldn't connect.")

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    screen = Form()
    screen.show()
    t = Thread(screen.get)
    t.deamon = True
    t.start()
    sys.exit(app.exec_())


UI将始终冻结,直到代码执行完成。为了避免这种情况,请使用多处理或线程,并在单独的进程/线程中调用阻塞代码。您也可以使用PyQT。

在代码执行完成之前,UI将始终冻结。为了避免这种情况,请使用多处理或线程,并在单独的进程/线程中调用阻塞代码。您也可以使用PyQT。

在代码执行完成之前,UI将始终冻结。为了避免这种情况,请使用多处理或线程,并在单独的进程/线程中调用阻塞代码。您也可以使用PyQT。

在代码执行完成之前,UI将始终冻结。为了避免这种情况,请使用多处理或线程,并在单独的进程/线程中调用阻塞代码。您也可以使用PyQT。

您的internet连接速度必须非常慢。对我来说,
get()
方法只需要大约一秒钟就可以运行。您的internet连接速度一定很慢。对我来说,
get()
方法只需要大约一秒钟就可以运行。您的internet连接速度一定很慢。对我来说,
get()
方法只需要大约一秒钟就可以运行。您的internet连接速度一定很慢。对我来说,运行
get()
方法只需要大约一秒钟这使用PySide,但PyQT将完全相同。我试图将其添加到另一个线程,但随后出现以下错误
QObject:无法为位于不同线程中的父线程创建子线程。(父线程是QTextDocument(0x1b8b680),父线程是QThread(0x18186a0),当前线程是QThread(0x7F17703E3E0)
相同的代码,但删除了init方法中的
self.get()
调用,并执行了以下操作:
如果u u name_uuuuuuuuuu=='uuuuu main_uuuuuu':import sys app=QApplication(sys.argv)screen=Form().show()p=thread(target=screen.get)p.daemon=True p.start()sys.exit(app.exec_())
sorry无法添加新行请再次查看示例代码,并尝试查看如何将函数与UI代码分开。检查
def doScrape(self)
函数。是的,你是对的,
doScrape()
方法有一个
q.put()
在很多地方。对于初学者,您甚至可以完全跳过队列。这只是用于更新进度。-这使用PySide,但PyQT将完全相同。我尝试将其添加到另一个线程,但随后出现以下错误
QObject:无法为位于不同线程中的父线程创建子线程。(父线程是QTextDocument(0x1b8b680),父线程是QThread(0x18186a0),当前线程是QThread(0x7F17703E3E0)
相同的代码,但删除了init方法中的
self.get()
调用,并执行了以下操作:
如果u u name_uuuuuuuuuu=='uuuuu main_uuuuuu':import sys app=QApplication(sys.argv)screen=Form().show()p=thread(target=screen.get)p.daemon=True p.start()sys.exit(app.exec_())
sorry无法添加新行请再次查看示例代码,并尝试查看如何将函数与UI代码分开。检查
def doScrape(self)
函数。是的,你是对的,
doScrape()
方法有一个
q.put()
在很多地方。对于初学者,您甚至可以完全跳过队列。这只是用于更新进度。-这使用PySide,但PyQT将完全相同。我尝试将其添加到另一个线程,但随后出现以下错误
QObject:无法为位于不同线程中的父线程创建子线程。(父线程是QTextDocument(0x1b8b680),父线程是QThread(0x18186a0),当前线程是QThread(0x7F17703E3E0)
相同的代码,但删除了init方法中的
self.get()
调用,并执行了以下操作:
如果u u name_uuuuuuuuuu=='uuuuu main_uuuuuu':import sys app=QApplication(sys.argv)screen=Form().show()p=thread(target=screen.get)p.daemon=True p.start()sys.exit(app.exec_())
sorry无法添加新行请再次查看示例代码,并尝试查看如何将函数与UI代码分开。检查
def doScrape(self)
函数。是的,你是对的,
doScrape()
方法有一个
q.put()
在很多地方。对于初学者,您甚至可以完全跳过队列。这只是用于更新进度。-这使用PySide,但PyQT将完全相同。我尝试将其添加到另一个线程,但随后出现以下错误
QObject:无法为位于不同线程中的父线程创建子线程。(父线程是QTextDocument(0x1b8b680),父线程是QThread(0x18186a0),当前线程是QThread(0x7F17703E3E0)
相同的代码,但删除了init方法中的
self.get()
调用,并执行了以下操作:
如果u u name_uuuuuuuuuu=='uuuuu main_uuuuuu':import sys app=QApplication(sys.argv)screen=Form().show()p=thread(target=screen.get)p.daemon=True p.start()sys.exit(app.exec_())
sorry无法添加新行请再次查看示例代码,并尝试查看如何将函数与UI代码分开。检查
def doScrape(self)
函数。是的,你是对的,
doScrape()
方法有一个
q.put()