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