Python Windows вызвать rundll32 модально

Нужно в Windows из приложения на Python (GUI на tkinter) открыть сертификат так, чтобы созданное окно было модальным. Т.е. сертификат должен открыться так:

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

Сам сертификат я могу открыть с помощью os.startfile, например:

os.startfile(cert_file_name.cer)

или с помощью subprocess, например:

subprocess.Popen(["C:\\Windows\\system32\\rundll32.exe", "cryptext.dll,CryptExtOpenCER", "cert_file_name.cer"])

Но в обоих случаях сертификат будет открыт как отдельный процесс. Можно ли открыть сертификат как модальное окно?


Ответы (1 шт):

Автор решения: Сергей Кох

Я думаю, что можно сымитировать "модальность":

  1. Открыть одновременно модальное окно, с помощью Toplevel и функций .grab_set() и .wait_window(), и окно сертификата (через subprocess.Popen).
  2. Сделать настоящее модальное окно невидимым .withdraw().
  3. Переодически проверяете завершился ли процесс с сертификатом.
  4. Если окно с сертификатом закрыто(или закрывается), то зыкрываете и настоящее модальное окно, тем самым делая активным основное окно. Я набросал заготовку с os.startfile на первые два пункта, для демонстрации:
import os
from tkinter import *


def func():
    os.startfile('cert_file_name.cer')
    top = Toplevel(root)
    top.grab_set()
    top.withdraw()
    top.wait_window()


root = Tk()
label = Label(root, text='Текст')
label.pack()
(button := Button(root, text='open', command=func)).pack()

root.mainloop()
→ Ссылка