From fd676638687b521ccf6bba6663eaeec8da4e83a8 Mon Sep 17 00:00:00 2001 From: david-ajax Date: Tue, 8 Apr 2025 23:14:29 +0800 Subject: [PATCH] Add basic components support --- pulsar/components/__horizontal_indicator.py | 0 .../__pycache__/marking_lines.cpython-312.pyc | Bin 0 -> 1926 bytes pulsar/components/marking_lines.py | 21 ++++++++ pulsar/main copy.py | 46 ---------------- pulsar/main.py | 49 +++++++++--------- pulsar/tester.py | 22 ++++++++ vgl/__pycache__/__init__.cpython-312.pyc | Bin 448 -> 448 bytes .../basic_elements.cpython-312.pyc | Bin 7328 -> 7328 bytes vgl/__pycache__/main.cpython-312.pyc | Bin 12056 -> 16382 bytes 9 files changed, 68 insertions(+), 70 deletions(-) create mode 100644 pulsar/components/__horizontal_indicator.py create mode 100644 pulsar/components/__pycache__/marking_lines.cpython-312.pyc create mode 100644 pulsar/components/marking_lines.py delete mode 100644 pulsar/main copy.py create mode 100644 pulsar/tester.py diff --git a/pulsar/components/__horizontal_indicator.py b/pulsar/components/__horizontal_indicator.py new file mode 100644 index 0000000..e69de29 diff --git a/pulsar/components/__pycache__/marking_lines.cpython-312.pyc b/pulsar/components/__pycache__/marking_lines.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b85b4aaa14acbdcb610aed112250467a9ba0bac GIT binary patch literal 1926 zcmb_cO>7%Q6rP>kb=L8^NlKiw{G>*yQVb{&RRxzcG`~_YgsLbNiIO-Q&)QjMy=!(i z4Y6F5LlH5pNRUA3p$E97N)F-X-rz(eE;bQLHROO)gp^x?Re?D1X6@YoMFI&%@_XOB zH}8An_ulL`;cz2@^>Xi{^ea3<581|BxDKjq0M-#fgwxRkB6xx${7p20m$;a4zz&V( z!*3|oyk?}MuWN>CC%JkkQ$hFvHL5lP;RnJxa(r*bOTo_7*JfR3M9*@p3vdO3xA;xQ z2kQpsG}I76UfhR*!!o*y2t?eh=NLj$qY#0MLMG(-kG12&jO;@nWSV^F10obK5%a*6 z!X$8v)0i}DNnX~!{TJL;aI;J*R8CoNy3TYEg`}5ibj`z8|axcvucl$QQqwtGLs8g)o|>deoIrXEa%d9kEaIxl^B zVMqF^uY7f~GB{P9PE-bG$_l9rl1e8jr{~MMQ%NrzBDBc$<0FLTxB(2iK|EC34YS<{ zj@NdsIvZ!UH}M#=b&laGLT9ewUqDVW3rKKJ;c3^AV5ZXv{0O1&3_jw~$#ysoMGsQ` zdRnLA2peb`P#i}|&QU?vY=?@LVx*ZdmxJ-AlB%n2WvRfv%rxXxM$4-)kp^ndi;C{s zu$}^TtAmNBLD+0?qp&Vn&j6wVtFiS0K-PNuXAn@>> ") - if i == "q": - return - exec(i) - except: - print("An error caused & captured") - -if __name__ == '__main__': - print("Welcome to AiraPulsar Client") - window.start() - horizontal_indicator() - marking_lines() - observer() - console() - input("任意键以退出") - window.kill() - exit() \ No newline at end of file diff --git a/pulsar/main.py b/pulsar/main.py index cbd8b7d..312643b 100644 --- a/pulsar/main.py +++ b/pulsar/main.py @@ -1,29 +1,30 @@ import vgl -import time +import colorama +import os +import importlib.util window = vgl.Window(title="Pulsar", size=(1024, 768)) -def horizontal_indicator(): - global window - frame = vgl.Frame().attach(window_object=window, poscale=(0, 0), clone_name="Horizontal Indicator") - vgl.elements.Line(ends=[(0.4, 0.5), (0.6, 0.5)], color="green").attach(frame_object=frame) - pass +def loader(): + components_dir = "components" + for i in os.listdir(components_dir): + if i.endswith(".py") and (not i.startswith("__")): + module_name = i[:-3] + module_path = os.path.join(components_dir, i) -def marking_lines(): - global window - frame = vgl.Frame().attach(window_object=window, poscale=(0,0), clone_name="Marking Line") - lines = list() - for i in range(0, 24): - lines.append(vgl.elements.Line(ends=[(0, i/24), (1, i/24)], color="green").attach(frame_object=frame)) - for i in range(0, 32): - lines.append(vgl.elements.Line(ends=[(i/32, 0), (i/32, 1)], color="green").attach(frame_object=frame)) - @window.observerize - def observer(info): - if info["delta"] == "key": - print(info) - for i in lines: - i.set_color('#' + str((info['cursor']['position'][0] + info['cursor']['position'][1]*100 + info['cursor']['position'][0]*10000) % 999999).zfill(6)) - observer() + spec = importlib.util.spec_from_file_location(module_name, module_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + try: + if hasattr(module, "main") and callable(module.main): + print(f"[ .... ] Starting {module.name} module") + try: + module.main(window=window) + print(f"[{colorama.Fore.GREEN} OK {colorama.Style.RESET_ALL}] Started {module.name} module") + except Exception as e: + print(f"[{colorama.Fore.RED}FAILED{colorama.Style.RESET_ALL}] Failed to start {module_name} module: {e}") + except: + print(f"Unsupported module: {module_name}.py") def console(): print("You've entered Pulsar's command console, an embbedded Python interpreter for debugging & testing") @@ -37,11 +38,11 @@ def console(): print("An error occured & captured") if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.abspath(__file__))) print("Welcome to AiraPulsar Client") window.start() - horizontal_indicator() - marking_lines() + loader() console() - input("任意键以退出") + print("Quitting") window.kill() exit() \ No newline at end of file diff --git a/pulsar/tester.py b/pulsar/tester.py new file mode 100644 index 0000000..0a93c8a --- /dev/null +++ b/pulsar/tester.py @@ -0,0 +1,22 @@ +import os +import importlib.util + +def run_components(): + components_dir = "components" + for filename in os.listdir(components_dir): + if filename.endswith(".py") and filename != "__init__.py": + module_name = filename[:-3] # 去掉 .py 后缀 + module_path = os.path.join(components_dir, filename) + + spec = importlib.util.spec_from_file_location(module_name, module_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + if hasattr(module, "main") and callable(module.main): + print(f"正在调用 {module_name}.main()") + module.main() + else: + print(f"{module_name}.py 中没有找到 main 函数或 main 不是可调用对象。") + +if __name__ == "__main__": + run_components() \ No newline at end of file diff --git a/vgl/__pycache__/__init__.cpython-312.pyc b/vgl/__pycache__/__init__.cpython-312.pyc index 8168771e5271141526eabc73e9d6dc6b00a01b80..fe2824fcc94acf9d317c6670e547598f2868cec2 100644 GIT binary patch delta 24 ecmX@We1MtzG%qg~0}u$!{WOvLFr)Fr^B)0IR0swD delta 24 ecmX@We1MtzG%qg~0}yDx{Wy{PFr(4L^B)0MdI)U* diff --git a/vgl/__pycache__/basic_elements.cpython-312.pyc b/vgl/__pycache__/basic_elements.cpython-312.pyc index 8189dedc412079c7515f8b35c1ff302ef0360d60..e31f818bd40df5637c3d8a19ebbeda6800cfffb2 100644 GIT binary patch delta 178 zcmV;j08Rg(IiNWW%MA?*00000JeKljB(V*|0RaY+(gBVE36o(0`2h>FTLXOo0S&X+ z1StXm5R(H3{Q(8D0SHL}0TYu;3Dp4?vmpu+0Rb7aGz)+M0UVRH4AB7+vxg0t0s%R* zArL140X?%x5e@+cK>z>%b0CvW5gW635()tUMYDqwAprqOv!xVC0Rc|4?-dLI0aLU5 g76SnRSF#u`0RdaHFBv8Q0XVZ(8Xp1y1e10gDk?xMegFUf delta 178 zcmV;j08Rg(IiNWW%MA?*00000BJ1&IBe4y{0RaV*(gBVE2$Nv~`2h;ETLXOo0SvR* z1StXm50e82{Q(5C0SHL}0TPo-3Dp4>vmpu+0Rb4ZGz)+M0UMLG4AB7*vxg0t0s%O) zArL140X(xw5e@+cKmY&$b0CvW5gW635()tUM6-hvAprqNv!xVC0Rc_3?-dLI0aCO4 g76SnRR diff --git a/vgl/__pycache__/main.cpython-312.pyc b/vgl/__pycache__/main.cpython-312.pyc index e2649c03ce03d7bdc81f504bee40a654e667dc59..c342b1f9946a8af5a4c0e85029350df906f1aa50 100644 GIT binary patch delta 5236 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 olb)QTZA}&?{8Mp-<6j92T)TZ&;S4c delta 1616 zcmZ9Me{2**6vuD2ch_sL?X^O{f~AK-+wEP8#bQl=p+pN6DXq3e5Lvf(bM2bzF1+1q zEz$J+5e(2MWmMoFHPIj?!NgolOpJ+|=pSG-0sqiV)cCK7M*l>OI^WrrAeY={-^_b6 zZ|1!>@1Oazhia}=S67DQ@2_9}n0&c$vF3JmVzK#Tc#i3nAAI$Q#`IEs*4$A|n){KwGs}q@ON+Jr;rJSx+J@l~Fw3KE0#N z2=UR<)wT!N{HT=mY8uDXKHza+KX3r(knqbND^SkNaKdT)a(8*u3Pr=xfP!UZglk1bo;7*9Z(W(LL&>jTrh0>)h9y3(-VsudI z{pgIDFK{;qjS6Jc%@F6dAD+lt9zBcg;b=L}KC@iJW5o$Vy5fYmEi<$riXG$gvsg!1 zm$)UD!IlN+aRPFI8&?i4g}nI*S%9|fc&2ALwrdzS#mDqCVqqGSVtw2h`kK~+8!6m#c(t(Cj@tzn<1nHuJZCmyv zb%-;a4UNxZLEPn@kueYBuzFeWCXTCx;#y}Ddtdz7`RQFM@?lc*C<9smUXfUNM#seu z+tTbqQF-rAX}nTB;#YW6#LcYq=SN4CNT;R7FO&0>kdk~g!(vs}M)r}|)@9b|+K{@L zd{ZZ+md=QGrS9X>mt7aN5jCS+?@)V8a*ytY6doBH9HlT83}77PGqM%9L48&@6E3G2 zPA)wMiz1+supmC`-f+L_0BXZZD`!m0YJ=&E(#pk-vMQHr5(ht8yHAyI`?P7T%`kJZ#<*vAz!N>yYT_v+HkO z+$*&!0X;81@4HXC8WMl^?VaC=WjDGCsUlPtdJ~E%KzT>~1?6@M5`s+U0GyvL02hHu z0R1a?amOG5i}LTH<-8R7zPj$@cyZwOXsCXJxZI!3L9fSE7YN!zg`A+*0Q3kya-_fu sTxG(KF28iuo>YM=7yozb$9kuoY$4D4>5|-l$-g@!&TUVLYui)*0S-Hd0ssI2