2025, Nov 22 03:02

Пустой график в pyqtgraph с PySide6 6.9.1: причина и решение

Почему pyqtgraph с PySide6 6.9.1 показывает пустой график: баг PYSIDE-3115. Решение: откат на 6.9.0/6.8.3 или временный переход на PyQt. Без предупреждений.

Когда простой график pyqtgraph в окне PySide6 отображается как пустое полотно без каких‑либо сообщений об ошибках, может показаться, что виновата логика в коде. На деле проблему может вызывать конкретная версия биндинга, которая ломает отрисовку. Ниже приведён минимальный пример, демонстрирующий ситуацию и корректный способ её решить.

Воспроизводимый пример

from PySide6.QtWidgets import QApplication, QMainWindow
import pyqtgraph as pg
import sys
class AppFrame(QMainWindow):
    def __init__(self):
        super().__init__()
        self.plot_area = pg.PlotWidget()
        self.setCentralWidget(self.plot_area)
        t_hours = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        temps = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]
        self.plot_area.plot(t_hours, temps)
app_ctx = QApplication(sys.argv)
window = AppFrame()
window.show()
app_ctx.exec()

Что происходит на самом деле

Пустой интерфейс вызывает не код построения графика. Это известная проблема в PySide 6.9.1, зафиксированная как PYSIDE-3115. Баг влияет на рендеринг так, что нет видимого вывода и не появляются предупреждения или ошибки, из‑за чего отладка сбивает с толку. Проблема достаточно серьёзная: релиз PySide 6.9.1 внесён в чёрный список pyqtgraph, а исправление намечено для PySide 6.9.2 и будущей ветки 6.10.

Исходя из этого, запуск примера с Python 3.13.5, pyqtgraph 0.13.7 и PySide6 6.9.1 может привести к пустому окну графика, тогда как точно такой же код работает с другими комбинациями, включая PyQt6 или более ранние версии PySide6.

Как исправить пустой график

Самый простой путь — избегать PySide 6.9.1. Откатитесь на PySide 6.9.0 или используйте ветку 6.8, например 6.8.3, где нет изменения, вызвавшего регрессию. Ещё один вариант — временно перейти на PyQt, который, судя по всему, не затронут. Когда выйдет исправленный PySide 6.9.2, обновление вернёт ожидаемое поведение.

Короче: избегайте PySide 6.9.1; используйте 6.9.0 или 6.8.3, либо временно перейдите на PyQt. Тогда тот же код корректно отрисуется.

Рабочий код в среде без проблемы

Логику построения менять не нужно. Достаточно использовать незатронутую версию — и следующий фрагмент покажет линейный график как задумано:

from PySide6.QtWidgets import QApplication, QMainWindow
import pyqtgraph as pg
import sys
class AppFrame(QMainWindow):
    def __init__(self):
        super().__init__()
        self.plot_area = pg.PlotWidget()
        self.setCentralWidget(self.plot_area)
        t_hours = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        temps = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]
        self.plot_area.plot(t_hours, temps)
app_ctx = QApplication(sys.argv)
window = AppFrame()
window.show()
app_ctx.exec()

Почему это важно

Такие биндинги, как PySide, находятся между вашим кодом на Python и Qt. Регрессия на этом уровне может дать пустой вывод без каких‑либо сигналов во время выполнения, из‑за чего уходит время на отладку приложения, хотя корень проблемы — в самом тулките. Для команд, выпускающих десктопные приложения, это наглядный пример, почему фиксация версий, отслеживание изменений и внимание к чёрным спискам или регрессиям «наверх по цепочке» критически важны для стабильности.

Вывод

Если ваш график pyqtgraph в связке с PySide6 отображается как пустой интерфейс, сначала проверьте версию биндинга. PySide 6.9.1 затронута известным багом, уже внесённым в чёрный список pyqtgraph и запланированным к исправлению в 6.9.2 и позднее. Откатитесь на 6.9.0 или 6.8.3, либо временно перейдите на PyQt до выхода фикса. Фиксируйте версии, следите за релиз‑нотами и проверяйте поведение GUI при каждом переходе между минорными релизами биндингов.