Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Как сделать мигание на панели задач?

#python #python_3x #windows #winapi #tkinter


Есть программа на подобие чата. Пользователей около 5. Обмен информацией не постоянный,
то есть пишут по необходимости и могут быть большие временные перерывы. Хочу сделать
так, чтобы после того как кто-то написал сообщение можно было привлечь внимание других
пользователей у которых запущена программа. Звук без вариантов (колонок нет). В идеале
было бы мигание программы на панели. Программа будет работать на windows server 2008 r2.
В гугле не могу найти ничего применимого к Python (у меня 3.4).
Это моя первая программа.

# -*- coding: utf-8 -*-
import tkinter
from tkinter import *
from tkinter import messagebox as mb
import time

name = str()
fname = str(time.strftime("%d_%m_%Y"))

def messange():
    global mdname
    if entry.get() < '0':
        mb.showerror('Ошибка', 'Вы не написали сообщение, сообщение не должно начинаться
с пробела') # Ошибка
    else:
        mess = entry.get()
        entry.delete(0, END)
        f = open(fname + '.txt', 'a')
        f.write(time.strftime("%H:%M") + ' ' + name + ' пишет: ' + mess + '\n')
        f.close()

def login(event):
    global name
    name = entry.get()
    if name < '0':
        mb.showerror('Ошибка', 'Напишите ваше имя, имя не должно начинаться с пробела')
# Ошибка
    else:
        event.widget.pack_forget() # Скрыть скнопку
        name = entry.get()
        entry.delete(0, END)
        f = open(fname + '.txt', 'a')
        f.write('Привет ' + name + '\n')
        f.close()
        button_visible_false.pack() # Отобразить кнопку
        while True:
            f = open(fname + '.txt')
            data = f.read()
            time.sleep(0.3)
            f.close()
            textbox.delete(1.0, END)
            textbox.insert(1.0, data)
            textbox.see("end")
            root.update_idletasks()
            root.update()

root = Tk()
root.title('Гармоничный чат v.1')

panelFrame = Frame(root, height = 60, bg = 'green')
textFrame = Frame(root, height = 340, width = 600)
panelFrame.pack(side = 'top', fill = 'x')
textFrame.pack(side = 'bottom', fill = 'both', expand = 1)

textbox = Text(textFrame, font='Arial 10', wrap='word')
scrollbar = Scrollbar(textFrame)

scrollbar['command'] = textbox.yview
textbox['yscrollcommand'] = scrollbar.set

textbox.pack(side = 'left', fill = 'both', expand = 1)
scrollbar.pack(side = 'right', fill = 'y')

entry = Entry(width = 80)
entry.pack(pady = 10)

btn1 = Button(panelFrame, text='Напишите ваше имя', width=17, height=3, bg="white",
fg="black")
btn1.bind('', login)
btn1.pack()
button_visible_false = tkinter.Button(panelFrame, text='Написать сообщение', width=17,
height=3, bg="white", fg="black", command = messange)

try:
    f = open(fname + '.txt')
except:
    f = open(fname + '.txt', 'w')
else:
    pass

root.mainloop()

    


Ответы

Ответ 1



Для мигания можно использовать функцию FlashWindow: import ctypes import tkinter as tk root = tk.Tk() def flash_window(): hwnd = int(root.wm_frame(), 16) # wm_frame() возвращает хэндл окна в виде строки в 16-ричной системе, переводим в число ctypes.windll.user32.FlashWindow(hwnd, True) root.after(1000, flash_window) root.mainloop() Активное окно мигнет один раз, свернутое подсветится (по крайней мере на Windows7 работает так). Не обязательно нужно делать через after, достаточно чтобы функция flash_window вызывалась откуда-то из обработчика событий, уже после запуска root.mainloop(). Чтобы мигнуть несколько раз, можно использовать FlashWindowEx (это немного сложнее из-за того, что данные в функцию передаются через структуру FLASHINFO): import ctypes import tkinter as tk class FLASHWINFO(ctypes.Structure): _fields_ = [ ("cbSize", ctypes.c_uint), ("hwnd", ctypes.c_uint), ("dwFlags", ctypes.c_uint), ("uCount", ctypes.c_uint), ("dwTimeout", ctypes.c_uint) ] # Codes for dwFlags FLASHW_ALL = 3 # Flash both the window caption and taskbar button. This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags. FLASHW_CAPTION = 1 # Flash the window caption. FLASHW_STOP = 0 # Stop flashing. The system restores the window to its original state. FLASHW_TIMER = 4 # Flash continuously, until the FLASHW_STOP flag is set. FLASHW_TIMERNOFG = 0xC # Flash continuously until the window comes to the foreground. FLASHW_TRAY = 2 # Flash the taskbar button. def __init__(self, hwnd, dwFlags, uCount, dwTimeout): super().__init__() self.cbSize = ctypes.sizeof(self) self.hwnd = hwnd self.dwFlags = dwFlags self.uCount = uCount self.dwTimeout = dwTimeout root = tk.Tk() def flash_window(): hwnd = int(root.wm_frame(), 16) flashinfo = FLASHWINFO(hwnd, FLASHWINFO.FLASHW_ALL, 3, 100) ctypes.windll.user32.FlashWindowEx(ctypes.byref(flashinfo)) root.after(1000, flash_window) root.mainloop()

Комментариев нет:

Отправить комментарий