Jump to content

All Activity

This stream auto-updates     

  1. Past hour
  2. Maybe something like: Func CPU() Local $sCPU = Input("Location?", "Please Define Server Location?", "") If @error Then Return EndFunc Func MEMORY() Local $sMemory = Input("Location?", "Please Define Server Location?", "") If @error Then Return EndFunc Func STORAGE() Local $sStorage = Input("Location?", "Please Define Server Location?", "") If @error Then Return EndFunc Func Input($1 = "", $2 = "", $3 = "") $input = InputBox($1, $2, $3) If @error = 3 Then MsgBox("", "ERROR!", "ERROR: " & @error & " The InputBox Failed To Open! Please Exit & Re-Open Template Generator!") If @error = 4 Then MsgBox("", "FAILED!", "The InputBox Failed To Open! Please Exit & Re-Open Template Generator!") If Not @error = 1 Then Return SetError(0, 0, $input) Return SetError(1, 0, "") EndFunc ;==>Input
  3. Hello I want to return exitloop to cause my script to stop parsing data if the user cancels an inputbox *I have lots of these inputboxes so I want to just do an over all easy non repetitive @error check for all of the inputboxes where if the user cancels any inputbox it stops parsing pops up a messagebox that says "Template Generation Cancelled!" & continue running normally as if user hadn't pressed anything. *EDIT IS HERE: Is it as simple as returning ExitLoop 2 while wrapping the parsing in a While loop that increments $i at the end to cause it to exit after 1 parse? ex: Func CPU() While $i < 1 ;parse here etc... Input("Server Location?", "Please Define The Server Location:", "") $i += 1 Wend EndFunc Func Input($1, $2, $3) $input = Inputbox($1, $2, $3) If @error = 1 Then Return ExitLoop 2 EndFunc *END OF EDIT I have the following code: #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Description=CNOC Template Generator #AutoIt3Wrapper_Res_Fileversion=1.0.0.8 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p #AutoIt3Wrapper_Res_ProductName=Automatic Template Generator #AutoIt3Wrapper_Res_ProductVersion=1.0.0.0 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Array.au3> #include <GuiStatusBar.au3> #Region ### START Koda GUI section ### Form= $Template_Generator = GUICreate("Template_Generator", 615, 480, 192, 124, BitOR($WS_THICKFRAME, $WS_VISIBLE)) $output = GUICtrlCreateEdit("", 24, 24, 569, 321, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY)) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $generate = GUICtrlCreateButton("Generate Template", 105, 368, 113, 49) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $copyTitle = GUICtrlCreateButton("Copy Title", 235, 368, 69, 22) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $copyCI = GUICtrlCreateButton("Copy CI", 309, 368, 69, 22) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $copyPID = GUICtrlCreateButton("Copy Event ID *NetCool*", 235, 395, 143, 22) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $copyTemplate = GUICtrlCreateButton("Copy Template", 396, 368, 113, 49) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $status = GUICtrlCreateInput(" Status: Program Loaded Successfully!", 0, 430, 615, 25) GUICtrlSetState(-1, 128) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### $priority = "" $cID = "" $loc = "" $node = "" $title = "" $loc = "" $ip = "" $vCenter = "" $tool = "" $osType = "" $machineType = "" $pID = "" $incTitle = "" While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $copyCI If StringInStr($node, "Volume:") Or StringInStr($node, "Virtual:") Or StringInStr($node, "Label:") Then ClipPut(StringReplace($node, StringRight($node, 4), "")) Else ClipPut($node) EndIf GUICtrlSetData($status, " Status: The CI Has Been Copied Successfully!") ;MsgBox("", "Output Copied!", "The Title Has" & @CRLF & " Been Copied Successfully!") Case $copyTitle ClipPut($incTitle) GUICtrlSetData($status, " Status: The Title Has Been Copied Successfully!") ;MsgBox("", "Output Copied!", "The Title Has" & @CRLF & " Been Copied Successfully!") Case $copyPID ClipPut($pID) GUICtrlSetData($status, " Status: The Event ID Has Been Copied Successfully!") ;MsgBox("", "Output Copied!", "The Event ID Has" & @CRLF & " Been Copied Successfully!") Case $copyTemplate ClipPut(GUICtrlRead($output)) GUICtrlSetData($status, " Status: The Output Has Been Copied Successfully!") ;MsgBox("", "Output Copied!", "The Output Has" & @CRLF & " Been Copied Successfully!") Case $generate GUICtrlSetData($output, "") Local $clip = ClipGet() $splitClip = StringSplit($clip, @CRLF) ;_ArrayDisplay($splitClip) If UBound($splitClip) > 3 Then If StringInStr($splitClip[3], "Message:") Then $title = StringStripWS(StringSplit($splitClip[3], "Message:", 1)[2], 3) ;MsgBox("", "", $title) If StringInStr($title, "CPU") Then CPU() ElseIf StringInStr($title, "Volume") Or StringInStr($title, "Virtual") Or StringInStr($title, "Label") Or StringInStr($title, "Datastore") Then STORAGE() ElseIf StringInStr($title, "Memory") Then MEMORY() EndIf Else MsgBox("", "No Data?", "Error! No Data Copied!") EndIf Else MsgBox("", "No Data?", "Error! No Data Copied!") EndIf EndSwitch WEnd Func CPU() ;Parse data here also accept user input as below: Input("Location?", "Please Define Server Location?", "") ;If Not Return ExitLoop continue parsing, otherwise stop parsing. EndFunc Func MEMORY() ;Parse data here also accept user input as below: Input("Location?", "Please Define Server Location?", "") ;If Not Return ExitLoop continue parsing, otherwise stop parsing. EndFunc Func STORAGE() ;Parse data here also accept user input as below: Input("Location?", "Please Define Server Location?", "") ;If Not Return ExitLoop continue parsing, otherwise stop parsing. EndFunc Func Input($1, $2, $3) If $1 = Default Then $1 = "" If $2 = Default Then $2 = "" If $3 = Default Then $3 = "" If $1 = "" Then $1 = "" If $2 = "" Then $2 = "" If $3 = "" Then $3 = "" $input = InputBox($1, $2, $3) If @error = 1 Then Return ExitLoop ; I want this If @error = 3 Then MsgBox("", "ERROR!", "ERROR: " & @error & " The InputBox Failed To Open! Please Exit & Re-Open Template Generator!") If @error = 4 Then MsgBox("", "FAILED!", "The InputBox Failed To Open! Please Exit & Re-Open Template Generator!") If Not @error = 1 Then Return $input EndFunc ;==>Input
  4. Hi everybody First of all, let me paste a part of LarsJ's explanation, found here, it could be related to the issue I'll expose below. I'm facing a problem with the following script because : * each right click on the header displays correctly a header context menu, with correct consolewrite info, even when you don't select any option in the menu : * each right click on a cell doesn't display the corresponding cell context menu : it appears at 1st right click, then if you don't select anything but right click a 2nd time, no menu appears (it would appear at 3rd click, not at 4th etc...) Here is the full script : #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiMenu.au3> #include <WindowsConstants.au3> Global $g_hListView, $g_hHeader, $g_bHeaderMenu = False, $g_bCellMenu = False, $g_iCounter = 0 Example() ;============================================ Func Example() Local $hGUI = GUICreate("Right-click on headers or cells", 400, 200) Local $idListView = GUICtrlCreateListView _ (" Col 0 | Col 1| Col 2| Col 3", 10, 10, 380, 180) $g_hListView = GuiCtrlGetHandle($idListView) $g_hHeader = _GUICtrlListView_GetHeader($idListView) For $iRow = 0 To 9 GUICtrlCreateListViewItem( _ "Row " & $iRow & " / Col 0 |" & _ "Row " & $iRow & " / Col 1 |" & _ "Row " & $iRow & " / Col 2 |" & _ "Row " & $iRow & " / Col 3", $idListView) Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState(@SW_SHOW) While 1 If $g_bHeaderMenu Then ; right click on header => Header context menu ConsoleWrite($g_iCounter & " HD Main A" & @lf) ConsoleWrite("============" & @lf) Header_menu() ConsoleWrite($g_iCounter & " HD Main B" & @lf) ; other code here $g_bHeaderMenu = False EndIf If $g_bCellMenu Then ; right click on any cell => Cell context menu ConsoleWrite($g_iCounter & " LV Main A" & @lf) ConsoleWrite("============" & @lf) Cell_menu() ConsoleWrite($g_iCounter & " LV Main B" & @lf) ; other code here $g_bCellMenu = False EndIf Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIDelete($hGUI) Exit EndSwitch Wend EndFunc ;==>Example ;============================================ Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $g_hListView Switch $iCode Case $NM_RCLICK $g_bCellMenu = True $g_iCounter += 1 ConsoleWrite($g_iCounter & " LV Notify" & @lf) EndSwitch Case $g_hHeader Switch $iCode Case $NM_RCLICK $g_bHeaderMenu = True $g_iCounter += 1 ConsoleWrite($g_iCounter & " HD Notify" & @lf) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY ;============================================ Func Header_menu() ; called by right click on header Local $iMenu_Choice = 0 Local $hMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hMenu, 10, "Header menu", 10) _GUICtrlMenu_InsertMenuItem($hMenu, 15, "", 0) _GUICtrlMenu_InsertMenuItem($hMenu, 20, "Option 1", 20) _GUICtrlMenu_InsertMenuItem($hMenu, 30, "Option 2", 30) $iMenu_Choice = _GUICtrlMenu_TrackPopupMenu($hMenu, $g_hHeader, -1, -1, 1, 1, 2) _GUICtrlMenu_DestroyMenu($hMenu) Switch $iMenu_Choice Case 0, 10 Case 20 Case 30 EndSwitch EndFunc ;==>Header_menu ;============================================ Func Cell_menu() ; called by right click on any cell Local $iMenu_Choice = 0 Local $hMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hMenu, 10, "Cell menu", 10) _GUICtrlMenu_InsertMenuItem($hMenu, 15, "", 0) _GUICtrlMenu_InsertMenuItem($hMenu, 20, "Option 3", 20) _GUICtrlMenu_InsertMenuItem($hMenu, 30, "Option 4", 30) $iMenu_Choice = _GUICtrlMenu_TrackPopupMenu($hMenu, $g_hHeader, -1, -1, 1, 1, 2) _GUICtrlMenu_DestroyMenu($hMenu) Switch $iMenu_Choice Case 0, 10 Case 20 Case 30 EndSwitch EndFunc ;==>Cell_menu What I notice in the compared Console outputs is this : A ) In case of the header menu, the 2nd right click doesn't trigger immediately the WM_NOTIFY message. See this "yellowed" line in the pic ? 1 HD Main B It's the part of the main loop that follows the 1st Header_menu() and it's executed when you right-click for the 2nd time. Immediately after that are triggered : 2 HD Notify 2 HD Main A B ) In case of the cell menu, why don't we have the same line ? 1 LV Main B It's not here (and I don't know why), it seems that the 2nd right-click on a cell triggers immediately the WM_NOTIFY message, without ending first the main loop (as it does in case of header menu) So anyone could explain why these 2 situations are different ? Thanks
  5. Hi, Sorry to bring up this old topic but I fail to find a solution to my problem! Can this functions be used to read a reg_qword value that is set to ffffffffffffffff in hex and 18446744073709551615 in decimal? Its returning -1 for me!
  6. Unfortunately in a domain environment Win32_UserAccount (takes forever to resolve domain users) if your disconnected from the network it works fine or if you only require local users you can use that within the query. Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount Where LocalAccount = True") Couple of days ago I needed to query a couple of hundred user accounts that had profiles on multiple RDS servers and used the following method to get the user accounts: #include <Array.au3> #include <Security.au3> Global $g_aProfileList[0] _UserProfiles(4) _ArrayDisplay($g_aProfileList) ;~ $_vDomain : 0 - All Users on the system ;~ : 1 = NT Authority Users on the system ;~ : 2 = Local Users on the system ;~ : 3 = NT Authority + Local Users on the system ;~ : 4 = Domain Users on the system ;~ : 5 = NT Authority + Domain Users on the system ;~ : 6 = Local + Domain Users on the system Func _UserProfiles($_vDomain = 0) Local $sRegProfileList = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" Local $aAccountSid, $sRegProfileGuid, $i = 1 While 1 $sRegProfileGuid = RegEnumKey($sRegProfileList, $i) If @error Then ExitLoop $aAccountSid = _Security__LookupAccountSid($sRegProfileGuid) If @error Then ContinueLoop If IsArray($aAccountSid) Then While 1 Switch $_vDomain Case 1 If ($aAccountSid[1] <> "NT Authority") Then ExitLoop Case 2 If ($aAccountSid[1] <> @ComputerName) Then ExitLoop Case 3 If Not ($aAccountSid[1] = "NT Authority" Or $aAccountSid[1] = @ComputerName) Then ExitLoop Case 4 If ($aAccountSid[1] = "NT Authority" Or $aAccountSid[1] = @ComputerName) Then ExitLoop Case 5 If $aAccountSid[1] = @ComputerName Then ExitLoop Case 6 If $aAccountSid[1] = "NT Authority" Then ExitLoop EndSwitch ReDim $g_aProfileList[UBound($g_aProfileList) + 1] $g_aProfileList[UBound($g_aProfileList) - 1] = $aAccountSid[0] ExitLoop WEnd EndIf $i += 1 WEnd EndFunc
  7. Today
  8. Just searched Google for "NextCloud Silent Install"
  9. For #1 it is very easy. Just create a GUI with a combo-box and use GUICtrlSetData ($idCombo, $Users) to store the values into the combo For #2, can you run this, see if you get all users this way (show the result if you can) : #include <Constants.au3> Global $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2") Local $Output = "Computer: " & @ComputerName & @CRLF $Output &= "==========================================" & @CRLF Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount") If not IsObj($colItems) then Exit Msgbox(0,"WMI Output","No WMI Objects Found") For $objItem In $colItems $Output &= "Caption: " & $objItem.Caption & @CRLF Next MsgBox ($MB_SYSTEMMODAL,"",$Output)
  10. Hello Subz, thanks for your proposal. Yes this installs the Client, even removing the old versions from the system!! I only wonder, where did you find a reference to those parameters? Or did you simply derive them from MSI installers? Now I will continue to automate the settings for the user. Again thanks a lot! I hope I'm able to return some help into the forum at some point. PS: Sorry for the late answer. First i had a meeting and then i experimented a bit with your command line parameters.
  11. Not sure that this will work in your scenario, but have you tried checking the result of ControlGetFocus, both before and after the timeout?
  12. @Nine Yea, I can provide the entire script but having the 3rd party application called Fusion Dictate is different story.
  13. @seadoggie01 So this is where I'm not entirely sure which one is the bug, however, when it's idle for 30 minutes, I've closed down the Au3 script and then just manually enter or scan in the data to the 3rd party application "Case #" and it works as normal. But when I open up the script again, it still won't send the data or hit the enter key. The best method so far is to close down the 3rd party application and opening it up again for everything to work. As a possible workaround, I'm thinking of doing an idle time check and just sending a blank enter key to the Case # and if possible delete that Case to open up the "Case #" again. My idea below: Global $idleFlag = False While 1    If WinExists($fusionWindowTitle) and WinExists($fusionCaseNumWinTitle) Then       If $idleFlag == False Then          $idleTimeStart = TimerInit()          consoleWrite("IDLE TIME START: "& $idleTimeStart & @CRLF)          $idleFlag = True       Else         $fDiff = TimerDiff($idleTimeStart)         If $fDiff > '1500000' Then ; <== Greater than 25 minutes             WinActivate($fusionCaseNumWinTitle, "")             WinWaitActive($fusionCaseNumWinTitle)             Send("{ENTER}")             $idleFlag = False         EndIf       EndIf    EndIF WEnd
  14. Really hard to say without a script that replicates the problem. But my first reflex (and I might be completely wrong) would be to check credentials conflict between the script and the end-user. You say that shutting down the script and restarting it (with the current user) solves the issue. I would try to put #RequireAdmin at first, see if it is working.
  15. At that point, is it better to try restarting the "Case #" application? It might be the one not responding instead of AutoIt.
  16. @jhcd i will do tests with what you passed me, thanks.
  17. @Danp2 Thanks for the reply, everything runs fine when the system has not been idle for 30 minutes. But when it has been 30+ minutes, the "WinActivate("Case #")" i.e. WinActivate($fusionCaseNumWinTitle, "") works as I can see the handle being properly returned. However, the data will not be inputted nor will the "Enter" key be sent. I've tried hard coding in the "ControlID" after it's been idle for 30 minutes as well, but it still will not work. The code I've tried: ControlSetText("Case #","", "[ID:2362094]", $caseTxt) Send("{ENTER}") I've also tried giving the ControlSetText the handle, but none of these work for the 30-minute idle issue. $hwnd = WinActivate("Case #", "") ControlSetText($hwnd,"", "[ID:2362094]", $caseTxt) Send("{ENTER}") Here is the current Control ID of the field in question. One thing to note is that the "Case #" windows will open and close depending on the end-user as they perform a task. This produces a new Control ID each time a "Case #" window appears and since I didn't have a reliable way to get that control ID, I used the ( TEXT = "" ) which I found from the AutoIt Window Info above. This is always consistent rather than CLASS or CLASSNN which can also change when the 3rd party application is loaded for each end-user. Hence the code below: ControlSetText("Case #","", "", $data) My reasoning for this was from the AutoIT Help documentation listed under "Controls" says TEXT is an option to use. I've tried also to use the "CLASSNN" as well, but yet again on when the application has been idle for 30 minutes it will not send the data or hit enter. $hwnd = WinActivate("Case #", "") ControlSetText($hwnd,"", "[CLASSNN:WindowsForms10.Window.8.app.0.33c0d9d1]", $caseTxt) Send("{ENTER}")
  18. Hi, i have a source code of "Danny35d" and i have 2 main question that are: How to extract this function's results (Datas are as Array) to combo-box without set number of datas? When i type 1, 2 in _SystemUsers($AccountType = 0) to get only Local or Domain users, it just give me both of them, it's old problem of this function, please share us debugged code :)❤ #include <Array.au3> $Users = _ArrayToString(_SystemUsers(), "|", 1) ConsoleWrite($Users & @CRLF) #cs =============================================================================== Function: _SystemUsers($AccountType = 0) Description: Return an array with the local or domain username Parameter(s): $AccountType: Local, domain or both username 0 = Local and Domain usernames 1 = Local usernames only 2 = Domain usernames only Returns: An array with the list of usernames - Succeeded @error 1 - Didn't query any username @error 2 - Failed to create Win32_SystemUsers object @error 3 - Invalid $AccountType Author(s): Danny35d #ce =============================================================================== Func _SystemUsers($AccountType = 0) Local $aSystemUsers Local $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20 Local $colItems = "", $strComputer = "localhost" If Not StringRegExp($AccountType, '[012]') Then Return SetError(3, 3, '') $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SystemUsers", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $Output = StringSplit($objItem.PartComponent, ',') If IsArray($Output) Then $Temp = StringReplace(StringTrimLeft($Output[2], StringInStr($Output[2], '=', 0, -1)), '"', '') If $AccountType = 0 Or ($AccountType = 1 And @ComputerName = $Temp) Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' ElseIf $AccountType = 2 And @ComputerName <> $Temp Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' EndIf EndIf Next $aSystemUsers = StringTrimRight($aSystemUsers, 1) If $aSystemUsers = '' Then Return(SetError(1, 1, $aSystemUsers)) Return(SetError(0, 0, StringSplit($aSystemUsers, '|'))) Else $aSystemUsers = '' Return(SetError(2, 2, $aSystemUsers)) EndIf EndFunc ;==>_SystemUsers Thanks to your best Team.
  19. Why not just read the UDF and save it as ASCII?
  20. I would really like to be able to continue using version 3.3.9.4 because it is the last one that still obfuscates the script after compiled, I know that this does not solve for those with advanced knowledge but it keeps away curious people who decompile scripts, any other way to save the bank of data I have in memory for the hard drive would be welcome but I cannot change the version I use Autoit to do this.
  21. You should upgrade to the latest AutoIt version! You can as well do what you say by dropping the DB table and recreating it from the memory table.
  22. Both Microsoft.XMLDOM and Msxml2.DOMDocument will use the default xml parser on your system, so effectively the same. Use the xml udf by mLipok and more specifically _XML_Tidy to create the indents.
  23. What does $aArray[3] contain? Is it a random port or is it the one you set on UDPOpen? https://www.autoitscript.com/autoit3/docs/functions/UDPOpen.htm Here's a simple script to view the array... #include 'array.au3' UDPStartup() Local $iPort = 2065 Local $sIPAddress = '192.168.1.20' Local $aUDPInfo = UDPOpen($sIPAddress, $iPort) _ArrayDisplay($aUDPInfo) UDPShutdown() BTW, there's an error in the example script on the MyUDP_Client() function. Local $iSocket = UDPOpen($sIPAddress, $iPort) Local $iError = 0 ;<----
  24. I was unable to change to UTF8 + BOM in version 3.3.9.4 of Autoit that I use, there is no simpler way to just save the database that is in memory to the hard drive after having made all the changes to this file that is being executed in the memory?
  25. Hi all, I'm writing a new script for reading/writing xml file. first question: I found different example and I see different ways: ObjCreate("Msxml2.DOMDocument") and ObjCreate("Microsoft.XMLDOM") ? which is the best? second question: $oNodeFile = $oXmlLog.createElement("File") $oNodeRoot.appendChild($oNodeFile) this is working but the output is written in one line (I'm using notepad++) <ROOT><NODE><SUBNODE/></NODE></ROOT> instead of <ROOT> <NODE> <SUBNODE/> </NODE> </ROOT> how can I format the xml in order to see the node indent? Thanks in advance
  26. I have an idea for a website, as I want to make myself a tool but also put it on the web to let others use it but am very new to development and have been teaching myself basic code, mainly python through youtube videos. I am not really sure which is the best coding language to learn to achieve what I want to do? How would I go about making something interactive like this tax calulator but much more thorough, so it can include budgeting, expenditure, and every aspect of a persons finances in a simple tool like this? Any pointers are appreciated, thank you
  1. Load more activity
×
×
  • Create New...