我喜欢python和Qt,但对我来说很明显,Qt并不是用python设计的.有许多方法可以使PyQt/PySide应用程序崩溃,其中许多方法都非常难以调试,即使使用适当的工具也是如此.
我想知道:使用PyQt和PySide时,避免崩溃和锁定的好方法是什么?这些可以是从一般编程技巧和支持模块到高度特定的变通方法和要避免的错误.
我使用Python的多处理模块使用管道在进程之间发送简单对象.文档说明如果管道已关闭,则调用pipe.recv()应该引发EOFError.相反,我的程序只是阻塞recv()并且永远不会检测到管道已经关闭.
例:
import multiprocessing as m
def fn(pipe):
print "recv:", pipe.recv()
print "recv:", pipe.recv()
if __name__ == '__main__':
p1, p2 = m.Pipe()
pr = m.Process(target=fn, args=(p2,))
pr.start()
p1.send(1)
p1.close() ## should generate EOFError in remote process
Run Code Online (Sandbox Code Playgroud)
输出看起来像:
recv: 1
<blocks here>
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我做错了什么?我在Linux和windows/cygwin上遇到了这个问题,但是没有使用windows native Python.
这是一个神秘的python问题:
我正在开发一个python包,偶尔会报告导入错误ImportError: cannot import name …
.一般不能导入的模块
通过这个简单的例子,我能够重现类似的效果:
mypkg/__init__.py
:
from . import module_a
yarg ## cause import error
Run Code Online (Sandbox Code Playgroud)
mypkg/module_a.py
:
print "imported module_a"
Run Code Online (Sandbox Code Playgroud)
现在我将尝试两次导入包.请注意,第二次导入时错误发生了变化:
>>> import mypkg
Module A imported
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg/__init__.py", line 2, in <module>
yarg
NameError: name 'yarg' is not defined
>>> import mypkg
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg/__init__.py", line 1, in <module>
from . …
Run Code Online (Sandbox Code Playgroud) 我想知道如何设置为pyqtgraph.GraphicsWindow.addPlot对象显示的x和y轴限制.我需要在循环中显示大量数据(因此使用pyqtgraph)但我宁愿预先分配我的轴而不是允许自动量程可能提高速度.举个例子,
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
app = QtGui.QApplication([])
win = pg.GraphicsWindow(title="My plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')
p1 = win.addPlot(title="plot1")
p2 = win.addPlot(title="plot2")
curve1 = p1.plot(pen='y')
curve2 = p1.plot(pen='r')
curve3 = p2.plot(pen='b')
x = np.linspace(0,10,1000)
x_current = x[0]
p1.setXRange((5,20), padding=0)
for i in range(1,len(x)):
x_current = np.append(x_current,x[i])
curve1.setData(x_current,np.sin(x_current))
curve2.setData(x_current,np.cos(x_current))
curve3.setData(x_current,np.tan(x_current))
app.processEvents()
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
Run Code Online (Sandbox Code Playgroud)
问题在于线p1.setXRange((5,20),padding=0)
.这会导致错误:TypeError:setXRange()至少需要3个参数(给定3个)
我认为这应该是一个非常简单的问题,只需在绘图前设置轴范围.
所以 Pyqtgraph 会自动计算轴并在缩放时重新缩放,这很好。然而我有两个轴,频率和小时。频率可以采用 0-100 之间的任何值,小时可以采用 0-39 之间的任何值。如何将轴限制为这些上限/下限,以便当用户缩放或平移时它们不能超出这些值?
我的代码如下(3行,我的实际代码会绘制更多):
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')
from random import randint
class CustomViewBox(pg.ViewBox):
def __init__(self, *args, **kwds):
pg.ViewBox.__init__(self, *args, **kwds)
self.setMouseMode(self.RectMode)
## reimplement right-click to zoom out
def mouseClickEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton:
#self.autoRange()
self.setXRange(0,5)
self.setYRange(0,10)
def mouseDragEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton:
ev.ignore()
else:
pg.ViewBox.mouseDragEvent(self, ev)
app = pg.mkQApp()
vb = CustomViewBox()
graph = pg.PlotWidget(viewBox=vb, enableMenu=False)
colour = []
for …
Run Code Online (Sandbox Code Playgroud) 我已经在PyQt5pyqtgraph
里面实现了QGraphicsView
。当我按以下方式显示图像时,它会以与屏幕相同的宽高比拉伸和扩展。我该如何解决?
image = pg.ImageItem(asarray(Image.open('pic.png')) )
self.graphicsView.addItem(image)
image.rotate(270)
Run Code Online (Sandbox Code Playgroud)
编辑:找到了如何旋转图像,所以我用解决方案更新了问题。现在我只是想适当地缩放它。