Python控制台使用ctypes无法同时显示多个消息框,该如何解决?
如何同时弹出多个MessageBox(不用Tkinter)
为什么当前代码不行
MessageBoxW默认是应用程序模态对话框,会阻塞调用它的线程,必须关闭第一个对话框后,第二个display_box的调用才会执行。
方案1:给每个消息框开独立线程(基于你的代码修改)
把每个display_box调用放到独立线程中,两个对话框就不会互相阻塞:
import ctypes import threading def display_box(text): return ctypes.windll.user32.MessageBoxW(0, text, "title", 0) # 用线程分别启动消息框 threading.Thread(target=display_box, args=("first box",)).start() threading.Thread(target=display_box, args=("second box",)).start()
方案2:换用其他支持非模态对话框的库
如果不想用多线程,可尝试以下库:
pywin32
和ctypes逻辑类似,配合多线程即可实现需求:
import win32api import threading def display_box(text): win32api.MessageBox(0, text, "title", 0) threading.Thread(target=display_box, args=("first box",)).start() threading.Thread(target=display_box, args=("second box",)).start()
wxPython
可创建非模态对话框,需先初始化wx环境:
import wx import threading # 初始化wx应用,不重定向控制台输出 app = wx.App(False) def display_box(text): dlg = wx.MessageDialog(None, text, "title", wx.OK) dlg.ShowModal() dlg.Destroy() threading.Thread(target=display_box, args=("first box",)).start() threading.Thread(target=display_box, args=("second box",)).start() app.MainLoop()
PyQt5/PySide2
支持非模态对话框,代码示例:
from PyQt5.QtWidgets import QApplication, QMessageBox import sys import threading app = QApplication(sys.argv) def display_box(text): msg = QMessageBox() msg.setText(text) msg.setWindowTitle("title") msg.exec_() threading.Thread(target=display_box, args=("first box",)).start() threading.Thread(target=display_box, args=("second box",)).start() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者Salah
相关产品推荐
相关产品推荐

