win32库弹窗相关应用方法

打开文件对话框


import os
import win32ui
lpszFilter = "csv Files (*.csv,*.txt)|*.csv;*.txt|" \
             "Files (*.*)|*.*|| "
# 当前文件夹路径
dirpath = os.path.dirname(__file__)
# 这里的构造方法,对应上面展示的构造方法
dlg = win32ui.CreateFileDialog(True, "csv", None, 0x04 | 0x02, lpszFilter)  # True表示打开文件对话框
# 设置打开文件对话框中的初始显示目录
dlg.SetOFNInitialDir(dirpath)
dlg.DoModal()
# 等待获取用户选择的文件
filename = dlg.GetPathName()  # 获取选择的文件名称
# 如果用户点击了取消,则返回的filename为"",而不是None
if filename == "":
    pass

对话框,提示框,弹窗提醒

##pip install pywin32
import win32api,win32con


##提醒OK消息框
win32api.MessageBox(0, "这是一个测试提醒OK消息框", "提醒",win32con.MB_OK)

##是否信息框
win32api.MessageBox(0, "这是一个测试是否信息框", "提醒",win32con.MB_YESNO)

##说明信息框
win32api.MessageBox(0, "这是一个测试说明信息框", "提醒",win32con.MB_HELP)

####警告信息框
win32api.MessageBox(0, "这是一个测试警告信息框", "提醒",win32con.MB_ICONWARNING)

##疑问信息框
win32api.MessageBox(0, "这是一个测试疑问信息框", "提醒",win32con.MB_ICONQUESTION)

##提示信息框
win32api.MessageBox(0, "这是一个测试提示信息框", "提醒",win32con.MB_ICONASTERISK)

##确认信息框
win32api.MessageBox(0, "这是一个测试确认信息框", "提醒",win32con.MB_OKCANCEL)

##重试信息框
win32api.MessageBox(0, "这是一个测试重试信息框", "提醒",win32con.MB_RETRYCANCEL)

##是否取消信息框
win32api.MessageBox(0, "这是一个测试是否取消信息框", "提醒",win32con.MB_YESNOCANCEL)

win32库弹窗倒计时自动关闭

import ctypes
import threading
import time

import win32con

user32 = ctypes.windll.user32


def create_dialog(message: str, title: str, style: int = win32con.MB_OK,
                  block: bool = None, interval: float = 0, callback=None):
    """
    使用微软未公布的Windows API: MessageBoxTimeout 实现自动关闭的对话框,通过user32.dll调用,
    相比于使用 MessageBox 来实现显得更加简洁,参数详情请参考以上函数 create_dialog

    值得注意的是 Windows 2000 没有导出该函数。并且对于多选一没有关闭/取消功能的对话框,
    自动关闭时默认(回调)返回值为 32000
    """

    block = block if (block is not None) else interval <= 0
    interval = int(interval * 1000) if interval > 0 else 0

    def show():
        # if UNICODE MessageBoxTimeoutW
        # else MessageBoxTimeoutA
        # MessageBoxTimeout(hwnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds)
        btn_val = user32.MessageBoxTimeoutW(
            0, message, title, style, 0, interval)
        if callback and callable(callback):
            callback(btn_val)
        return btn_val

    if block:
        return show()
    else:
        threading.Thread(target=show).start()


# 基本使用
if __name__ == '__main__':
    def cb(res):
        print("[回调函数] 对话框返回值:{}".format(res))

    # 同步阻塞+手动关闭
    res = create_dialog('同步阻塞+手动关闭', '同步阻塞对话框')
    print(res)
    # 同步阻塞+自动关闭
    res = create_dialog('同步阻塞+自动关闭', '同步阻塞对话框', block=True, interval=3)
    print(res)

# 当然你也可以指定对话框回调函数(多此一举?)
res = create_dialog(
    '同步阻塞对话框+回调',
    '同步阻塞对话框',
    style=win32con.MB_YESNO,
    callback=cb)
print(res)

# 异步非阻塞+手动关闭
res = create_dialog('异步非阻塞+手动关闭', '异步非阻塞自动关闭对话框')
print(res)

# 异步非阻塞+自动关闭
res = create_dialog('异步非阻塞+自动关闭', '异步非阻塞自动关闭对话框', interval=3)
print(res)

time.sleep(5)

# 添加回调函数以获取结果
res = create_dialog(
    '异步非阻塞自动关闭对话框+回调',
    '异步非阻塞自动关闭对话框',
    interval=3,
    callback=lambda x: cb(x))
print(res)

# 组合style,带警告图标的确认对话框,并且对话框弹出处于前台
res = create_dialog(
    'message',
    'title',
    interval=2,
    callback=cb,
    style=win32con.MB_OK | win32con.MB_ICONERROR | win32con.MB_SETFOREGROUND)
print(res)

详情:https://blog.csdn.net/u012131025/article/details/118342180?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168430231816800197016034%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168430231816800197016034&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-8-118342180-null-null.142^v87^insert_down28v1,239^v2^insert_chatgpt&utm_term=win32%E5%BC%B9%E5%87%BA%E6%8F%90%E7%A4%BA%E6%A1%86%E5%B8%A6%E5%80%92%E8%AE%A1%E6%97%B6&spm=1018.2226.3001.4187

win32打开选择文件对话框

import os
import win32ui
lpszFilter = "csv Files (*.csv,*.txt,*.xlsx,*.xls)|*.csv;*.txt;*.xlsx;*.xls|" \
             "Files (*.*)|*.*|| "

# 当前文件夹路径
dirpath = os.path.dirname(__file__)
# 这里的构造方法,对应上面展示的构造方法
dlg = win32ui.CreateFileDialog(True, "xlsx", None, 0x04 | 0x02, lpszFilter)  # True表示打开文件对话框
# 设置打开文件对话框中的初始显示目录
dlg.SetOFNInitialDir(dirpath)
dlg.DoModal()
# 等待获取用户选择的文件
filename = dlg.GetPathName()  # 获取选择的文件名称
# 如果用户点击了取消,则返回的filename为"",而不是None
if filename == "":
    pass
else:
    print(filename)

  目录