#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)