feat: 修改以支持单实例

This commit is contained in:
caoqianming 2024-07-23 18:19:03 +08:00
parent a01c16982a
commit 58b62dd090
1 changed files with 21 additions and 25 deletions

View File

@ -13,16 +13,14 @@ from flask import Flask, request, jsonify
from PyPDF2 import PdfWriter, PdfReader from PyPDF2 import PdfWriter, PdfReader
from flask_cors import CORS from flask_cors import CORS
import ctypes import ctypes
import os
import pystray import pystray
import threading
from PIL import Image from PIL import Image
from pystray import MenuItem from pystray import MenuItem
# import requests # import requests
import socket import socket
import logging import logging
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
import sys
CUR_DIR = os.path.dirname(os.path.abspath(__file__)) CUR_DIR = os.path.dirname(os.path.abspath(__file__))
@ -53,14 +51,12 @@ CORS(app, supports_credentials=True)
app.json.ensure_ascii = False app.json.ensure_ascii = False
class SnPost: class MyPrint:
def __init__(self, server, port) -> None: def __init__(self) -> None:
self.is_one_instance = False self.is_one_instance = False
self.is_working = False self.is_working = False
self.icon = None # 下标 self.icon = None # 下标
self.server = server
self.port = port
self.check_one_instance() self.check_one_instance()
@ -69,7 +65,7 @@ class SnPost:
global s global s
s = socket.socket() s = socket.socket()
host = socket.gethostname() host = socket.gethostname()
s.bind((host, 8080)) s.bind((host, 20309))
self.is_one_instance = True self.is_one_instance = True
except Exception: except Exception:
self.is_one_instance = False self.is_one_instance = False
@ -77,6 +73,8 @@ class SnPost:
def close(self): def close(self):
self.is_working = False self.is_working = False
self.icon.stop() self.icon.stop()
logger.info("程序退出")
sys.exit(0)
def log(self): def log(self):
os.system(log_command) os.system(log_command)
@ -84,13 +82,14 @@ class SnPost:
def run(self): def run(self):
if not self.is_one_instance: if not self.is_one_instance:
return return
menu = (MenuItem('查看日志', self.log))
menu = (MenuItem('退出', self.close), MenuItem('查看日志', self.log))
image = Image.open("001.ico") image = Image.open("001.ico")
title = "打印机" title = "打印机"
self.icon = pystray.Icon(title, image, "打印机", menu) self.icon = pystray.Icon(title, image, "打印机", menu)
threading.Thread(target=self.icon.run, daemon=True).start() threading.Thread(target=self.icon.run, daemon=True).start()
app.run(port=8080, debug=False, host='0.0.0.0')
@app.route('/print/', methods=['POST', 'OPTIONS']) @app.route('/print/', methods=['POST', 'OPTIONS'])
def pdf_printer(): def pdf_printer():
@ -109,7 +108,7 @@ def pdf_printer():
win32print.OpenPrinter(printer_name) win32print.OpenPrinter(printer_name)
win32print.SetDefaultPrinter(printer_name) win32print.SetDefaultPrinter(printer_name)
else: else:
return jsonify({"error_message": "打印机名称不正确","error_code": "printer_name_error"}), 400 return jsonify({"err_msg": "打印机名称不正确","err_code": "printer_name_error"}), 400
win32api.ShellExecute( win32api.ShellExecute(
0, 0,
@ -119,11 +118,10 @@ def pdf_printer():
".", ".",
0 0
) )
logger.info("打印成功")
except Exception as e: except Exception as e:
import traceback logger.error(f"打印失败: {e}")
logger.error(traceback.format_exc()) return jsonify({"err_msg": "打印失败", "err_code": "print_failed"}), 500
print(traceback.format_exc())
return jsonify({"error_message": str(e), "error_code": "print_failed"}), 500
finally: finally:
t = threading.Thread(target=del_file, args=(temp_pdf_path,)) t = threading.Thread(target=del_file, args=(temp_pdf_path,))
t.start() t.start()
@ -149,12 +147,11 @@ def str_printer():
print_commands = request.json.get('printer_commands', None) print_commands = request.json.get('printer_commands', None)
print_name = request.json.get('printer_name', None) print_name = request.json.get('printer_name', None)
tsclibrary = ctypes.WinDLL(".//TSCLIB.dll") tsclibrary = ctypes.WinDLL(".//TSCLIB.dll")
if print_name: try:
logger.info("打印机名称: %s", print_name)
tsclibrary.openportW(print_name) tsclibrary.openportW(print_name)
else: except Exception as e:
logger.error("打印机名称无效") logger.error(f"打印机名称无效: {e}")
return jsonify({"error_message": "打印机名称无线","error_code": "printer_name_error"}), 400 return jsonify({"err_msg": "打印机名称无","err_code": "printer_name_error"}), 400
tsclibrary.clearbuffer() tsclibrary.clearbuffer()
try: try:
for item in print_commands: for item in print_commands:
@ -172,14 +169,13 @@ def str_printer():
else: else:
tsclibrary.sendcommandW(item) tsclibrary.sendcommandW(item)
tsclibrary.closeport() tsclibrary.closeport()
logger.info("打印成功")
except Exception as e: except Exception as e:
print(e) logger.error(f"打印失败: {e}")
logger.error("打印错误: %s", str(e)) return jsonify({"err_msg": "打印失败", "err_code": "print_failed"}), 500
return jsonify({}), 200 return jsonify({}), 200
if __name__ == '__main__': if __name__ == '__main__':
obj = SnPost(server='localhost', port=8080) MyPrint().run()
obj.run()
app.run(port=8080, debug=True, host='0.0.0.0')