Skip to content

Commit d690b9e

Browse files
committed
add pyside6 sample
1 parent 8454908 commit d690b9e

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from asyncio_guest_run import asyncio_guest_run, schedule_on_asyncio
2+
import asyncio_example_tasks
3+
4+
import sys
5+
import traceback
6+
7+
from PySide6 import QtCore, QtWidgets
8+
from outcome import Error
9+
10+
REENTER_EVENT_TYPE = QtCore.QEvent.Type(QtCore.QEvent.registerEventType())
11+
12+
class ReenterEvent(QtCore.QEvent):
13+
pass
14+
15+
class Reenter(QtCore.QObject):
16+
def event(self, event):
17+
event.fn()
18+
return False
19+
20+
class QtHost:
21+
def __init__(self, app):
22+
self.app = app
23+
self.reenter = Reenter()
24+
25+
def run_sync_soon_threadsafe(self, fn):
26+
event = ReenterEvent(REENTER_EVENT_TYPE)
27+
event.fn = fn
28+
self.app.postEvent(self.reenter, event)
29+
30+
def done_callback(self, outcome):
31+
print(f"Outcome: {outcome}")
32+
if isinstance(outcome, Error):
33+
exc = outcome.error
34+
traceback.print_exception(type(exc), exc, exc.__traceback__)
35+
self.app.quit()
36+
37+
def mainloop(self):
38+
self.app.exec() # PySide6使用exec()代替exec_()
39+
40+
class QtDisplay:
41+
def __init__(self, app):
42+
self.app = app
43+
self.widget = QtWidgets.QProgressDialog("Fetching...", "Cancel", 0, 0)
44+
self.widget.setMinimumDuration(0)
45+
46+
def set_title(self, title):
47+
self.widget.setLabelText(title)
48+
49+
def set_max(self, maximum):
50+
self.widget.setMaximum(maximum)
51+
52+
def set_value(self, downloaded):
53+
self.widget.setValue(downloaded)
54+
55+
def set_cancel(self, fn):
56+
self.widget.canceled.connect(fn)
57+
self.app.lastWindowClosed.connect(fn)
58+
59+
def main(task):
60+
app = QtWidgets.QApplication(sys.argv)
61+
app.setQuitOnLastWindowClosed(False)
62+
host = QtHost(app)
63+
display = QtDisplay(app)
64+
asyncio_guest_run(
65+
task,
66+
display,
67+
run_sync_soon_threadsafe=host.run_sync_soon_threadsafe,
68+
run_sync_soon_not_threadsafe=None,
69+
done_callback=host.done_callback,
70+
)
71+
host.mainloop()
72+
73+
if __name__ == '__main__':
74+
main(asyncio_example_tasks.count)

0 commit comments

Comments
 (0)