#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()
Комментариев нет:
Отправить комментарий