如何在Tkinter窗口中嵌入外部应用 解决现有代码运行报错问题
问题原因&解决方案
报错根因
- 你对
app_1变量调用了open()方法,得到的是文件IO对象,而os.system()要求传入的是字符串类型的文件路径,所以触发类型错误。 - 你对图片也调用了
open()方法,原生Tkinter不支持直接读取文件对象加载PNG图片,后续也会触发图片加载错误。 - 你当前的逻辑只是尝试打开外部程序,完全没有实现「嵌入外部应用窗口到Tkinter中」的逻辑,需要调用Windows平台API实现该需求。
前置依赖安装
执行以下命令安装需要的第三方库:
pip install pillow pywin32
完整修改代码
from tkinter import * import os import time import win32gui import win32con from PIL import Image, ImageTk # 初始化主窗口 window = Tk() window.geometry('1000x700') window.title("内嵌应用演示") # 加载应用图标 app_icon_path = './Images/App_Icons/App_1.png' icon = Image.open(app_icon_path) app_1_icon = ImageTk.PhotoImage(icon.resize((40,40))) # 可根据需求调整图标大小 # 存放嵌入应用的容器frame app_frame = Frame(window, width=900, height=600, bg="gray") app_frame.pack(pady=20) # 启动目标应用(快捷方式用os.startfile打开更稳妥) app_path = './Applications/App_1.lnk' os.startfile(app_path) time.sleep(2) # 等待应用窗口完全启动,可根据实际启动速度调整时长 # 获取应用窗口句柄,替换下面的窗口标题为你实际启动的App_1的窗口标题 app_hwnd = win32gui.FindWindow(None, "你的App_1窗口标题") if app_hwnd: # 设置应用窗口的父容器为我们创建的frame win32gui.SetParent(app_hwnd, app_frame.winfo_id()) # 移除窗口的标题栏、边框等多余样式 style = win32gui.GetWindowLong(app_hwnd, win32con.GWL_STYLE) style = style & ~(win32con.WS_CAPTION | win32con.WS_THICKFRAME | win32con.WS_MINIMIZEBOX | win32con.WS_MAXIMIZEBOX | win32con.WS_SYSMENU) win32gui.SetWindowLong(app_hwnd, win32con.GWL_STYLE, style) # 调整应用窗口大小适配容器 win32gui.SetWindowPos(app_hwnd, win32con.HWND_TOP, 0, 0, 900, 600, win32con.SWP_SHOWWINDOW) # 显示应用图标和名称(可根据你的需求调整布局) icon_label = Label(window, image=app_1_icon) icon_label.pack(side=LEFT, padx=20) app_name_label = Label(window, text="App_1", font=("微软雅黑",14)) app_name_label.pack(side=LEFT) window.mainloop()
注意事项
- 代码中
win32gui.FindWindow的第二个参数需要替换为你启动的App_1实际的窗口标题,你可以打开App_1后手动查看窗口顶部的标题文字填写。 - 如果应用启动速度较慢,可以适当调大
time.sleep的等待时长。 - 该方案仅适用于Windows平台,依赖Win32 API实现窗口嵌入。
内容的提问来源于stack exchange,提问作者AsmitTheCoder
相关产品推荐
相关产品推荐

