Открытие exe файлов внутри окна Tkinter

Существует ли возможность запускать .exe файлы внутри окна Tkinter?
Я хочу чтобы пользователь выбирал .exe программу и ее GUI открывался в фрейме моего окна Tkinter на Python.

Можно ли хотя-бы реализовать запуск Python программ в окне (работающих в терминале) или Python программ написанных на Tkinter?

Я хочу использовать эту функцию в разработке виртуальной машины Windows 95.
Если это невозможно, придется самому писать программы на питоне чтобы они открывались в окне tkinter.


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

Автор решения: S. Nick

Если запускать в отдельном окне, то это может выглядеть так:

import subprocess
from tkinter import *


root = Tk()
root.wm_geometry("300x300")

def some_function():
    child_script = "calc.exe"
    subprocess.Popen([child_script,])
    
frame = Frame(root)
frame.place(x=0, y=0)
button = Button(frame, text="Click my")
button.grid(row=0, column=2)
button.bind("<Button>", lambda event: some_function())

root.mainloop()

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

→ Ссылка
Автор решения: Donovan

Возможность запускать исполняемые файлы внутри окна tkinter есть, более того, их можно реализовать разными способами. С помощью библиотеки pywin32 можно запустить приложения внутри окна tkinter. Но некоторые из окон (такие как системное окно калькулятора) не открываются, видимо из-за "кастомного" окна.

Небольшой код, показывающий работу:

import tkinter as tk # tkinter
import subprocess # Запуск через системный процесс
import win32gui # библиотека для встраивания приложений
import win32con
import win32process

def get_hwnd_from_pid(pid):
    def callback(hwnd, hwnds):
        _, found_pid = win32process.GetWindowThreadProcessId(hwnd)
        if found_pid == pid:
            hwnds.append(hwnd)
        return True

    hwnds = []
    win32gui.EnumWindows(callback, hwnds)
    return hwnds[0] if hwnds else None

def embed_app(root_window_id, app_path):
    proc = subprocess.Popen(app_path)
    app_pid = proc.pid

    # Получение HWND запущенного приложения
    hwnd = None
    while hwnd is None:
        hwnd = get_hwnd_from_pid(app_pid)

    # Встраивание приложения в окно tkinter
    win32gui.SetParent(hwnd, root_window_id)
    win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    win32gui.MoveWindow(hwnd, 0, 0, 800, 600, True)

# Окно tkinter
win = tk.Tk()
win.geometry("800x600")

# Идентификатор окна tkinter
root_window_id = win.winfo_id()

# Путь к приложению
app_path = "C:\\Windows\\System32\\notepad.exe"

b = tk.Button(win, text="Запустить приложение", command=lambda: embed_app(root_window_id, app_path))
b.pack()

win.mainloop()

P.s. Кажется эту библиотеку уже использовали по этому назначению, Подробнее

→ Ссылка