PyQt5点击按钮后弹出窗口瞬间关闭问题求助
PyQt5点击按钮后弹出窗口瞬间关闭问题求助
我遇到了一个问题:点击“Create”按钮后,弹出的窗口只显示了一毫秒就立刻关闭了。
我的代码如下:
main.py文件:
from PyQt5.QtCore import Qt import PyQt5.QtWidgets as qt import database as db # 褎邪泄谢, 褋芯械写械薪褟褞褖懈泄 袘袛 褋 锌褉懈谢芯卸械薪懈械屑 import create_client_fn app = qt.QApplication([]) window = qt.QWidget() # 袧袗效袗袥袨 肖袪袨袧孝协袧袛袗 window.setWindowTitle("袟邪锌懈褋褜 泻谢懈械薪褌芯胁 by EevVee's Projects") window.resize(650, 610) main_layout = qt.QHBoxLayout() clients_list_layout = qt.QVBoxLayout() # 胁 褋芯褋褌邪胁械 屑褝泄薪 spisok_nadpis = qt.QLabel("小锌懈褋芯泻 泻谢懈械薪褌芯胁:") clients_list = qt.QListWidget() clients_list_layout.addWidget(spisok_nadpis) clients_list_layout.addWidget(clients_list) but_style = "background-color: rgb(173, 99, 219);" find_clients_layout = qt.QVBoxLayout() # 胁 褋芯褋褌邪胁械 屑褝泄薪 create_and_search_layout = qt.QHBoxLayout() # 胁 褋芯褋褌邪胁械 褎邪泄薪写 create_btn = qt.QPushButton("小芯蟹写邪褌褜") create_btn.setStyleSheet(but_style) create_and_search_layout.addWidget(create_btn) search_field = qt.QLineEdit() search_field.setPlaceholderText("袥褞斜邪褟 懈薪褎芯 芯 泻谢懈械薪褌械") create_and_search_layout.addWidget(search_field) search_btn = qt.QPushButton("袧邪泄褌懈") search_btn.setStyleSheet(but_style) create_and_search_layout.addWidget(search_btn) find_clients_layout.addLayout(create_and_search_layout) list_of_found_clients_layout = qt.QVBoxLayout() # 胁 褋芯褋褌邪胁械 褎邪泄薪写 list_of_found_clients = qt.QListWidget() list_of_found_clients_layout.addWidget(list_of_found_clients) find_clients_layout.addLayout(list_of_found_clients_layout) menu_of_app = qt.QVBoxLayout() # 胁 褋芯褋褌邪胁械 屑械泄薪 # 褋芯蟹写邪械褌 谢褝泄邪褍褌 写谢褟 泻薪芯锌芯泻 褋 写芯锌 褉邪蟹写械谢邪屑懈. notes_sv_btn = qt.QPushButton("袟邪屑械褌泻懈\n褋褍锌械褉胁懈蟹懈泄") # 蟹邪屑械褌泻懈 褋褍锌械褉胁懈蟹懈泄 sess_descrs_btn = qt.QPushButton("袨锌懈褋邪薪懈褟\n褋械褋褋懈泄") # 芯锌懈褋邪薪懈褟 褋械褋褋懈泄 shedule_btn = qt.QPushButton("袪邪褋锌懈褋邪薪懈械") # 褉邪褋锌懈褋邪薪懈械 褋械褋褋懈泄 notes_sv_btn.setStyleSheet(but_style) sess_descrs_btn.setStyleSheet(but_style) shedule_btn.setStyleSheet(but_style) menu_of_app.addWidget(notes_sv_btn) menu_of_app.addWidget(sess_descrs_btn) menu_of_app.addWidget(shedule_btn) main_layout.addLayout(clients_list_layout) main_layout.addLayout(find_clients_layout) main_layout.addLayout(menu_of_app) # 袣袨袧袝笑 肖袪袨袧孝协袧袛袗 create_btn.clicked.connect(create_client_fn.main) window.setLayout(main_layout) window.show() app.exec_() # 2024 EevVee's Projects 漏
create_client_fn.py文件:
from PyQt5.QtCore import Qt import PyQt5.QtWidgets as qt import database as db def main(): window = qt.QWidget() window.setWindowTitle("小芯蟹写邪褌褜 泻谢懈械薪褌邪") # 褋芯蟹写邪械屑 芯褋薪芯胁薪芯泄 谢褝泄邪褍褌 main_layout = qt.QVBoxLayout() # 褋芯蟹写邪械屑 写芯锌芯谢薪懈褌械谢褜薪褘械 谢褝泄邪褍褌褘 写谢褟 胁胁芯写邪 写邪薪薪褘褏 泻谢懈械薪褌芯胁(胁褋械 锌褉械薪邪写谢械卸邪褌 main_layout) l_name_field_layout = qt.QHBoxLayout() f_name_field_layout = qt.QHBoxLayout() fa_name_field_layout = qt.QHBoxLayout() age_field_layout = qt.QHBoxLayout() dateofrequest_field_layout = qt.QHBoxLayout() relations_field_layout = qt.QHBoxLayout() children_field_layout = qt.QHBoxLayout() job_field_layout = qt.QHBoxLayout() hobby_field_layout = qt.QHBoxLayout() request_field_layout = qt.QHBoxLayout() ust_kontr_field_layout = qt.QHBoxLayout() save_button_layout = qt.QHBoxLayout() # 褋芯蟹写邪械屑 锌芯谢褟 写谢褟 懈薪褎芯褉屑邪褑懈懈 懈 泻薪芯锌泻褍 写谢褟 褋芯蟹写邪薪懈褟 蟹邪锌懈褋懈 l_name_field = qt.QLineEdit() f_name_field = qt.QLineEdit() fa_name_field = qt.QLineEdit() age_field = qt.QLineEdit() dateofrequest_field = qt.QLineEdit() relations_field = qt.QTextEdit() children_field = qt.QTextEdit() job_field = qt.QTextEdit() hobby_field = qt.QTextEdit() request_field = qt.QTextEdit() ust_kontr_field = qt.QTextEdit() save_button = qt.QPushButton("小芯蟹写邪褌褜") # 褋芯蟹写邪械屑 锌芯写锌懈褋懈 泻 锌芯谢褟屑 l_name_label = qt.QLabel("肖邪屑懈谢懈褟") f_name_label = qt.QLabel("袠屑褟") fa_name_label = qt.QLabel("袨褌褔械褋褌胁芯") age_label = qt.QLabel("袙芯蟹褉邪褋褌") dateofrequest_label = qt.QLabel("袛邪褌邪 芯斜褉邪褖械薪懈褟") relations_label = qt.QLabel("袨褌薪芯褕械薪懈褟") children_label = qt.QLabel("袛械褌懈") job_label = qt.QLabel("袪邪斜芯褌邪") hobby_label = qt.QLabel("啸芯斜斜懈/褍胁谢械褔械薪懈褟") request_label = qt.QLabel("袟邪锌褉芯褋") ust_kontr_label = qt.QLabel("校褋褌薪褘泄 泻芯薪褌褉邪泻褌") # 写芯斜邪胁谢褟械屑 锌芯写锌懈褋懈 泻 褋芯芯褌胁械褌褋褌胁褍褞褖懈屑 胁褌芯褉芯褋褌械锌械薪薪褘屑 谢褝泄邪褍褌邪屑 l_name_field_layout.addWidget(l_name_label) f_name_field_layout.addWidget(f_name_label) fa_name_field_layout.addWidget(fa_name_label) age_field_layout.addWidget(age_label) dateofrequest_field_layout.addWidget(dateofrequest_label) relations_field_layout.addWidget(relations_label) children_field_layout.addWidget(children_label) job_field_layout.addWidget(job_label) hobby_field_layout.addWidget(hobby_label) request_field_layout.addWidget(request_label) ust_kontr_field_layout.addWidget(ust_kontr_label) # 写芯斜邪胁谢褟械屑 锌芯谢褟 懈 泻薪芯锌泻褍 泻 褋芯芯褌胁械褌褋褌胁褍褞褖懈屑 胁褌芯褉芯褋褌械锌械薪薪褘屑 谢褝泄邪褍褌邪屑 l_name_field_layout.addWidget(l_name_field) f_name_field_layout.addWidget(f_name_field) fa_name_field_layout.addWidget(fa_name_field) age_field_layout.addWidget(age_field) dateofrequest_field_layout.addWidget(dateofrequest_field) relations_field_layout.addWidget(relations_field) children_field_layout.addWidget(children_field) job_field_layout.addWidget(job_field) hobby_field_layout.addWidget(hobby_field) request_field_layout.addWidget(request_field) ust_kontr_field_layout.addWidget(ust_kontr_field) save_button_layout.addWidget(save_button) # 写芯斜邪胁谢褟械屑 胁褌芯褉芯褋褌械锌械薪薪褘械 谢褝泄邪褍褌褘 泻 芯褋薪芯胁薪芯屑褍 main_layout.addLayout(l_name_field_layout) main_layout.addLayout(f_name_field_layout) main_layout.addLayout(fa_name_field_layout) main_layout.addLayout(age_field_layout) main_layout.addLayout(dateofrequest_field_layout) main_layout.addLayout(relations_field_layout) main_layout.addLayout(children_field_layout) main_layout.addLayout(job_field_layout) main_layout.addLayout(hobby_field_layout) main_layout.addLayout(request_field_layout) main_layout.addLayout(ust_kontr_field_layout) main_layout.addLayout(save_button_layout) # 薪邪 褝褌芯屑 褎褉芯薪褌褝薪写 蟹邪胁械褉褕械薪 # 褍褋褌邪薪邪胁谢懈胁邪械屑 谢褝泄邪褍褌 写谢褟 芯泻薪邪 window.setLayout(main_layout) # 芯褌芯斜褉邪卸邪械屑 芯泻薪芯 window.show()
我启动应用后,点击“小芯蟹写邪褌褜”按钮,窗口闪了一下就没了,求帮忙解决!
问题分析与解决办法
这问题我太熟了!核心原因是你在create_client_fn.py的main()函数里创建的window是局部变量——当main()函数执行完最后一行代码,Python的垃圾回收机制就会把这个局部变量销毁,绑定在它上面的窗口自然就跟着关闭了。
给你两种解决思路,第二种更推荐:
方法1:给窗口对象添加持久引用(简单快速)
修改create_client_fn.py的main()函数,把window变成全局变量,这样函数执行完它也不会被回收:
from PyQt5.QtCore import Qt import PyQt5.QtWidgets as qt import database as db def main(): # 声明window为全局变量 global window window = qt.QWidget() window.setWindowTitle("小芯蟹写邪褌褜 泻谢懈械薪褌邪") # 后面的UI代码保持不变...
方法2:用类实现弹窗(PyQt标准写法,推荐)
这种方式更符合PyQt的面向对象设计,后续加功能(比如保存逻辑、数据校验)也更方便:
首先重构create_client_fn.py:
from PyQt5.QtCore import Qt import PyQt5.QtWidgets as qt import database as db class CreateClientWindow(qt.QWidget): def __init__(self): super().__init__() self.setWindowTitle("小芯蟹写邪褌褜 泻谢懈械薪褌邪") self.init_ui() def init_ui(self): # 把原来main()里的UI代码全部移到这里 main_layout = qt.QVBoxLayout() l_name_field_layout = qt.QHBoxLayout() f_name_field_layout = qt.QHBoxLayout() fa_name_field_layout = qt.QHBoxLayout() age_field_layout = qt.QHBoxLayout() dateofrequest_field_layout = qt.QHBoxLayout() relations_field_layout = qt.QHBoxLayout() children_field_layout = qt.QHBoxLayout() job_field_layout = qt.QHBoxLayout() hobby_field_layout = qt.QHBoxLayout() request_field_layout = qt.QHBoxLayout() ust_kontr_field_layout = qt.QHBoxLayout() save_button_layout = qt.QHBoxLayout() l_name_field = qt.QLineEdit() f_name_field = qt.QLineEdit() fa_name_field = qt.QLineEdit() age_field = qt.QLineEdit() dateofrequest_field = qt.QLineEdit() relations_field = qt.QTextEdit() children_field = qt.QTextEdit() job_field = qt.QTextEdit() hobby_field = qt.QTextEdit() request_field = qt.QTextEdit() ust_kontr_field = qt.QTextEdit() save_button = qt.QPushButton("小芯蟹写邪褌褜") l_name_label = qt.QLabel("肖邪屑懈谢懈褟") f_name_label = qt.QLabel("袠屑褟") fa_name_label = qt.QLabel("袨褌褔械褋褌胁芯") age_label = qt.QLabel("袙芯蟹褉邪褋褌") dateofrequest_label = qt.QLabel("袛邪褌邪 芯斜褉邪褖械薪懈褟") relations_label = qt.QLabel("袨褌薪芯褕械薪懈褟") children_label = qt.QLabel("袛械褌懈") job_label = qt.QLabel("袪邪斜芯褌邪") hobby_label = qt.QLabel("啸芯斜斜懈/褍胁谢械褔械薪懈褟") request_label = qt.QLabel("袟邪锌褉芯褋") ust_kontr_label = qt.QLabel("校褋褌薪褘泄 泻芯薪褌褉邪泻褌") l_name_field_layout.addWidget(l_name_label) f_name_field_layout.addWidget(f_name_label) fa_name_field_layout.addWidget(fa_name_label) age_field_layout.addWidget(age_label) dateofrequest_field_layout.addWidget(dateofrequest_label) relations_field_layout.addWidget(relations_label) children_field_layout.addWidget(children_label) job_field_layout.addWidget(job_label) hobby_field_layout.addWidget(hobby_label) request_field_layout.addWidget(request_label) ust_kontr_field_layout.addWidget(ust_kontr_label) l_name_field_layout.addWidget(l_name_field) f_name_field_layout.addWidget(f_name_field) fa_name_field_layout.addWidget(fa_name_field) age_field_layout.addWidget(age_field) dateofrequest_field_layout.addWidget(dateofrequest_field) relations_field_layout.addWidget(relations_field) children_field_layout.addWidget(children_field) job_field_layout.addWidget(job_field) hobby_field_layout.addWidget(hobby_field) request_field_layout.addWidget(request_field) ust_kontr_field_layout.addWidget(ust_kontr_field) save_button_layout.addWidget(save_button) main_layout.addLayout(l_name_field_layout) main_layout.addLayout(f_name_field_layout) main_layout.addLayout(fa_name_field_layout) main_layout.addLayout(age_field_layout) main_layout.addLayout(dateofrequest_field_layout) main_layout.addLayout(relations_field_layout)
相关产品推荐
相关产品推荐

