【问题标题】:Pop up window no longer closes when using lambda function使用 lambda 函数时弹出窗口不再关闭
【发布时间】:2018-02-10 05:20:27
【问题描述】:

使用这个问题的答案: Python: PyQt Popup Window 我能够生成一个带有弹出窗口的按钮的 gui。

我现在想做的是在弹出窗口中按下一个按钮并将命令传递给 MyPopup 类中的函数。这很容易使用 lambda 函数完成,但是,当您按下主窗口中的按钮时,弹出窗口不再关闭,而是创建了一个新的弹出实例,从而产生两个弹出屏幕。据我了解,这是由于 lambda 函数产生了一个信号。有没有办法清除这个 lambda 函数,以便在按下主按钮时关闭旧实例并加载弹出窗口的新实例?

如果使用 lambda 无法做到这一点,是否有另一种方法可以将变量传递给函数以获得我正在寻找的结果?

以下是一些示例屏幕截图,可以更好地说明我的问题:

在弹出窗口中运行没有 lambda 的脚本

在弹出窗口中使用 lambda 运行脚本

这是上一个问题修改后的弹出代码:

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.btn_popup = QPushButton("broken", self)
        self.btn_popup.clicked.connect(lambda state, x='lambda prevents refresh': self.function(x))

    def function(self, word):
        print('Now I dont close',word)

    def paintEvent(self, e):
        dc = QPainter(self)
        dc.drawLine(0, 0, 100, 100)
        dc.drawLine(100, 0, 0, 100)

class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(0, 0, 100, 30))
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

def doit(self):
    print ("Opening a new popup window...")
    self.w = MyPopup()
    self.w.setGeometry(QRect(100, 100, 400, 200))
    self.w.show()

class App(QApplication):
    def __init__(self, *args):
        QApplication.__init__(self, *args)
        self.main = MainWindow()
        self.main.show()

def main(args):
    global app
    app = App(args)
    app.exec_()

if __name__ == "__main__":
    main(sys.argv)

【问题讨论】:

  • 更好地解释自己,永远不要相信我有两个窗口,只有一个有一个按钮和一个画有交叉线的小部件。
  • 您可以发布您使用的完整代码。
  • 删除这行self.popup = QWidget(self),你从来不用self.popup

标签: python python-3.x lambda pyqt pyqt4


【解决方案1】:

似乎如果 lambda 函数不存在,则弹出窗口被销毁,请通过添加以下内容来验证这一点:

class MyPopup(QWidget):
    def __init__(self, i):
        [..]
        self.destroyed.connect(lambda: print("destroyed"))

在没有 lambda 的情况下,消息被打印,而在另一种情况下则没有。所以解决方法是使用deleteLater()方法手动销毁:

def doit(self):
    print ("Opening a new popup window...")
    if self.w:
        self.w.deleteLater()
    self.w = MyPopup()
    self.w.setGeometry(QRect(100, 100, 400, 200))
    self.w.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多