鱼C论坛

 找回密码
 立即注册
查看: 1995|回复: 5

[已解决]向大佬们请教两个PYQT5的问题

[复制链接]
发表于 2022-10-1 10:47:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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_())
最佳答案
2022-10-1 17:35:37
本帖最后由 阿奇_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))

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-1 16:31:59 From FishC Mobile | 显示全部楼层
等一个大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-1 17:35:37 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_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))

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
qq1151985918 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-1 18:08:18 | 显示全部楼层
阿奇_o 发表于 2022-10-1 17:35
问题1: 因为"事件循环"机制, self.hide()  和 self.show() 以及 self.move() 会根据你定义的触发条件(被 ...

感谢大佬,已经解决了我一个问题,不知道第二个问题大佬能不能也给点指点?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-1 18:49:50 | 显示全部楼层
qq1151985918 发表于 2022-10-1 18:08
感谢大佬,已经解决了我一个问题,不知道第二个问题大佬能不能也给点指点?

问题二,你的类设计似乎搞复杂了,我一时半会也理不清。。

另外,我对PyQt5也不熟,所以你自己再搞搞吧,国庆快乐 ^_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-1 22:09:06 From FishC Mobile | 显示全部楼层
阿奇_o 发表于 2022-10-1 18:49
问题二,你的类设计似乎搞复杂了,我一时半会也理不清。。

另外,我对PyQt5也不熟,所以你自己再搞搞 ...

我也再研究下,然后看看有没有别的大佬指点下我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 23:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表