pywebview. Как переключить фокус на основное окно программы?

Рейтинг: 0Ответов: 1Опубликовано: 31.01.2023

Использовал pywebview для отображения веб-страниц внутри программы. Столкнулся с проблемой: при создании окна webview основное окно программы становится неактивным, причем манипуляции с ним (перемещение) запоминаются и воспроизводятся после закрытия окна webview. Попробовал пустить через поток, вероятно не правильно использовал. Кто сталкивался, как решить эту проблему? Нужно чтоб основное окно не блокировалось окном webview. Минимальный код ниже. Для работы необходимы установленные: PyQt5, PyWebview.

(известный вариант с PyQtWebEngine не предлагайте, работает только на х64 и при инсталяции/деинсталяции вышибает рабочую PyQt5).

from threading import Thread
import sys
import webview
from PyQt5 import QtWidgets
from PyQt5.Qt import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.resize(400, 200)

        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)

        self.label = QtWidgets.QLabel('<h1>Double Click Me!</h1>', alignment=Qt.AlignCenter)
        self.label.setStyleSheet('background-color: #5599ff;')

        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)

    def mouseDoubleClickEvent(self, event):
        thread_func()

def thread_func():
    webview.start(win2)

if __name__ == '__main__':
    win2 = webview.create_window('tst_win_2', html='text2', width=400, height=300)
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    thread = Thread(target=thread_func)
    thread.start()
    thread.join()

    sys.exit(app.exec_())

Ответы

▲ 1Принят

Связался с разработчиком PyWebview, действительно имеет место быть такая проблема. Особенность GUI. Решается задача через мультипроцессинг. Накидал корявенкий код, но суть решения отражает.

import multiprocessing
import sys
import webview

from PyQt5 import QtWidgets
from PyQt5.Qt import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        self.label = QtWidgets.QLabel(f'<h1>Main window</h1>', alignment=Qt.AlignCenter)
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)

    def mousePressEvent(self, event):
        pass

def gui_main(): # функция с процессом основной программы
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

def gui_bro(): # функция с процессом создания окна pywebview
    win2 = webview.create_window('tst_win_2', html='text2', width=400, height=300)
    webview.start(win2)

if __name__ == '__main__':
    proc1 = multiprocessing.Process(target=gui_main)
    proc1.start()
    proc2 = multiprocessing.Process(target=gui_bro, daemon=True)
    proc2.start()
    proc1.join()