带有Tkinter的Windows中的消息气泡

时间:2017-03-25 13:11:54

标签: python-3.x tkinter notifications

我有一个有shorcuts等的程序,可以拍摄并保存截图。一旦屏幕截图被保存,我想显示一个带有气泡的通知: https://tipsfromanand.files.wordpress.com/2011/01/clip_image001.png

如何使用Tkinter?有可能吗?

2 个答案:

答案 0 :(得分:1)

使用tkinter?不,你不能,因为泡泡通知只在Windows中可用,而所有(大多数)tkinter的小部件都是跨平台的。但要完成任务,使用win32api这是一个api for windows是非常有可能的。您可以使用pip来安装此软件包来获取所有模块:pypiwin32其中包括win32apiwin32gui ...以下是他们制作您想要的泡泡小部件的来源示例:

from win32api import *
from win32gui import *
import win32con
import sys, os
import struct
import time

class WindowsBalloonTip:
    def __init__(self, title, msg):
        message_map = {
                win32con.WM_DESTROY: self.OnDestroy,
        }
        # Register the Window class.
        wc = WNDCLASS()
        hinst = wc.hInstance = GetModuleHandle(None)
        wc.lpszClassName = "PythonTaskbar"
        wc.lpfnWndProc = message_map # could also specify a wndproc.
        classAtom = RegisterClass(wc)
        # Create the Window.
        style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
        self.hwnd = CreateWindow( classAtom, "Taskbar", style, \
                0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
                0, 0, hinst, None)
        UpdateWindow(self.hwnd)
        iconPathName = os.path.abspath(os.path.join( sys.path[0], "balloontip.ico" ))
        icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
        try:
           hicon = LoadImage(hinst, iconPathName, \
                    win32con.IMAGE_ICON, 0, 0, icon_flags)
        except:
          hicon = LoadIcon(0, win32con.IDI_APPLICATION)
        flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
        nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "tooltip")
        Shell_NotifyIcon(NIM_ADD, nid)
        Shell_NotifyIcon(NIM_MODIFY, \
                         (self.hwnd, 0, NIF_INFO, win32con.WM_USER+20,\
                          hicon, "Balloon  tooltip",title,200,msg))
        # self.show_balloon(title, msg)
        time.sleep(10)
        DestroyWindow(self.hwnd)
        UnregisterClass(classAtom, hinst)
    def OnDestroy(self, hwnd, msg, wparam, lparam):
        nid = (self.hwnd, 0)
        Shell_NotifyIcon(NIM_DELETE, nid)
        PostQuitMessage(0) # Terminate the app.
def balloon_tip(title, msg):
    w=WindowsBalloonTip(msg, title)

balloon_tip('Hello', 'How are you?')

如果你坚持使用tkinter,那么你最接近的就是使用tkinter的messagebox:以下是一些例子:

import tkinter as tk
from tkinter import messagebox as tkMessageBox

# hide main window
root = tk.Tk()
root.withdraw()

tkMessageBox.showerror("Error", "Error message")
tkMessageBox.showwarning("Warning","Warning message")
tkMessageBox.showinfo("Information","Informative message")

但我仍然建议使用win32api,因为这是你的问题所要求的。

修改

如果您使用tkinter的第一个示例,则需要先import threading然后将balloon_tip('Hello', 'How are you?')替换为:

balloon_thread = threading.Thread(target=balloon_tip, args=('Hello', 'How are you?'))
balloon_thread.start()

尝试启动气泡时,由于程序在使用win32api时暂停,tkinter会对无响应做出反应。

注意:本指南专为python 3设计,因为许多模块在python 2中的命名方式不同。

答案 1 :(得分:0)

tkinter提供的所有可能的小部件都在他们的网站上提供。 据我所知,没有气泡,标签是最接近的东西。 http://effbot.org/tkinterbook/tkinter-index.htm

一种可能的解决方案:

import os
import time
from tkinter import *


fname = "C:\\Users\\...\\test.txt"


while not a:
    time.sleep(1)
    a = os.path.isfile(fname) 


def Notification(master):

    w = Label(master, text="Hello, world!")
    w.pack()
    mainloop()


master = Tk()
Notification(master)

在这里你有一个while循环检查你是否添加了一个新文件。您可以根据需要动态更改名称。找到文件后,会弹出一个tkinter小部件。您可以更改窗口小部件弹出的位置。