Skip to content

Commit e8ca85f

Browse files
authored
增加单例模式,打开文件时会调用同一个进程,增加拖入事件使得可以通过拖入文件来进行播放。 (#61)
1 parent b0ffe0e commit e8ca85f

File tree

3 files changed

+86
-28
lines changed

3 files changed

+86
-28
lines changed

src/main.py

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,34 @@
11
# from fbs_runtime.application_context.PyQt5 import ApplicationContext
2+
import time
23
from PyQt5 import QtWidgets
34
from PyQt5 import QtCore
5+
from PyQt5.QtWidgets import QApplication,QMessageBox
6+
from PyQt5.QtNetwork import QLocalSocket,QLocalServer
47
import sys, os
58
import mainWindowGUI as mainWindowGUI
69
import mineSweeperGUI as mineSweeperGUI
710
import ctypes
811
from ctypes import wintypes
9-
1012
os.environ["QT_FONT_DPI"] = "96"
1113

14+
def on_new_connection(localServer:QLocalServer):
15+
"""当新连接进来时,接受连接并将文件路径传递给主窗口"""
16+
socket = localServer.nextPendingConnection()
17+
if socket:
18+
socket.readyRead.connect(lambda: on_ready_read(socket))
19+
20+
def on_ready_read(socket:QLocalSocket):
21+
"""从socket读取文件路径并传递给主窗口"""
22+
if socket and socket.state() == QLocalSocket.ConnectedState:
23+
# 读取文件路径并调用打开文件
24+
socket.waitForReadyRead(500)
25+
file_path = socket.readAll().data().decode()
26+
for win in QApplication.topLevelWidgets():
27+
if isinstance(win, mainWindowGUI.MainWindow):
28+
win.dropFileSignal.emit(file_path)
29+
socket.disconnectFromServer() # 断开连接
30+
31+
1232

1333
def find_window(class_name, window_name):
1434
"""
@@ -37,26 +57,38 @@ def find_window(class_name, window_name):
3757

3858
if __name__ == "__main__":
3959
# QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
40-
41-
app = QtWidgets.QApplication (sys.argv)
42-
mainWindow = mainWindowGUI.MainWindow()
43-
ui = mineSweeperGUI.MineSweeperGUI(mainWindow, sys.argv)
44-
ui.mainWindow.show()
45-
ui.mainWindow.game_setting_path = ui.game_setting_path
46-
47-
_translate = QtCore.QCoreApplication.translate
48-
hwnd = find_window(None, _translate("MainWindow", "元扫雷"))
49-
50-
SetWindowDisplayAffinity = ctypes.windll.user32.SetWindowDisplayAffinity
51-
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000011) else 1/0
52-
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000000) else 1/0
53-
54-
55-
56-
57-
sys.exit(app.exec_())
58-
...
59-
60+
try:
61+
app = QtWidgets.QApplication (sys.argv)
62+
serverName = "MineSweeperServer"
63+
socket = QLocalSocket()
64+
socket.connectToServer(serverName)
65+
if socket.waitForConnected(500):
66+
if len(sys.argv) == 2:
67+
filePath = sys.argv[1]
68+
socket.write(filePath.encode())
69+
socket.flush()
70+
time.sleep(0.5)
71+
app.quit()
72+
else:
73+
localServer = QLocalServer()
74+
localServer.listen(serverName)
75+
localServer.newConnection.connect(lambda: on_new_connection(localServer=localServer))
76+
mainWindow = mainWindowGUI.MainWindow()
77+
ui = mineSweeperGUI.MineSweeperGUI(mainWindow, sys.argv)
78+
ui.mainWindow.show()
79+
ui.mainWindow.game_setting_path = ui.game_setting_path
80+
81+
_translate = QtCore.QCoreApplication.translate
82+
hwnd = find_window(None, _translate("MainWindow", "元扫雷"))
83+
84+
SetWindowDisplayAffinity = ctypes.windll.user32.SetWindowDisplayAffinity
85+
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000011) else 1/0
86+
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(hwnd, 0x00000000) else 1/0
87+
88+
sys.exit(app.exec_())
89+
...
90+
except Exception as e:
91+
pass
6092

6193
# 最高优先级
6294
# 计时器快捷键切换

src/mainWindowGUI.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
from PyQt5 import QtCore, QtWidgets
22
from PyQt5.QtCore import Qt
3-
from PyQt5.QtCore import QTimer
3+
from PyQt5.QtCore import QTimer, QFileInfo
44
from PyQt5.QtWidgets import QApplication
5-
5+
from PyQt5.QtGui import QDragEnterEvent, QDropEvent
66
# 重写QMainWindow
7+
8+
79
class MainWindow(QtWidgets.QMainWindow):
810
keyRelease = QtCore.pyqtSignal(str)
911
closeEvent_ = QtCore.pyqtSignal()
12+
dropFileSignal = QtCore.pyqtSignal(str)
1013
flag_drag_border = False
1114
minimum_counter = 0
1215

16+
def __init__(self):
17+
super(MainWindow, self).__init__()
18+
self.setAcceptDrops(True)
19+
1320
def closeEvent(self, event):
1421
self.closeEvent_.emit()
1522

1623
def keyReleaseEvent(self, event):
1724
if event.key() == Qt.Key_Space and not event.isAutoRepeat():
1825
self.keyRelease.emit('Space')
19-
20-
def resizeEvent(self,event):
26+
27+
def resizeEvent(self, event):
2128
# 拖拽边框后resize尺寸
2229
if QApplication.mouseButtons() & Qt.LeftButton:
2330
self.flag_drag_border = True
@@ -35,4 +42,22 @@ def __minimumWindowRelease(self):
3542
self.minimum_counter = 0
3643
self.timer_.stop()
3744

45+
def dragEnterEvent(self, event: QDragEnterEvent):
46+
super().dragEnterEvent(event)
47+
if event.mimeData().hasUrls():
48+
url = event.mimeData().urls()[0]
49+
if url.isLocalFile():
50+
fileType = QFileInfo(url.toLocalFile()).suffix()
51+
if fileType in ('evf', 'avf', 'rmv', 'mvf'):
52+
event.acceptProposedAction()
53+
return
54+
event.ignore()
3855

56+
def dropEvent(self, event: QDropEvent):
57+
super().dropEvent(event)
58+
files = event.mimeData().urls()
59+
if len(files) > 0:
60+
url = files[0]
61+
if url.isLocalFile():
62+
filePath = url.toLocalFile()
63+
self.dropFileSignal.emit(filePath)

src/mineSweeperGUI.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
# from PyQt5.QtWidgets import QApplication
2020
# from country_name import country_name
2121
import metaminesweeper_checksum
22-
22+
from mainWindowGUI import MainWindow
2323

2424
class MineSweeperGUI(superGUI.Ui_MainWindow):
25-
def __init__(self, MainWindow, args):
25+
def __init__(self, MainWindow: MainWindow, args):
2626
self.mainWindow = MainWindow
2727
self.checksum_guard = metaminesweeper_checksum.ChecksumGuard()
2828

@@ -110,7 +110,7 @@ def save_evf_file_integrated():
110110
self.relative_path = args[0]
111111
# 用本软件打开录像
112112
if len(args) == 2:
113-
self.action_OpenFile(args[1])
113+
self.action_OpenFile(openfile_name=args[1])
114114

115115
self.trans_language()
116116
self.score_board_manager.with_namespace({
@@ -124,6 +124,7 @@ def save_evf_file_integrated():
124124
self.score_board_manager.visible()
125125

126126
self.mainWindow.closeEvent_.connect(self.closeEvent_)
127+
self.mainWindow.dropFileSignal.connect(self.action_OpenFile)
127128

128129
@property
129130
def pixSize(self):

0 commit comments

Comments
 (0)