Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter透明窗口不受鼠标单击的影响_Python_Tkinter_Controls_Mouse_Alpha Transparency - Fatal编程技术网

Python Tkinter透明窗口不受鼠标单击的影响

Python Tkinter透明窗口不受鼠标单击的影响,python,tkinter,controls,mouse,alpha-transparency,Python,Tkinter,Controls,Mouse,Alpha Transparency,我目前正在通过发送鼠标和按键命令来控制python游戏。我想做的是在游戏上方放置一个透明的Tkinter窗口,以提供鼠标位置和像素颜色等信息 我熟悉更改窗口的alpha属性以使其透明,但不知道如何始终将该窗口保持在前面,并让鼠标单击通过它 我目前控制游戏的方法包括在特定位置截图并分析颜色内容。我还需要一些方法来避免Tkinter窗口的干扰 Pyscreenshot用于截图 win32api用于单击 谢谢,, Alec您可以使用win32gui模块的SetWindowLong功能。如果您想要一个透

我目前正在通过发送鼠标和按键命令来控制python游戏。我想做的是在游戏上方放置一个透明的Tkinter窗口,以提供鼠标位置和像素颜色等信息

我熟悉更改窗口的alpha属性以使其透明,但不知道如何始终将该窗口保持在前面,并让鼠标单击通过它

我目前控制游戏的方法包括在特定位置截图并分析颜色内容。我还需要一些方法来避免Tkinter窗口的干扰

Pyscreenshot用于截图 win32api用于单击

谢谢,,
Alec

您可以使用
win32gui
模块的
SetWindowLong
功能。如果您想要一个透明的点击窗口,您必须在我们的窗口上应用
GWL\u EXSTYLE
。因此,您需要窗口的窗口句柄

hwnd = win32gui.FindWindow(None, "Your window title") # Getting window handle
# hwnd = root.winfo_id() getting hwnd with Tkinter windows
# hwnd = root.GetHandle() getting hwnd with wx windows
lExStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
lExStyle |=  win32con.WS_EX_TRANSPARENT | win32con.WS_EX_LAYERED
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE , lExStyle )
如果要通过winapi更改窗口的透明度,请使用
SetLayeredWindowAttributes

编辑:示例覆盖始终位于顶部透明窗口的代码,该窗口通过单击传递。它获取当前桌面图像并创建一个透明覆盖,这样您就可以欣赏桌面背景图像

from win32api import GetSystemMetrics
import win32con
import win32gui
import wx


def scale_bitmap(bitmap, width, height):
    image = wx.ImageFromBitmap(bitmap)
    image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH)
    result = wx.BitmapFromImage(image)
    return result

app = wx.App()
trans = 50
# create a window/frame, no parent, -1 is default ID
# change the size of the frame to fit the backgound images
frame1 = wx.Frame(None, -1, "KEA", style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP)
# create the class instance
frame1.ShowFullScreen(True)
image_file = win32gui.SystemParametersInfo(win32con.SPI_GETDESKWALLPAPER,0,0)
bmp1 = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
bmp1 = scale_bitmap(bmp1,GetSystemMetrics(1)*1.5,GetSystemMetrics(1))
bitmap1 = wx.StaticBitmap(frame1, -1, bmp1, (-100, 0))
hwnd = frame1.GetHandle()
 
extendedStyleSettings = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, extendedStyleSettings  | win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT)
win32gui.SetLayeredWindowAttributes(hwnd, 0, 255, win32con.LWA_ALPHA)
 
frame1.SetTransparent(trans)


def onKeyDown(e):
    global trans
    key = e.GetKeyCode()
    if  key==wx.WXK_UP:
        print trans
        trans+=10
        if trans >255:
            trans = 255
    elif key==wx.WXK_DOWN:
        print trans
        trans-=10
        if trans < 0:
            trans = 0
    try:
        win32gui.SetLayeredWindowAttributes(hwnd, 0, trans, win32con.LWA_ALPHA)
    except:
        pass
frame1.Bind(wx.EVT_KEY_DOWN, onKeyDown)

app.MainLoop()
从win32api导入GetSystemMetrics
导入win32con
导入win32gui
导入wx
def scale_位图(位图、宽度、高度):
image=wx.ImageFromBitmap(位图)
图像=图像.比例(宽度,高度,宽x.图像质量高)
结果=wx.BitmapFromImage(图像)
返回结果
app=wx.app()
反式=50
#创建一个窗口/框架,没有父对象,-1是默认ID
#更改帧的大小以适合背景图像
frame1=wx.Frame(无,-1,“KEA”,style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP)
#创建类实例
frame1.全屏显示(真)
image\u file=win32gui.SystemParametersInfo(win32con.SPI\u GETDESKWALLPAPER,0,0)
bmp1=wx.Image(Image\u文件,wx.BITMAP\u TYPE\u ANY).ConvertToBitmap()
bmp1=缩放位图(bmp1,GetSystemMetrics(1)*1.5,GetSystemMetrics(1))
bitmap1=wx.StaticBitmap(帧1,-1,bmp1,(-100,0))
hwnd=frame1.GetHandle()
extendedStyleSettings=win32gui.GetWindowLong(hwnd,win32con.GWL_EXSTYLE)
win32gui.SetWindowLong(hwnd、win32con.GWL_EXSTYLE、extendedStyleSettings | win32con.WS_EX|u LAYERED | win32con.WS_EX|u TRANSPARENT)
win32gui.SetLayeredWindowAttributes(hwnd、0、255、win32con.LWA_ALPHA)
frame1.SetTransparent(trans)
def onKeyDown(e):
全球运输
key=e.GetKeyCode()
如果key==wx.WXK\u UP:
打印转换
反式+=10
如果trans>255:
trans=255
elif key==wx.WXK_向下:
打印转换
反式-=10
如果trans<0:
trans=0
尝试:
win32gui.SetLayeredWindowAttributes(hwnd、0、trans、win32con.LWA_ALPHA)
除:
通过
frame1.Bind(wx.EVT\u KEY\u DOWN,onKeyDown)
app.MainLoop()
可以使用上/下箭头键动态更改透明度。 请注意,windowframe是使用“wx”创建的,但也应使用tkinter


您可以随意使用代码。

这是否只允许鼠标单击通过同一tk实例中的其他窗口?我之所以这么问是因为我把它应用到了我的根窗口上,而我无法点击或拖动其他窗口(比如Chrome)。这应该是可行的。我写了一个小脚本,它将我的桌面背景图像作为透明的最上面的窗口放置在所有其他窗口之上。这一切都如愿以偿,所有的点击和拖放都起到了作用。但你也可以尝试处理
WM\u NCHITTEST
并返回
HTNOWHERE
如果我不知道你的代码,很难提供有用的帮助。。。我建议您创建一个可复制的问题code@PSSolanki我已经很久没有接触pyhton了,但我已经编写了一个小应用程序,可以满足您的需要。请注意其wxpython和pyhton 2.7。我想我使用wx是因为tk在图像方面有一些问题。。。但要正确地记住,这是很久以前的事了