Skip to content

Commit 90b4748

Browse files
authored
解决冲突 (#64)
* 增加单例模式,打开文件时会调用同一个进程,增加拖入事件使得可以通过拖入文件来进行播放。 * Merge remote-tracking branch 'upstream/master' * 修改 * 修改 * 增加gitee * 隐藏gitee下不存在的控件
1 parent d444680 commit 90b4748

File tree

4 files changed

+325
-251
lines changed

4 files changed

+325
-251
lines changed

src/CheckUpdateGui.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,11 @@ def initUi(self):
8989
row1.addWidget(QLabel(self.release.tag_name))
9090
row1.addItem(QSpacerItem(
9191
20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
92-
self.dateTimeLabel.setText(QDateTime.fromString(
93-
self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString("yyyy-MM-dd hh:mm:ss"))
92+
self.dateTimeLabel.hide()
93+
if self.release.assets_created_at != "":
94+
self.dateTimeLabel.setText(QDateTime.fromString(
95+
self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString("yyyy-MM-dd hh:mm:ss"))
96+
self.dateTimeLabel.show()
9497
row1.addWidget(self.dateTimeLabel)
9598
row1.addItem(QSpacerItem(
9699
20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
@@ -99,24 +102,29 @@ def initUi(self):
99102
self.titleWidget.setLayout(row1)
100103
self.titleWidget.setContentsMargins(0, 0, 0, 0)
101104
formLayout = QFormLayout()
102-
urlLabel = QLabel()
103-
urlLabel.setText("<a href='" + self.release.html_url +
104-
"'>" + QObject.tr(self, "open external links") + "</a>")
105-
urlLabel.setOpenExternalLinks(True)
106-
dataLayout = QVBoxLayout()
107105
formLayout.setLabelAlignment(Qt.AlignmentFlag.AlignLeft)
108-
formLayout.addRow(QObject.tr(self, "html_url"), urlLabel)
106+
dataLayout = QVBoxLayout()
107+
if self.release.html_url != "":
108+
urlLabel = QLabel()
109+
urlLabel.setText("<a href='" + self.release.html_url +
110+
"'>" + QObject.tr(self, "open external links") + "</a>")
111+
urlLabel.setOpenExternalLinks(True)
112+
formLayout.addRow(QObject.tr(self, "html_url"), urlLabel)
109113
formLayout.addRow(QObject.tr(self, "name"),
110114
QLabel(self.release.assets_name))
111-
formLayout.addRow(QObject.tr(self, "content_type"),
112-
QLabel(self.release.assets_content_type))
113-
formLayout.addRow(QObject.tr(self, "size"), QLabel(
114-
str(f"{self.release.assets_size / 1000000:.2f} MB")))
115-
formLayout.addRow(QObject.tr(self, "download_count"),
116-
QLabel(str(self.release.assets_download_count)))
117-
formLayout.addRow(QObject.tr(self, "created_at"),
118-
QLabel(QDateTime.fromString(self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString(
119-
"yyyy-MM-dd hh:mm:ss")))
115+
if self.release.assets_content_type != "":
116+
formLayout.addRow(QObject.tr(self, "content_type"),
117+
QLabel(self.release.assets_content_type))
118+
if self.release.assets_size > 0:
119+
formLayout.addRow(QObject.tr(self, "size"), QLabel(
120+
str(f"{self.release.assets_size / 1000000:.2f} MB")))
121+
if self.release.assets_download_count != "":
122+
formLayout.addRow(QObject.tr(self, "download_count"),
123+
QLabel(str(self.release.assets_download_count)))
124+
if self.release.assets_created_at != "":
125+
formLayout.addRow(QObject.tr(self, "created_at"),
126+
QLabel(QDateTime.fromString(self.release.assets_created_at, "yyyy-MM-ddThh:mm:ssZ").toString(
127+
"yyyy-MM-dd hh:mm:ss")))
120128
downloadUrlLabel = QLabel()
121129
downloadUrlLabel.setText("<a href='" + self.release.assets_browser_download_url +
122130
"'>" + QObject.tr(self, "open download links") + "</a>")
@@ -237,7 +245,7 @@ def __init__(self, github: GitHub, parent=None):
237245
self.setWindowTitle(QObject.tr(self, "CheckUpdate"))
238246
# 去掉问号
239247
self.setWindowFlags(self.windowFlags() & ~
240-
Qt.WindowContextHelpButtonHint)
248+
Qt.WindowContextHelpButtonHint)
241249
self.r_path = parent.r_path
242250
self.github: GitHub = github
243251
self.github.setParent(self)
@@ -309,7 +317,7 @@ def initConnect(self):
309317

310318
def changeSource(self, source: str):
311319
self.pingThread = PingThread(
312-
source, self.github.sourceManager.sources[source])
320+
source, self.github.sourceManager.sources[source]['url'])
313321
self.sourceSpeedLabel.setText("---ms")
314322
self.pingThread.pingSignal.connect(
315323
lambda x, y: self.sourceSpeedLabel.setText(f"{int(y)}ms"))

src/githubApi.py

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,16 @@ def run(self) -> None:
4747
class SourceManager(QObject):
4848
quickSource = pyqtSignal(str, float)
4949

50-
def __init__(self, sources: dict, current: any = None, parent=None):
50+
def __init__(self, sources: dict, current: str = None, parent=None):
5151
super().__init__(parent)
5252
if not isinstance(sources, dict):
5353
raise TypeError
5454
if not sources:
5555
raise ValueError
5656
self.sources = sources
5757
# 第一个的key
58-
self.currentSource = list(sources.keys())[0] if current is None else current
58+
self.currentSource = list(sources.keys())[
59+
0] if current is None else current
5960
self.speedData = {}
6061
self.threads = []
6162

@@ -70,7 +71,7 @@ def sources(self, sources: dict):
7071
if not sources:
7172
raise ValueError
7273
for key in sources:
73-
sources[key] = sources[key].strip('/')
74+
sources[key]['url'] = sources[key]['url'].strip('/')
7475
self.__sources = sources
7576
self.currentSource = list(sources.keys())[0]
7677

@@ -81,6 +82,17 @@ def currentSource(self):
8182
"""
8283
return self.__currentSource
8384

85+
@property
86+
def token(self) -> str:
87+
return self.__sources[self.currentSource]['t']
88+
89+
@property
90+
def tokenUrl(self) -> str:
91+
if self.currentSource == "gitee":
92+
return f'?access_token={self.token}'
93+
else:
94+
return ""
95+
8496
@currentSource.setter
8597
def currentSource(self, currentSource: str):
8698
"""
@@ -98,7 +110,7 @@ def currentSource(self, currentSource: str):
98110

99111
@property
100112
def currentSourceUrl(self):
101-
return self.sources[self.currentSource]
113+
return self.sources[self.currentSource]['url']
102114

103115
def checkSourceSpeed(self):
104116
"""
@@ -107,7 +119,7 @@ def checkSourceSpeed(self):
107119
self.threads.clear()
108120
self.speedData = {}
109121
for source in self.sources:
110-
thread = PingThread(source, self.sources[source])
122+
thread = PingThread(source, self.sources[source]['url'])
111123
thread.pingSignal.connect(self.__pingSignal)
112124
self.threads.append(thread)
113125
thread.start()
@@ -129,13 +141,13 @@ def __init__(self, dataJson: dict, versionReStr: str) -> None:
129141
self.tag_name = dataJson['tag_name'] if re.search(
130142
versionReStr, dataJson['tag_name']) else dataJson['name']
131143
self.body = dataJson['body']
132-
self.html_url = dataJson['html_url']
144+
self.html_url = dataJson['html_url'] if 'html_url' in dataJson else ""
133145
m_assert = dataJson['assets'][0]
134146
self.assets_name = m_assert['name']
135-
self.assets_content_type = m_assert['content_type']
136-
self.assets_size = m_assert['size']
137-
self.assets_download_count = m_assert['download_count']
138-
self.assets_created_at = m_assert['created_at']
147+
self.assets_content_type = m_assert['content_type'] if 'content_type' in m_assert else ""
148+
self.assets_size = m_assert['size'] if 'size' in m_assert else 0
149+
self.assets_download_count = m_assert['download_count'] if 'download_count' in m_assert else ""
150+
self.assets_created_at = m_assert['created_at'] if 'created_at' in m_assert else ""
139151
self.assets_browser_download_url = m_assert['browser_download_url']
140152

141153

@@ -148,20 +160,16 @@ class GitHub(QObject):
148160
downloadReleaseAsyncFinishSignal = pyqtSignal(str)
149161
errorSignal = pyqtSignal(str)
150162

151-
def __init__(self, sourceManager: SourceManager, owner: str, repo: str, version: str, versionReStr: str,
163+
def __init__(self, sourceManager: SourceManager, version: str, versionReStr: str,
152164
parent=None):
153165
"""
154166
:param sourceManager: 一个SourceManager实例,提供了多个github api的url
155-
:param owner: github的owner
156-
:param repo: github的仓库名
157167
:param version: 当前的版本号
158168
:param versionReStr: 一个正则表达式串,用于从github的release中,提取版本号
159169
:param parent: 一个QObject实例,父对象
160170
"""
161171
super().__init__(parent)
162172
self.__sourceManager = sourceManager
163-
self.__owner = owner
164-
self.__repo = repo
165173
self.__version = version
166174
self.__versionReStr = versionReStr
167175
self.__replyDict = {}
@@ -177,22 +185,6 @@ def sourceManager(self, sourceManager: SourceManager) -> None:
177185
self.__sourceManager = sourceManager
178186
self.__sourceManager.setParent(self)
179187

180-
@property
181-
def owner(self) -> str:
182-
return self.__owner
183-
184-
@owner.setter
185-
def owner(self, owner: str) -> None:
186-
self.__owner = owner
187-
188-
@property
189-
def repo(self) -> str:
190-
return self.__repo
191-
192-
@repo.setter
193-
def repo(self, repo: str) -> None:
194-
self.__repo = repo
195-
196188
@property
197189
def version(self) -> str:
198190
return self.__version
@@ -214,14 +206,14 @@ def latestReleaseUrl(self) -> str:
214206
"""
215207
获取最新的release的url
216208
"""
217-
return f'{self.sourceManager.currentSourceUrl}/{self.__owner}/{self.__repo}/releases/latest'
209+
return f'{self.sourceManager.currentSourceUrl}/releases/latest{self.sourceManager.tokenUrl}'
218210

219211
@property
220212
def releasesUrl(self) -> str:
221213
"""
222214
获取所有release的url
223215
"""
224-
return f'{self.sourceManager.currentSourceUrl}/{self.__owner}/{self.__repo}/releases'
216+
return f'{self.sourceManager.currentSourceUrl}/releases{self.sourceManager.tokenUrl}'
225217

226218
def isNeedUpdate(self, isAsync: bool = True) -> bool | str | None:
227219
"""
@@ -354,7 +346,8 @@ def downloadRelease(self, release: ReleaseInfo) -> str:
354346
:return: 一个当前请求的唯一标识
355347
"""
356348
self.downloadReleaseAsyncStartSignal.emit(release)
357-
nam, request = self.__createRequest(release.assets_browser_download_url)
349+
nam, request = self.__createRequest(
350+
release.assets_browser_download_url)
358351
reply = nam.get(request)
359352
reply.setObjectName(str(uuid.uuid1()))
360353
self.__replyDict[reply.objectName()] = reply
@@ -474,14 +467,14 @@ def removeDownloadFile(self):
474467
"""删除下载的文件"""
475468
GitHub.removeAllTempFile(f".*{self.__repo}.*")
476469

470+
477471
if __name__ == '__main__':
478472
app = QCoreApplication([])
479473
data = {
480-
"Github": "https://api.github.com/repos/",
481-
"gitee": "https://api.gitee.com/repos/",
474+
"Github": "https://api.github.com/repos/eee555/Metasweeper",
475+
"gitee": "https://api.gitee.com/repos/ee55/Metasweeper",
482476
}
483-
github = GitHub(SourceManager(data), "eee555",
484-
"Solvable-Minesweeper", "3.1.9", "(\d+\.\d+\.\d+)")
477+
github = GitHub(SourceManager(data, "gitee"), "3.1.9", "(\d+\.\d+\.\d+)")
485478
github.releasesAsyncSignal.connect(lambda x: print(x))
486479
github.releases()
487480
# manager = SourceManager(data)

src/main.py

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,44 @@
22
import time
33
from PyQt5 import QtWidgets
44
from PyQt5 import QtCore
5-
from PyQt5.QtWidgets import QApplication
6-
from PyQt5.QtNetwork import QLocalSocket,QLocalServer
7-
import sys, os
5+
from PyQt5.QtWidgets import QApplication, QMessageBox
6+
from PyQt5.QtNetwork import QLocalSocket, QLocalServer
7+
import sys
8+
import os
89
import mainWindowGUI as mainWindowGUI
910
import mineSweeperGUI as mineSweeperGUI
1011
import ctypes
1112
from ctypes import wintypes
1213
os.environ["QT_FONT_DPI"] = "96"
1314

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

20-
def on_ready_read(socket:QLocalSocket):
41+
42+
def on_ready_read(socket: QLocalSocket):
2143
"""从socket读取文件路径并传递给主窗口"""
2244
if socket and socket.state() == QLocalSocket.ConnectedState:
2345
# 读取文件路径并调用打开文件
@@ -29,21 +51,43 @@ def on_ready_read(socket:QLocalSocket):
2951
socket.disconnectFromServer() # 断开连接
3052

3153

54+
def on_new_connection(localServer: QLocalServer):
55+
"""当新连接进来时,接受连接并将文件路径传递给主窗口"""
56+
socket = localServer.nextPendingConnection()
57+
if socket:
58+
socket.readyRead.connect(lambda: on_ready_read(socket))
59+
60+
61+
def on_ready_read(socket: QLocalSocket):
62+
"""从socket读取文件路径并传递给主窗口"""
63+
if socket and socket.state() == QLocalSocket.ConnectedState:
64+
# 读取文件路径并调用打开文件
65+
socket.waitForReadyRead(500)
66+
file_path = socket.readAll().data().decode()
67+
for win in QApplication.topLevelWidgets():
68+
if isinstance(win, mainWindowGUI.MainWindow):
69+
win.dropFileSignal.emit(file_path)
70+
socket.disconnectFromServer() # 断开连接
71+
3272

3373
def find_window(class_name, window_name):
3474
"""
3575
查找指定窗口的句柄。
36-
76+
77+
3778
Args:
3879
class_name (str): 要查找的窗口的类名。
3980
window_name (str): 要查找的窗口的标题。
40-
81+
82+
4183
Returns:
4284
int: 查找到的窗口的句柄。如果未找到窗口,则抛出异常。
43-
85+
86+
4487
Raises:
4588
ctypes.WinError: 如果未找到指定窗口,则抛出此异常。
46-
89+
90+
4791
"""
4892
user32 = ctypes.WinDLL('user32', use_last_error=True)
4993
user32.FindWindowW.argtypes = [wintypes.LPCWSTR, wintypes.LPCWSTR]
@@ -58,7 +102,7 @@ def find_window(class_name, window_name):
58102
if __name__ == "__main__":
59103
# QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
60104
try:
61-
app = QtWidgets.QApplication (sys.argv)
105+
app = QtWidgets.QApplication(sys.argv)
62106
serverName = "MineSweeperServer"
63107
socket = QLocalSocket()
64108
socket.connectToServer(serverName)
@@ -72,7 +116,8 @@ def find_window(class_name, window_name):
72116
else:
73117
localServer = QLocalServer()
74118
localServer.listen(serverName)
75-
localServer.newConnection.connect(lambda: on_new_connection(localServer=localServer))
119+
localServer.newConnection.connect(
120+
lambda: on_new_connection(localServer=localServer))
76121
mainWindow = mainWindowGUI.MainWindow()
77122
ui = mineSweeperGUI.MineSweeperGUI(mainWindow, sys.argv)
78123
ui.mainWindow.show()
@@ -82,8 +127,14 @@ def find_window(class_name, window_name):
82127
hwnd = find_window(None, _translate("MainWindow", "元扫雷"))
83128

84129
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
130+
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(
131+
hwnd, 0x00000011) else 1/0
132+
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(
133+
hwnd, 0x00000000) else 1/0
134+
ui.disable_screenshot = lambda: ... if SetWindowDisplayAffinity(
135+
hwnd, 0x00000011) else 1/0
136+
ui.enable_screenshot = lambda: ... if SetWindowDisplayAffinity(
137+
hwnd, 0x00000000) else 1/0
87138

88139
sys.exit(app.exec_())
89140
...
@@ -157,4 +208,3 @@ def find_window(class_name, window_name):
157208
# MouseState::ChordingNotFlag => Ok(6),
158209
# MouseState::DownUpAfterChording => Ok(7),
159210
# MouseState::Undefined => Ok(8),
160-

0 commit comments

Comments
 (0)