PyQt5 автоматически изменяет размер окна tkinter

#python #tkinter #pyqt5

#python #tkinter #pyqt5

Вопрос:

Я пытаюсь открыть веб-страницу, используя PyQt5 после нажатия кнопки в tkinter окне.

Как только открывается новое окно, оно изменяет размер (в данном случае уменьшает размер) tkinter окна навсегда.

Минимальный код, необходимый для воспроизведения этого

 import sys
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import QApplication
from tkinter import *
from threading import Thread

class Web:
    def __init__(self,url,title='',size=False):
        self.title=title
        self.url=url
        self.size=size

        self.app=QApplication(sys.argv)
        self.web=QWebEngineView()
        self.web.setWindowTitle(self.title)
        self.web.load(QUrl(self.url))
        if size:
            self.web.resize(self.size[0],self.size[1])
    
    def open(self):
        self.web.show()
        sys.exit(self.app.exec_())

def launch():
    web=Web('https://www.example.com')
    web.open()

root=Tk()

button=Button(root,text='open',command=lambda:Thread(target=launch).start())
button.pack(padx=100,pady=100)

root.mainloop()
 

Изображения для справки

Оба изображения имеют одинаковую высоту.

введите описание изображения здесь
введите описание изображения здесь

Я хотел бы знать причину и способ предотвратить это.

Комментарии:

1. Я не могу воспроизвести сокращение в Linux. Однако Qt жалуется, что приложение не создается в основном потоке, а ссылка на веб-странице недоступна для просмотра. Попытка использовать несколько наборов инструментов GUI с отдельными основными циклами вместе — сложная задача. Может быть, попробуйте поместить свой PyQt-код в отдельный файл и запустить его suprocess.Popen вместо этого.

2. @j_4321 Большое спасибо за ваши предложения. suprocess.Popen Метод работает без каких-либо проблем. Но если мне нужно передать URL-адрес скрипту, то мне придется прагматично переписывать эту часть скрипта каждый раз перед его выполнением. На данный момент, для моего варианта использования, я не обнаружил какой-либо заметной проблемы с тем, что его нет в основном потоке, и ссылка действительно работает для меня. Кроме того, если бы я распространял приложение как исполняемый файл, мне, возможно, пришлось бы провести немного больше исследований, чтобы заставить его работать аналогичным образом.

3. Есть ли реальная причина, по которой необходимо использовать как tk, так и Qt? Совместная работа компонентов двух фреймворков с графическим интерфейсом редко является хорошей идеей (в большинстве случаев это просто очень плохая идея и считается плохой практикой): все они имеют свой собственный цикл событий, и не должно быть другого параллельного цикла, который работает по-другому. В любом случае, вам не нужно «программно переписывать», чтобы передать URL-адрес, просто используйте аргумент командной строки.

4. @musicamante спасибо за ваши предложения. У меня есть приложение, полностью написанное с помощью tk, но я хотел бы открыть несколько веб-страниц в среде приложения (без использования внешних веб-браузеров), поскольку в tk нет виджета для рендеринга веб-страниц, я подумал использовать Qt для этой цели, например, веб-оболочки pywebview имеют ту же проблему, что иони должны выполняться в основном потоке, что приводит к тому, что остальная часть программы не отвечает во время использования. Я был бы рад узнать, есть ли лучший подход к этому.

Ответ №1:

Я сам это понял. PyQt изменяет осведомленность о dpi , чего не происходит по умолчанию с tkinter помощью . Из-за чего tkinter окно изменило свой размер, как только PyQt было запущено в том же основном цикле.

Поскольку я нахожусь на компьютере с Windows, использование этого решило проблему.

 ctypes.windll.shcore.SetProcessDpiAwareness(1)