小编ekh*_*oro的帖子

asyncore python挂起

我尝试用asyncore做简单的异步http客户端:这段代码工作正常,输出是(快速执行):

www.gmail.com  :  recv http code:  301
www.yandex.ru  :  recv http code:  200
www.python.org  :  recv http code:  200
www.google.ru  :  recv http code:  200
www.gravatar.com  :  recv http code:  302
www.com.com  :  recv http code:  302
www.yahoo.com  :  recv http code:  302
www.bom.com  :  recv http code:  301
Run Code Online (Sandbox Code Playgroud)

但是,与我不存在主机的取消注释:

#c = AsyncHTTP('http://www.no-such-host.ru') #!this line breaks execution!
Run Code Online (Sandbox Code Playgroud)

执行中断,代码挂起一段时间,输出部分数据并挂起,没有最后的数据输出:

connection error: [Errno -5] No address associated with hostname
www.gmail.com  :  recv http code:  301
www.yandex.ru  :  recv http code:  200
www.yahoo.com …
Run Code Online (Sandbox Code Playgroud)

python asyncore

5
推荐指数
1
解决办法
909
查看次数

Qt/PyQt:如何创建下拉窗口小部件,例如QLabel,QTextBrowser等?

如何创建下拉窗口小部件,例如下拉式QLabel,下拉式QTextBrowser等?

例如,我在QTextBrowser中记录信息,但我不希望它占用屏幕上的空间.所以我想能够点击QTool按钮并有一个可滚动的QTextBrowser下拉菜单.(QComboBox也可以工作,但我不能只将每个事件作为一个单独的项添加 - 我需要包装文本,而不是被省略.因此,下拉QTextBrowser.)

或者,例如,我想要一个包含图片的下拉QLabel等...

python qt pyqt widget drop-down-menu

5
推荐指数
1
解决办法
1万
查看次数

如何从左上角开始向网格布局添加小部件

我在 Qt Designer 中创建了一个 UI 并将其转换为 python:

在此处输入图片说明

在空白区域中,我添加了一个滚动区域和一个网格布局来对齐我的按钮。

每次按下“CreatePose”按钮时,我都需要从左上角开始向 gridlayout 添加一个带有图标的按钮。现在它将它添加到网格布局的中心。

self.ui.PoseBtn_GridLayout.setColumnMinimumWidth(4,4)
self.button = QtGui.QPushButton('')
self.button.setIcon(self._icon)
self.button.setIconSize(QtCore.QSize(128, 128))
self.button.setMinimumSize(QtCore.QSize(128, 128))
self.button.setMaximumSize(QtCore.QSize(128, 128))
self.ui.PoseBtn_GridLayout.addWidget(self.button)
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

python layout pyqt

5
推荐指数
1
解决办法
4062
查看次数

如何在QGraphicsScene上绘图而不缩放画笔宽度?

我正在尝试绘制 QGraphicScene 数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是装饰性的,因此我希望视图与数据的大小无关。但我得到的是这样的:

带噪声的正弦波乘以 50000:

规模50000

带噪声的正弦波乘以 50:

规模 50

但是,如果我放大这些图中的任何一个(两个图的缩放量相同),我最终会达到两个图像看起来相同的水平:

缩放比例50000 在此输入图像描述

这里发生了什么?为什么数据值变大了,笔的宽度就变了?为什么放大后缩放比例消失了?

重现此内容的代码如下。左键单击图可放大,右键单击可缩小。

import sys

from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC

import numpy as n

class ZoomView(QG.QGraphicsView):
    """Zoomable QGraphicsView"""
    def mouseReleaseEvent(self,event):
        if event.button() == QC.Qt.LeftButton:
            self.scale(1.5,1)
        elif event.button() == QC.Qt.RightButton:
            self.scale(1/1.5,1)

class MainUI(QG.QDialog):
    def __init__(self, parent=None):
        super(MainUI, self).__init__(parent)

        layout = QG.QVBoxLayout()
        self.setLayout(layout)
        button_layout = QG.QHBoxLayout()
        pb3 = QG.QPushButton('add plot')
        button_layout.addWidget(pb3)
        layout.addLayout(button_layout)
        pb3.clicked.connect(self.scene_maker_singleshot)
        scene = QG.QGraphicsScene()
        view = ZoomView(self)
        view.setTransformationAnchor(QG.QGraphicsView.AnchorUnderMouse)
        view.setRenderHint(QG.QPainter.Antialiasing)
        layout.addWidget(view)
        view.setScene(scene)

        self.view = view
        self.scene = …
