Python PyQt5中彈出子窗口解決子窗口一閃而過的問題
方式一:槽函數(shù)中創(chuàng)建子窗口對象,賦值到普通變量
在主窗口添加按鈕,并把按鈕信號關(guān)聯(lián)槽,在槽函數(shù)中創(chuàng)建子窗口對象賦值到普通變量,并調(diào)用其 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): child_window = Child() child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結(jié)果: 該段代碼運行后,點擊主窗口中的按鈕,子窗口一閃而過。
方式二:槽函數(shù)中創(chuàng)建子窗口對象,賦值為對象屬性
在主窗口添加按鈕,并把按鈕信號關(guān)聯(lián)槽,在槽函數(shù)中創(chuàng)建子窗口對象并賦值為對象屬性,并調(diào)用其 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): self.child_window = Child() self.child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結(jié)果: 該段代碼運行后,點擊主窗口中的按鈕,子窗口正常打開,重復(fù)點擊按鈕,子窗口重復(fù)彈出。
方式三:在主窗口__init__方法中創(chuàng)建子窗
在主窗口__init__方法中創(chuàng)建子窗口對象并賦值為對象屬性,添加按鈕,并把按鈕信號關(guān)聯(lián)槽,在槽函數(shù)中調(diào)用子窗口對象的 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) self.child_window = Child() def show_child(self): self.child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結(jié)果: 重復(fù)點擊按鈕,子窗口不重復(fù)彈出。
方式四:exec()方法
把例1的show()方法改為exec()方法
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): child_window = Child() child_window.exec() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結(jié)果:子窗口順利彈出,且不能重新選擇父窗口
結(jié)論:
這里涉及到一個概念 模式對話框 與 非模式對話框 (modeless dialog | modal dialog)
模式對話框,就是在彈出窗口的時候,整個程序就被鎖定了,處于等待狀態(tài),直到對話框被關(guān)閉。這時往往是需要對話框的返回值進(jìn)行下面的操作。如:確認(rèn)窗口(選擇“是”或“否”)。
非模式對話框,在調(diào)用彈出窗口之后,調(diào)用即刻返回,繼續(xù)下面的操作。這里只是一個調(diào)用指令的發(fā)出,不等待也不做任何處理。如:查找框。
show() ------ modeless dialog
exec() ------- modal dialog
- 方式一中 子窗口 通過 show() 方法顯示,為非模態(tài)窗口,它的實例為父窗口show_child()方法中的局部變量,當(dāng)窗口顯示后,父窗口的show_child()方法繼續(xù)執(zhí)行,當(dāng)方法運行完后,python的回收機制就把局部變量銷毀了,相當(dāng)于子窗口實例被銷毀,故子窗口一閃而過;
- 方式二中 子窗口實例為 主窗口類的變量,當(dāng)show_child()方法運行完后,主窗口對象依舊存在,子窗口實例也存在,故子窗口正常顯示,但是每一次運行槽函數(shù)都會重新創(chuàng)建子窗口對象;
- 方式三中 子窗口實例為 主窗口類的變量,當(dāng)show_child()方法運行完后,主窗口對象依舊存在,子窗口實例也存在,故子窗口正常顯示,每一次show_child()函數(shù),重新調(diào)用子窗口對象show_child()方法,不會創(chuàng)建新窗口,且可隨意在父,子窗口間切換;
- 方式四中 子窗口 通過 exec() 方法顯示,為模態(tài)窗口,雖然他為父窗口show_child()方法中的局部變量,由于阻塞的機制,父窗口show_child()并沒有繼續(xù)執(zhí)行,故其不會像 例1 中 一閃而過,且不能在父,子窗口間切換;
到此這篇關(guān)于Python PyQt5中彈出子窗口解決子窗口一閃而過的問題的文章就介紹到這了,更多相關(guān)Python PyQt5彈出子窗口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)提取XML內(nèi)容并保存到Excel中的方法
這篇文章主要介紹了Python實現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對xml文件的讀取、解析以及Excel文件的寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09Python?pass函數(shù)使用及其應(yīng)用的詳解
Python中,pass是一種空語句,即不做任何事情,只起到占位符的作用,本文主要介紹了Python?pass函數(shù)使用及其應(yīng)用的詳解,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python 多進(jìn)程并行編程 ProcessPoolExecutor的實現(xiàn)
這篇文章主要介紹了python 多進(jìn)程并行編程 ProcessPoolExecutor的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10詳解程序意外中斷自動重啟shell腳本(以Python為例)
這篇文章主要介紹了詳解程序意外中斷自動重啟shell腳本(以Python為例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07linux系統(tǒng)使用python監(jiān)控apache服務(wù)器進(jìn)程腳本分享
這篇文章主要介紹了linux系統(tǒng)使用python監(jiān)控apache服務(wù)器進(jìn)程的腳本,大家參考使用吧2014-01-01