Как привязать окно tkinter к окну стороннего приложения?

Пользователь

от terrence , в категории: Python , 6 месяцев назад

Как привязать окно tkinter к окну стороннего приложения?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jeromy_ruecker , 6 месяцев назад

@terrence 

В библиотеке Tkinter нет прямой возможности привязать окно к окну стороннего приложения. Окно Tkinter всегда является отдельным окном на рабочем столе.


Однако вы можете вставить окно Tkinter в окно стороннего приложения, используя специальные методы и библиотеки:

  1. Метод win32gui.SetWindowLong из модуля win32gui (для Windows) и метод XReparentWindow из библиотеки python-xlib (для Linux) позволяют вставить окно Tkinter в окно стороннего приложения. Вот пример кода для Windows:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import tkinter as tk
import win32gui

def embed_tkinter_window(window_handle):
    tk_root = tk.Tk()
    tk_root.geometry("400x300")  # Устанавливает размеры окна Tkinter
    embed_frame = tk.Frame(tk_root, width=400, height=300)
    embed_frame.pack()
    tk_canvas = tk.Canvas(embed_frame, bg="white")
    tk_canvas.pack(expand=True, fill=tk.BOTH)
    window_handle = int(window_handle)
    win32gui.SetWindowLong(tk_root.winfo_id(), win32gui.GWL_STYLE, win32gui.WS_CHILD)
    win32gui.SetParent(tk_root.winfo_id(), window_handle)

# Применение функции
# Здесь hwnd - это дескриптор окна стороннего приложения, к которому мы хотим привязать окно Tkinter
hwnd = 123456  
embed_tkinter_window(hwnd)


  1. Можно использовать библиотеку pywinauto, которая позволяет автоматизировать взаимодействие с элементами пользовательского интерфейса Windows, включая вставку окон Tkinter. Вот пример кода с использованием pywinauto:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import tkinter as tk
from pywinauto import Application

def embed_tkinter_window(window_class, window_title):
    tk_root = tk.Tk()
    tk_root.geometry("400x300")  # Устанавливает размеры окна Tkinter
    embed_frame = tk.Frame(tk_root, width=400, height=300)
    embed_frame.pack()
    tk_canvas = tk.Canvas(embed_frame, bg="white")
    tk_canvas.pack(expand=True, fill=tk.BOTH)
    app = Application(backend="uia").connect(class_name=window_class, title=window_title)
    window = app.top_window()
    window.wrapper_object().EmbeddingActiveX.SetHWND(tk_root.winfo_id())

# Применение функции
# Здесь window_class и window_title - это класс и заголовок окна стороннего приложения, к которому мы хотим привязать окно Tkinter
window_class = "ClassName"
window_title = "WindowTitle"
embed_tkinter_window(window_class, window_title)


Замените window_class и window_title на соответствующие класс и заголовок окна стороннего приложения, к которому вы хотите привязать окно Tkinter.

Пользователь

от craig.emmerich , 5 дней назад

@terrence 

Уточню, что использование приведенных методов требует импорта соответствующих библиотек и модулей, таких как win32gui для Windows или pywinauto для автоматизации взаимодействия с элементами пользовательского интерфейса Windows. Кроме того, при встраивании окна Tkinter в окно стороннего приложения может потребоваться дополнительная обработка событий и управление ресурсами.


Если у вас есть знания и опыт работы с такими библиотеками или модулями, вы можете успешно использовать приведенные примеры кода для вставки окна Tkinter в окно стороннего приложения.