Прозрачный холст Python tkinter

Я ищу, чтобы сделать фон прозрачного tkinter прозрачным, но все еще есть события мыши на холсте, вот мой код, я на Windows 10, Python 3.6:

from tkinter import * import time WIDTH = 500 HEIGHT = 500 LINEWIDTH = 1 TRANSCOLOUR = 'gray' global old old = () tk = Tk() tk.title('Virtual whiteboard') tk.wm_attributes('-transparentcolor', TRANSCOLOUR) canvas = Canvas(tk, width=WIDTH, height=HEIGHT) canvas.pack() canvas.config(cursor='tcross') canvas.create_rectangle(0, 0, WIDTH, HEIGHT, fill=TRANSCOLOUR, outline=TRANSCOLOUR) def buttonmotion(evt): global old if old == (): old = (evt.x, evt.y) return else: canvas.create_line(old[0], old[1], evt.x, evt.y, width=LINEWIDTH) old = (evt.x, evt.y) def buttonclick(evt): global old canvas.create_line(evt.x-1, evt.y-1, evt.x, evt.y, width=LINEWIDTH) old = (evt.x, evt.y) canvas.bind('<Button-1>', buttonmotion) canvas.bind('<B1-Motion>', buttonclick) while True: tk.update() time.sleep(0.01) 

При запуске кода он создает прозрачный фон, но я выбираю вещи под, а не холст.

One Solution collect form web for “Прозрачный холст Python tkinter”

Я создаю небольшое обходное решение с помощью win api, вот мое предложение:

 from tkinter import * import time import win32gui import win32api WIDTH = 500 HEIGHT = 500 LINEWIDTH = 1 TRANSCOLOUR = 'gray' title = 'Virtual whiteboard' global old old = () global HWND_t HWND_t = 0 tk = Tk() tk.title(title) tk.lift() tk.wm_attributes("-topmost", True) tk.wm_attributes("-transparentcolor", TRANSCOLOUR) state_left = win32api.GetKeyState(0x01) # Left button down = 0 or 1. Button up = -127 or -128 canvas = Canvas(tk, width=WIDTH, height=HEIGHT) canvas.pack() canvas.config(cursor='tcross') canvas.create_rectangle(0, 0, WIDTH, HEIGHT, fill=TRANSCOLOUR, outline=TRANSCOLOUR) def putOnTop(event): event.widget.unbind('<Visibility>') event.widget.update() event.widget.lift() event.widget.bind('<Visibility>', putOnTop) def drawline(data): global old if old !=(): canvas.create_line(old[0], old[1], data[0], data[1], width=LINEWIDTH) old = (data[0], data[1]) def enumHandler(hwnd, lParam): global HWND_t if win32gui.IsWindowVisible(hwnd): if title in win32gui.GetWindowText(hwnd): HWND_t = hwnd win32gui.EnumWindows(enumHandler, None) tk.bind('<Visibility>', putOnTop) tk.focus() running = 1 while running == 1: try: tk.update() time.sleep(0.01) if HWND_t != 0: windowborder = win32gui.GetWindowRect(HWND_t) cur_pos = win32api.GetCursorPos() state_left_new = win32api.GetKeyState(0x01) if state_left_new != state_left: if windowborder[0] < cur_pos[0] and windowborder[2] > cur_pos[0] and windowborder[1] < cur_pos[1] and windowborder[3] > cur_pos[1]: drawline((cur_pos[0] - windowborder[0] - 5, cur_pos[1] - windowborder[1] - 30)) else: old = () except Exception as e: running = 0 print("error %r" % (e)) 

Объяснение описания новых кодовых битов:

 tk.lift() tk.wm_attributes("-topmost", True) ... def putOnTop(event): event.widget.unbind('<Visibility>') event.widget.update() event.widget.lift() event.widget.bind('<Visibility>', putOnTop) ... tk.bind('<Visibility>', putOnTop) tk.focus() 

Эти строки гарантируют, что окно всегда будет поверх всех других окон.

 global HWND_t HWND_t = 0 ... def enumHandler(hwnd, lParam): global HWND_t if win32gui.IsWindowVisible(hwnd): if title in win32gui.GetWindowText(hwnd): HWND_t = hwnd win32gui.EnumWindows(enumHandler, None) 

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

 state_left = win32api.GetKeyState(0x01) ... if HWND_t != 0: windowborder = win32gui.GetWindowRect(HWND_t) cur_pos = win32api.GetCursorPos() state_left_new = win32api.GetKeyState(0x01) if state_left_new != state_left: if windowborder[0] < cur_pos[0] and windowborder[2] > cur_pos[0] and windowborder[1] < cur_pos[1] and windowborder[3] > cur_pos[1]: drawline((cur_pos[0] - windowborder[0] - 5, cur_pos[1] - windowborder[1] - 30)) else: old = () 

Эта

  1. Проверки, если ручка найдена
  2. Проверки, если нажата кнопка мыши 1 или нет.
  3. Проверки, если мышь находится внутри окна

если все верно, оно принимает данные мыши и рисует линию

текущий режим состоит в том, что он ничего не рисует до щелчка кнопки, а затем рисует, пока кнопка не будет нажата снова.

  • Tkinter: Как получить рамку в окне холста, чтобы расширить размер холста?
  • Python, Tkinter - Вставка текста в окна холста
  • Как открыть изображение PIL в Tkinter на холсте
  • Tkinter Canvas create_window ()
  • Python tkinter змея игровой лаг
  • Как очистить холст Tkinter?
  • Как сделать кнопку с помощью виджета tkinter Canvas?
  • Черепаха от руки
  • Python - лучший язык программирования в мире.