PyQT UI在启动时不显示(我需要不同的线程吗?)

时间:2016-04-17 16:16:10

标签: python multithreading pyqt

var fs = require('fs'); var request = require('request'); var cheerio = require('cheerio'); var start_url = ["http://blog.codinghorror.com/"] var wstream = fs.createWriteStream("output.json"); // Extract root domain name from string function extractDomain(url) { var domain; if (url.indexOf("://") > -1) { //find & remove protocol (http(s), ftp, etc.) and get domain domain = url.split('/')[2]; } else { domain = url.split('/')[0]; } domain = domain.split(':')[0]; //find & remove port number return domain; } var req = function(url){ request(url, function(error, response, html){ if(!error){ var $ = cheerio.load(html); $("a").each(function() { var link = $(this).attr("href"); var makelinkplain = extractDomain(link); start_url.push("http://" + makelinkplain); wstream.write('"http://'+ makelinkplain + '",'); }); } start_url.shift(); if(start_url.length > 0) { return req(start_url[0]); } wstream.end(); }); } req(start_url[0]); 我调用方法__init__以控制应用程序的状态。最初tickMain()传递给此方法。这意味着在States.STATE_INIT传递到state_Init()之前,会调用States.STATE_IDLE。该计划继续致电tickMain()。这个过程似乎工作正常(正在执行tickMain()语句)。然而,UI似乎停留在初始化上,即它不显示(只是白色背景,鼠标光标是加载图标)。我错过了什么?我是否需要从另一个线程中调用print()

tickMain()

1 个答案:

答案 0 :(得分:0)

当你调用app.exec_()时,这会在maim线程中启动Qt事件循环。它处理窗口事件,如按钮点击,重绘等。为了使Qt起作用,你不能有任何阻塞主线程的东西(如无限循环),因为这会阻止Qt的事件循环起作用。 / p>

虽然您可以将内容卸载到某个线程,但这可能会对您的应用程序造成过大影响。线程是棘手的,因为您无法从该辅助线程中修改或访问Qt GUI对象。

假设您想要在循环中运行的代码(self.tickMain())很快,您可以要求Qt事件循环定期调用您的方法。这样您就不会在任何重要的时间段内阻止事件循环。

您可以使用QTimer

执行此操作
def __init__(self):
    # you must call the parent class constructor
    QtGui.QMainWindow.__init__(self)

    # create the timer
    self.timer = QTimer(self)
    self.timer.timeout.connect(self.tickMain)
    self.timer.start(1000) # call tickMain every 1000 milliseconds