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