#pyqtgraph

1 messages · Page 5 of 1

rough furnace
#

I was thinking of cutting a release before too much longer, I'd have no problem keeping 3.10 around for another release if you think it's beneficial.

What I'm most excited for is ditching PySide2

fervent vale
#

SPEC 0 is quite aggressive

#

About dropping Python

rough furnace
#

the duration for dropping python is 6 months shorter than before. Since NEP-29 was released, Python has gone to a more scheduled release cadence, doesn't surprise me that they'd shorten the duration for supporting versions of python.

#

Anything you want to see in the next release? (that's not currently in master)

fervent vale
#

There's a parameter tree warning on the tests

#

Something about default values

#

And the deprecation supposedly expires on 2025

#

There's a trivial parameter bug identified in #3229

#

#2994

rough furnace
#

yeah those warnings have been annoying me, but if Nathan has a newborn at home, probably won't get to see him much for a while...

rough furnace
#

something so rewarding about deleting python 2 style print statements

rough furnace
#

your screenshot in that point cloud discussion pijyoi reminds me of those old desktop linux systems that you could assign a virtual desktop to each side of the cube, and rotate the cube and get that fancy animation.

fervent vale
#

yes I remember those days when frivolous special effects were the rage

#

Wobbly desktop

#

The 0.13.7 GLScatterPlotItem was half shader half fixed pipeline

#

Don't think you could find tutorials that demonstrated such a usage

rough furnace
#

were the rage

pretty sure they still are 😄

rough furnace
#

I'm trying to write a test to catch the bug in #3229... and while I can see the change the poster makes is indeed the correct one, as it works in their example, I can't get my test code to fail (before I submit the fix)

rough furnace
#

oh huh, behavior is different for int vs str, for my test suite I was using a str which was passing but when I switched to an int then it blew up ...

fervent vale
#

Hmm, #3263 opengl question was asked on stackoverflow first. That's the 2nd pyqtgraph opengl question asked in 2 months on stackoverflow first

rough furnace
#

not to say that people jump right away when new issues are opened, but years back, SO had a lot more activity with regards to getting help with pyqtgraph vs. the issue tracker.

rough furnace
#

@wide prism you've looked at AxisItem more than anyone else recently, feel like looking this PR over?

fervent vale
#

Potentially, distro builds of PySide6 could suffer the same issue as #3265

rough furnace
#

ugh ...ugh...

#

@twin spire not sure you're around these parts, but a significant memory leak was reported affecting pyside, and @fervent vale tracked it down to here: https://code.qt.io/cgit/pyside/pyside-setup.git/tree/sources/pyside6/PySide6/glue/qtcore.cpp#n825

Here's a link to the issue and the identification of the problematic area: https://github.com/pyqtgraph/pyqtgraph/issues/3265#issuecomment-2689480190

GitHub

Short description Using ErrorBarItem with PlotWidget causes small and gradual memleaks that become noticable when app is running a longer time. Code to reproduce This code is extracted from ErrorBa...

fervent vale
#

Probably doesn't affect many people. Just don't get a memoryview on QByteArray

#

But official builds of PySide are always using the Limited Api, so that even further narrows down the number of people affected

fervent vale
#

I think PySide2 probably defaults to non-limited-api build. Qt builds it so that a single binary can be used across multiple Python versions

rough furnace
#

back to pyside2 deprecation, forgot pyside2 was available on conda forge with python 3.11 ... we should support that...

fervent vale
#

Hmm. ArchLinux PySide 6.8.2.1 suffers from the leak too. So in all likelihood, distros would build with non-limited api as they are targeting only one Python version

#

Unless the leak gets fixed by Qt company, we may have to use the workaround for both PySide2 and PySide6

#

I got interested in this limited api thing, and there are quite a few places in PySide where conditional compilation takes place depending on whether limited api is in use

rough furnace
fervent vale
#

The leak isn't with Qt, it's with PySide

#

Just tested out OpenSUSE tumbleweed

#

No leak.

#

Fedora 40 doesn't have PySide6 packages.

#

In the beginning there wasn't such a thing as limited api. Every python extension needed to be compiled separately for each version of python they wanted to support

#

Then Python defined a limited api to guarantee forwards abi compatibility

rough furnace
#

ahhhh

fervent vale
#

So extension authors would only need to produce 1 binary extension that would work for all supported python versions, including future versions

#

However, for big extensions like PySide, the api provided by the limited api was not sufficient for their needs

#

So under the hood some shenanigans need to be done

#

Now the question is why PySide provides 2 compilation paths? Surely one of them is going to suffer bit-rot

#

From what I gather, FreeCAD has some issues with PySide6 compiled with limited api

#

So conda and distros then decide to compile PySide6 with non-limited api in order to satisfy FreeCAD

rough furnace
#

I’m a wee bit surprised that pyside is using the python limited API. With cibuildwheel I would have thought it wouldn’t be that much work to release wheels for each version of python

fervent vale
#

The binaries are huge. Building just one copy for all supported python versions makes a lot of sense

#

But to be clear, it's not the limited api or non-limited api that is directly causing the issue.

#

Qt might not be motivated to fix the bug since the bug won't trigger on their binaries

#

The bug is present in all the distros providing PySide2 5.15.x where x >= 3

#

Because compiling for limited api for PySide2 is opt-in

#

Whereas it is opt-out for PySide6

rough furnace
#

Yea…

rough furnace
#

@mortal grotto hey, so I'm patching up the warning for missing default value when value is set that Parameter is emitting all over the place. I do have a question about the potential implementation. If I don't pass a value but do pass a default, is it expected that the value is automatically set to what is specified in default ?

#

what is working is you specify a default and you can override that with passing in value, but when you don't pass value I would anticipate the default values to automatically apply, but that's not happening.

#

A more concrete example:

# I would anticipate this parameter to have no items checked by default
p = pt.Parameter.create(name='checklist', type='checklist', limits=[1, 2, 3], default=[])
# but that's not true, 1, 2, and 3 are checked

this does work

# I would anticipate this parameter to have no items checked
p = pt.Parameter.create(name='checklist', type='checklist', limits=[1, 2, 3], default=[1, 2, 3], value=[])
# and indeed, no items are checked
runic umbraBOT
#

pyqtgraph/parametertree/parameterTypes/checklist.py lines 165 to 167

limits = opts.setdefault('limits', [])
self.forward, self.reverse = ListParameter.mapping(limits)
value = opts.setdefault('value', limits)```
rough furnace
#

alright, gonna call it a night, something is still up w/ interactive.py, it's creating parameters with value in **opts but no default so it's blowing up on me...

fervent vale
#

I think it was Martin that added the concept of a "default" value.

rough furnace
#

@obsidian sapphire ☝️

rough furnace
#

<@&831776746206265384> 👆(not sure what’s going on here)

proper summit
#

just voice gate spam

#

I've cleaned it up

rough furnace
#

Voice gate?

proper summit
#

you need 50 messages on the server before you can unmute in a voice channel. People try to get around that by spamming nonsense

rough furnace
#

Ahhhh

proper summit
#

which just earns them a temporary voice ban 🤷‍♂️

rough furnace
#

Ok that explains so much

copper lily
#

why voice

fervent vale
#

Just succeeded in implementing "hello teapot" with QRhiWidget

rough furnace
#

🤯

#

what level of pain/difficulty was involved?

fervent vale
#

The pain/difficulty was absorbed during the transition from fixed pipeline opengl to shaders

#

The concepts in QRhi are quite the same once you have been weaned off the fixed pipeline

rough furnace
#

while I'm good w/ moving Qt6 support to Qt 6.7 before too long, killing off Qt5 support is going to be a tougher sell.

#

I won't lie, being able to migrate to QRhiWidget so we don't have to worry about the particularities of opengl specifics on each platform would be REALLY nice

#

suppose we could hide hardware acceleration behind qt6 6.7+

fervent vale
#

It only works for GLViewWidget. It wouldn't work for QOpenGLWidget in QGraphicsView.

rough furnace
#

ooooo

#

we also hit 4,000 github stars

fervent vale
#

There's a huge spike around 3 months ago

rough furnace
#

yeah, wonder what that's about...

#

also looks like the spike was exclusively python 3.11 (and on linux)

fervent vale
rough furnace
#

oh...huh...that's ...that's going to force us to make an interesting decision

fervent vale
#

Plus PyQt6 doesn't have bindings for QRhi

#

In GLGraphicsItem, you will see that all 3 pre-defined GLOptions have CULL FACE set to false. It would make sense for opaque to have cull face set to True

#

At least for rendering solid meshes

#

However if you set it to True and then run GLSurfacePlot example, it demonstrates clearly that pyqtgraph has clockwise polygons

rough furnace
rough furnace
fervent vale
#

PySide6-Addons needs to be installed in order to get the qsb utility needed for compilation of the shaders

rough furnace
#

I’ll give it a go on macOS in a bit

rough furnace
#

i'm a n00b w/ make files..

qrhi-experiments ❯ make all
Makefile:4: *** missing separator.  Stop.
#

ahh, had to replace the space indentations w/ tabs

#

wait, how am i supposed to use the make file?

rough furnace
#

Sorted it out!

fervent vale
#

Hmm, I had whipped up the Makefile on Windows, but had forgotten that nmake is incompatible with gmake

fervent vale
#

So it's been 6 years since a proof of concept QRhi backend for QPainter had been made

#

But not published or not ready for prime time

rough furnace
#

Yeah seems like this has been a long time coming

#

Hopefully it will exit technical preview sometime soon so pyqt will include it

fervent vale
#

I think it is out of technical preview. Just that Qt reserves the right to break the API

fervent vale
#

I added an example (on a working branch) that demonstrates the use of compute shaders for image rescaling. Basically, the image data only gets uploaded once and all rescaled data reside on the GPU where it gets displayed directly.

#

It is faster and more responsive than what can be achieved with pyqtgraph’s ImageItem

#

The use of cupy still requires a gpu-to-cpu round trip

#

So far it works on the OpenGL backend but fails really badly with DirectX on the same laptop. Bad as in possible to make the system unusable.

#

Gotta try on other computers to see if it’s just my AMD laptop’s problem

rough furnace
#

the image-viewer worked on my apple laptop

fervent vale
#

The compute shader one is under a branch called "imageview"

#

Under a directory called "image-rescale"

#

It makes use of a pg.HistogramLutWidget

rough furnace
#

I’ll give it a go in a few hours.

#

thanks for making the makefile work on not-windows 😄

#

(have a few minutes this morning, will test now)

#

segfault

qrhi-experiments ❯ python main.py
initialize
MSL shader compilation failed: program_source:22:27: error: C-style cast from 'const device void *' to 'const constant buf *' converts between mismatching address spaces
    constant auto& _60 = *(constant buf*)spvBufferAliasSet0Binding0;
                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

zsh: segmentation fault  python main.py
fervent vale
#

There's also a HLSL compilation error

#

So far it only works on my Windows amd gpu laptop when forced to use OpenGL backend

#

I got a black screen on a Linux intel gpu system

#

Got a segfault on my RPI5

#

I have a PyOpenGL compute shader version and it works on all the systems mentioned above

fervent vale
#

So I tested on 3 Windows systems: Nvidia, Amd, Intel. QRhiWidget compute shader works with OpenGL backend

#

The non-compute shaders work with DirectX, OpenGL and Vulkan

#

It seems like the transpilation from GLSL shader to the other backends is not such a battle-tested path?

rough furnace
#

maybe, hard to say, ... I mean QRhi's whole thing is to work w/ different backends, so I don't feel like this is some niche edge case that slipped through the cracks.

fervent vale
#

I got it working on Linux (opengl) and Windows (opengl) including the RPI5. HLSL still doesn't work but at least it no longer messes up the display

#

It's now on the main branch

fervent vale
#

Okay it's now working for both HLSL and OpenGL. So it should work for Metal

#

There are now 2 versions of the ImageRescaleRhiWidget

#

One using compute shaders and the other not.

#

For such a simple operation, there's no need for a compute shader

#

In fact, the version using compute shader uses double the memory

rough furnace
#

I’ll give them a try in a few hours

rough furnace
#

would you look at that!

#

image-rescale-compute works too

#

is there a large-ish example file you like working w/ for trimesh loads? was going to test something with a lot of points

fervent vale
#

There's a --size argument to image-rescale program. The largest texture size supported for nvidia was 16384.

#

That's where I got a really large mesh file

#

But my standard test file is the Utah teapot model

#

I think you need to zoom out for the skeleton

#

The default calculated view distance clips away a lot

rough furnace
#

loaded the skeleton in STL format, wow...this is fast/smooth

#

viewing via a touchpad ...doesn't feel right but then again navigating a 3d space w/ the touchpad would feel awkward in the best of circumstances

rough furnace
#

man, this parameter tests with value is specified, but default is not present is killing me ... been chipping away at these for a while but ...so many places.

rough furnace
#

who merged this default/value for parametertrees without ensuring there were no warnings 😛

rough furnace
#

ok, took a while but I got to the underlying bit of code that was making everything fail ... but now have a weird error:

================================================================================================================================== FAILURES ===================================================================================================================================
_____________________________________________________________________________________________________________________________ test_export_dialog ______________________________________________________________________________________________________________________________
tests/exporters/test_exporter_dialog.py:9: Failure: Qt messages with level WARNING or above emitted
---------------------------------------------------------------------------------------------------------------------------- Captured Qt messages -----------------------------------------------------------------------------------------------------------------------------
QtWarningMsg: The cached device pixel ratio value was stale on window expose.  Please file a QTBUG which explains how to reproduce.
#

should be noted that I made Qt warnings be errors:

qt_log_level_fail = WARNING
rough furnace
#

doesn't fail in CI tho so I guess that's good...

fervent vale
#

I don't understand the rationale for requiring default to be set if value is set

#

#2954 indicates that "value" is more or less required to be set

#

The changes in your PR have converted "value" to "default"

#

Is the new syntax such that users will now specify "limits" and "default" instead of "limits" and "value"?

#

Because this would be yet another breaking syntax change?

rough furnace
#

I didn't merge because I wanted to have a think on this when I wasn't tired; but I think I need to review why that deprecation got introduced to begin with

rough furnace
#

@obsidian sapphire you around? Would love to discuss the parameter default vs. value attribute and the motivation behind not supporting the use of value absent default attribute.

fervent vale
#

One issue is that the deprecation warning does not show up when normal users run their code

#

So users get caught by surprise when the deprecation expires and becomes an error

#

A few users were caught by the "values" to "limits" change and had to be pointed to #2954

rough furnace
#

on further reflection, I don't like requiring default is you specify value, ...seems like it makes enough sense if a default value is not specified, that the default should be set to whatever the value that is passed into is (like the current behavior) ... not sure why that needs to be removed.

fervent vale
#

Prior to this PR, “default”, if not provided, would just take on “value”. This logic meant that “default” ended up being always considered to be provided. The PR seems to want to remove that side effect.

#

But if “default” becomes a required argument, that’s going to break existing use. A lot of busy work just to add “default” to all existing code.

rough furnace
#

Yeah I agree

rough furnace
#

Alright, chatted with @mortal grotto (sorry for the ping). We are all in agreement, this deprecation is more trouble than it’s worth. I’ll scrap my PR and make a new one that doesn’t try and change everything and instead sets the default based on the value

rough furnace
#

Going to sneak a few more PRs in and then cut a release, want to get to the bottom of #3226 (fix regression to GraphicsLayout.removeItem()

if @mortal grotto could spare some time for #3203 that would be great 😄 (but I'm not on the verge of doing a release do not urgent)

mortal grotto
rough furnace
#

should we close pyqtgraph/pyqtgraph#3233 ?

supple leafBOT
fervent vale
#

Ok I have closed it

rough furnace
#

so I know pyqtgraph/pyqtgraph#2883 is a year and a half old, but you think it's still worth merging?

supple leafBOT
fervent vale
#

Alright, I have rebased it

#

If not used, it doesn’t change any existing behaviour

rough furnace
#

(I'm in a mood to get the PR count down, being over 50 for a while was causing too much anxiety)

rough furnace
#

@mortal grotto know I'm nagging you on a big PR already, but if you have 2-3 minutes, mind glancing at the diff of pyqtgraph/pyqtgraph#3288 ? (change to slider parameteritem, adds a lot of conditionals) ...thinking that's a lot of conditionals in that if statement and wondering if there is a better check we could make.

#

pyqtgraph/pyqtgraph#3288

rough furnace
#

@fervent vale I know this PR you made (and we merged) is over a year old, but would you say #2944 superseeds/addresses the issue that #2881 was intended to fix?

rough furnace
#

oh, I should probably get #2614 fixed and then merged before the next release 😬

rough furnace
#

eh, almost got done cleaning up the ASV PR, but still some lingering issues...

rough furnace
#

for some reason numba acceleration isn't running:

============== ============== ============ ========= ========== ============ ============ ============
--                                                                            lut_length
--------------------------------------------------------------- --------------------------------------
     size       acceleration   use_levels    dtype    channels     uint8        uint16        None
============== ============== ============ ========= ========== ============ ============ ============
...
(4096, 4096)      numba          True       uint8       1          n/a          n/a          n/a
(4096, 4096)      numba          True       uint8       3          n/a          n/a          n/a
(4096, 4096)      numba          True       uint16      1          n/a          n/a          n/a
(4096, 4096)      numba          True       uint16      3          n/a          n/a          n/a
(4096, 4096)      numba          True      float32      1          n/a          n/a          n/a
(4096, 4096)      numba          True      float32      3          n/a          n/a          n/a
(4096, 4096)      numba         False       uint8       1          n/a          n/a          n/a
(4096, 4096)      numba         False       uint8       3          n/a          n/a          n/a
(4096, 4096)      numba         False       uint16      1          n/a          n/a          n/a
(4096, 4096)      numba         False       uint16      3          n/a          n/a          n/a
(4096, 4096)      numba         False      float32      1          n/a          n/a          n/a
(4096, 4096)      numba         False      float32      3          n/a          n/a          n/a
...
fervent vale
#

Latest numba only supports numpy 2.1.x

rough furnace
#

your ears must have been burning, this was on my screen not 5 seconds earlier

#

ok, so I should setup different environments for numba vs. non-numba ....

#

...or I could just use the older version of numpy

rough furnace
#

huh, wish I understood why, but the latest numpy keeps being installed....even though I don't specify numpy at all (and pyqtgraph just has the minimal version specified)

fervent vale
#

The minimal version bound only specifies what version below which you do not support

rough furnace
#

https://asv.readthedocs.io/en/stable/asv.conf.json.html#matrix

The keys of the "req" are the names of dependencies, and the values are lists of versions (as strings) of that dependency. An empty string means the “latest” version of that dependency available on PyPI. Value of null means the package will not be installed.

I'm even specifying numpy 2.1 here, and it's still installing 2.2...

#
PS C:\Users\ogi\Developer\pyqtgraph> .\.asv\env\f805a76c1f0b2fa61d39fb029488cfae\scripts/activate
(f805a76c1f0b2fa61d39fb029488cfae) PS C:\Users\ogi\Developer\pyqtgraph> pip list
Package            Version
------------------ -----------
asv_runner         0.2.1
build              1.2.2.post1
colorama           0.4.6
cupy-cuda12x       13.4.1
fastrlock          0.8.3
importlib_metadata 8.6.1
llvmlite           0.44.0
numba              0.61.0
numpy              2.2.4
packaging          24.2
pip                25.0.1
Pympler            1.1
pyproject_hooks    1.2.0
PyQt5              5.15.11
PyQt5-Qt5          5.15.2
PyQt5_sip          12.17.0
PyQt6              6.8.1
PyQt6-Qt6          6.8.2
PyQt6_sip          13.10.0
pyqtgraph          0.14.0.dev0
PySide6_Essentials 6.8.2.1
pywin32            310
setuptools         78.1.0
shiboken6          6.8.2.1
wheel              0.45.1
zipp               3.21.0

the config file json looks like

  "matrix": {
    "env_nobuild": {
      "PYQTGRAPH_QT_LIB": [
        "PySide6",
        "PyQt5",
        "PyQt6"
      ]
    },
    "req": {
      "pyqt6": [
        ""
      ],
      "pyqt5": [
        ""
      ],
      "PySide6-Essentials": [
        ""
      ],
      "numba": [
        ""
      ],
      "numpy": [
        "2.1"
      ],
      "cupy-cuda12x": [
        ""
      ]
    }
  },
  "include": [
    {
      "python": "3.10",
      "req": {
        "pyside2": [
          ""
        ],
        "numba": [
          ""
        ],
        "numpy": [
          "2.1"
        ]
      },
      "env_nobuild": {
        "PYQTGRAPH_QT_LIB": [
          "PySide2"
        ]
      }
    }
  ],
fervent vale
#

There's an ImageView example using numba in #1512. If you bump up the size to 8192x8192, on a fast system it's still smooth without numba. Provided you have numpy >= 2.1. That's the version with the clip improvement

#

If you go up to 16384x16384, you can feel the lag

#

That's where the QRhi image-rescale example is still smooth

rough furnace
#

"must go even bigger!"

fervent vale
#

16384 is the largest supported texture dimension

rough furnace
#

ha!

fervent vale
#

That's already 1GB of memory

rough furnace
#

ok, think I got numpy to not install the latest version, issue was w/ pyqtgraph specifying numpy as a dependency in setup.py; numba was installed beforehand so there was no check for numba compatibility with numpy. ... so installing pyqtgraph with --no-deps seems to work.

#
                                                                      channels / lut_length
     size       acceleration   use_levels    dtype    1 / uint8     1 / uint16     1 / None     3 / None
============== ============== ============ ========= ============ ============= ============= ============
(4096, 4096)      numpy          True       uint8     206±5μs       207±5μs      176±0.9μs    65.4±0.9ms
(4096, 4096)      numpy          True       uint16   21.8±0.2ms    41.2±0.8ms    21.6±0.2ms   66.6±0.7ms
(4096, 4096)      numpy          True      float32    23.5±2ms     66.9±0.8ms    22.8±0.2ms   67.3±0.4ms
(4096, 4096)      numpy         False       uint8     191±3μs       192±2μs       73.5±1μs     71.8±1μs
(4096, 4096)      numpy         False       uint16   22.2±0.2ms     41.5±1ms     70.5±0.1μs   67.9±0.8ms
(4096, 4096)      numba          True       uint8     199±3μs       200±4μs       173±2μs      32.8±1ms
(4096, 4096)      numba          True       uint16   11.2±0.3ms    18.4±0.4ms    10.3±0.2ms   31.7±0.4ms
(4096, 4096)      numba          True      float32   10.9±0.7ms    25.3±0.4ms    9.32±0.3ms   29.0±0.3ms
(4096, 4096)      numba         False       uint8       n/a         190±2μs         n/a          n/a
(4096, 4096)      numba         False       uint16   10.8±0.2ms    17.5±0.2ms       n/a       31.3±0.3ms
(4096, 4096)       cupy          True       uint8    4.81±0.2ms   4.61±0.04ms   4.49±0.09ms   14.4±0.5ms
(4096, 4096)       cupy          True       uint16   5.52±0.2ms    16.3±0.5ms   5.72±0.07ms   15.3±0.8ms
(4096, 4096)       cupy          True      float32   5.77±0.2ms    16.8±0.8ms    5.38±0.1ms   15.4±0.5ms
(4096, 4096)       cupy         False       uint8       n/a        4.61±0.1ms       n/a          n/a
(4096, 4096)       cupy         False       uint16   5.40±0.4ms    14.8±0.6ms       n/a       13.9±0.3ms
#

this is ... not sure which Qt bindings this is for... one of them...point is it's running

#

you think we should up the sizes to 8192x8192 ?

#

ok, updated the PR, works on windows, need to test on macOS and make sure it doesn't blow up there. Very open to using changing what the benchmark is testing if you think that would be worthwhile

fervent vale
#

Probably not worth going beyond 4096x4096

rough furnace
#

hmm...asv config needs a litlte mroe tweaking, or docs update, it blows up w/ my pyenv setup

runic umbraBOT
#

:incoming_envelope: :ok_hand: applied timeout to @flat sphinx until <t:1743073770:f> (10 minutes) (reason: emoji spam - sent 21 emojis).

The <@&831776746206265384> have been alerted for review.

rough furnace
#

ok, pyside2 is just being too annoying in the config, going to ditch it...

rough furnace
#

<@&831776746206265384> OP got a 10 minute timeout, consider a longer ban for spam? 👆

trim nexus
#

!pban 693228208367337525 spam

runic umbraBOT
#

:incoming_envelope: :ok_hand: applied ban to @flat sphinx permanently.

trim nexus
rough furnace
#

thank you 🙏

rough furnace
#

realized that the benchmark suite didn't test 4-channel Images ... given how long this thing is taking to run, I'm wondering if I should not bothering running the test across all the supported versions of python, just the current version perhaps...

#

or perhaps just oldest/newest supported versions...

#

need to look at this more closely, but wonder why 3 channels is so much slower than 1 or 4 channels for dtype=uint16 and use_levels=False

fervent vale
#

Most of the 3 and 4 channel paths fallback to makeARGB

fervent vale
#

On closer look, the code enters functions_qimage.py lines 183 to 189

#

It could be speeded up by special-casing uint16 RGB at lines 143 to 151

#

You could convert it to a RGBA64 format instead by adding an alpha channel

#

Then no rescaling needs to be done

#

But this could just as well have been done externally by the user

#

But real live 16-bit data doesn't usually come pre-scaled to the full 16-bit dynamic range

#

So it ends up that uint16 + levels=None combination is not such a useful combination

#

Besides, the display mechanism may just choose to drop the lowest 8 bits prior to display

uncut ore
#

@proud dagger Your message has been removed for being off topic and for breaking rules 5 and 6. Please refer to both the #rules and #code-of-conduct

rough furnace
fervent vale
fervent vale
#

My testing shows that changing to RGBX64 format is not faster, slightly slower even

rough furnace
#

Just got back from a several day trip. Will try and test out tomorrow morning

#

You have thoughts on what versions of Python we should run asv on? I suppose running on all the supported Python versions that can be found is probably the way to do it

fervent vale
#

Perhaps uint16 3 channel should just be delegated to makeARGB. It doesn't seem like this is a configuration that can be optimised

rough furnace
#

running the suite now comparing branches... (will probably take ~20 minutes to run)

#

I was thinking that perhaps some kind of table/chart/diagram may be warranted to highlight which combinations of inputs can be reidrectly rendered to Qt, and which combinations have cupy and/or numba acceleration.

#

could do a flow-chart diagram with mermaid... or do a series of tables (say one table for each dtype) ...

rough furnace
#

on your branch.

Looks faster than the old asv benchmark, but still substantially slower than 1 or 4 channel variants

rough furnace
#

Curious why asv is showing a 2x improvement but you’re seeing a performance loss

fervent vale
#

I was using VideoSpeedTest as a benchmark. asv only times the creation of a QImage, it doesn't include the time needed for Qt to display the QImage on screen

#

Ultimately, Qt would need to scale the 16-bit image for display

rough furnace
#

ahh right

fervent vale
#

So the original version that scales it to uint8 makes it easier for Qt to display downstream

rough furnace
#

alright, might as well close out your PR and I'll merge my ASV PR ...

#

thanks for entertaining me on that

rough furnace
#

looking at NonUniformImage, trying to come up w/ a description of x and y values and how they correspond to the colors of Z, ... getting the wording right is tricky! the image here is helping (drew InfiniteLines at each x and y value)

fervent vale
#

"The correct interpretation is that the provided coords are supposed to be the sampled data points, while the drawn polygons are shaded to the nearest coord's Z value."

rough furnace
#

yeah, I'll go w/ that sentence vs. the confusing mess that is the ASCII art I'm trying to create

last matrix
#

Hi

rough furnace
#

ugh, this NonUniformImage PR needed more work than I thought... will still wrap it up hopefully in a few days... would like to get a few other PRs merged and then cut the next release.

mortal grotto
rough furnace
#

I'll give the contributor of 3288 the opportunity to make the change themselves, but if they don't in a day or so, I'll make the change for them.

Also those multiple condition if-statements, ... I have a hard time reading those unless they're on different lines. I may change the format even if they update their PR accordingly

rough furnace
#

my PR to sphinx-contrib/images started getting attention after years of sitting idle ... so yeah hopefully we'll be able to upgrade to a recent version of sphinx soon

twin spire
#

(PSA: pyside 6.9.0 was released yesterday in case you want to give it a try 👍 )

rough furnace
#

Thanks for the heads up!

#

I don't imagine you all are supporting the free threaded python yet?

#

(sorry for asking here and not searching in the issue tracker first!)

twin spire
twin spire
rough furnace
#
QtWarningMsg: The cached device pixel ratio value was stale on window expose.  Please file a QTBUG which explains how to reproduce.

I've seen this periodically... usually seems to be associated with new versions of macOS that get released

#

this does happen only on one test, so I'll spend some time trying to reproduce, otherwise our test suite passes on 6.9!

twin spire
#

yeah, I have seen that message somewhere :/

rough furnace
fervent vale
#

"...there is a greater-than-zero chance that we might get (RHI backend for QPainter and QWidgets) in the future."

rough furnace
#

wouldn't that be something!

rough furnace
#

while pushing a change to NonUnfiromImage PR I'm workign on, I encountered this test failure, only on linux:

 =================================== FAILURES ===================================
_________________ testExamples[ MouseSelection.py - PySide2 ] __________________
[gw0] linux -- Python 3.10.16 /opt/hostedtoolcache/Python/3.10.16/x64/bin/python


Traceback (most recent call last):
  File "/home/runner/work/pyqtgraph/pyqtgraph/pyqtgraph/Qt/OpenGLHelpers.py", line 109, in initializeGL
    if not ctx.isOpenGLES() and ctx.format().version() >= (3, 1):
AttributeError: 'PySide2.QtGui.QOpenGLExtraFunctions' object has no attribute 'isOpenGLES'

Failed MouseSelection Example Test Located in MouseSelection.py
----------------------------- Captured stdout call -----------------------------
MouseSelection

Traceback (most recent call last):
  File "/home/runner/work/pyqtgraph/pyqtgraph/pyqtgraph/Qt/OpenGLHelpers.py", line 109, in initializeGL
    if not ctx.isOpenGLES() and ctx.format().version() >= (3, 1):
AttributeError: 'PySide2.QtGui.QOpenGLExtraFunctions' object has no attribute 'isOpenGLES'

=========================== short test summary info ============================
FAILED pyqtgraph/examples/test_examples.py::testExamples[ MouseSelection.py - PySide2 ] - Failed: 

Traceback (most recent call last):
  File "/home/runner/work/pyqtgraph/pyqtgraph/pyqtgraph/Qt/OpenGLHelpers.py", line 109, in initializeGL
    if not ctx.isOpenGLES() and ctx.format().version() >= (3, 1):
AttributeError: 'PySide2.QtGui.QOpenGLExtraFunctions' object has no attribute 'isOpenGLES'

Failed MouseSelection Example Test Located in MouseSelection.py
============== 1 failed, 95 passed, 3 skipped in 78.96s (0:01:18) ==============

I should note there is no pyside2 runner on macOS, and this test passes on windows.

fervent vale
#

Something very wrong has happened for PySide2 to have returned the wrong object type

rough furnace
#

yeah don't think that's our issue ...curious if you've encountered this before

fervent vale
#

No.

#

But I see that the test subsequently passed

rough furnace
#

yeah ... guess we can chalk it up to a cosmic ray particle

#

not seeing anything different on the debug info sections of each run.. so ...yeah ...not much we can do haha

rough furnace
#

well, cleaned up all the sphinx warnings, numpydoc warnings/errors .... let's see what the rendered output looks like!

....ewwww

rough furnace
#

til that enum.Flag is a thing. Nice use of it!

fervent vale
#

I think it's an anti-pattern to be using 1 VBO per attribute

rough furnace
#

the documentation ecosystem, combined with type hinting is such a minefield... so many config options create breakages in other stuff ...

#

I'm trying to get it to the point that if the docstring has no type-annotation for an argument, but there is an annotation in the function signature, that is used instead...

fervent vale
#

so far, QRhi seems to run best on Windows. D3D, OpenGL and Vulkan all run with no issues on Windows. Running Vulkan on Ubuntu (wayland) ends up with a window with no window decorations

rough furnace
#

Linux, always the odd one

twin spire
#

@rough furnace we started to have our first users confused between the new plot module in Qt, that's replacing Qt Charts, called Qt Graphs, with this project 🙂
Maybe we will include a "dissambiguation" note on the binding's page for the module 😛

rough furnace
#

Hahahah I saw that Qt Graphs allowed for zoom via the mouse? A huge portion of the value of this project is the ViewBox module we provide, if Qt Graphs provides that, I’ll have to look into what we provide that it doesn’t 😅

rough furnace
#

I should take a closer look at that Qt Graphs to try and differentiate what it offers (or see if it would be worthwhile to integrate).

rough furnace
fervent vale
#

QtGraphs is GPL / Commercial only

rough furnace
#

That too 😅

twin spire
#

but it's purely naming coincidence, it's not real "an alternative" though

#

it never crossed my mind that the name will for sure make people confused 😦

rough furnace
#

Looked through overview, looks like an extension of Qt Charts (not that I was that familiar with it before).

twin birch
#

is pyqtgraph an alternate of matplotlib?

rough furnace
#

Both are plotting libraries, but matplotlib is generally meant for static plots. They have a huge array of options,m/plot types; pyqtgraph is usually used for interactive applications where plots either need to be updated frequently and/or user updates interaction with the plot is wanted (ability to scroll/zoom). Pyqtgraph doesn’t come close to offering the plot types that matplotlib offers.

runic umbraBOT
#

:incoming_envelope: :ok_hand: applied timeout to @copper lily until <t:1746461575:f> (10 minutes) (reason: duplicates spam - sent 4 duplicate messages).

The <@&831776746206265384> have been alerted for review.

mild willow
#

Hello is it ok if I post a syntax of my visualization here as well as my visualization itself?? I really don't know what pyqtgraph is all about but it seems where visualization can be posted

whole snow
#

pyqtgraph is a specific visualization library

mild willow
#

Oh I see...noted

eager glade
#

f

fervent vale
#

Seems like PySide 6.9.1 has broken ViewBox in a major way

rough furnace
#

saw the issue, wondering if ViewBox is doing something really weird, or if this is a legit breakage on PySide's side...

fervent vale
#

I have an MWE now

rough furnace
#

Looks like it's been fixed upstream and the fix will be in 6.9.2

#

Thanks for the MWE pijyoi

fervent vale
#

6.9.2 is going to be more than 2 months away

rough furnace
#

🤷‍♂️ I'm not feeling motivated to introduce more code complexity due to an upstream breakage that has a fix coming, even if its months away.

#

If it's a big enough of an issue, they may release a 6.9.1.1 (they've done that w/ other releases before)

fervent vale
#

IMO there's no possible workaround

rough furnace
#

I remember seeing some commented out itemChanged methods with a comment saying something about it not working on pyside bindings ... can probably find those if you look at a git tag of a release from years back.

bronze mulch
#

<@&831776746206265384> seems pretty suspicious here ^

lofty pollen
#

!cpban 537521207273324566

runic umbraBOT
#

:incoming_envelope: :ok_hand: applied ban to @devout hinge until <t:1750112661:f> (4 days).

bronze mulch
#

Thanks

bronze mulch
#

<@&831776746206265384>

#

I think it is a scam likely

wide prism
#

Hi all!
Looking at https://github.com/pyqtgraph/pyqtgraph/pull/3318
the tests throw a bunch of errors for the newer Python versions. This looks to be

NumPy 2.3.0 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.```

Err... Is that something that is known to happen, currently?
GitHub

Fixes #3250, which originated from #2827 (therefore maybe @NilsNemitz has an opinion on this?).
This can be used as follows, adapting the example from the above issue:
import pyqtgraph as pg

app =...

fervent vale
#

The tests that got cancelled due to timeout are due to PySide6 6.9.1

#

The tests that fail are due to numpy 2.3.0

#

But not because of the warning shown above

#

Older versions PySide6 are compiled against numpy 1.x

#

However, because we do not make use of the portions of PySide6 that accept ndarrays, it doesn't affect us

wide prism
#

Hmm. Any run of the tests on a relatively new version (3.11 to 3.13?) of Python fails due to TableWidgetItem doing something that looks like mixing native bools and numpy bools?

#

And in addition, anything with Pyside on 3.12 and 3.13 times out. Ok, I see that.

fervent vale
#

Trying to replicate it locally

wide prism
#

Thank you! Sorry, I am still at work and only have half an eye on this.

#

I am just hoping to get an idea what to expect with the tests 🙂

fervent vale
#

There is some issue with numpy 2.3.0 and the TableWidget example which uses a numpy structured array

#

If we change it to just a 2d list, the error doesn't get triggered

#

Or if I remove the _defersort decorator, it also doesn't get triggered

#

So possibly an issue with numpy 2.3.0

#

But I don't know if anyone even uses pg.TableWidget

wide prism
#

hehe, I guess that may be true. Numpy 2.3.0 is just newly arrived?

#

Let me admit that I am at this point mostly trying to figure out if #3318 can get merged, or if there is anything to look out for that might be hiding behind the numpy issues.

#

I am not really expecting anything, since the PR doesn't touch anything numpy OR pyside related...

#

... but when 2/3 of the tests come back red, I felt it's best to ask what's currently going on 😁

rough furnace
#

@wide prism feel free to pin pyside6 to 6.9.0 (you'd only have to pin the unpinned version)

fervent vale
#

For the TableWidget thing, my summary of the issue would be: With numpy 2.3.0, if a structured array is to be used with TableWidget, then all the fields must be of type "object"

rough furnace
#

structured arrays are annoying to work w/, if a 2D array works just as well, let's do that.

fervent vale
#

The TableWidget example is actually demonstrating that it can handle structured arrays

fervent vale
#

‘np.bool’ scalars can no longer be interpreted as an index (deprecated since 1.19)

#

That’s what is causing pyqtgraph test failures

fervent vale
fervent vale
#

Probably don't need to run the test matrix against Qt 6.2 and 6.4 anymore

fervent vale
#

Okay, if PR3333 gets merged, pipelines will be green again. I have blacklisted PySide6 6.9.1

wide prism
#

j9ac9k keeps trying to get me to push the button. So...

#

Thank you for hunting that down and getting the tests back.

#

Not sure how I feel about the numpy datatypes (np.floating) leaking into the value field, but the final cast to bool seems like the least invasive solution. 👍

#

Now somebody please teach me how to write a proper commit subject and info 🫣

fervent vale
#

For structured types, the numpy scalar types end up in the field

#

The comparison between numpy scalar types yield a numpy boolean scalar

wide prism
#

I looked through the code, and half of TableWidget seems to believe that self.value is a python float, and half of it seems to think it can be whatever it wants.

fervent vale
#

And somehow PySide and PyQt want to use this numpy boolean as an index

wide prism
#

Probably for pikcing / blanking out some subset? That's the only place where I have run into that.

#

It feels like the dangerous bit is data that was originally in a numpy table spreading the redundant numpy data formats to parts of the code that do not expect them.

#

But the only alternative I would have seen is to make sure that "value" is always a float, but that certainly would break somebodies existing code.

fervent vale
#

The TableWidget example really seems to be advertising its ability to accept structured arrays

#

Not something that I would have expected to work

wide prism
#

That seems fine to me, but I am not quite sure why the structured array is so keen to report back np.floating types rather than python float. np.array doesn't do that for the standard types.

fervent vale
#

If you wanted to express that it was a python float, you would have used "object" as the data type

wide prism
#

Hmm. Doesn't the regular numpy array have the same basic problem and works around that?

fervent vale
#

Actually I have no idea what's really going on. Even if in the structured array you specify an exact size type like float32, int32, it will end up generating np.bool

#

Whereas a homogeneous array apparently doesn't trigger this issue

wide prism
#

I think numpy doesn't love the structured array as much as the regular one. Thank yuo for checking the float32 case, I was JUST wondering if we brought this on ourselves by making the test array "floating" dtype.

#

Looking at stuff my colleague is doing with it, it seems that the structured array case is mostly in the hands of pandas dataframes now.

rough furnace
#

Congratulations @wide prism on pushing the button

wide prism
#

I think the cleanest solution would be to sanitize input at setData(), but that just seems to leave too many ways how that might get confused and mess up someone's data.
StackOverflow has a magic solution:
https://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types

...and it would still require the bool(...) cast at the exit because some types do not convert, I think.

So your fix remains the best practical solution I can see. Thank you!

rough furnace
#

Please, feel free to do more of that

wide prism
#

Clear statement is very appreciated. 🙇

fervent vale
#

After some more investigation, the issue does also get triggered by numpy homogeneous arrays, and is not limited to numpy structured arrays

#

What happens is that pg.TableWidget automatically sorts by the 1st column if the data has a column header. This is true for structured arrays but not homogeneous arrays

#

For homogeneous arrays, we can subsequently trigger the problem by clicking on one of the row header labels to activate a sort

#

If you want to try this out, try it with PyQt6. PySide6 has some additional weird behavior. On PySide6, the issue only gets triggered if the sorting was activated programmatically (i.e. calling the method directly). It doesn't get triggered if it got activated by clicking

#

In either case, np.bool was generated; so it's really weird behavior for PySide6

fervent vale
#

I wonder if it's pure coincidence that there are 2 new issues raised about OpenGL...

rough furnace
#

I hope so 😅

fervent vale
#

Something interesting in #3334

#

import of OpenGL interferes with Qt on conda

fervent vale
#

I tested conda locally on Windows and Ubuntu. pyqtgraph OpenGL works on Windows but not on Ubuntu. A bit strange that the CI passes.

#

By OpenGL, I mean the code that makes use of pyopengl. So MouseSelection that uses purely Qt OpenGL works.

fervent vale
#

Mystery solved! conda builds only come with x11 plugin, no wayland...

#

Error doesn't appear on CI since it presumably uses x11

rough furnace
#

way to track that down! I'm wondering if there is something we should do in this regard; like...should we modify the cond build recipe to include the relevant wayland package

fervent vale
#

It was only 2 years ago that conda gained qt-wayland

frigid shard
#

Hi

fervent vale
#

bad news: just tried out PySide6 6.9.2 snapshot and it segfaults on both Windows and Linux on plotting that makes use of QGraphicsView. i.e. OpenGL examples still run

#

Sometime after the fix for PYSIDE-3115, some other regression has been introduced

#

Given that PySide6 6.9.2 is going to be released next week or so, we are going to end up with PySide6 >= 6.9.1 unusable with pyqtgraph

rough furnace
#

Ugh… I’m briefly on the grid but going off the grid again in a few hours. I guess I have something else to look into this next week

fervent vale
#

After some more testing, 6.9.2 seems to run fine on Python 3.11. It segfaults on Python 3.12 and 3.13. This is true on both Windows and Linux. 6.9.1 and lower did not segfault on Python 3.12 and Python 3.13. (notwithstanding that 6.9.1 was unusable with pyqtgraph)

fervent vale
rough furnace
#

Thanks, when I get back to land I’ll report in the qt bug tracker

#

@twin spire 👆

#

Normally wouldn’t tag you Cristian, but I probably won’t be at a computer (where I can write up the bug report) until the release

cerulean sinew
#

Yo

twin spire
#

oh no worries @rough furnace good that you tagged me !

#

I can check it out, but the multiple inheritance is always an issue 😢 we do encourage people to have the QObject-related base class first

rough furnace
#

Looks like your team jumped on it in short order!

keen dagger
#

Qt

#

is the better tkinter

#

because

#

faster

#

What

#

do you think about tkinter

finite frigate
#

I'm hate Qt

tawny bramble
analog swift
#

Hello

tired pilot
#

Ya

fervent vale
#

In the example above with OpenGL enabled, I am seeing that master branch is slightly more than 10x faster than 0.13.7

#

(On 0.13.7, you also have to set enableExperimental=True)

rough furnace
#

That’s awesome you can see such improvement based on your work on OpenGL!

stark latch
#

!res

runic umbraBOT
#
Resources

The Resources page on our website contains a list of hand-selected learning resources that we regularly recommend to both beginners and experts.

charred lagoon
#

Does anyone know how to create graphs for state machines using QT or some other graphical interface lib?

rough furnace
#

Qt did have a state machine module, but I haven’t actually seen it used, and definitely not in the context of pyqtgraph.

fervent vale
#

There seems to be a 50% loss in performance in QPainter.drawPath in Qt 6.10

rough furnace
#

That; is not good

#

Really surprised that there would be a regression here. Graphics view has been remarkably stable for quite a while

fervent vale
#

The performance loss seems limited to Windows wheels but not Linux wheels. x64 builds anyway.

rough furnace
#

how did you install the 6.10 preview? I'll check on macos

fervent vale
#

But replace "dev" with "6.10"

rough furnace
#

for testing, do I need to use the branch you made a PR for?

fervent vale
#

No need

#

It's only the enableExperimental qpainter path

#

You can set the environment variable PYQTGRAPHPROFILE=MonkeyCurveItem.paint

#

Then run PlotSpeedTest --nsamples=100000 --iterations=10

fervent vale
fervent vale
#

pytest-qt 4.5.0 drops support for PySide2

rough furnace
#

Yeah saw that; holding off on merging that change until this next release. This coming release being the last to suppose pyside2

fervent vale
#

PyQt5 is not going to be sunsetted

rough furnace
#

pyqt5 has been well supported, getting updates so and so on; so not too worried about it so much

twin spire
#

@rough furnace PySide6 6.10 is out, the blog post with the official announcement will go out tomorrow.

copper lily
#

nice

rough furnace
waxen phoenix
#

what's this

verbal tartan
#

.

fossil steeple
fervent vale
#

strangely, there's a website pyqtgraph dot com

fervent vale
#

Every now and then, the CI fails at one particular test on Linux PySide2.

#
Traceback (most recent call last):
  File "/home/runner/work/pyqtgraph/pyqtgraph/pyqtgraph/Qt/OpenGLHelpers.py", line 109, in initializeGL
    if not ctx.isOpenGLES() and ctx.format().version() >= (3, 1):
AttributeError: 'PySide2.QtGui.QOpenGLExtraFunctions' object has no attribute 'isOpenGLES'
#

Something very wrong here. "ctx" is supposed to be a QOpenGLContext object but somehow the bindings got confused and thinks it's a QOpenGLExtraFunctions object

rough furnace
#

Thanks for looking at this. I saw the intermittent failures and thought it was something funky but as we are removing pyside2 support soon I wasn’t too worried about it

fervent vale
#

Seems like the dot com website above got banned and removed

rough furnace
#

Yeah, whomever ran that domain operated a bunch of other sites referencing different libraries as well; pretty sure it was some kind of scam operation.

rough furnace
#

omg the CI is going to be soooo backlogged

rough furnace
#

besidees boxplot PR, anything eels eyou think should make its way in before I cut the next release?

fervent vale
#

Don’t think so

rough furnace
#

I’ll start on the changelog today then

rough furnace
#

184 merged PRs since the last release 😬

#

ok, I definitely let this linger way too long

viral sleet
#

that's not that bad

#

You'll be fine, it just means a lot of new features 🙂

rough furnace
#

Yea it’s a behemoth of a release for sure

rough furnace
#

alright, done segmenting the changelog into different sections, should probably do a little re-ordering; but that's going to have to wait until after work...

rough furnace
#

and shipped

#

@fervent vale this is an amazing release in large part to your efforts, not only overhauling the OpenGL implementation within the library, but providing feedback for other PRs. That really took a major load off of me and I can't thank you enough 🙏

rough furnace
#

I was convinced I was going to wake up this morning to an avalanche of new issues pointing out some regression 🤣

fervent vale
#

It's a breaking change for any users who created their own GLGraphicsItem

#

Also a breaking change for any users that create their own GraphicsObject and call deviceTransform, presumably to create scale invariant items

rough furnace
#

Not too worried about those folks, if they’re proficient enough to subclass like that they’ll get themselves sorted out soon enough.

#

Is thick lines (glLineWidth) the only thing requiring legacy OpenGL at this point?

fervent vale
#

On macOS, yes, because it only has Core Profile. Windows and Linux OpenGL drivers can run with compatibility profile and still have thick lines

rough furnace
#

I keep wondering if I have too much of a reckless mentality regarding breaking stuff for existing users... I guess I'm of the mindset that I remember when the PR queue was way backlogged and trying to minimize breakages for existing folks caused a significant drain on time (not to mention code complexity) that it was overwhelming ...

#

Anyway feel free to teell me if you think I'm being too reckless in that regard

fervent vale
#

The issue is whether all methods are considered public interface and over-ridable by users. Sometimes even member variables are accessed by users

rough furnace
#

yeah' ... i do want to make better use of "private" methods; ... i think member variables/attributes are fair game to change up unless explicitly documented.

fervent vale
#

I left the GL_SELECT behind even though it's super deprecated and didn't even work on anything but nvidia drivers

rough furnace
#

man, how can folks even keep up with what opengl functions work on what drivers...

fervent vale
#

I tried it on amd, intel and nividia

rough furnace
#

I guess I have access to all those platforms myself...

fervent vale
#

Can't remember if it worked on RPI5

fervent vale
#

There's a OpenGL debug logger that can be enabled. On some drivers (nvidia I think), it warns you whenever an operation is taking a slow emulated path. GL_SELECT was one of them

rough furnace
#

oh, that's useful

rough furnace
#

per SPEC-0, we're now numpy 2.0+ and python 3.12+ ... will strip out pyside2 code here as well

#

bumping up min Qt6 version to 6.6 (open to suggestions if it should be different)

fervent vale
rough furnace
#

oooo good thought

#

hmm...debating if I should set it to 6.5 now, or if I should set it to 6.8, assuming we won't be doing a major release in the next 4 months...

#

eh, set to 6.5 now, can change to 6.8 later

#

you have opinions on preserving PyQt5 support?

fervent vale
#

I seem to recall that pypi PySide6 6.5.3 wheel has an issue that makes it not work with pyqtgraph

rough furnace
#

that sounds familiar, I mean, we can support 6.5.2 I suppose

fervent vale
#

Probably can keep PyQt5 for now

fervent vale
#

PySide6 6.10.1 is supposed to support Python 3.14

#

6.10.1 is supposed to be released today

rough furnace
#

gonna take me a while to prune some pyside2 stuff so probably won't have a commit ready for another day or so (so hopefully not until after 6.10.1 is out)

fervent vale
#

Maybe you could do it in 2 steps? First remove PySide2 from the CI without actually deleting any PySide2 code?

rough furnace
#

yeah that would be the way to do it

rough furnace
#

waiting on pyside6 6.10.1 before I push my cocmmit bumping up versions of things...

rough furnace
#

don't know when it happened, but the cards on our docs now suddenly stretch horizontally way more than intended

I really should learn CSS at some point

rough furnace
#

ok, bumped all the documentation and test dependencies; fixed a handful of documentation issues, just going to hold off on pushing until 6.10.1 is out

fervent vale
#

Got delayed by 2 days apparently

rough furnace
#

hmm.... i may just exclude the python3.14/pyside matrix option on CI then

fervent vale
#

When PySide2 gets dropped, we can remove the code snippets "obj.exec() if hasattr(obj, 'exec') else obj.exec_()"

#

PyQt5 has "exec()"

rough furnace
#

looking forward to seeing the diff 😂

fervent vale
#

but we still can't remove the "obj.position() if hasattr(obj, 'position') else obj.posF()"

rough furnace
#

eh, between removing those cases, your diff from pyqtgraph/pyqtgraph#3359 that part of the codebase is gonna be so much better

supple leafBOT
fervent vale
#

Actually I thought that in the same vein, GraphicsWidget could just remove boundingRect() and shape()

rough furnace
#

a lot of that code was getting either ancient versions of Qt4 working, or Qt 5.6-5.9 working which were never ...great for us.

fervent vale
#

since the overridden implementation is the same as the C++ default implementations

rough furnace
#

ahh yeah may as well delete it then

fervent vale
#

there was a slight issue though, the ViewBox's boundingRect fudging itself to increase by 1 pixel

#

that was to make the InfiniteLine not disappear behind the axes

rough furnace
#

ViewBox.py I swear is the bane of my existance ... it's like there needs to a mountain of ViewBox.py tests and then start trimming that class down... I bet there are so many code paths that are never reached...

#

so much of that code is so fragile (not to mention absolutely ancient) ... I keep wanting to redo many portions of it but it's so ...finicky that I'm awlays worried I'm going to break something very subtle

fervent vale
#

it's not clear to me that fudging ViewBox's boundingRect() was the "right" thing to do

rough furnace
#

oh I'm almost certain it wasn't 😂

fervent vale
#

I think I saw that certain rects computed in different ways were different because of that fudging

#

that was while I was doing the glScissor PR

rough furnace
#

any numpy < 2.0 related code you think we can trim out?

fervent vale
#

None really

fervent vale
#

I think the QtTest.QTest.qWait shim can be removed. It got added in some version of PySide6

rough furnace
#

ooo right

#

I nuked all my virtual environments; I'll be sure to test it with pyside6 6.5.2

keen garnet
#

lmao

rough furnace
#

oh, i have a typo in my main.yml, probably blew up

#

sure enough, that was it,, sorry for the noise

#

oh, that's interesting; doesn't look like the .whl for pyside6 6.5.2 will install on python 3.12

#

looks like the PyQt6 6.5 wheel installs to 3.12 just fine; so I guess we do have a Qt 6.5 version we can test against...

rough furnace
#

now to try and get rid of those annoying conda environment setup warnings...

rough furnace
#

ok, one of those warnings I just can't seem to work around, so I guess we'll just wait until it's patched upstream 🙃

#

ok, I'm getting tired, heading to bed, but I can't replicate that failure on my system with the same python environment

rough furnace
#

went to a different version of pyqt6-qt6 and got this error:

 Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/matplotlib/backends/backend_qt.py", line 266, in eventFilter
    if event.type() == QtCore.QEvent.Type.DevicePixelRatioChange:
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'Type' has no attribute 'DevicePixelRatioChange'
________________________________________________________________________________
Exceptions caught in Qt event loop:
#

will look into this after the kids head off to school

fervent vale
#

But that's a matplotlib error

rough furnace
#

Yeah, but they usually support some ancient versions of Qt, and I’m not getting the same error on different OSs.

rough furnace
#

hmm...getting the same error on linux, probably less of a matplotlib issue but a mismatch of PyQt6/PyQt6-Qt6 versions.... gonna try and go back to 6.5.x versions of both and remove matplotlib and see if that runs

#

actually, i bet it's a pyqt6 issue, as I'm installing to python 3.13, I'm not sure python 3.13 was available when 6.5.x was released so probably was never tested...

#

ok will test qt 6.5.x on python 3.12, and test pyqt5 on 3.13...

#

ugh qt6 6.5 is also hanging on python 3.12 on macOS .... but again, can't reproduce locally

fervent vale
#

I think a possible issue is that PyQt6-sip works across multiple versions of PyQt6

rough furnace
#

oh good call, yeah should probably look into downgrading to whatever the version was at the time qt6 6.5 was released

fervent vale
#

However that's not something that users do. You would at most specify the versions for PyQt6 and PyQt6-Qt6

rough furnace
#

it's not, but I don't think users would pip install pyqt6==6.5.2 at this point; the case I want to capture is where they have PyQt 6.5 from a linux package manager or something like that

#

hmm...even specifying older sip it's still hanging ...

fervent vale
#

DevicePixelRatioChange is since Qt 6.6

rough furnace
#

that's not the issue (I mean it is an issue when I have PyQt6==6.5.2 and PyQt6-Qt6=6.6.x)

gonna try a few other things but I'm getting close to just testing 6.6+ at this point

rough furnace
#

blerg, I can't get PyQt6 6.5.x to run reliably in CI across platforms... gonna set it to 6.6+ for now.

I probably should add a CI job that tries to use the apt-packages of pyqt6, but that's a future me task

rough furnace
#

hmm..ubuntu 24.04's python3-numpy apt package is 1.26 :/

fervent vale
#

SPEC-0 doesn't care about distro packages

rough furnace
#

yeah; question now is if I care enough about them or not 😂

fervent vale
#

strange, mybinder mouse zoom and pan no longer works

rough furnace
#

uh-oh!

fervent vale
#

not sure when that happened

rough furnace
#

hmm... looks like in jupyter_rfb in recent versions they did edit some of the mouse events

fervent vale
#

trying out a manual bisect

rough furnace
#

man, I'm really bike-shedding right now; debating if I want to test pyqt6 6.5 and just exclude the test on macOS, just test 6.6 across the board...

#

or since 6.5 support is going away so soon (4 months) should I just move up to 6.8+ ?

rough furnace
#

alright, going to 6.8+ ...feels like an aggressive bump, but if someone is downloading new versions of pyqtgraph, they can download a relatively newish version of its dependencies... if they need an older version that's what 5.15 is for...

rough furnace
fervent vale
#

PySide6 is nowadays a rolling release

#

There isn't really a notion of "LTS" for open source users

rough furnace
#

yeah, ... still would be nice to have a deprecation policy that is a bit more clear that isn't just "current release" (as often we have breakages there too 😂 ) not sure what the right balance there is. I certainly don't want to try and support versions that are old enough that they're annoying to install in CI

fervent vale
#

Right now, I wouldn't purposely install any Qt6 version lower than 6.8

rough furnace
#

only reason I could think of being in that situation is if I had an existing application and have Qt constriants outside of pyqtgraph

fervent vale
#

Pyqtgraph doesn't really have hard Qt version requirements

#

Nor numpy version either

#

So you could mostly get away with pip --no-deps

rough furnace
#

just realized we no longer have distutils; so have to rework the asv configuration command

rough furnace
#

looks like pyside6-essentials 6.10.1 is out

#

if i can't do a quick fix to the asv command/setup.py thing I'll just update the PR w/o that change and merge to get going and figure out what to do about asv later...

fervent vale
rough furnace
#

how convinient an issue was made!

rough furnace
#

well, that PR came quick; ...question now is should I merge this and cut 0.14.1 ?

fervent vale
#

Nothing to cut. It’s just to make the mybinder badge work

rough furnace
#

ahh right

fervent vale
#

Users who run Jupyter notebook locally have to apply the workaround on their own

#

If I understood what was happening, the QApplication and the PlotWidget are being instantiated by 2 different threads

rough furnace
#

ooof...

fervent vale
#

So the suggested workaround of signaling the main thread doesn’t apply

rough furnace
#

whew, I can replace distutils.core.Command with setuptools.Command 😅 not that I'm a bit fan of that mechanism

#

got rid of so much stuff that hasn't worked in god knows how long....

#

oh whoops I broke something

#

huh, and now all of the sudden I can't download the mesa drivers for windows; claiming not a valid archive ...

#

looks to be intermittent ...some windows jobs are passing... anyway I'll switch to a newer version of the drivers, why not, I'm updating everything else

rough furnace
#

finally got rid of that stupid conda warning...

rough furnace
#

ok, i'm making an environment variable with the URL to the mesa drivers, tha'ts like the 3rd time I've updated them for pip or conda, but not the other...

rough furnace
#

If you have some time pijyoi,, take a look at pyqtgraph/pyqtgraph#2777 I think that one would be a good one to merge; drawing lots of separate lines seems to have triggered some performance issues before; ...PR is pretty old at this point so I'll likely need to resolve merge conflicts but curious what you think of the diff.

fervent vale
#

#2777 refers to #1039

#

And #1039 says something about slowness for interactive use

#

Maybe the updated OpenGL would help here

#

That PR needs a MWE that demonstrates the slowness

rough furnace
#

Fair enough!

fervent vale
#

Looking at #2777, it is implementing a use-case where all the curves share the same x-values. It doesn't seem like it would be useful for such a scenario to involve so many curves. They would just plot over and obscure one another.

#

Also would either require lots of modifications to the OpenGL path, OR fallback to CPU when such input is provided

#

But a clarifying example of the intended use-case of this PR would be helpful

rough furnace
#

Was hoping to prune through more PRs today but my day is packed.

#

I’m really reluctant to merge stuff requiring big changes to OpenGL code paths, you just got those in great shape

fervent vale
#

I added two runnable examples to #1039. It seems usable to me with the current version of pyqtgraph.

#

There were some timings added by you that timed the addition of curves to the plot at ~16 secs. I got ~230ms without doing anything particularly special.

#

There was a comment that "addItem" was the culprit in making it slow and a trick was to add the curves to a group first. I didn't do that and things just worked fine anyway.

fervent vale
#

Between the 2 extremes of 1 PlotCurveItem for everything vs 1000 PlotCurveItems, one could group the plots by unique color. So if you only have 10 unique colors, you only need 10 PlotCurveItem and you would get snappy performance

rough furnace
#

Grouping by color is a good idea, we do that in pcmi too right?

#

Or maybe I’m thinking of scatterplotitem

fervent vale
#

yes it's done in the cpu path for pcmi, but it's still quite slow

#

For scatterplotitem, it's beneficial to share QBrushes as the id is part of the hash to determine symbol uniqueness

rough furnace
#

oh man, reaeding through the diff of pyqtgraph/pyqtgraph#3423 just brings a smile to my face. ... so many workarounds being removed... it's ...it's wonderful

supple leafBOT
fervent vale
#

It does demonstrate that there isn't a need to hard kill PySide2 yet

rough furnace
#

i'm just not sure who continued pyside2 support would be for at this point... I can see having an alternative for LGPL licensing, but pyside6 has been a thing for quite some time now... suppose pyside2 + conda still provides a path to install on python 3.12+

fervent vale
#

To be clear, there's no support for it going forward

rough furnace
#

I don't like the gray zone of "we don't support it, but if you use it thing should work so we're going to leave a bunch of code in-place so things may be still work for you"

#

that said, we did just remove support so suppose there's no harm in having a "wind down period" to give the straggling users more time to migrate over

fervent vale
#

Removing exec_() will be the nail in the coffin

rough furnace
#

I sort of like what GDAL does when they're considering removing support for something; ...

they raise the equivalent of a NotImplementedError but in the message they say "We're planning on removing support for this, if you need this working set <whatever> environment variable and rerun to bypass this error, open an issue if you need continued support for this feature moving forward".

rough furnace
#

Won’t lie, I laughted when I saw you remove ActionGroup from the dictionary file

fervent vale
#

Did I do something wrong?

fervent vale
#

I found a bug in the hidpi enablement code for Qt5 5.15. The lines previously used for Qt5 5.12-5.13 should also be set for Qt 5.15. Previously, icons would look blurry when run on PyQt5 on a hidpi screen. This includes the "Auto" button and also the invisible eye icon in Legend. The effect is more striking with the invisible eye icon.

rough furnace
#

No no, just a very thurough removal of something

#

Huh, nice find!

rough furnace
#

you think you're done w/ that branch or are there more changes you plan to make?

fervent vale
#

It's done

fervent vale
#

Found a crashing bug that goes all the way back to 1 year ago. #3179

#

Run parametertree example. Expand until ColorMapButton gets used

#

Call of drawText is missing one parameter

#

How did that get missed?

fervent vale
#

It crashes on PyQt 5,6 but not on PySide6

ancient ivy
#

Haven't used pyqtgraph in at least 5 years... Good to know it's still being maintained!

rough furnace
#

Saw the PR, I’ll merge tonight

rough furnace
fervent vale
#

There's a regression with PySide6 6.10.1. The ColorMapMenu will not change colormap after a menu selection

rough furnace
#

<@&831776746206265384> ☝️

magic nebula
#

!cleanban @quiet veldt scam

runic umbraBOT
#

:incoming_envelope: :ok_hand: applied ban to @quiet veldt permanently.

twin spire
#

Hey @rough furnace I hope you are doing fine 🙂
We got a question in the telegram group for Qt for Python:

Hi everyone. I have a pyside6 app for signal processing with interactive plots using pyqtgraph.
On windows there is no problem at all.
But on ubuntu, it can not show the plots that have too many points , like 60000 points in a plot, or even more.
Can I do something to solve it or it is what it is?
Not sure if the user will arrive here, but I recommended him to join this channel

rough furnace
#

Huh, we have no known major difference in performance across platforms that I know of… hopefully they’ll come here

fervent vale
#

A known scenario where the above happens: using version < 0.14.0 and useOpenGL but not enableExperimental

rough furnace
#

Oh right, that awkward combination of config options would cause … issues

rough furnace
fervent vale
#

Anaconda now bundles PySide6 6.9.2 and PyQt5 5.15. Looks like PySide6 will become the defacto binding

rough furnace
#

Is that on defaults or conda-forge ?

fervent vale
#

Defaults I suppose. It's what comes included in the base installer without further creating any environment

rough furnace
#

Defaults is of little concern to me, almost everyone I know that uses conda is dependent on conda-forge, we don’t even use defaults in our CI.

fervent vale
#

Some places/corporations walled off from the Internet provide an Anaconda installation. That provides quite enough to do something useful.

#

Offhand, there's Spyder, scipy, matplotlib, h5py, ipython, jupyter, numba bundled.

#

So even if you aren't allowed to install anything else, you can still do something

rough furnace
#

Since anaconda inc. Started charging money to use the defaults most OSS folks that work in the conda ecosystem stopped messing with defaults and just use miniforge (conda but with defaults channel replaced with conda-forge)

rough furnace
#

that said, there is the whole Anaconda distribution (naming is so confusing!) which does include those packages; ...was pyqtgraph ever included in that?

fervent vale
#

Right, by "base installer", I was referring to the Anaconda distribution. It does not include pyqtgraph.

#

But it includes many of the scientific packages

rough furnace
#

yeah; the conda ecosystem is a bit of a mess as it targets some very different groups; in geospatial, we're tethered to conda, but despise what Anaconda Inc. has done w/ the defaults channel ; so we all use miniforge with conda-forge channel exclusively . I forgot there was a whole Anaconda distribution with a whole built-in library; but yeah that's definitely geared more towards their enterprise customer base.

I've tried to get updated versions of pyqtgraph into the defaults branch before; nobody from Anaconda Inc. seem'd to be interested in picking up new releases, so I left it alone and to their own schedule; I know they modify the code in some of the packages to ensure stuff works... but I'm really not feeling inclined to put extra effort into making sure the latest pyqtgraph works w/ the current Anaconda distribution.

#

I mean, I won't go out of my way so it doesn't work... but tough to know ahead of time what their decisions are regarding bundling Qt (for a long time they didn't upgrade for anything newer than PyQt 5.9, I even asked the matplotlib dev to lobby them to bump that up). Maybe I'm still a little bitter.

fervent vale
#

I think a few years ago, they were the ones able to bundle numpy and scipy linked against MKL

rough furnace
#

yup! I remember when that happened, I was in grad school at the time; and using Miniconda with numpy+mkl was the latest hotness 😂

fervent vale
#

Except that MKL defaults to using up all cpu cores

#

So I found that even an array copy using numpy was invoking MKL

#

Causing extremely heavy system load

rough furnace
#

I haven't tracked that so much recently; is that still an issue?

#

I guess I was under the impression that the SIMD optimizations sort of made MKL fall out of favor ...but admittedly I don't know how any of that low level stuff works

fervent vale
#

I have the impression that is still the default

#

For me, the number crunching is not in python. Python is used for visualisation. I certainly do not want the UI to be chewing cpu cycles

rough furnace
#

has the opengl stuff helped w/ your work?

fervent vale
#

The issue is that MKL uses openmp and keeps its thread pool "warm" by spinning the cpu threads for a short while in the hope that another job will be scheduled soon

#

So the default behaviour is that all cpus get occupied without the program running any faster than a single threaded program

fervent vale
rough furnace
#

I can see being annoyed when doing a numpy operations freezes your GUI even for a fraction of a second...

fervent vale
#

oh it's not that. Just want the UI to be lightweight and not compete with other services

#

I think they compile the fortran portions of scipy with ifort

rough furnace
#

my boss said he would sponsor a trip to SciPy for me next summer if I got a pyqtgraph talk accepted (still working on seeing if he would accept a tutorial session) ... probably need to figure out a way to tie some geospatial or point cloud stuff into it tho

crystal kernel
#

wait why is there a channel specifically for pyqtgraph

rough furnace
spiral ocean
#

f

fervent vale
#

There is a CI failure with PyQt6 6.10.2 + PyQt6-Qt6-6.10.2, macOS, OpenGL examples that set OpenGL version to 4.1 Core.

#

GLGraphItem is the only exception. (it does enable OpenGL 4.1 Core)

fervent vale
#

The errors disappear if I change the bindings to PyQt6 6.10.2 + PyQt6-Qt6 6.10.1

#

So chances are that PySide6 6.10.2 (when it releases) will have the same issue

rough furnace
#

So the “fix” would be to disable the use of glLineWidth?

#

Probably should hide that call behind an if check for platform and comparability profile … and just disable it on macOS with Qt 6.10.2+

fervent vale
#

It's not glLineWidth. The failure occurs at the first PyOpenGL call which is glClearColor

#

i.e. it's not any one call. All calls would fail

fervent vale
#

#3458 fixes the issue

night bane
#

hello guys would anyone be intersted in heping me develop a simple python script (im very new to coding and i wanna get this script done but im not sure how to)

#

dm me

fervent vale
#

My Qt bug report referenced in #3471 got tagged as P1 critical

quaint thicket
#

@fervent vale

vestal garden
#

nobody has spoke in here for over a month

rough furnace
#

Maintainer here, life is a bit upside down for me, my kids and I got evacuated from the Middle East due to the war there. Kid and work duties are consuming all my time 🙁

fervent vale
rough furnace
#

Oh thanks for the heads up on that one! I’ll take a closer look this weekend

quartz tiger
#

Hey @rough furnace! I've made this channel so we can thrash out some details of this event you'd like to run. Could you let us know who else is in your team, so we can get them in here? 🙂 (cc @rapid kestrel)

rapid kestrel
#

Also! We can create a voice channel and you'll have screen sharing permissions for you to use. It's easy for us to create those on the fly.

quartz tiger
#

Yes! The only limitation of Discord VC streams is that they're currently limited to 25 watchers, so depending on the expected size we could always switch over to a youtube stream

rough furnace
#

hey folks, I'll reply in a bit as I have to get kids to school and such, but the other members AFAIK are not members of this server, but they do have discord accounts, I can provide user-info too.

#

i doubt the stream will be that interesting, we review PRs 😆

rough furnace
#

we are all on slack, so I'll get some discord names, I don't have a list handy so they'll trickle in, first one I have is: NilsNemitz#8915

quartz tiger
#

Could you get them to join the guild? 😄

rough furnace
#

I'll get him onto this server

quartz tiger
#

Nice 😄

rough furnace
#

(he is in Japan's time-zone, so he may have called it a day already)

quartz tiger
#

Ah that's understandable

rough furnace
#

last time we did this we had 3-6 people on at any given time; so we're not talking a huge influx of individuals here

#

Thank you all for your willingness to host us!

quartz tiger
#

No problem! So to get the ball rolling, is the idea that over some weekend you'll all join a vc and do a mini-sprint on the repo?

rough furnace
#

pretty much; we've only done this once before during SciPy sprints but it worked out so well we wanted to do it quarterly.

quartz tiger
#

What are the logisics on that, is there usually a few hours you say, this is where everyone is joining, or is it more of a 24 hour thing where people drop in and out

rough furnace
#

During the SciPy sprints we had active members on more or less around the clock (I'm sure we had some hours with zero activity) in time zones with higher levels of activity, we took the opportunity to review some bigger PRs together.

quartz tiger
#

Ah alright cool, I'm just thinking how to market it to our members, the in-discord events calendar has proved very useful for the last few events we ran

rough furnace
#

so in terms of "new to pyqtgraph" users, we have a handful of "good first issue" topics, we have a contributing.md, and while I don't speak for everyone in the group, but I'm certainly willing to help new members contribute

quartz tiger
#

I think we could have a few events in the calendar, one that marks the start of the sprint, then a few more that mark the planned higher levels of activity

rough furnace
#

I can be more specific with what libraries/familiarity would be beneficial (openGL, pytest, sphinx, etc)

rapid kestrel
#

It may be worth only marketing like a "pyqtgraph intro to contributing" since it'll be visible server wide

rough furnace
#

there isn't much we have that is good for people new to programming/python in general (I'm sure there probably is something, I'll just have to look, we picked a lot of the low-hanging fruit)

rapid kestrel
#

also, some neat features we have built in here is pyqtgraph/pyqtgraph#2002

quartz tiger
#

Yea, that could be good, say the event will be round the clock, maybe suggesting hours that may be higher activity

rapid kestrel
#

(automatic issue and pull request linking!)

#

I believe an admin can also add in a hook to relay certain events from github to here too, depending on how integrated you want things

quartz tiger
#

Yea, I think having a VC where only staff can speak, but anyone can join, and then having this as a voice chat for people to ask questions would work well

#

Yea, we can add a github hook here, similar to what's in #dev-log

#

The only limitation is that only 25 people can watch a given stream, so during the active hours there may be a bottleneck

rough furnace
#

I'll keep that in mind; but I'd be really surprised if there is that level of activity; I mean, the streams would be to go over the diff in something like a PR like this: https://github.com/pyqtgraph/pyqtgraph/pull/1625

GitHub

pyqtgraph currently does not handle changes to the overall palette of colors really well (#1407 ).
#1588 points out that there is a useful paletteChange() signal that would allow an application to ...

vital night
quartz tiger
#

Yea, they're planned with like a 1k cap

#

just no announced due date

vital night
#

They created an experiment, so hopefully soon\™

quartz tiger
#

but yea, the only reason I'm concerned is that when we put an event in the calendar, it often gets hundreds of rsvps

rapid kestrel
#

It's a pretty heavy attrition rate though

quartz tiger
#

true, I feel like 25 will be easily hit though

#

between staff and users

rough furnace
#

I can elaborate a bit on what skills/experiences would be useful for contributing; and link to relevant issues if it would be helpful.

vital night
#

Yeah. Ideally we would do a YouTube stream, maybe one of the pygraph maintainer could handle that at the same time? I guess it also depends, since you can only stream one screen at once while you can have many people screen sharing

rough furnace
#

I wouldn't mind handling that, but I'm not sure what would be involved w/ that.

rapid kestrel
#

I think a youtube stream maaay be a bit overkill for a first attempt at this

quartz tiger
#

Yea we could give it a go with Discord, it's not too hard to setup, so we could transition to youtube mid event if needed

#

(mostly due to all the stuff kat has already setup in streamyard 😄 )

vital night
#

Having streamyard as a backup sounds nice

rough furnace
#

@quartz tiger can you invite outofculture#8604 ?

quartz tiger
#

!u outofculture#8604

runic umbraBOT
#
outofculture#8604
User information

Created: <t:1459799494:R>
Profile: @obsidian sapphire
ID: 166635900300820480

Member information

Joined: <t:1634232946:R>
Roles: None

Infractions

Total: 0
Active: 0

quartz tiger
#

@obsidian sapphire 👋

rough furnace
#

that's them! they're a pyqtgraph maintainer

#

👋

#

thank you!

quartz tiger
rough furnace
#

@quartz tiger can you invite NilsNemitz#8915

quartz tiger
#

!u NilsNemitz#8915

runic umbraBOT
#
NilsNemitz#8915
User information

Created: <t:1587531662:R>
Profile: @wide prism
ID: 702383444180860928

Member information

Joined: <t:1634233270:R>
Roles: None

Infractions

Total: 0
Active: 0

quartz tiger
#

@wide prism

rough furnace
#

(or can I invite folks and not bug you about it?)

#

👋

quartz tiger
#

only admins can assign roles unfortunately

rough furnace
#

np

quartz tiger
#

but feel free to keep pinging me 😄

rough furnace
#

just trying not to unnecessarily burden you all

quartz tiger
#

It's no problem, it's just a right click and a left click 😛

#

Also, I only pinged them so that I could assign the roles, so it's likely they didn't actually get a notification

#

@obsidian sapphire @wide prism This is the channel 😄

#

Welcome! 🙂

rough furnace
#

@quartz tiger can you invite ntjess#5054 please?

quartz tiger
#

!u ntjess#5054

runic umbraBOT
#
ntjess#5054
User information

Created: <t:1622426173:R>
Profile: @mortal grotto
ID: 848741630936743956

Member information

Joined: <t:1634233882:R>
Roles: None

Infractions

Total: 0
Active: 0

quartz tiger
#

@mortal grotto 👋

vital night
#

Yay more people

#

Hello everyone!

rough furnace
#

see, we do exist 😆

quartz tiger
#

hah!

mortal grotto
#

👋 Thanks for the invite!

wide prism
#

Oh hi, got lost there for a long second. 🙂

#

Hi all!

#

Thank you for having us over!

rough furnace
#

@wide prism they seem to think we might break the 25 user limit for streaming in the voice channel 😆

rapid kestrel
#

(to be fair we have a lot of people on this server)

vital night
#

At least at the start of the event there is no way you don't pass the limit haha

rough furnace
#

yeah, this server does h ave a lot of people ...w/o a doubt the largest discord server I've joined to

rapid kestrel
#

!server

runic umbraBOT
#
Server Information

Created: <t:1483877013:R>
Voice region: europe
Roles: 90
Member status: status_online 72,727 status_offline 191,708

Members: 264,436

Helpers: 129
Moderation Team: 31
Admins: 15
Owners: 3
Contributors: 45
Leads: 13

Channels: 228

Category: 30
News: 8
Staff: 67
Stage_Voice: 2
Text: 111
Voice: 10

rapid kestrel
#

... 260,000 people x_x

rough furnace
#

264k members!

#

wow...that's ....that's a lot more than I thought

#

I thought it was a lot!

wide prism
#

No wonder it took its time to load the members list...

rapid kestrel
#

I think it'll be fine for the majority of the event, especially as you get deeper into the sprint. But when people see folks streaming and chatting and it looks interesting they to join and lurk

#

A year ago we had a bit under 100k, so we've seen a lot of growth

rough furnace
#

@wide prism turns out @rapid kestrel is actually a pyqtgraph user, our users exist in the wild!

rapid kestrel
#

I've been converting people where I can~ I have my whole work team defaulting to it now

wide prism
#

Happy to hear that!

#

Thanks for helping me out, but unfortunately it's time to run off an sleep some. I'll be back to look around on the weekend! 👋

rough furnace
#

💤

rough furnace
#

@quartz tiger can you invite Luke Campagnola#2343 ?

quartz tiger
#

I'm afk atm, could another <@&267628507062992896> grab this please? 😀

#

Just assign the pyqt contrib role and community role

quartz tiger
#

Hah I guess not, I'm back now anyway

#

@violet basin

rough furnace
#

for those that don't know, @violet basin is the original author of pyqtgraph ...all praise the founder!

violet basin
#

Don't try to flatter me, usurper!

#

Fore those that don't know, @rough furnace has been the lifeblood of pyqtgraph for years.

rough furnace
#

I just push the merge button, ...as evidence by log-handling, sometimes with consequences that should really have been foreseen 😆

royal snow
#

A little breakage every now and then keeps life interesting

#

Welcome y’all

rough furnace
#

thanks again for hosting us; at some point (doesn't have to be now) we should discuss how to "advertise" this event. As I mentioned earlier, totally welcome to have others join us, but probably not a great event for completely new to python/programming folks. This library can be a bit tricky to test locally on your system due to the different combination of dependencies we support.

rapid kestrel
#

We could spin this event as a "welcome to open source contributions" where we focus on what it's like contributing to in-use libraries vs new to python/programming. "Looking to apply your python skills and give back to the open source community" type thing.

rough furnace
#

you all have run events here before, so I'll go with your suggestions, but something like that sounds good.

#

I'll spruce up the contributing guide; but some things we can use help with is developing MWE's for some existing issues, testing out some existing PRs to find edge cases where things break.... things of that nature

rapid kestrel
#

So I think some good info to have is:

  • What is pyqtgraph and a quick paragraph/example of its use case
  • What this sprint is hoping to accomplish
  • Quick breakdown of your tech stack / things you use to contribute
  • Link to the "first good issues"
  • A specified time where folks can drop in and ask questions/get set up
rough furnace
#

I'll draft up something and attach it here in the next day or so

rapid kestrel
#

when were you roughly planning on having this sprint?

rough furnace
#

I'm eyeing Nov 13-14

#

if not that weekend, then the weekend before or after; but probably that weekend (like unless everyone suddenly is unavailable that weekend, that's the weekend we're doing it)

rapid kestrel
#

Alright cool, so we've got time~

rough furnace
#

@rapid kestrel if you want to implement the quiver plot you were mentioning earlier, would love to assist w/ that contribution

rough furnace
#

@quartz tiger when you get a chance can you add @timber stirrupnden#1436 and @fervent vale

rapid kestrel
#

Added the roles to pijyoi, I don't think ksunden is in the guild yet

rough furnace
#

he should be here now

#

@fervent vale 👋

rapid kestrel
#

@plush fulcrum ablobwave

rough furnace
#

I think there is one more person to bring over; but probably not going to happen tonight

plush fulcrum
#

Hello

rough furnace
#

👋

quartz tiger
#

Another thought here, should we loop in Keith for reddit reach?

rough furnace
#

Keith?

quartz tiger
#

Sorry, was aiming that at Kat mostly. @hexed tundra is a mod in /r/python

#

We work with him quite often for events like this

rough furnace
#

I just want to throw out how thankful I am that Kat is involved here, given her existing knowledge of the library and the community here.

quartz tiger
#

@rapid kestrel is great 😄 We'd be lost without her lmfao

rapid kestrel
rough furnace
#

I'm working on the writeup for the questions Kat brought up earlier right now

#

I reviewed 4 merge requests at work this morning so I should have a little time 😆

rapid kestrel
#

@half jewel some context! Requested adding you here because pyqtgraph maintainers are looking to do a sprint for their repo and also do it as an event where folks can drop in and get contributing. We've talked about this more than a bit, so figured you'd want to also chime in

hexed tundra
#

👀 DataViz?

I'm sorry yes hello how can I help I love this

rough furnace
#

👋

hexed tundra
#

Learning curves are tough on me and I've been really itching for a reason to take on PyQtGraph, so I don't know what's going on yet, but I'm on board and I'll be learning about the library these next couple of weeks 😄

rough furnace
#

pyqtgraph maintainer here, feel free to ping me if I can be of help

vital night
#

I believe what Chris and Kat are looking for is some reddit outreach for the event

hexed tundra
#

To the reddit side of things, I just need a bit of heads up and I can draft any announcement and run it by everyone. We typically sticky the announcement on the top of the sub. It gets various levels of engagement but we're more than happy to help out!

rough furnace
#

the 'event' will take place november 13-14, I'm drafting up more of a writeup right now

hexed tundra
#

Awesome! We're on board to help however you'd like!

vital night
#

So we at least have the date pinned somewhere :D

rough furnace
#

😆

#

so ...first off, I'm super thankful for the outreach/marketing/advertisement, but just fyi sounds like this event may be growing in size (user wise) to a number significantly larger than we anticipated 😆 ...not sure the existing maintainers will be able to do too much handholding with forking/branching/PR-submission/venv-creation and things of that nature.

#

for context, we have 6-7 active maintainers of the library, and a handful of very regular contributors... we're spread out time-zone wise such that we're concentrated on Asia/Pacific and America/Pacific

vital night
#

Knowing our user base, you can most probably expect some people that both never contributed to any projects and some who is already at their thousandth contribution. That said, for stuff like that you can always redirect them to help channel for Python related questions (#❓|how-to-get-help) and off-topic (#ot0-psvm’s-eternal-disapproval to ot2) if you don't want/cannot deal with them.

half jewel
# rapid kestrel <@!429445826251587616> some context! Requested adding you here because pyqtgraph...

Ah of course! I've been super duper busy (well more like enough so that I have no energy) so I haven't been able to either clear out the blockers I have nor get back to planning psf/black's intro-to-oss event. Just for context for who I am: I'm Richard aka ichard26 and I co-maintain psf/black (I'm also staff here but that's not as relevant). I'm the documentation and developer experience lead so improving the experience for beginners is totally up my alley. And yeah Kat and I have talked about this kind of stuff before ^^

rough furnace
#

k, perhaps I should check in w/ regulars at #❓|how-to-get-help to give them a heads up that they may get an influx w/ those kinds of questions

vital night
#

Oh don't worry, it isn't gonna be much compared to our average :D just a bit busier than usual

rough furnace
#

In the announcement I can put a blurb on what I expect participants in the event to be able to do by themselves?

royal snow
#

One of the highest traffic things we have

vital night
#

Sure, that sounds like a good idea to write some prerequisites

rough furnace
#

k, would appreciate some feedback on the wording, as I don't want to come across as someone that's trying to gate-keep

hexed tundra
#

Oh intros are a good idea! I'm Keith, I help moderate the Python Subreddit. We've been partnering a lot with the discord to help manage different kinds of events, and outreach across both platforms. To the event--this discord staff is really good at distributing workload, so from my perspective I wouldn't worry too much about being overwhelmed. They're really good at directing users to either seek help or offer help at the level the user is at, and they're experienced in managing influx due to different events.

royal snow
#

Could start off the announcement something like:

Do you have experience working with python, but would like to get started in the open source world? Join us for...

..

For those interested in joining, make sure you have experience with:

  • x
  • y
  • z
rough furnace
#

@hexed tundra I'm /u/ogi010 on reddit; thanks for maintaining the subreddit. I am one of the maintainers of pyqtgraph and after the success of our first/last sprint session during SciPy 2021, we decided we wanted to make the sprint a more regular thing.

I should point out during the SciPy sprints we didn't have any new-comers to the library participate, but it was the first time a bunch of maintainers and a regular contributor were able to collaborate in real-time.

half jewel
#

As far as I can tell the general plan looks good to me. One thing I'll note is that how easy it is to set up a development environment is incredibly important, especially as if you're targeting new to the open-source world .. who might not be similar with the workflows of Python OSS. Although it really depends on much you want to focus on the "get contributing: newcomers to OSS welcome!" side of it.

vital night
rough furnace
vital night
#

I would be a bit weary to make it sound too much a first step into open source if that's not what you want to do

rough furnace
#

yeah I don't think this is a good event for complete noobs to open source contributing ... I mean we have some low-hanging issues in docs, where to be real, newcomers can be very helpful for identifying pain points within the documentation.

half jewel
rough furnace
#

...also there will be periods during this weekend where all maintainers may be offline, I'm trying to clear the weekend, but still have kids that do require my attention... I'll try and have issues tagged in the repo tho

vital night
#

Family is more important than anything else lemon_pleased

rough furnace
#

(sorry now I'm a little worried and trying to tamper expectations 😆 )

half jewel
#

haha, it's scary running an event, especially if you're new to it!

vital night
#

Don't worry, we don't expect you to do anything other than having a nice weekend

#

If you don't have fun this is where it gets real catkill

rough furnace
#

😛

#

so ...about that 25 user limit, if there is an influx from reddit, we could likely break through that number; ...

hexed tundra
#

The reddit side of things has been really hard to predict, there could be maybe two users from there, there could be lots.

#

I wish I had a better handle on it, but because of the way reddit manages notifications and rankings of posts, it's kind of just based on luck to a certain degree

vital night
#

I honestly am sure that just from the event notification we will get more than 25 people lemon_sweat

rough furnace
#

last time we did this, the screen-share was useful for reviewing a PR, ...depending on the audience size, we may not do that...

vital night
#

Because the way it works is user can add a reminder before the start of the event and get a nice push notification when it starts

rough furnace
#

we have a couple of monster PRs that individually we've been scared to review 😆

vital night
#

YouTube could be an alternative to this limit, but that's one more thing to handle

rapid kestrel
# rough furnace last time we did this, the screen-share was useful for reviewing a PR, ...depend...

I will say, the sprint comes first. So if there's an issue with audience size being too big to allow screen sharing that's something we could potentially solve in advance, maybe with gating a role that allows people access to the voice channel. So you could invite regular users who are interested in contributing or similar.

During the dedicated time for newcomers to the library (if that's still something you're interested in), that could be transitioned to a stage channel to allow a bigger audience size, although no screen share there. I do want to steer us away from youtube as that's a whole thing in and of itself.

For the reddit post, that's something I'm pretty keen on doing because I do think it will bring out the intermediate user base a bit more. The cross over from reddit isn't too high, but if it brings in a few really interested people that would be clutch.

I'm absolutely fine for spinning this event towards folks who are more experienced with python and contributing. Like expecting people to know git, how manage venvs and the like. We have plenty of content for beginners, less so for people sort of "in the middle".

rough furnace
#

I think having dedicated hours for newcomers is a great idea.

#

i'm good w/ avoiding youtube, the streams I don't think will be that interesting, last time we did it was for someone to scroll through a diff, and gave the author of a PR to explain stuff in real-time with questions from other maintainers

#

first draft - I don't think I even ran the spell checker in my editor here, sorry in advance!

#

ok, I have to get back to work/errands...thanks again you all!

vital night
#

That's quite a good message you have there, I assume it is for Reddit?

rough furnace
vital night
#

Righto, we can probably write a discord and reddit announcement from that

rough furnace
#

I can expand/refine sections

rapid kestrel
#

I'll take a look today~ It's nice to have as a sort of basis to provide people and to know the details of it too

rough furnace
#

@rapid kestrel sharing some bit of pyqtgraph related news, we're about to we just merged a PR incorporating our biggest feature request in some time; as a user-this may be of interest.

As you know, line plots in pyqtgraph are pretty fast, you may or may not know, as soon as the pen width > 1.0 pixels, that speed plummets (unless you're using the openGL renderer, but that has its own set of issues). Our own benchmark goes from 500 fps to 0.5 fps the moment the line thickness goes from 1.0 pixels to 1.1 pixels.

We're about to merge a PR that boosts plot performance with thick lines so that on the same benchmark, it's ~100 fps (so 5x slower than pixel thickness of 1 or less, but not 4 orders of magnitude). I doubt we will be able to get performance parity, but at least it's usable now.

wide prism
#

Maybe you want to incorporate some of that into your draft. Overall it seems nice already, though!

rough furnace
rough furnace
#

I'm reading through the changes, they're all good; I'm incorporating them all. Reading through them I realized some other points I forgot to mention, which I'll add in. I'll post an updated version shortly

rapid kestrel
#

I will take a look during my lunch!

rapid kestrel
# rough furnace I'm reading through the changes, they're all good; I'm incorporating them all. ...

this is great!!

So I figure we can post this with some slight modifications in r/Python (cc: @hexed tundra) when we get closer to the event date.

I figure there can be a post with this info in either #python-community or #python-events. If you want we can do one in #announcements as well, although I would recommend against the at-announcements ping.

We can also create an Event for it so that it'll appear at the top event tab. This will let you easily share the event with other people. Although, for this. Do you want an event for the sprint in general or just the "welcome new contributors" section?

Do you have a general idea of schedule or do you prefer to keep it a bit more free-flowing as to what you tackle when?

rough furnace
#

Schedule wise, I think the only thing we should do is have some kind of "office hours" period where we'll try to have our efforts aimed at bringing newcomers "up to speed" with greater ease... not sure how else to phrase it, ...but basically time I will plan on not doing dev work directly but answering questions/directing people/etc.

I think I can do something like 11am-1pm PST on both days or something like that...

I plan on being online/available the majority of the weekend; and I'll certainly be willing to help folks outside of those hours.... but I'd be willing to reserve that time for providing greater assistance/etc.

#

(I'm trying to schedule babysitters for that weekend so my wife doesn't resent me for being "at the computer" all weekend while she's watching the kids 😆 )

rapid kestrel
#

okay cool, I'll make an event for that then!

So some more logistics thing for during the sprint.

  • You will have a voice channel where you can screenshare and then this accompanying channel. If necessary, we can lock we the voice channel to only people with certain roles (in case you hit a full voice channel and the people there aren't really engaging with y'all). Do you want a functionality where you can give a role to a person to allow them in?

I guess this is me asking if there are non-maintainer contributors to the repo that might need access to the VC (or even this channel) if we find we need to lock it down slightly due to too much off-topic chatter

rough furnace
#

generally, I think having voice only to people with roles being good, and I'm not seeing the need to have the ability to give other people roles either...

rapid kestrel
#

I can also make myself available during then in case any role intervention is required

rough furnace
#

I may ask to give a few people a role if they jump in ... but if I do, I wouldn't expect immediate responses... and the people that I would do that for are like, ...pytest maintainers, or maybe a vispy maintainer if they hop on.

rapid kestrel
#

I can also make it available to anyone with the Python Community role, so pytest maintainers would have access based on that. And any other crucial maintainer can get their own fancy role here~

rough furnace
#

oh, that would be perfect

#

due to time-zone spread, I really doubt there will be significant usage of voice/screen-share, ...it will likely be limited to a time period where there is significant overlap between our availability

rough furnace
#

@quartz tiger another person to add to the pyqtgraph role if you have a moment, @torn coyote could be brought here please

#

unless some contributors/maintainers come out of hiatus, I think that should do it

rocky bolt
rough furnace
#

:t-hanks:

#

to not pick on any one of you admins, should I be @-ing at a group instead when I could use some non-urgent assistance?

rocky bolt
#

Pinging the role would be fine for this sort of thing, yeah

rough furnace
#

@Admins ?

rocky bolt
#

Yeah

rough furnace
#

👍

rough furnace
#

@rapid kestrel so what should we do next here; or is there some rewording we should change with respect to the announcement?

rapid kestrel
rough furnace
#

We will certainly handle the labeling of issues and such... annoyingly I'm unable to get a babysitter for that Saturday, but do have one for that Sunday.

For the "contributors session" I'm going to recommend 1300-1500 PM PST ... we'll have folks around before/after but I think that's probably the time I can make myself most available.

#

Announcements going live Nov 1st sounds good, I'm starting to do some prep work on my end regarding announcements, but don't want to do too much until I can link somewhere else 👍

hexed tundra
#

At about what time tomorrow would you like the reddit announcement post to go live?

rough furnace
#

For this, I'll take the suggestions of those more experienced than me. I reside in the U.S. west Coast, I can be intermittently online to answer questions all day

rough furnace
#

also feel free to tag me on the post, I'm /u/ogi010 on reddit

rapid kestrel
#

Hi! I will be making some posts in a few hours once I am feeling less ill and can breathe a bit better

rough furnace
rapid kestrel
#

Yeah, a very persistent cough that has stolen my voice. Rather annoying but otherwise fine~

rough furnace
#

persistent coughs are the worst

hexed tundra
#

Just so I'm on the same page--today we're announcing the sprint for Nov 13th-14th correct?

rough furnace
#

yes

hexed tundra
#

awesome! Just making sure I had my ducks in a row

hexed tundra
rough furnace
hexed tundra
rough furnace
#

👍

hexed tundra
#
#PyQtGraph Code Sprint!

Join us on November 13th and 14th for a code sprint with the developers of PyQtGraph! 

* https://github.com/pyqtgraph/pyqtgraph

PyQtGraph frequently finds a use in scientific computing/research applications where it is valuable to view incoming data in real-time, and we'll be hosting a coding sprint to tackle open issue and to submit pull requests which address them. We'll have office hours at 1300-1500 PST on Saturday where [LIST OF NAMES] will be available to help make the sprint go smoothly and answer any questions you might have. 


During the sprint we hope to achieve some of the following:

* submit PRs that address existing open issues
* test, review and merge existing PRs
* identify documentation that can be improved, and submit PRs to do so


If you're interested in joining and helping contribute to this awesome library, make sure you familiarize yourself with the Contribution Guide: 

* https://github.com/pyqtgraph/pyqtgraph/blob/master/CONTRIBUTING.md

And make sure you're familiar with the use of virtual environments and have the necessary dependencies outlined in the README installed and ready to go. 
#

It needs some work, but @rough furnace let me know what you think, and let me know the times and timezones you'll be available during, and @rapid kestrel give it a look over and let me know what changes would work to be more inline with standard discord announcements

rough furnace
#

for [TIMES] I would recommend 1300-1500 PST on Saturday and 1000-1200 PST on Sunday if a second time is needed.

I can/should write up a blurb on what we could use help with cough openGL cough

In terms of list of names, Ogi Moore for sure, @plush fulcrum @obsidian sapphire would 1300-1500 PST Saturday the 13th be a good time to hold an "office hour" for you two?

#

oh, forgot to tag @mortal grotto with the question above ☝️

hexed tundra
#

Awesome, added the saturday time slot in and will add names once everyone is ready

#

Also Spookiekatj9--if you had something drafted feel free to disregard mine. I just took a shot at it in case you weren't able to get it

obsidian sapphire
#

I've got a few things to work around that day, which aren't entirely under my control, but probably? If it gets pushed around, will that be hard to coordinate with?

rough furnace
#

eh, as long as one of us is there to answer some basic questions I think that's fine, Saturday mornings are pretty tough due to kid events; but the afternoon is usually a bit lower key, this was a window I felt I could most certainly make myself available; anyway if you're busy that day, I wouldn't worry about it @obsidian sapphire

obsidian sapphire
#

No, yeah, I have hours of time to give then, I just don't know exactly when they'll be.

mortal grotto
#

@rough furnace that time should work for me as well, thanks

wide prism
#

I think these times are around 6AM on Sunday and 3 AM on Monday in my time zone. So I think I'd prefer not to promise my availability right then. Sorry 🙂

rough furnace
wide prism
#

I am not the best person to help with setup / getting started issues anyway. But I have tried to clear that weekend as much as possible, so I will be around as much as possible.

#

If the intro happens in this channel, I can scroll up later 🙂

cedar trail
#

This channel will most probably stay internal, even during the event

#

New public facing channels will/can be made for the event

rough furnace
#

not to get all nag-ey, but ...well is there anything I can do to help w/ getting the announcement posted?

rapid kestrel
rapid kestrel
#

aaaand we're off!

#

This channel will still remain private to y'all in case you need a non-public area to discuss things

rough furnace
#

huge thank you to everyone involved here!

quartz tiger
rough furnace
#

@quartz tiger I think that would be fine, leave the pinned message up, I'll answer questions throughout the day.

#

I'll let you all know if it's overwhelming, ...in which case I may draft up a FAQ or something

quartz tiger
#

Cool, done

#

people should be able to type there now

rough furnace
#

thank you all for all this, I really appreciate it

#

@hexed tundra let me know once the reddit post goes live and I'll link on twitter and such. I can't thank you all enough for supporting us on this!

hexed tundra
# rough furnace <@!459119350851567626> let me know once the reddit post goes live and I'll link ...
Join the [PyQtGraph](https://github.com/pyqtgraph/pyqtgraph) maintainers on November 13th and 14th for a code sprint hosted by our sister community the [Python Discord](https://discord.gg/python)! 


PyQtGraph (https://github.com/pyqtgraph/pyqtgraph) frequently finds use in scientific computing/research applications especially when you need to view data in realtime. The Python Discord be hosting a coding sprint on the server to tackle open issues and to submit and review pull requests in this very channel! 

During the sprint we hope to:
• Submit PRs that address existing open issues
• Test, review and merge existing PRs
• Identify documentation that can be improved, and submit PRs to do so

Office hours will be at November 13, 2021 3:00 PM (2100-2300 UTC on Saturday, November 13) where j9ac9k (u/ogi010), ntjess, outofculture will be available to answer any questions you might have while contributing!

If you're interested in helping contribute to this library then check out the following:
• Read and abide by the code of conduct https://github.com/pyqtgraph/pyqtgraph/blob/master/CODE_OF_CONDUCT.md
• Setup your contributing environment https://github.com/pyqtgraph/pyqtgraph/blob/master/CONTRIBUTING.md
• Get ready to have fun and support an awesome library! 

How does this look? I removed the tags to avoid pinging everyone, but it's got an @ ahead of it in the actual post

rough furnace
hexed tundra
#

no worries no rush

rough furnace
#

That looks good, is PyQtGraph in the second paragraph intentionally not hypter-linked? (I'm good with it not being so)

hexed tundra
#

I'll hyperlink that! (Or would you prefer the second on link to the docs page?)

rough furnace
#

oh, good call on the docs page, it's pyqtgraph.readthedocs.io

hexed tundra
#

Ok--one final thing.
Do you have any images you're particularly fond of to showcase the library?

rough furnace
#

sure, stand-by

cedar trail
rough furnace
#

"Basic Plotting Example"

#

PColorMeshItem

#

Scatter Plots

#

(one more)

#

Region of Interest

hexed tundra
#

Ok, I should have the post ready. I've never played with embedding images so we might experience some fun bugs, but I'll be able to edit and fix them

rough furnace
#

looks great to me!

hexed tundra
#

Awesome, it is now distinguished and sticked to the sub so it sits on the top of the page. Hopefully that'll help get some interested folks to help contribute!

rough furnace
#

wait nov 14 and 15?

#

title says 14 and 14, text says 13 and 14)

hexed tundra
#

Yeah I messed that up--let me deleted and repost 😄

rough furnace
#

😆

#

I love that mods have the same annoyances as users with not being able to edit titles

hexed tundra
#

Haha it's such a pain but so it goes. Give me a minute and I'll get the new post setup

#

Does that look right?