Открытие exe файлов внутри окна Tkinter
Существует ли возможность запускать .exe файлы внутри окна Tkinter?
Я хочу чтобы пользователь выбирал .exe программу и ее GUI
открывался в фрейме моего окна Tkinter на Python.
Можно ли хотя-бы реализовать запуск Python программ в окне (работающих в терминале) или Python программ написанных на Tkinter?
Я хочу использовать эту функцию в разработке виртуальной машины Windows 95.
Если это невозможно, придется самому писать программы на питоне чтобы они открывались в окне tkinter.
Ответы (2 шт):
Если запускать в отдельном окне, то это может выглядеть так:
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()
Возможность запускать исполняемые файлы внутри окна 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. Кажется эту библиотеку уже использовали по этому назначению, Подробнее