How to keep open Tkcalendar after running code
The problem is that you are using 2 libraries that have 2 eventloops, a possible solution is to run the eventloops separately in different processes but that is unnecessarily complicating the application. A better solution is to write all the logic using a single library, in this one because there is no equivalent of Qt WebEngine in tkinter I will choose to use pyqt5:
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgetsSCRIPT_FIND_URL = """var url = ""var phrase = "Tipo de cambio para solventar obligaciones denominadas en moneda extranjera pagaderas en la República Mexicana."var elements = document.getElementsByTagName("a");for(const e of elements){ if(e.text.includes(phrase)) url = e.href}url"""class PageOffline(QtWebEngineWidgets.QWebEnginePage): finished = QtCore.pyqtSignal(bool) def __init__(self, parent=None): super().__init__(parent) self.date_url = QtCore.QUrl() self.loadFinished.connect(self.handle_loaded) self.pdfPrintingFinished.connect(self.handle_pdf) def search(self, date): self.date = date self.date_url = QtCore.QUrl("https://www.dof.gob.mx/index_111.php") query = QtCore.QUrlQuery() query.addQueryItem("year", self.date.toString("yyyy")) query.addQueryItem("month", self.date.toString("MM")) query.addQueryItem("day", self.date.toString("dd")) query.addQueryItem("edicion", "MAT") self.date_url.setQuery(query) self.load(self.date_url) def handle_loaded(self, ok): if ok: if self.url() == self.date_url: self.runJavaScript(SCRIPT_FIND_URL, self.handle_url) else: filename = "{}.pdf".format(self.date.toString("yyyy-MM-dd")) self.printToPdf(filename) else: self.finished.emit(False) def handle_url(self, url): if url: pdf_url = QtCore.QUrl.fromUserInput(url) self.load(pdf_url) else: self.finished.emit(False) def handle_pdf(self, path, ok): self.finished.emit(ok)class Widget(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.page = PageOffline() self.button = QtWidgets.QPushButton("Generate pdf") self.calendar = QtWidgets.QCalendarWidget() lay = QtWidgets.QVBoxLayout(self) lay.addWidget(self.calendar) lay.addWidget(self.button, alignment=QtCore.Qt.AlignCenter) self.button.clicked.connect(self.handle_clicked) self.page.finished.connect(self.handle_print_finished) def handle_clicked(self): date = self.calendar.selectedDate() self.page.search(date) self.button.setEnabled(False) def handle_print_finished(self, status): QtWidgets.QMessageBox.information( self, "Generación de PDF", "El PDF fue generado con éxito" if status else "La generación de PDF fallo", ) self.button.setEnabled(True)def main(): import sys app = QtWidgets.QApplication(sys.argv) QtCore.QLocale.setDefault(QtCore.QLocale(QtCore.QLocale.Spanish)) w = Widget() w.resize(400, 400) w.show() sys.exit(app.exec_())if __name__ == "__main__": main()