Как отображать текст на экране без окна с помощью Python

Проблема:

Мне нужно написать текст прямо на экран без окна. Текст должен отображаться над всеми другими окнами и полноэкранными приложениями и не должен быть интерактивным или интерактивным.

Пример: Скриншот текста на экране. Текст не должен иметь прозрачный фон, как показано в примере. Я могу использовать Python 2 или 3 в Windows 7.

Моя попытка решения:

Я попытался сделать отдельную метку с помощью Tkinter:

Изменить: Улучшено с помощью христианского Раппа

import Tkinter label = Tkinter.Label(text='Text on the screen', font=('Times','30'), fg='black', bg='white') label.master.overrideredirect(True) label.master.geometry("+250+250") label.master.lift() label.master.wm_attributes("-topmost", True) label.master.wm_attributes("-disabled", True) label.master.wm_attributes("-transparentcolor", "white") label.pack() label.mainloop() 

Что работает:

  • Текст отображается без окна
  • Текст остается выше всех остальных окон
  • Фон может быть прозрачным

Что нет:

  • Текст не отображается выше полноэкранных приложений
  • Текст блокирует события щелчка, которые происходят над ним.
  • Фоновая прозрачность не альфа, поэтому есть твердые края

    One Solution collect form web for “Как отображать текст на экране без окна с помощью Python”

    Оказывается, здесь есть две совершенно разные проблемы. Чтобы отобразить текст над окнами, вам нужно создать неизолированное верхнее окно и цветной ключ фона. Однако это не будет работать, если работает полноэкранное приложение (например, игра). Единственный надежный способ показать текст в полноэкранном приложении – использовать Direct3D-hook.

    Я не написал пример Direct3D hook, но я дам два разных решения первой проблемы.

    Решение 1: Tkinter + pywin32

    В этом примере я выполняю большую часть работы с Tkinter и использую win32api, чтобы предотвратить блокировку щелчка мышью. Если win32api недоступен для вас, вы можете просто удалить эту часть кода.

     import Tkinter, win32api, win32con, pywintypes label = Tkinter.Label(text='Text on the screen', font=('Times New Roman','80'), fg='black', bg='white') label.master.overrideredirect(True) label.master.geometry("+250+250") label.master.lift() label.master.wm_attributes("-topmost", True) label.master.wm_attributes("-disabled", True) label.master.wm_attributes("-transparentcolor", "white") hWindow = pywintypes.HANDLE(int(label.master.frame(), 16)) # http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx # The WS_EX_TRANSPARENT flag makes events (like mouse clicks) fall through the window. exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT win32api.SetWindowLong(hWindow, win32con.GWL_EXSTYLE, exStyle) label.pack() label.mainloop() 

    Решение 2: pywin32

    Этот пример делает все через pywin32. Это делает его более сложным и менее портативным, но значительно более мощным. Я включил ссылки на соответствующие части API Windows на протяжении всего кода.

     import win32api, win32con, win32gui, win32ui def main(): hInstance = win32api.GetModuleHandle() className = 'MyWindowClassName' # http://msdn.microsoft.com/en-us/library/windows/desktop/ms633576(v=vs.85).aspx # win32gui does not support WNDCLASSEX. wndClass = win32gui.WNDCLASS() # http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW wndClass.lpfnWndProc = wndProc wndClass.hInstance = hInstance wndClass.hCursor = win32gui.LoadCursor(None, win32con.IDC_ARROW) wndClass.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH) wndClass.lpszClassName = className # win32gui does not support RegisterClassEx wndClassAtom = win32gui.RegisterClass(wndClass) # http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx # Consider using: WS_EX_COMPOSITED, WS_EX_LAYERED, WS_EX_NOACTIVATE, WS_EX_TOOLWINDOW, WS_EX_TOPMOST, WS_EX_TRANSPARENT # The WS_EX_TRANSPARENT flag makes events (like mouse clicks) fall through the window. exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT # http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx # Consider using: WS_DISABLED, WS_POPUP, WS_VISIBLE style = win32con.WS_DISABLED | win32con.WS_POPUP | win32con.WS_VISIBLE # http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx hWindow = win32gui.CreateWindowEx( exStyle, wndClassAtom, None, # WindowName style, 0, # x 0, # y win32api.GetSystemMetrics(win32con.SM_CXSCREEN), # width win32api.GetSystemMetrics(win32con.SM_CYSCREEN), # height None, # hWndParent None, # hMenu hInstance, None # lpParam ) # http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx win32gui.SetLayeredWindowAttributes(hWindow, 0x00ffffff, 255, win32con.LWA_COLORKEY | win32con.LWA_ALPHA) # http://msdn.microsoft.com/en-us/library/windows/desktop/dd145167(v=vs.85).aspx #win32gui.UpdateWindow(hWindow) # http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx win32gui.SetWindowPos(hWindow, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOACTIVATE | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_SHOWWINDOW) # http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx #win32gui.ShowWindow(hWindow, win32con.SW_SHOW) win32gui.PumpMessages() def wndProc(hWnd, message, wParam, lParam): if message == win32con.WM_PAINT: hdc, paintStruct = win32gui.BeginPaint(hWnd) dpiScale = win32ui.GetDeviceCaps(hdc, win32con.LOGPIXELSX) / 60.0 fontSize = 80 # http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx lf = win32gui.LOGFONT() lf.lfFaceName = "Times New Roman" lf.lfHeight = int(round(dpiScale * fontSize)) #lf.lfWeight = 150 # Use nonantialiased to remove the white edges around the text. # lf.lfQuality = win32con.NONANTIALIASED_QUALITY hf = win32gui.CreateFontIndirect(lf) win32gui.SelectObject(hdc, hf) rect = win32gui.GetClientRect(hWnd) # http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx win32gui.DrawText( hdc, 'Text on the screen', -1, rect, win32con.DT_CENTER | win32con.DT_NOCLIP | win32con.DT_SINGLELINE | win32con.DT_VCENTER ) win32gui.EndPaint(hWnd, paintStruct) return 0 elif message == win32con.WM_DESTROY: print 'Closing the window.' win32gui.PostQuitMessage(0) return 0 else: return win32gui.DefWindowProc(hWnd, message, wParam, lParam) if __name__ == '__main__': main() 
     
    Interesting Posts for Van-Lav

    Как скомпилировать Python 1.0

    Подкласс _init_ метод игнорируется – выполнение переходов прямо на суперкласс _init_

    несоответствие типа данных оракула python

    Почему мой файл закрывается, если я ничего не сделаю с ним некоторое время?

    что означает представление% (xyz) s в python

    Что такое clojure-эквивалент идиомы Python «если __name__ == '__main__?»?

    Как мы можем передавать разные браузеры сразу в robotframework

    вызов php-функции из python

    очистить данные с веб-сайта, которые перешли на следующую страницу при прокрутке вниз с помощью Python и BeautifulSoup

    Как получить доступ к ключам или значениям Python GDB Value

    Я ужасно искал Китона, это хуже, чем чистый Python. Зачем?

    Отсутствующие данные, вставьте строки в Pandas и заполните NAN

    Ошибка вызова LibreOffice из Python

    Лучший способ объединить вероятностные классификаторы в scikit-learn

    Поверните строку с вложенными скобками во вложенный список, python

    Python - лучший язык программирования в мире.