Попытка установить неинтерактивное (щелчковое) наложение с TkInter - PullRequest
0 голосов
/ 09 апреля 2020

Я просмотрел несколько других сообщений, касающихся подобных проблем, и все, кажется, указывают на этот код. Поскольку я работаю над созданием наложения на рабочем столе, я установил короткую программу для создания верхнего окна и, надеюсь, изолировал проблему, но, несмотря на все свои усилия, я не могу понять, почему это, казалось бы, общепринятое решение не помогает мне или что Я мог пропустить.

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

from tkinter import *
from PIL import Image, ImageTk
from win32gui import GetForegroundWindow, ShowWindow, FindWindow,
                     SetWindowLong, GetWindowLong
from win32con import SW_MINIMIZE, WS_EX_LAYERED, WS_EX_TRANSPARENT, GWL_EXSTYLE

def setClickthrough(root, window="Applepie"):
    hwnd = FindWindow(None, window)
    styles = GetWindowLong(hwnd, GWL_EXSTYLE)
    styles |= WS_EX_LAYERED | WS_EX_TRANSPARENT
    print(SetWindowLong(hwnd, GWL_EXSTYLE, styles))

# Dimensions
width = 1920 #self.winfo_screenwidth()
height = 1080 #self.winfo_screenheight()

root = Tk()
root.geometry('%dx%d' % (width, height))
root.title("Applepie")
root.attributes('-transparentcolor', 'white', '-topmost', 1)
root.config(bg='white') 
root.attributes("-alpha", 0.25)
root.wm_attributes("-topmost", 1)
root.bg = Canvas(root, width=width, height=height, bg='white')

setClickthrough(root)

frame = ImageTk.PhotoImage(file="Resources/Test/Test-0000.gif")
root.bg.create_image(1920/2, 1080/2, image=frame)
root.bg.pack()
root.mainloop()

Окно TkInter было успешно сделано прозрачным и интерактивным, благодаря решению, предоставленному acw1668 с использованием:

root.attributes('-transparentcolor', 'white', '-topmost', 1)
root.config(bg='white')
root.bg = Canvas(root, width=width, height=height, bg='white')

Проблема сохраняется при создании изображения на холсте , Нужно иметь возможность кликать по дополнительным изображениям:

frame = ImageTk.PhotoImage(file="Resources/Test/Test-0000.gif")
root.bg.create_image(1920/2, 1080/2, image=frame)

1 Ответ

0 голосов
/ 14 апреля 2020

Оказывается, дескриптор не был захвачен должным образом с помощью FindWindow, и использование альтернатив, таких как root .frame () или root .winfo_id (), по какой-то причине не соответствовало дескриптору окна. Передав winfo_id () Canvas, я смог заставить работать следующий код:

    self.root.config(bg='#000000') 
    self.root.wm_attributes("-topmost", 1)
    self.root.attributes('-transparentcolor', '#000000', '-topmost', 1)

    print("Configuring bg")
    self.bg = Canvas(self.root, highlightthickness=0)
    self.setClickthrough(self.bg.winfo_id())

Вызов:

def setClickthrough(self, hwnd):
    print("setting window properties")
    try:
        styles = GetWindowLong(hwnd, GWL_EXSTYLE)
        styles = WS_EX_LAYERED | WS_EX_TRANSPARENT
        SetWindowLong(hwnd, GWL_EXSTYLE, styles)
        SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA)
    except Exception as e:
        print(e)
...