Повторный запуск окна на PyQt5 из Tkinter

Wladimirbel

Новичок
Пользователь
Май 8, 2021
2
0
1
Windows 7

При первом запуске все отрабатывает ок, при повторном запуске программа вылетает.

Python:
import tkinter as tk

from PyQt5.QtWebEngineWidgets import *

from PyQt5 import QtWidgets

from PyQt5 import QtCore

from PyQt5.QtCore import *

import sys

import threading



class Main(tk.Frame):

    def __init__(self, root):

        super().__init__(root)

        self.init_main()



    def init_main(self):

        self.label = tk.Label(self, text='После первого нажатия на кнопку все отрабатывает,\n'

                                         ' потом закрываем окно \n'

                                         'и повторно жмем кнопку и программа рушится\n')

        self.label.pack(side=tk.TOP)

        self.btn = tk.Button(self, text='Нажми меня', command=self.open_new_child)

        self.btn.pack(side=tk.TOP)



    def thread(my_func):

        def wrapper(*args, **kwargs):

            my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs)

            my_thread.start()

        return wrapper



    @thread

    def open_new_child(self):



        self.url = 'https://www.example.com'

        self.app = QtWidgets.QApplication(sys.argv)



        self.centralwidget = QtWidgets.QWidget()

        self.centralwidget.setObjectName("centralwidget")

        self.centralwidget.setGeometry(QtCore.QRect(150, 50, 700, 600))



        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)

        self.lineEdit.setGeometry(QtCore.QRect(70, 10, 600, 20))

        self.lineEdit.setObjectName("lineEdit")



        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)

        self.lineEdit_2.setGeometry(QtCore.QRect(70, 40, 600, 20))

        self.lineEdit_2.setObjectName("lineEdit_2")



        self.frame = QtWidgets.QFrame(self.centralwidget)

        self.frame.setGeometry(QtCore.QRect(70, 70, 600, 371))

        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)

        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)

        self.frame.setObjectName("frame")



        self.web = QWebEngineView(self.frame)

        # self.web.setWindowTitle(self.title)

        self.web.load(QUrl(self.url))

        self.web.resize(600, 550)



        self.label = QtWidgets.QLabel(self.centralwidget)

        self.label.setGeometry(QtCore.QRect(40, 10, 21, 16))

        self.label.setObjectName("label")



        self.label_2 = QtWidgets.QLabel(self.centralwidget)

        self.label_2.setGeometry(QtCore.QRect(30, 40, 31, 16))

        self.label_2.setObjectName("label_2")



        self.label.setText("От:")

        self.label_2.setText("Тема:")



        self.centralwidget.show()

        self.app.exec()





if __name__ == "__main__":

    root = tk.Tk()

    app = Main(root)

    app.pack()

    root.geometry("400x200+100+100")

    root.resizable(True, True)

    root.mainloop()

Вот еще вариант но проблема та же:

Код:
import tkinter as tk
from PyQt5.QtWebEngineWidgets import *
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtCore import *
import sys

class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()

    def init_main(self):
        self.label = tk.Label(self, text='После первого нажатия на кнопку все отрабатывает,\n'
                                         ' потом закрываем окно \n'
                                         'и повторно жмем кнопку и программа рушится\n')
        self.label.pack(side=tk.TOP)
        self.btn = tk.Button(self, text='Нажми меня', command=self.open_read_mail)
        self.btn.pack(side=tk.TOP)

    def open_read_mail(self):
        # self.filepath = 'https://www.example.com'  # 'file:///__Страшно_горят_цены_в_21vek___/index.html'
        # web_text = self.filepath
        web = Web()   # web_text
        web.open()


class Web:
    def __init__(self, url='https://www.example.com', title='Входящее сообщение'):
        self.title = title
        self.url = url

    def init_child(self):

        self.app = QtWidgets.QApplication(sys.argv)

        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setGeometry(QtCore.QRect(150, 50, 700, 600))

        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(70, 10, 600, 20))
        self.lineEdit.setObjectName("lineEdit")

        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(70, 40, 600, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(70, 70, 600, 371))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")

        self.web = QWebEngineView(self.frame)
        self.web.setWindowTitle(self.title)
        self.web.load(QUrl(self.url))
        self.web.resize(600, 550)

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 10, 21, 16))
        self.label.setObjectName("label")

        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 40, 31, 16))
        self.label_2.setObjectName("label_2")

        self.label.setText("От:")
        self.label_2.setText("Тема:")

        qbtn = QtWidgets.QPushButton('Quit', self.centralwidget)
        qbtn.clicked.connect(self.close_window)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(1, 60)

    def close_window(self):
        self.centralwidget.close()
        #sys.exit(0)

    def open(self):
        self.init_child()
        self.centralwidget.show()
        self.app.exec()
        #sys.exit()


if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack()
    root.geometry("400x200+100+100")
    root.resizable(True, True)
    root.mainloop()
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
тема называется
Повторный запуск окна на PyQt5 из Tkinter
а что нельзя без Tkinter обойтись вообще?
в нём как и во всём есть и плюсы, но
root = Tk() # класс Tk() = создание окна, всегда называйте его root, появляется на долю секунды, ЧТО ПЛОХО, НЕКРАСИВО!!!!
для меня всё перечёркивает............
 

Wladimirbel

Новичок
Пользователь
Май 8, 2021
2
0
1
Спасибо за Ваше мнение, но к сожалению Ваш ответ не приблизил меня к решению проблемы. Ответ из разряда. tkinter и PyQt5 лучше не совмещать, гораздо более был бы ценным. Дело ведь не в том что бы переписывать всю программу каждый раз когда натыкаешься на что-то, возможно и придется, но я надеюсь может быть подскажут ответ так как я пока его сколько не искал не нашел, по всей видимости из за того что мои познания в этом еще не очень большие.
 

Форум IT Специалистов