Я создаю инструмент для создания снимков экрана с помощью PySide6 и хочу создать невидимое безрамочное окно, чтобы пользователь мог перетаскивать и захватывать его. Но каждый известный мне метод позволяет щелкнуть мышью за окном, а не в окне.
Есть ли способ сделать окно прозрачным и получает ввод мыши? (Я успешно создал инструмент для обрезки с помощью Tkinter, но не хочу использовать tkinter)
Это мой код, использующий PySide6 (работает на Mac):
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtGui import QScreen, QPixmap
import sys
using_debug_mode = None
class DraggingPanel(QWidget):
def __init__(self, callback=None, cancel_callback=None):
super().__init__()
self.callback = callback
self.cancel_callback = cancel_callback
self.start_x = None
self.start_y = None
self.rect:QtCore.QRect = None
window_tools.set_frameless(self)
### just look at here is enough ###
# method 1: cannot click on the window
'''
widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)
'''
# method 2: cannot click on the window
'''
self.setStyleSheet('background-color: #00000000;')
'''
# method 3: when opacity 0 and h > 0:
def do_capture():
screen_cap = QScreen.grabWindow(QApplication.primaryScreen(), 0, 0,
screen.width(),
screen.height())
to_img_scale_x = lambda val: round(val * screen_cap.width()/screen.width())
to_img_scale_y = lambda val: round(val * screen_cap.height()/screen.height())
screen_cap = screen_cap.copy(to_img_scale_x(x1),
to_img_scale_y(y1),
to_img_scale_x(w),
to_img_scale_y(h)) if True else screen_cap
if using_debug_mode: print("Screenshot taken!")
QtCore.QTimer.singleShot(1, lambda: self.callback(screen_cap) and self.deleteLater())
QtCore.QTimer.singleShot(1, do_capture)
else:
if using_debug_mode: print("Screenshot canceled!")
QtCore.QTimer.singleShot(1, lambda: self.cancel_callback() and self.deleteLater())
### Tools ###
class window_tools:
@staticmethod
def set_flag(widget:QWidget, flag: QtCore.Qt, on=True):
# Get current flags and remove the FramelessWindowHint flag
widget.setWindowFlag(flag, on=on)
@staticmethod
def set_no_entity_mode(widget:QWidget, transparent_no_enitity=True, frameless = True):
"the mouse can click behind the window."
window_tools.set_flag(widget, QtCore.Qt.FramelessWindowHint, on=frameless)
widget.setAttribute(QtCore.Qt.WA_TranslucentBackground, on=transparent_no_enitity)
def set_bg_to_almost_transparent(widget):
"Opacity: 1/255, Clickable\n\n`widget.setStyleSheet('background-color: #01000000;')`"
widget.setStyleSheet('background-color: #01000000;')
@staticmethod
def set_frameless(widget, on = True):
window_tools.set_flag(widget, QtCore.Qt.FramelessWindowHint, on=on)
@staticmethod
def set_always_on_top(widget, on = True):
window_tools.set_flag(widget, QtCore.Qt.WindowStaysOnTopHint, on=on)
@staticmethod
def create_window(title="", borderless=False, always_on_top=False, width=300, height=300):
# Create a new QWidget (or QMainWindow)
new_window = QWidget()
new_window.setWindowTitle(title)
# Set window flags based on parameters
new_window.setWindowFlag(QtCore.Qt.FramelessWindowHint, borderless)
new_window.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint, always_on_top)
# Set the size of the window
new_window.resize(width, height)
return new_window
class screen:
@staticmethod
def size():
return app_using.primaryScreen().size()
@staticmethod
def width():
return screen.size().width()
@staticmethod
def height():
return screen.size().height()
### main function ###
app_using: QApplication = None
def launch_screenshot_panel(Qapp: QApplication, on_screenshot=None, on_cancel=None, debug_logging=False):
"Please STORE the returned widget to prevent garbage collection"
global using_debug_mode, app_using
using_debug_mode = debug_logging
app_using = Qapp
panel = DraggingPanel(on_screenshot, on_cancel)
panel.show()
return panel
if __name__ == "__main__":
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
def on_screenshot(img: QPixmap):
img.save("a.png")
quit()
def on_screenshot_cancelled():
print("cancelled callback!")
panel = launch_screenshot_panel(app, on_screenshot=on_screenshot, on_cancel=on_screenshot_cancelled, debug_logging=True)
sys.exit(app_using.exec())
Подробнее здесь: https://stackoverflow.com/questions/791 ... ble-window
PySide6 – Как сделать окно прозрачным, но кликабельным? ⇐ Python
Программы на Python
-
Anonymous
1731393265
Anonymous
Я создаю инструмент для создания снимков экрана с помощью PySide6 и хочу создать [b]невидимое безрамочное окно[/b], чтобы пользователь мог перетаскивать и захватывать его. Но каждый известный мне метод позволяет [b]щелкнуть мышью за окном[/b], а не в окне.
[b]Есть ли способ сделать окно прозрачным и получает ввод мыши?[/b] (Я успешно создал инструмент для обрезки с помощью Tkinter, но не хочу использовать tkinter)
Это мой код, использующий PySide6 (работает на Mac):
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtGui import QScreen, QPixmap
import sys
using_debug_mode = None
class DraggingPanel(QWidget):
def __init__(self, callback=None, cancel_callback=None):
super().__init__()
self.callback = callback
self.cancel_callback = cancel_callback
self.start_x = None
self.start_y = None
self.rect:QtCore.QRect = None
window_tools.set_frameless(self)
### just look at here is enough ###
# method 1: cannot click on the window
'''
widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)
'''
# method 2: cannot click on the window
'''
self.setStyleSheet('background-color: #00000000;')
'''
# method 3: when opacity 0 and h > 0:
def do_capture():
screen_cap = QScreen.grabWindow(QApplication.primaryScreen(), 0, 0,
screen.width(),
screen.height())
to_img_scale_x = lambda val: round(val * screen_cap.width()/screen.width())
to_img_scale_y = lambda val: round(val * screen_cap.height()/screen.height())
screen_cap = screen_cap.copy(to_img_scale_x(x1),
to_img_scale_y(y1),
to_img_scale_x(w),
to_img_scale_y(h)) if True else screen_cap
if using_debug_mode: print("Screenshot taken!")
QtCore.QTimer.singleShot(1, lambda: self.callback(screen_cap) and self.deleteLater())
QtCore.QTimer.singleShot(1, do_capture)
else:
if using_debug_mode: print("Screenshot canceled!")
QtCore.QTimer.singleShot(1, lambda: self.cancel_callback() and self.deleteLater())
### Tools ###
class window_tools:
@staticmethod
def set_flag(widget:QWidget, flag: QtCore.Qt, on=True):
# Get current flags and remove the FramelessWindowHint flag
widget.setWindowFlag(flag, on=on)
@staticmethod
def set_no_entity_mode(widget:QWidget, transparent_no_enitity=True, frameless = True):
"the mouse can click behind the window."
window_tools.set_flag(widget, QtCore.Qt.FramelessWindowHint, on=frameless)
widget.setAttribute(QtCore.Qt.WA_TranslucentBackground, on=transparent_no_enitity)
def set_bg_to_almost_transparent(widget):
"Opacity: 1/255, Clickable\n\n`widget.setStyleSheet('background-color: #01000000;')`"
widget.setStyleSheet('background-color: #01000000;')
@staticmethod
def set_frameless(widget, on = True):
window_tools.set_flag(widget, QtCore.Qt.FramelessWindowHint, on=on)
@staticmethod
def set_always_on_top(widget, on = True):
window_tools.set_flag(widget, QtCore.Qt.WindowStaysOnTopHint, on=on)
@staticmethod
def create_window(title="", borderless=False, always_on_top=False, width=300, height=300):
# Create a new QWidget (or QMainWindow)
new_window = QWidget()
new_window.setWindowTitle(title)
# Set window flags based on parameters
new_window.setWindowFlag(QtCore.Qt.FramelessWindowHint, borderless)
new_window.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint, always_on_top)
# Set the size of the window
new_window.resize(width, height)
return new_window
class screen:
@staticmethod
def size():
return app_using.primaryScreen().size()
@staticmethod
def width():
return screen.size().width()
@staticmethod
def height():
return screen.size().height()
### main function ###
app_using: QApplication = None
def launch_screenshot_panel(Qapp: QApplication, on_screenshot=None, on_cancel=None, debug_logging=False):
"Please STORE the returned widget to prevent garbage collection"
global using_debug_mode, app_using
using_debug_mode = debug_logging
app_using = Qapp
panel = DraggingPanel(on_screenshot, on_cancel)
panel.show()
return panel
if __name__ == "__main__":
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
def on_screenshot(img: QPixmap):
img.save("a.png")
quit()
def on_screenshot_cancelled():
print("cancelled callback!")
panel = launch_screenshot_panel(app, on_screenshot=on_screenshot, on_cancel=on_screenshot_cancelled, debug_logging=True)
sys.exit(app_using.exec())
Подробнее здесь: [url]https://stackoverflow.com/questions/79178630/pyside6-how-to-make-transparent-but-clickable-window[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия