├── .gitattributes ├── .gitignore ├── LICENSE ├── PythonUniverseLauncher.dpr ├── PythonUniverseLauncher.dproj ├── PythonUniverseLauncher.dsv ├── PythonUniverseLauncher.iss ├── PythonUniverseLauncher.mes ├── PythonUniverseLauncher.prjmgc ├── PythonUniverseLauncher.res ├── README.md ├── images └── PythonUniverseLauncher.png ├── uMainForm.dfm └── uMainForm.pas /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ 70 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jim McKeeth 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.dpr: -------------------------------------------------------------------------------- 1 | program PythonUniverseLauncher; 2 | 3 | uses 4 | Vcl.Forms, 5 | uMainForm in 'uMainForm.pas' {MainForm}, 6 | Vcl.Themes, 7 | Vcl.Styles; 8 | 9 | {$R *.res} 10 | 11 | begin 12 | Application.Initialize; 13 | Application.MainFormOnTaskbar := True; 14 | TStyleManager.TrySetStyle('Glow'); 15 | Application.CreateForm(TMainForm, MainForm); 16 | Application.Run; 17 | end. 18 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | True 4 | Application 5 | Release 6 | VCL 7 | PythonUniverseLauncher.dpr 8 | Win32 9 | {83CFD83E-B778-45C5-B906-68F71BD819AC} 10 | 20.2 11 | 1 12 | PythonUniverseLauncher 13 | 14 | 15 | true 16 | 17 | 18 | true 19 | Base 20 | true 21 | 22 | 23 | true 24 | Base 25 | true 26 | 27 | 28 | true 29 | Cfg_1 30 | true 31 | true 32 | 33 | 34 | true 35 | Base 36 | true 37 | 38 | 39 | true 40 | Cfg_2 41 | true 42 | true 43 | 44 | 45 | PythonUniverseLauncher 46 | Glow|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Glow.vsf 47 | .\$(Platform)\$(Config) 48 | .\$(Platform)\$(Config) 49 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 50 | $(BDS)\bin\delphi_PROJECTICON.ico 51 | 52 | 53 | true 54 | Debug 55 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 56 | vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 57 | $(BDS)\bin\default_app.manifest 58 | true 59 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 60 | 1033 61 | 62 | 63 | true 64 | true 65 | DEBUG;$(DCC_Define) 66 | true 67 | true 68 | false 69 | true 70 | true 71 | 72 | 73 | PerMonitorV2 74 | true 75 | false 76 | true 77 | 1033 78 | 79 | 80 | 0 81 | RELEASE;$(DCC_Define) 82 | false 83 | 0 84 | 85 | 86 | PerMonitorV2 87 | true 88 | 1033 89 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=2.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=2.0.0.0;Comments= 90 | 3 91 | 2 92 | true 93 | 2 94 | 95 | 96 | 97 | MainSource 98 | 99 | 100 |
MainForm
101 | dfm 102 |
103 | 104 | Base 105 | 106 | 107 | Cfg_1 108 | Base 109 | 110 | 111 | Cfg_2 112 | Base 113 | 114 |
115 | 116 | Delphi.Personality.12 117 | Application 118 | 119 | 120 | 121 | PythonUniverseLauncher.dpr 122 | 123 | 124 | Embarcadero Standard Components 125 | Embarcadero C++Builder Office 2000 Servers Package 126 | Embarcadero C++Builder Office XP Servers Package 127 | Microsoft Office 2000 Sample Automation Server Wrapper Components 128 | Microsoft Office XP Sample Automation Server Wrapper Components 129 | QRDesign design-time 130 | (untitled) 131 | (untitled) 132 | TMS BIZ Core Library - Design-Time Package 133 | GraphQL for Delphi - Design-Time Package 134 | TMS Logging - Design-Time Package 135 | (untitled) 136 | TMS iCL 137 | TMS iCL Designtime 138 | TMS Sparkle - Design-Time Package 139 | TMS Aurelius - Design-Time Package 140 | TMS RemoteDB - Design-Time Package 141 | TMS XData - Design-Time Package 142 | TMS Scripter - Design-Time Package 143 | TMS Scripter - Memo Design-Time Package 144 | TMS Sphinx - Design-Time Package 145 | 146 | 147 | 148 | False 149 | False 150 | False 151 | False 152 | False 153 | False 154 | True 155 | False 156 | 157 | 158 | 12 159 | 160 | 161 | 162 | 163 |
164 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.dsv: -------------------------------------------------------------------------------- 1 | [ClosedView_QzpcVXNlcnNcaWFuXERvY3VtZW50c1xFbWJhcmNhZGVyb1xTdHVkaW9cMjMuMFxDYXRhbG9nUmVw 2 | b3NpdG9yeVxET1NDb21tYW5kLTEyXHBhY2thZ2VzXDExQW5kQWJvdmVcRGVscGhpXERPU0NvbW1h 3 | bmREUi5kcGs=] 4 | Module=C:\Users\ian\Documents\Embarcadero\Studio\23.0\CatalogRepository\DOSCommand-12\packages\11AndAbove\Delphi\DOSCommandDR.dpk 5 | CursorX=1 6 | CursorY=33 7 | TopLine=1 8 | LeftCol=1 9 | Elisions= 10 | Bookmarks= 11 | EditViewName= 12 | 13 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Script Studio Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | #define MyAppName "Embarcadero Python Universe Launcher" 5 | #define MyAppVersion "1.05" 6 | #define MyAppPublisher "Embarcadero Technologies" 7 | #define MyAppURL "https://www.embarcadero.com/" 8 | #define MyAppExeName "PythonUniverseLauncher.exe" 9 | 10 | [Setup] 11 | ; NOTE: The value of AppId uniquely identifies this application. 12 | ; Do not use the same AppId value in installers for other applications. 13 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 14 | AppId={{D14D643C-450A-4E4A-B529-E57AA4DEA791} 15 | AppName={#MyAppName} 16 | AppVersion={#MyAppVersion} 17 | ;AppVerName={#MyAppName} {#MyAppVersion} 18 | AppPublisher={#MyAppPublisher} 19 | AppPublisherURL={#MyAppURL} 20 | AppSupportURL={#MyAppURL} 21 | AppUpdatesURL={#MyAppURL} 22 | DefaultDirName={pf}\{#MyAppName} 23 | DefaultGroupName={#MyAppName} 24 | OutputDir=.\Win32\Release 25 | OutputBaseFilename=PythonUniverse 26 | Compression=lzma 27 | SolidCompression=yes 28 | 29 | [Languages] 30 | Name: "english"; MessagesFile: "compiler:Default.isl" 31 | 32 | [Tasks] 33 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 34 | 35 | [Files] 36 | Source: ".\Win32\Release\PythonUniverseLauncher.exe"; DestDir: "{app}"; Flags: ignoreversion 37 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 38 | 39 | [Icons] 40 | Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 41 | Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 42 | 43 | [Run] 44 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 45 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.mes: -------------------------------------------------------------------------------- 1 | [GeneralSettings] 2 | MesVersion=4 3 | HandleExceptions=0 4 | LinkInCode=1 5 | AppendMapFileToBinary=1 6 | NoOwnMadExceptSettings=0 7 | CheckFileCrc=1 8 | CheckForFrozenMainThread=0 9 | FreezeTimeout=60000 10 | ReportLeaks=0 11 | WindowsLogo=0 12 | CrashOnBuffer=0 13 | CrashOnUnderrun=0 14 | AutomaticallySaveBugReport=1 15 | AutoSaveBugReportIfNotSent=1 16 | AutomaticallyMailBugReport=0 17 | AutoMailProgressBox=0 18 | CopyBugReportToClipboard=0 19 | SuspendAllRunningThreads=0 20 | ShowPleaseWaitBox=1 21 | PleaseWaitIcon=plwait1 22 | AutomaticallyContinueApplication=0 23 | AutomaticallyRestartApplication=0 24 | AutomaticallyCloseApplication=0 25 | SendInBackground=1 26 | SendHelper=196608 27 | Send32Icon=send321 28 | UploadViaHttp=0 29 | HttpServer= 30 | HttpSsl=0 31 | HttpPort=0 32 | HttpAccount= 33 | HttpPassword= 34 | UploadToFogBugz=0 35 | UploadToBugZilla=0 36 | UploadToMantis=0 37 | BugTrackerAccount= 38 | BugTrackerPassword= 39 | BugTrackerProject= 40 | BugTrackerArea= 41 | BugTrackerAssignTo= 42 | MailAsSmtpServer=0 43 | MailAsSmtpClient=0 44 | SmtpServer= 45 | SmtpSsl=0 46 | SmtpTls=0 47 | SmtpPort=0 48 | SmtpAccount= 49 | SmtpPassword= 50 | MailViaMapi=1 51 | MailViaMailto=1 52 | MailAddress=ian.barker@gmail.com 53 | BugReportFile=bugreport.txt 54 | AttachBugReport=1 55 | AttachBugReportFile=1 56 | DeleteBugReportFile=1 57 | BugReportSendAs=bugreport.txt 58 | BugReportZip= 59 | ScreenShotDepth=8 60 | ScreenShotAppOnly=0 61 | ScreenShotSendAs=screenshot.png 62 | ScreenShotZip= 63 | AdditionalAttachments= 64 | AppendBugReports=1 65 | BugReportFileSize=100000 66 | DontSaveDuplicateExceptions=1 67 | DontSaveDuplicateFreezings=1 68 | DuplicateExceptionDefinition=1 69 | DuplicateFreezeDefinition=2 70 | ShowExceptionBox=1 71 | OkBtnText=&OK 72 | DetailsBtnText=&Details 73 | PleaseWaitTitle=Information 74 | PleaseWaitText=Please wait a moment... 75 | BugTrackerTitle=%25appname%25, %25exceptMsg%25 76 | BugTrackerDescr=error details: %0d%0a%25errorDetails%25 77 | MailSubject=bug report 78 | MailBody=please find the bug report attached 79 | SendBoxTitle=Sending bug report... 80 | PrepareAttachMsg=Preparing attachments... 81 | MxLookupMsg=Searching for mail server... 82 | ConnectMsg=Connecting to server... 83 | SendMailMsg=Sending mail... 84 | FieldsMsg=Setting fields... 85 | SendAttachMsg=Sending attachments... 86 | SendFinalizeMsg=Finalizing... 87 | MailFailureMsg=Sorry, sending the bug report didn't work. 88 | VersionVariable= 89 | [ExceptionBox] 90 | ShowButtonMailBugReport=1 91 | ShowButtonSaveBugReport=0 92 | ShowButtonPrintBugReport=0 93 | ShowButtonShowBugReport=1 94 | ShowButtonContinueApplication=1 95 | ShowButtonRestartApplication=1 96 | ShowButtonCloseApplication=1 97 | IconButtonSendBugReport=send1 98 | IconButtonSaveBugReport=save1 99 | IconButtonPrintBugReport=print1 100 | IconButtonShowBugReport=show1 101 | IconButtonContinueApplication=continue1 102 | IconButtonCantContinueApplication=cantContinue1 103 | IconButtonRestartApplication=restart1 104 | IconButtonCloseApplication=close1 105 | FocusedButton=0 106 | SendAssistant=SendAssistant 107 | SaveAssistant=SaveAssistant 108 | PrintAssistant=PrintAssistant 109 | AutomaticallyShowBugReport=0 110 | NoOwnerDrawButtons=0 111 | BigExceptionIcon=big1 112 | TitleBar=%25appname%25 113 | ExceptionMessage=An error occurred in the application. 114 | FrozenMessage=The application seems to be frozen. 115 | BitFaultMsg=The file "%25modname%25" seems to be corrupt! 116 | MailBugReportText=send bug report 117 | SaveBugReportText=save bug report 118 | PrintBugReportText=print bug report 119 | ShowBugReportText=show bug report 120 | ContinueApplicationText=continue application 121 | RestartApplicationText=restart application 122 | CloseApplicationText=close application 123 | [BugReport] 124 | ListThreads=1 125 | ListModules=1 126 | ListHardware=1 127 | ShowCpuRegisters=1 128 | ShowStackDump=1 129 | Disassembly=1 130 | HideUglyItems=0 131 | ShowRelativeAddrs=1 132 | ShowRelativeLines=1 133 | FormatDisassembly=0 134 | LimitDisassembly=5 135 | EnabledPlugins=modules|processes|hardware 136 | [Filters] 137 | Filter1ExceptionClasses=EDBEditError 138 | Filter1DontCreateBugReport=1 139 | Filter1DontCreateScreenshot=1 140 | Filter1DontSuspendThreads=1 141 | Filter1DontCallHandlers=1 142 | Filter1ShowBox=3 143 | Filter1Assis= 144 | Filter2ExceptionClasses= 145 | Filter2DontCreateBugReport=0 146 | Filter2DontCreateScreenshot=0 147 | Filter2DontSuspendThreads=0 148 | Filter2DontCallHandlers=0 149 | Filter2ShowBox=0 150 | Filter2Assis= 151 | GeneralDontCreateBugReport=0 152 | GeneralDontCreateScreenshot=0 153 | GeneralDontSuspendThreads=0 154 | GeneralDontCallHandlers=0 155 | GeneralShowBox=0 156 | GeneralAssis= 157 | [Assistants] 158 | Assistant1=SendAssistant|Send Assistant|ContactForm|DetailsForm|ScrShotForm 159 | Assistant2=SaveAssistant|Save Assistant|ContactForm|DetailsForm 160 | Assistant3=PrintAssistant|Print Assistant|ContactForm|DetailsForm 161 | Forms1=TPF0%0eTMEContactForm%0bContactForm%07Message%0c%13%00%00%00Contact Information%08MinWidth%04%00%00%00%00%08OnAction%0c%1b%00%00%00madExcept.HandleContactForm%05Timer%04%00%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%08%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%08INVLabel%06Label1%07Caption%0c%0a%00%00%00your name:%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%08NameEdit%07Colored%09%07Enabled%09%05Lines%04%01%00%00%00%08Optional%09%0aOutputName%0c%0c%00%00%00contact name%0aOutputType%07%09nvoHeader%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%08INVLabel%06Label2%07Caption%0c%0b%00%00%00your email:%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%09EmailEdit%07Colored%09%07Enabled%09%05Lines%04%01%00%00%00%08Optional%08%0aOutputName%0c%0d%00%00%00contact email%0aOutputType%07%09nvoHeader%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%0bINVCheckBox%08MemCheck%07Caption%0c%0b%00%00%00remember me%07Checked%08%07Enabled%09%0aOutputName%0c%00%00%00%00%07Spacing%04%00%00%00%00%00%00%00 162 | Forms2=TPF0%0eTMEDetailsForm%0bDetailsForm%07Message%0c%0d%00%00%00Error Details%08MinWidth%04%00%00%00%00%08OnAction%0c%00%00%00%00%05Timer%04%00%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%08INVLabel%06Label1%07Caption%0c,%00%00%00what were you doing when the error occurred?%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%0bDetailsMemo%07Colored%09%07Enabled%09%05Lines%04%09%00%00%00%08Optional%08%0aOutputName%0c%0d%00%00%00error details%0aOutputType%07%0dnvoOwnSection%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%00 163 | Forms3=TPF0%0eTMEScrShotForm%0bScrShotForm%0dActiveControl%07%0bContinueBtn%07Message%0c%18%00%00%00Screenshot Configuration%08MinWidth%04%00%00%00%00%08OnAction%0c%1e%00%00%00madExcept.HandleScreenshotForm%05Timer%04%fa%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%08%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%0bINVCheckBox%0bAttachCheck%07Caption%0c%25%00%00%00attach a screenshot to the bug report%07Checked%09%07Enabled%09%0aOutputName%0c%00%00%00%00%07Spacing%04%00%00%00%00%00%00%08INVImage%0aScrShotImg%06Border%09%09Clickable%09%07Enabled%09%04File%0c%00%00%00%00%06Height%04%00%00%00%00%07Spacing%04%00%00%00%00%05Width%04%00%00%00%00%00%00%08INVLabel%06Label1%07Caption%0c%15%00%00%00(click to edit image)%07Enabled%09%07Spacing%04%00%00%00%00%00%00%00 164 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.prjmgc: -------------------------------------------------------------------------------- 1 | [Settings] 2 | AutoLibSuffix=0 3 | ClearChildAppSettings=0 4 | ClearChildPackageSettings=0 5 | ClearChildVersionInfo=0 6 | NormalizeDproj=1 7 | SplitDproj=0 8 | EnableMissingPlatforms=1 9 | RemoveUnusedPlatforms=1 10 | RefreshFormType=0 11 | RemoveExcludedPackages=1 12 | RemoveDeployment=1 13 | RemoveUWP=1 14 | 15 | -------------------------------------------------------------------------------- /PythonUniverseLauncher.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Embarcadero/PythonUniverse/ec2488df66d762800169570eff9be796a78abf4c/PythonUniverseLauncher.res -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PythonUniverse 2 | Embarcadero's Python Universe Installer 3 | 4 | ![PythonUniverseLauncher](/images/PythonUniverseLauncher.png) 5 | 6 | Simplifies the installation of 7 | * The latest Python 8 | * [PyScripter](https://www.embarcadero.com/free-tools/pyscripter/free-download) IDE 9 | * [Python GUI Development](https://pythongui.org/) eBook 10 | * Access to Embarcadero's [Python YouTube Playlist](https://www.youtube.com/playlist?list=PLwUPJvR9mZHhtW2q12PpuFhEHabUlN1Po) 11 | * DelphiVCL and DelphiFMX libraries 12 | * [RAD Studio](https://www.embarcadero.com/products/rad-studio) for Python form visual design 13 | 14 | Python has enjoyed an incredible rise to prominence over the last decade, thanks to its ease of use, versatility, and the robustness of its scientific, data analysis, and web frameworks. Despite this, one area where Python has traditionally struggled is in the creation of graphical user interfaces (GUIs). Today, we're going to explore a solution to this challenge: PythonUniverse, an all-in-one installer that provides powerful tools and resources for Python GUI development. 15 | 16 | # What is PythonUniverse? 17 | PythonUniverse is an installer package that takes the legwork out of setting up a Python development environment. With PythonUniverse, you don't need to worry about individually installing and configuring various components. Everything you need is bundled together in one convenient package, including: 18 | 19 | * The latest Python interpreter: Stay up-to-date with the most recent Python release and enjoy all the new features and improvements that the Python community has to offer. 20 | * PyScripter IDE: An open-source Python Integrated Development Environment (IDE) that offers a multitude of features like code completion, syntax highlighting, and advanced editing tools. 21 | * Python GUI Development eBook: A comprehensive guide to creating Python GUI applications, perfect for beginners and experienced programmers alike. 22 | * Access to Embarcadero's Python YouTube Playlist: A wealth of video tutorials and educational content on Python programming, presented by industry experts. 23 | * DelphiVCL and DelphiFMX libraries: Powerful libraries for creating robust and visually appealing GUI applications in Python. 24 | * RAD Studio for Python form visual design: A state-of-the-art visual designer for creating Python GUI applications with ease and efficiency. 25 | 26 | # Simplifying the Installation Process 27 | One of the standout features of PythonUniverse is the streamlined installation process it offers. Instead of having to download, install, and configure multiple components separately, you can now do it all in one fell swoop. No more compatibility issues or configuration headaches! PythonUniverse ensures all the components work seamlessly together, freeing you to focus on what matters most: writing great Python code. 28 | 29 | # Harnessing DelphiVCL and DelphiFMX Libraries for GUI Development 30 | PythonUniverse comes bundled with two powerful libraries for GUI development: DelphiVCL and DelphiFMX. 31 | 32 | DelphiVCL (Visual Component Library) is a set of visual components for rapid development of Windows applications in Python. It provides an efficient way to create visually rich and data-intensive applications. 33 | 34 | On the other hand, DelphiFMX (FireMonkey) is a cross-platform framework designed for teams that want to create stunning, high-performance applications for Windows, macOS, iOS, and Android with a single codebase. 35 | 36 | Both libraries are renowned for their efficiency and ease of use, enabling developers to quickly and easily build GUI applications in Python. They allow Python developers to leverage the power of Delphi's visual design tools, enabling rapid GUI development without sacrificing the flexibility and power of Python. 37 | 38 | Ready to get started? 39 | With PythonUniverse, Python programmers are no longer left behind when it comes to GUI development. By providing a simplified setup process and a suite of powerful tools and resources, PythonUniverse empowers Python developers to create visually stunning and high-performance GUI applications with ease. 40 | 41 | Whether you're a seasoned Python developer or just starting your coding journey, PythonUniverse is a game-changer. It allows you to leverage the power and flexibility of Python while also tapping into the visual design capabilities of Delphi. Give it a try and elevate your Python GUI development process to new heights! 42 | 43 | [Download the latest release](https://github.com/Embarcadero/PythonUniverse/releases) 44 | (*Please note this project was sponsored by Time Systems and the installer is code-signed by them*). 45 | 46 | -------------------------------------------------------------------------------- /images/PythonUniverseLauncher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Embarcadero/PythonUniverse/ec2488df66d762800169570eff9be796a78abf4c/images/PythonUniverseLauncher.png -------------------------------------------------------------------------------- /uMainForm.pas: -------------------------------------------------------------------------------- 1 | unit uMainForm; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.jpeg, 8 | Vcl.ExtCtrls, DosCommand, System.Net.URLClient, System.Net.HttpClient, 9 | System.Net.HttpClientComponent, Vcl.ComCtrls, System.IOUtils, Registry; 10 | 11 | type 12 | TMainForm = class(TForm) 13 | UniverseImage: TImage; 14 | PyScripterButton: TButton; 15 | VideoTutorialsButton: TButton; 16 | eBookButton: TButton; 17 | PythonButton: TButton; 18 | RADStudioButton: TButton; 19 | DelphiVCLButton: TButton; 20 | DelphiFMXButton: TButton; 21 | CMD: TDosCommand; 22 | NetHTTPClient: TNetHTTPClient; 23 | ProgressBar: TProgressBar; 24 | PythonComboBox: TComboBox; 25 | PyScripterComboBox: TComboBox; 26 | PythonGUIButton: TButton; 27 | ConsoleMemo: TMemo; 28 | procedure PyScripterButtonClick(Sender: TObject); 29 | procedure VideoTutorialsButtonClick(Sender: TObject); 30 | procedure eBookButtonClick(Sender: TObject); 31 | procedure DelphiVCLButtonClick(Sender: TObject); 32 | procedure DelphiFMXButtonClick(Sender: TObject); 33 | procedure RADStudioButtonClick(Sender: TObject); 34 | procedure PythonButtonClick(Sender: TObject); 35 | procedure NetHTTPClientRequestCompleted(const Sender: TObject; 36 | const AResponse: IHTTPResponse); 37 | procedure NetHTTPClientRequestError(const Sender: TObject; 38 | const AError: string); 39 | procedure NetHTTPClientRequestException(const Sender: TObject; 40 | const AError: Exception); 41 | procedure NetHTTPClientReceiveData(const Sender: TObject; AContentLength, 42 | AReadCount: Int64; var AAbort: Boolean); 43 | procedure FormCreate(Sender: TObject); 44 | procedure PythonComboBoxSelect(Sender: TObject); 45 | procedure PyScripterComboBoxSelect(Sender: TObject); 46 | procedure PythonGUIButtonClick(Sender: TObject); 47 | procedure CMDNewLine(ASender: TObject; const ANewLine: string; 48 | AOutputType: TOutputType); 49 | private 50 | { Private declarations } 51 | FFilename: String; 52 | procedure AsyncInstall(AURL: string; AFilename: string); 53 | procedure EnableDownloads(AMessage: string); 54 | procedure DisableDownloads; 55 | public 56 | { Public declarations } 57 | end; 58 | 59 | var 60 | MainForm: TMainForm; 61 | 62 | implementation 63 | 64 | {$R *.dfm} 65 | 66 | function ReadPythonPath(RegistryKey: String): String; 67 | var 68 | Reg: TRegistry; 69 | begin 70 | Reg := TRegistry.Create(KEY_READ); 71 | try 72 | Reg.RootKey := HKEY_CURRENT_USER; 73 | 74 | if Reg.OpenKey(RegistryKey, False) then 75 | begin 76 | try 77 | if Reg.ValueExists('') then 78 | begin 79 | Result := Reg.ReadString(''); 80 | end 81 | else 82 | Result := ''; 83 | finally 84 | Reg.CloseKey; 85 | end; 86 | end 87 | else 88 | Result := ''; 89 | finally 90 | Reg.Free; 91 | end; 92 | 93 | end; 94 | 95 | function GetPythonPath: String; 96 | begin 97 | var InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.11\InstallPath'); 98 | if InstallPath='' then 99 | InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.10\InstallPath'); 100 | if InstallPath='' then 101 | InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.9\InstallPath'); 102 | if InstallPath='' then 103 | InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.8\InstallPath'); 104 | if InstallPath='' then 105 | InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.7\InstallPath'); 106 | if InstallPath='' then 107 | InstallPath := ReadPythonPath('\SOFTWARE\Python\PythonCore\3.6\InstallPath'); 108 | Result := InstallPath; 109 | end; 110 | 111 | procedure TMainForm.AsyncInstall(AURL: string; AFilename: string); 112 | begin 113 | DisableDownloads; 114 | NetHTTPClient.Asynchronous := True; 115 | FFilename := TPath.Combine(TPath.GetDownloadsPath,AFilename); 116 | NetHTTPClient.Get(AURL); 117 | end; 118 | 119 | procedure TMainForm.EnableDownloads(AMessage: string); 120 | begin 121 | MainForm.Caption := MainForm.Hint + ': ' + AMessage; 122 | ProgressBar.Visible := False; 123 | PyScripterButton.Enabled := True; 124 | VideoTutorialsButton.Enabled := True; 125 | eBookButton.Enabled := True; 126 | PythonButton.Enabled := True; 127 | RADStudioButton.Enabled := True; 128 | DelphiVCLButton.Enabled := True; 129 | DelphiFMXButton.Enabled := True; 130 | PythonGUIButton.Enabled := True; 131 | end; 132 | 133 | procedure TMainForm.FormCreate(Sender: TObject); 134 | begin 135 | if (TOSVersion.Architecture = arIntelX86) OR (TOSVersion.Architecture = arARM32) then 136 | begin 137 | PyScripterComboBox.ItemIndex := 1; 138 | PyScripterComboBoxSelect(Self); 139 | PythonComboBox.ItemIndex := 1; 140 | PythonComboBoxSelect(Self); 141 | end 142 | else if (TOSVersion.Architecture = arIntelX64) OR (TOSVersion.Architecture = arARM64) then 143 | begin 144 | PyScripterComboBox.ItemIndex := 0; 145 | PyScripterComboBoxSelect(Self); 146 | PythonComboBox.ItemIndex := 0; 147 | PythonComboBoxSelect(Self); 148 | end; 149 | end; 150 | 151 | procedure TMainForm.DisableDownloads; 152 | begin 153 | PyScripterButton.Enabled := False; 154 | VideoTutorialsButton.Enabled := False; 155 | eBookButton.Enabled := False; 156 | PythonButton.Enabled := False; 157 | RADStudioButton.Enabled := False; 158 | DelphiVCLButton.Enabled := False; 159 | DelphiFMXButton.Enabled := False; 160 | PythonGUIButton.Enabled := False; 161 | ProgressBar.Visible := True; 162 | end; 163 | 164 | procedure TMainForm.PythonGUIButtonClick(Sender: TObject); 165 | begin 166 | CMD.CommandLine := 'cmd /c "start '+PythonGUIButton.Hint+'"'; 167 | CMD.Execute; 168 | end; 169 | 170 | procedure TMainForm.CMDNewLine(ASender: TObject; const ANewLine: string; 171 | AOutputType: TOutputType); 172 | begin 173 | ConsoleMemo.Lines.Append(ANewLine); 174 | end; 175 | 176 | procedure TMainForm.DelphiFMXButtonClick(Sender: TObject); 177 | begin 178 | ConsoleMemo.Visible := True; 179 | CMD.CommandLine := 'cmd /c "'+GetPythonPath+'python -m '+DelphiFMXButton.Hint+'"'; 180 | CMD.Execute; 181 | end; 182 | 183 | procedure TMainForm.DelphiVCLButtonClick(Sender: TObject); 184 | begin 185 | ConsoleMemo.Visible := True; 186 | CMD.CommandLine := 'cmd /c "'+GetPythonPath+'python -m '+DelphiVCLButton.Hint+'"'; 187 | CMD.Execute; 188 | end; 189 | 190 | procedure TMainForm.eBookButtonClick(Sender: TObject); 191 | begin 192 | AsyncInstall(eBookButton.Hint,'Getting_Started_with_Python_GUI_Development.pdf'); 193 | end; 194 | 195 | procedure TMainForm.NetHTTPClientReceiveData(const Sender: TObject; 196 | AContentLength, AReadCount: Int64; var AAbort: Boolean); 197 | begin 198 | TThread.Synchronize(nil,procedure begin 199 | ProgressBar.StepIt; 200 | end); 201 | end; 202 | 203 | procedure TMainForm.NetHTTPClientRequestCompleted(const Sender: TObject; 204 | const AResponse: IHTTPResponse); 205 | begin 206 | var LMemoryStream := TMemoryStream.Create; 207 | try 208 | LMemoryStream.LoadFromStream(AResponse.ContentStream); 209 | LMemoryStream.SaveToFile(FFilename); 210 | finally 211 | LMemoryStream.Free; 212 | end; 213 | 214 | EnableDownloads('Download complete!'); 215 | 216 | CMD.CommandLine := 'cmd /c "'+FFilename+'"'; 217 | CMD.Execute; 218 | end; 219 | 220 | procedure TMainForm.NetHTTPClientRequestError(const Sender: TObject; 221 | const AError: string); 222 | begin 223 | EnableDownloads(AError); 224 | end; 225 | 226 | procedure TMainForm.NetHTTPClientRequestException(const Sender: TObject; 227 | const AError: Exception); 228 | begin 229 | EnableDownloads(AError.Message); 230 | end; 231 | 232 | procedure TMainForm.PyScripterButtonClick(Sender: TObject); 233 | begin 234 | ASyncInstall(PyScripterButton.Hint,PyScripterComboBox.Items[PyScripterComboBox.ItemIndex]); 235 | end; 236 | 237 | procedure TMainForm.PyScripterComboBoxSelect(Sender: TObject); 238 | begin 239 | case PyScripterComboBox.ItemIndex of 240 | 0: PyScripterButton.Hint := 'https://downloads.sourceforge.net/project/pyscripter/PyScripter-v5.1/PyScripter-5.1.3-x64-Setup.exe?ts=gAAAAABkZRVS7pmQa1H5KZU4j6ceDjzYW9Amh5qeDpuH_KhrXaDPBs3KuZ5kmWJqUutPvC_S7xru9PkhdUu-jV7nFWXzlu9RFg%3D%3D&use_mirror=gigenet&r='; 241 | 1: PyScripterButton.Hint := 'https://downloads.sourceforge.net/project/pyscripter/PyScripter-v5.1/PyScripter-5.1.3-x86-Setup.exe?ts=gAAAAABkZRXPGyi6Sb5fBk3euOs1lZuIlG6ljIHq_EW3bs2NETTw2Ti9fVnYuEmaSFaocd9eSawhQsTSAwWTZVtwTbDwWM-SgA%3D%3D&use_mirror=versaweb&r='; 242 | end; 243 | end; 244 | 245 | procedure TMainForm.PythonButtonClick(Sender: TObject); 246 | begin 247 | ASyncInstall(PythonButton.Hint,PythonComboBox.Items[PythonComboBox.ItemIndex]); 248 | end; 249 | 250 | procedure TMainForm.PythonComboBoxSelect(Sender: TObject); 251 | begin 252 | case PythonComboBox.ItemIndex of 253 | 0: PythonButton.Hint := 'https://www.python.org/ftp/python/3.14.0/python-3.14.0a4-amd64.exe'; 254 | 1: PythonButton.Hint := 'https://www.python.org/ftp/python/3.14.0/python-3.14.0a4.exe'; 255 | 3: PythonButton.Hint := 'https://www.python.org/ftp/python/3.11.3/python-3.11.3-amd64.exe'; 256 | 4: PythonButton.Hint := 'https://www.python.org/ftp/python/3.11.3/python-3.11.3.exe'; 257 | 5: PythonButton.Hint := 'https://www.python.org/ftp/python/3.10.11/python-3.10.11-amd64.exe'; 258 | 6: PythonButton.Hint := 'https://www.python.org/ftp/python/3.10.11/python-3.10.11.exe'; 259 | end; 260 | end; 261 | 262 | procedure TMainForm.RADStudioButtonClick(Sender: TObject); 263 | begin 264 | CMD.CommandLine := 'cmd /c "start '+RADStudioButton.Hint+'"'; 265 | CMD.Execute; 266 | end; 267 | 268 | procedure TMainForm.VideoTutorialsButtonClick(Sender: TObject); 269 | begin 270 | CMD.CommandLine := 'cmd /c "start '+VideoTutorialsButton.Hint+'"'; 271 | CMD.Execute; 272 | end; 273 | 274 | end. 275 | --------------------------------------------------------------------------------