Home > other >  Python using tkinter achieve the function minimize to tray. But after minimize to tray program canno
Python using tkinter achieve the function minimize to tray. But after minimize to tray program canno

Time:11-27

The program has two process
The child process calls the function count

Count for infinite loop time. Sleep to control events each cycle interval, 10 seconds each time,

The problem is:
The program does not enter the tray all normal, once every 10 seconds,
But a program to minimize the into the tray, the count in the infinite loop "been" suspended (strangely to minimize to tray for the first time, the time to perform a output code before pause)

I want to achieve, minimize to tray after the program is still normal execution, and not appear the code is suspended in the count,


All the code is as follows:

 
the import the OSThe import win32api
The import win32con
The import win32gui_struct
The import win32gui
The from tkinter import *
The import json
The import requests
The import time
The import win32com. Client
The import pypyodbc
The import threading

Mayi __author__=' '

Def print_ts (the message) :
Return "[% s] % s" % (time. Strftime (" % % Y - m - H: % d % % m: % s ", the time the localtime ()), the message)

The Main=None

The class SysTrayIcon (object) :
The QUIT='QUIT'
SPECIAL_ACTIONS=[the QUIT]
FIRST_ID=1314
Def __init__ (s,
Icon,
Hover_text,
Menu_options,
On_quit=None,
Default_menu_index=None,
Window_class_name=None) :
S.i con=icon
Sheldon horowitz over_text=hover_text
S.o n_quit=on_quit

Menu_options=menu_options + ((' exit 'None, s.Q UIT),)
S. _next_action_id=s. IRST_ID
S.m enu_actions_by_id=set ()
S.m enu_options=s. _add_ids_to_menu_options (list (menu_options))
S.m enu_actions_by_id=dict (s.m enu_actions_by_id)
Del s. _next_action_id

Spyware doctor efault_menu_index=(default_menu_index or 0)
S. indow_class_name=window_class_name or "SysTrayIconPy
"
Message_map={win32gui. RegisterWindowMessage (" TaskbarCreated ") : s.r efresh_icon,
Win32con. WM_DESTROY: spyware doctor estroy,
Mand win32con. WM_COMMAND: s.com,
Win32con. WM_USER + 20: s.n otify,}
# registered window class,
Window_class=win32gui. WNDCLASS ()
Window_class. HInstance=win32gui. GetModuleHandle (None)
Window_class. LpszClassName=s. indow_class_name
Window_class. Style=win32con. CS_VREDRAW | win32con. CS_HREDRAW;
Window_class. HCursor=win32gui. LoadCursor (0, win32con. IDC_ARROW)
Window_class. HbrBackground=win32con. COLOR_WINDOW
Window_class. LpfnWndProc=message_map # you can also specify wndproc.
S.c lassAtom=win32gui. RegisterClass (window_class)

Def show_icon (s) :
# to create window,
Hinst=win32gui. GetModuleHandle (None)
Style=win32con. WS_OVERLAPPED | win32con. WS_SYSMENU
Sheldon horowitz WND=win32gui. CreateWindow (s.c lassAtom,
S. indow_class_name,
Style,
0,
0,
Win32con CW_USEDEFAULT,
Win32con CW_USEDEFAULT,
0,
0,
Hinst,
None)
Win32gui. UpdateWindow (Sheldon horowitz WND)
S.n otify_id=None
S.r efresh_icon ()

Win32gui. PumpMessages ()

Def show_menu that demonstrates (s) :
The menu=win32gui. CreatePopupMenu ()
S.c reate_menu (menu, s.m enu_options)
# win32gui. SetMenuDefaultItem (menu, 1000, 0)

Pos=win32gui. GetCursorPos ()
# See http://msdn.microsoft.com/library/default.asp? Url=/library/en - us/winui/menus_0hdi asp
Win32gui. SetForegroundWindow (Sheldon horowitz WND)
Win32gui. TrackPopupMenu (menu,
Win32con TPM_LEFTALIGN,
Pos [0],
Pos [1],
0,
Sheldon horowitz WND,
None)
Win32gui. PostMessage (Sheldon horowitz WND, win32con WM_NULL, 0, 0)

Def destroy (s, HWND, MSG, wparam, lparam) :
If s.o n_quit: s.o n_quit # (s) run pass on_quit
Nid=(Sheldon horowitz WND, 0)
Win32gui. Shell_NotifyIcon (win32gui NIM_DELETE, nid)
Win32gui. PostQuitMessage (0) # exit tray icon

Def notify (s, HWND, MSG, wparam, lparam) :
If lparam==win32con. WM_LBUTTONDBLCLK: double click
#Pass # s.e xecute_menu_option (s.d. efault_menu_index + s. IRST_ID)
Elif lparam==win32con. WM_RBUTTONUP: # right-click
S.s how_menu ()
Elif lparam==win32con. WM_LBUTTONUP: # click left key
Nid=(Sheldon horowitz WND, 0)
Win32gui. Shell_NotifyIcon (win32gui NIM_DELETE, nid)
Win32gui. PostQuitMessage (0) # exit tray icon
If the Main: the Main root. Deiconify ()
Return True
"" "possible mouse events:
WM_MOUSEMOVE
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
The WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK "" "

Def _add_ids_to_menu_options (s, menu_options) :
Result=[]
For menu_option menu_options in:
Option_text option_icon, option_action=menu_option
If callable (option_action) or option_action in s.S PECIAL_ACTIONS:
S.m enu_actions_by_id. Add ((s. _next_action_id, option_action))
Result. Append (menu_option + (s. _next_action_id,))
The else:
Result. Append ((option_text,
Option_icon,
S. _add_ids_to_menu_options (option_action),
S. _next_action_id))
S. _next_action_id +=1
Return the result

Def refresh_icon (s * * data) :
Hinst=win32gui. GetModuleHandle (None)
If OS. Path. Isfile (s.i con) : # tries to find the custom icon
Icon_flags=win32con. LR_LOADFROMFILE | win32con. LR_DEFAULTSIZE
Hicon=win32gui. LoadImage (hinst,
S.i con,
Win32con IMAGE_ICON,
0,
0,
Icon_flags)
The else: # can't find the icon file - use the default
Hicon=win32gui. LoadIcon (0, win32con. IDI_APPLICATION)

nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
  • Related