Приложение PyQt Frozen Screen в Linux, нормально в Windows

Я некоторое время писал приложение PyQt для Windows и хотел посмотреть, будет ли оно правильно работать в Linux. Приложение с графическим интерфейсом представляет собой оболочку для набора научных инструментов, предназначенного для использования на qtconsole/notebook. Системы Linux и Windows основаны на Anaconda 3.5 и работают под управлением PyQt5. Он отлично работает в Windows, но когда я запускаю Linux, всплывающее окно Qt просто останавливается на месте графики, которая была под окном (см. Изображение ниже). В командной строке вообще не отображаются ошибки, окно просто всплывает и вообще не показывает виджеты. Кроме того, когда я пытаюсь закрыть с помощью кнопки x в верхней части окна, отображается диалоговое окно «Приложение не отвечает», и мне приходится принудительно закрыть его.

База кода довольно велика (слишком велика для этого поста), поэтому я не смог бы привести пример кода для этой проблемы (мне пока не удалось воспроизвести ошибку вне этой программы). Могу сказать, что я получил несколько примеров с этого сайта, работающих с простыми программами с графическим интерфейсом: https://github.com/Deusdies/pythonbo . В моем коде много подклассов виджетов, используется pyqtgraph (самая последняя версия из github) для графиков и много подокон MDI.

Другие пакеты для базового инструментария включают:

  • numpy, numba, scipy, matplotlib
  • не подходит
  • pyexcel, pyexcel-xlsx
  • pyvisa, pyserial
  • пиперклип

Когда я пытаюсь запустить любой из виджетов подокна MDI как отдельные программы, я получаю ту же проблему, что и при запуске основной программы.

Думаю, мне любопытно, сталкивался ли кто-нибудь с этой ситуацией раньше и может ли предложить вероятные вещи, которые я должен исследовать, чтобы увидеть, в чем может быть проблема.

Замороженное приложение PyQt


person Vince W.    schedule 03.07.2016    source источник
comment
Создайте MCVE. Начните со своей программы и удаляйте весь код, который не способствует возникновению проблемы, пока у вас не останется минимальный пример. Есть большая вероятность, что вы сами обнаружите проблему таким образом (тем более, что небольшие примеры, кажется, работают, поэтому проблема, скорее всего, в вашей программе, а не в вашей установке). Если нет, опубликуйте свой MCVE, и мы сможем лучше разобраться в проблеме.   -  person titusjan    schedule 03.07.2016


Ответы (1)


Общий ответ оказался таким: инициализировались 2 цикла событий QApplication.

Код проблемы оказался в небольшом модуле, который я использовал под названием pyperclip, который импортировался первым. , а затем я создавал экземпляр своего QApplication в нижней части моего кода графического интерфейса.

Это не было проблемой в Windows, потому что pyperclip может получить доступ к буферу обмена Windows в некоторой степени изначально, но в Linux он использует QtClipboard. Мое решение состояло в том, чтобы отредактировать код pyperclip, чтобы определить, запущено ли приложение, а затем создать экземпляр моего графического приложения перед импортом pyperclip.

ИЗМЕНИТЬ КОД

в коде pyperclip, модуль pyperclip.clipboards, строка 51, я изменил эту строку:

app = QApplication([])

к этому:

app = QApplication.instance()
if app is None:
    app = QApplication([])
person Vince W.    schedule 04.07.2016
comment
У меня точно такая же проблема. Вы написали: Мое решение состояло в том, чтобы отредактировать код pyperclip, чтобы определить, запущено ли приложение. Очень жаль, что вы не опубликовали фрагмент кода для этого... :( - person JonBrave; 07.06.2017
comment
Хорошо, я тоже так делал, когда узнал, как это делать! Также pyperclip использует здесь app как глобальную переменную, что опасно, я переименовал ее здесь в cbApp. (Кстати, чисто OOI, я обнаружил, что даже без каких-либо изменений кода, если вы запускаете приложение pyperclip от имени пользователя root, оно не зависает --- странно!) - person JonBrave; 09.06.2017