|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 qq1151985918 于 2022-10-1 18:19 编辑
第一个: (已解决请直接看第二个问题)
将隐藏(显示)窗口绑定到全局快捷键Alt + Z,可以正常使用,但是想要将隐藏窗口直接显示到(200, 200)就会崩溃,请教大佬到底什么原因?
第 63 行我注释掉了,如果加进去就会崩溃,求原因?怎样解决呢?
- # -*- coding: utf-8 -*-
- # Form implementation generated from reading ui file 'qwe.ui'
- #
- # Created by: PyQt5 UI code generator 5.15.4
- #
- # WARNING: Any manual changes made to this file will be lost when pyuic5 is
- # run again. Do not edit this file unless you know what you are doing.
- from PyQt5 import QtCore, QtGui, QtWidgets
- class Ui_Form(object):
- def setupUi(self, Form):
- Form.setObjectName("Form")
- Form.resize(400, 300)
- self.pushButton = QtWidgets.QPushButton(Form)
- self.pushButton.setGeometry(QtCore.QRect(110, 110, 171, 61))
- self.pushButton.setObjectName("pushButton")
- self.pushButton_2 = QtWidgets.QPushButton(Form)
- self.pushButton_2.setGeometry(QtCore.QRect(110, 200, 171, 61))
- self.pushButton_2.setObjectName("pushButton_2")
- self.label = QtWidgets.QLabel(Form)
- self.label.setGeometry(QtCore.QRect(50, 20, 311, 71))
- self.label.setTextFormat(QtCore.Qt.PlainText)
- self.label.setScaledContents(False)
- self.label.setWordWrap(True)
- self.label.setObjectName("label")
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
- def retranslateUi(self, Form):
- _translate = QtCore.QCoreApplication.translate
- Form.setWindowTitle(_translate("Form", "Form"))
- self.pushButton.setText(_translate("Form", "隐藏(显示)窗口"))
- self.pushButton_2.setText(_translate("Form", "移动到(200,200)"))
- self.label.setText(_translate("Form", "将隐藏(显示)窗口绑定到全局快捷键Alt + Z,可以正常使用,但是想要将隐藏窗口直接显示到(200,200)就会崩溃,请教大佬到底什么原因?"))
- import sys
- from PyQt5.QtWidgets import QWidget, QApplication
- from system_hotkey import SystemHotkey
- class Window(Ui_Form, QWidget):
- def __init__(self):
- super().__init__()
- self.setupUi(self)
-
- self.hotkey = SystemHotkey() # 全局快捷键 Alt + Z
- self.hotkey.register(('alt', 'z'), callback=self.hide_show)
-
- self.pushButton.clicked.connect(self.hide_show)
- self.pushButton_2.clicked.connect(lambda:self.move_x_y(200, 200))
- self.show()
-
- def hide_show(self, *arg):
- if not self.isHidden():
- self.hide()
- else:
- self.show()
- ## self.move(200, 200) # 加上这一行代码就会崩溃,求原因
-
-
- def move_x_y(self, x=200, y=200):
- self.move(x, y)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- ui = Window()
- sys.exit(app.exec_())
复制代码
第二个
我前段时间提问过气泡弹窗和鼠标移动到 QLabel 显示气泡提醒的问题
但是这两个结合起来,气泡提示就会消失,求原因?是哪里冲突了吗?
# 当不点击按钮提示气泡的时候,鼠标移动到QLabel可以正常查看内容
# 但是点击按钮后就无法正常显示
# 详见案例
- # -*- coding: utf-8 -*-
- # Form implementation generated from reading ui file 'qwe.ui'
- #
- # Created by: PyQt5 UI code generator 5.15.4
- #
- # WARNING: Any manual changes made to this file will be lost when pyuic5 is
- # run again. Do not edit this file unless you know what you are doing.
- import sys
- from PyQt5 import QtCore, QtGui, QtWidgets
- from PyQt5.QtWidgets import QWidget, QApplication, QDialog
- from PyQt5.QtCore import Qt, QTimer, QRect
- from pyautogui import position
- # 以下是我在网上找到的气泡显示提示
- class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName("Dialog")
- Dialog.resize(150, 54)
- Dialog.setStyleSheet("background: transparent;")
- self.pushButton = QtWidgets.QPushButton(Dialog)
- self.pushButton.setGeometry(QtCore.QRect(0, 0, 151, 51))
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
- self.pushButton.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setFamily("Microsoft YaHei UI")
- font.setPointSize(10)
- font.setBold(True)
- font.setWeight(75)
- self.pushButton.setFont(font)
- self.pushButton.setFocusPolicy(QtCore.Qt.NoFocus)
- self.pushButton.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
- self.pushButton.setAutoFillBackground(False)
- # 在这里设置气泡的stylesheet
- self.pushButton.setStyleSheet("background-color:lightgreen;\n"
- "border-style:none;\n"
- "padding:8px;\n"
- "border-radius:25px;")
- self.pushButton.setObjectName("pushButton")
- self.retranslateUi(Dialog)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
- def retranslateUi(self, Dialog):
- _translate = QtCore.QCoreApplication.translate
- Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
- self.pushButton.setText(_translate("Dialog", "提示框"))
- # 创建静态变量的装饰器
- def static_vars(**kwargs):
- def decorate(func):
- for k in kwargs:
- setattr(func, k, kwargs[k])
- return func
- return decorate
- class TipUi(QDialog):
- def __init__(self, text:str, parent=None):
- # 设置ui
- super().__init__(parent)
- self.ui = Ui_Dialog()
- self.ui.setupUi(self)
- # 设置定时器,用于动态调节窗口透明度
- self.timer = QTimer()
- # 设置气泡在屏幕上的位置,水平居中,垂直屏幕80%位置
- desktop = QApplication.desktop()
- x, y = position()
- self.setGeometry(QRect(int(x), int(y), 152, 50))
- # 显示的文本
- self.ui.pushButton.setText(text)
- # 设置隐藏标题栏、无边框、隐藏任务栏图标、始终置顶
- self.setWindowFlags(Qt.CustomizeWindowHint | Qt.FramelessWindowHint | Qt.Tool | Qt.WindowStaysOnTopHint)
- # 设置窗口透明背景
- self.setAttribute(Qt.WA_TranslucentBackground, True)
- # 窗口关闭自动退出,一定要加,否则无法退出
- self.setAttribute(Qt.WA_QuitOnClose, True)
- # 用来计数的参数
- self.windosAlpha = 0
- # 设置定时器25ms,1600ms记64个数
- self.timer.timeout.connect(self.hide_windows)
- self.timer.start(25)
-
- # 槽函数
- def hide_windows(self):
- self.timer.start(25)
- # 前750ms设置透明度不变,后850ms透明度线性变化
- if self.windosAlpha <= 30:
- self.setWindowOpacity(1.0)
- else:
- self.setWindowOpacity(1.882 - 0.0294 * self.windosAlpha)
- self.windosAlpha += 1
- # 差不多3秒自动退出
- if self.windosAlpha >= 63:
- self.close()
-
- # 静态方法创建气泡提示
- @staticmethod
- @static_vars(tip=None)
- def show_tip(text):
- TipUi.show_tip.tip = TipUi(text)
- TipUi.show_tip.tip.show()
- # 当不点击按钮提示气泡的时候,鼠标移动到QLabel可以正常查看内容
- # 但是点击按钮后就无法正常显示
- # 详见案例
- class Ui_Form(object):
- def setupUi(self, Form):
- Form.setObjectName("Form")
- Form.resize(400, 300)
- self.pushButton = QtWidgets.QPushButton(Form)
- self.pushButton.setGeometry(QtCore.QRect(110, 150, 171, 61))
- self.pushButton.setObjectName("pushButton")
- self.label = QtWidgets.QLabel(Form)
- self.label.setGeometry(QtCore.QRect(50, 40, 311, 71))
- self.label.setTextFormat(QtCore.Qt.PlainText)
- self.label.setScaledContents(False)
- self.label.setWordWrap(True)
- self.label.setObjectName("label")
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
- def retranslateUi(self, Form):
- _translate = QtCore.QCoreApplication.translate
- Form.setWindowTitle(_translate("Form", "Form"))
- self.pushButton.setText(_translate("Form", "显示气泡提醒"))
- tip_text = "我前段时间提问过气泡弹窗和鼠标移动到 QLabel 显示气泡提醒的问题,但是这两个结合起来,气泡提示就会消失,求原因?是哪里冲突了吗?"
- self.label.setText(_translate("Form", tip_text))
- self.label.setToolTip(tip_text)
- class Window(Ui_Form, QWidget):
- def __init__(self):
- super().__init__()
- self.setupUi(self)
- self.pushButton.clicked.connect(self.show_tips)
- self.show()
- def show_tips(self):
- TipUi.show_tip('显示气泡提醒')
- # 当点击按钮后,鼠标再移动到QLabel就不再显示tip
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- ui = Window()
- sys.exit(app.exec_())
复制代码
本帖最后由 阿奇_o 于 2022-10-1 17:41 编辑
问题1: 因为"事件循环"机制, self.hide() 和 self.show() 以及 self.move() 会根据你定义的触发条件(被你定义在hide_show方法里了),一直LOOP执行着!即页面按特定帧率刷新着。
也就是说,是因为 self.pushButton.clicked.connect(self.hide_show) 这句导致一旦被触发就一直LOOP,self.move(200, 200)被一直重复最后导致程序崩溃。
解决:注释掉上面说的这一行。 只用 hotkey 即可,因为它是 callback function 只会执行一次。
或者改用其他非connect的、合适的toggle的方法(暂时我也没找到)
另外,如果你理解了的话,move_x_y 这个方法,也就没必要定义。 因为 移动的按钮 可以直接用PyQt组件自己的move方法,即 ...connect(lambda :self.move(200,200))
|
|