Run Code Online (Sandbox Code Playgroud)

qt qt4 pyqt pyqt4

5
推荐指数
1
解决办法
1685
查看次数

QTableView中的搜索/查找功能

我有一个QWidget,里面有一个QTableView.我需要在表的第一列有一个查找功能,所以当我点击Ctrl + F时,会弹出一个查找对话框.

class Widget(QWidget):
    def __init__(self,md,parent=None):
        QWidget.__init__(self,parent)
        layout=QVBoxLayout(self)

        # initially construct the visible table
        tv = QTableView()
        # uncomment this if the last column shall cover the rest
        tv.horizontalHeader().setStretchLastSection(True)
        tv.show()

        # set black grid lines
        self.setStyleSheet("gridline-color: rgb(39, 42, 49)")

        # construct the Qt model belonging to the visible table
        model = NvmQtModel(md)
        tv.setModel(model)
        tv.resizeRowsToContents()
        tv.resizeColumnsToContents()

        # set the shortcut ctrl+F for find in menu
        shortcut = QShortcut(QKeySequence('Ctrl+f'), self)
        shortcut.activated.connect(self.handleFind)

        # delegate for decimal
        delegate = NvmDelegate()
        tv.setItemDelegate(delegate)
        self.setGeometry(200,200,600,600) # …
Run Code Online (Sandbox Code Playgroud)

python search qt pyqt qtableview

5
推荐指数
1
解决办法
2040
查看次数

从qComboBox弹出菜单中捕获鼠标按钮按下的信号

我做了多选QComboBox.项目是可检查的(每个项目都有复选框和文本值).只有在用户单击它时才会检查CheckBox.我想要的是在用户点击文本值时捕获信号,这样我就可以设置选中它旁边的复选框.怎么做?

在此输入图像描述

这就是我将模型设置为组合框的方式:

areas = ["Area one", "Area two", "Area three", "Area four"]
model = QtGui.QStandardItemModel(5, 1)# 5 rows, 1 col

firstItem = QtGui.QStandardItem("---- Select area(s) ----")
firstItem.setBackground(QtGui.QBrush(QtGui.QColor(200, 200, 200)))
firstItem.setSelectable(False)
model.setItem(0, 0, firstItem)

for i,area in enumerate(areas):
    item = QtGui.QStandardItem(area)
    item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
    item.setData(QtCore.Qt.Unchecked, QtCore.Qt.CheckStateRole)
    model.setItem(i+1, 0, item)

self.ui.comboBox.setModel(model)        
self.ui.comboBox.installEventFilter(self)
Run Code Online (Sandbox Code Playgroud)

我已经为阻止轮子事件添加了事件过滤器,因此firstItem文本总是显示为"已选择"

def eventFilter(self,target,event):
    if target == self.ui.comboBox:
        if(event.type()== QtCore.QEvent.Wheel):
            #wheel event is blocked here
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

python popupmenu signals-slots pyqt4 qcombobox

5
推荐指数
1
解决办法
5241
查看次数

使用QWebPage刮取多个URL

我正在使用Qt的QWebPage来呈现一个使用javascript动态更新其内容的页面 - 因此只下载静态版本的页面(例如urllib2)的库将无效.

我的问题是,当我渲染第二页时,大约99%的时间程序崩溃了.在其他时候,它会在崩溃前工作三次.我也得到了一些段错误,但它都是随机的.

我的猜测是我用来渲染的对象没有被正确删除,所以尝试重用它可能会给自己造成一些问题.我看了一遍,似乎没有人真的遇到同样的问题.

这是我正在使用的代码.该程序从steam的社区市场下载网页,因此我可以创建所有项目的数据库.我需要getItemsFromPage多次调用该函数来获取所有项目,因为它们被分解为页面(显示X量的结果1-10).

import csv
import re
import sys
from string import replace
from bs4 import BeautifulSoup
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *

class Item:
    __slots__ = ("name", "count", "price", "game")

    def __repr__(self):
        return self.name + "(" + str(self.count) + ")"

    def __str__(self):
        return self.name + ", " + str(self.count) + ", $" + str(self.price)

class Render(QWebPage):  
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def _loadFinished(self, …
Run Code Online (Sandbox Code Playgroud)

python pyqt pyqt4 qwebpage web-scraping

5
推荐指数
1
解决办法
2396
查看次数

PyQt/PySide 事件循环在哪里运行?

如果我打开一个 Python 解释器并输入以下几行:

from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
Run Code Online (Sandbox Code Playgroud)

然后出现一个文本输入小部件。当我与口译员互动时,我可以与它互动。如果我附加了任何事件处理程序,它们也会被调用。

如果我这样做import time; time.sleep(10),小部件将无响应 10 秒。

如果我运行app.exec_(),该调用会阻塞,直到我关闭应用程序。

我的问题是:app.exec_()如果小部件已经在响应事件,那么运行的意义何在?有什么不同吗?这是否只是一种防止应用程序关闭同时仍为 Qt 的事件循环提供服务的方法(while True: pass正如我们所理解的那样,会导致事件循环阻塞time.sleep(10)

我还想了解 Qt 在哪里与 CPython 挂钩,允许解释器和 GUI 处于活动状态。我知道 Python 2(可能还有 3?)有一个所谓的PyOS_InputHook机制,大约每秒调用 10 次。IPython 使用它来运行 GUI(需要付出很多努力以每秒 10 次以上的速度处理 GUI 事件)。当我实例化 a 时是否发生了同样的事情QApplication?如果是这样,再一次,打电话有什么意义app.exec_()

python events pyqt event-handling pyside

5
推荐指数
1
解决办法
6723
查看次数

退出时'QThread:在线程仍在运行时被销毁'

我正试图找到一种方法来正确退出我的应用程序.当我退出时,我收到一个错误说QThread: Destroyed while thread is still running.我有一个线程用于输出输出到QTextBrowser.什么应该是正确的退出方式?这是我得到的:

class LogReceiver(QtCore.QObject):
    mysignal = QtCore.Signal(str)

    def __init__(self, queue, *args, **kwargs):
        QtCore.QObject.__init__(self, *args, **kwargs)
        self.queue = queue

    def run(self):
        while True:
            text = self.queue.get()
            self.mysignal.emit(text)

if __name__ == '__main__':
    queue = Queue()
    thread = QtCore.QThread()
    my_receiver = MyReceiver(queue)

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    my_receiver.mysignal.connect(window.append_text)
    my_receiver.moveToThread(thread)
    thread.started.connect(my_receiver.run)
    thread.start()

    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

thread退出时应该以某种方式终止?请注意self.queue.get()块和等待文本.

谢谢

python qt multithreading pyqt pyside

5
推荐指数
1
解决办法
4216
查看次数

PyQt5 + Python 3:跨线程传递列表、字典作为信号参数

我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程。qt 何时创建作为参数传递的对象的副本。根据:http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/ qt 应该复制该对象。但是,在下面的示例中,主线程可以更改从另一个线程发送的列表的内容。

import sys
import time
from PyQt5.QtCore import QThread, QObject, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QApplication

class ClassProcessing(QObject):

    py_sig_send_data = pyqtSignal(list)

    def __init__(self):
        super().__init__()
        # initialize some variables
        self.data = [1, 2, 3, 4, 5]

    def worker(self):
        print(self.data)
        self.py_sig_send_data.emit(self.data)
        time.sleep(1)
        print("modfied data in thread", self.data)

class ClassProcessingThread(QObject):
    def __init__(self):
        super().__init__()
        self.objThread = QThread()
        self.objThread_id = 1
        self.objThread_finished = False
        self.processing = ClassProcessing()
        self.processing.moveToThread(self.objThread)
        self.objThread.started.connect(self.processing.worker)
        self.objThread.start()

class SomeClass(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot(list)
    def …
Run Code Online (Sandbox Code Playgroud)

multithreading thread-safety signals-slots python-3.x pyqt5

5
推荐指数
1
解决办法
4069
查看次数