diff --git a/PySimpleGUI.py b/PySimpleGUI.py index f48d8593..6e470560 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -1,5 +1,5 @@ #!/usr/bin/python3 -version = __version__ = "4.32.1.3 Unreleased\nRemoved faking timeout message as it can happen when autoclose used, CLOSE_ATTEMPED_EVENT, fill_color added to draw_arc" +version = __version__ = "4.32.1.12 Unreleased\nRemoved faking timeout message as it can happen when autoclose used, CLOSE_ATTEMPED_EVENT, button_color can have a None parameter, fill_color added to draw_arc, 16x16 icon, Titlebar element, set_option gets custom titlebar option, tons of sh*t for custom titlebars, if running on Trinket then use custom titlebars by default, smarter titlebar handling..auto remove, added key to titlebar image, renamed InputText to Input, massive nngogol Union docstring fix!" __version__ = version.split()[0] # For PEP 396 and PEP 345 @@ -105,7 +105,6 @@ The User Manual and the Cookbook are both designed to paint some nice looking GU """ -import sys # all of the tkinter involved imports import tkinter as tk @@ -115,7 +114,11 @@ from tkinter import ttk import tkinter.scrolledtext as tkst import tkinter.font # end of tkitner specific imports -import datetime +# get the tkinter detailed version +tclversion_detailed = tkinter.Tcl().eval('info patchlevel') + + + import time import pickle import calendar @@ -137,8 +140,7 @@ from math import fabs from functools import wraps try: # Because Raspberry Pi is still on 3.4.... from subprocess import run, PIPE -except: - pass +except: pass from threading import Thread import itertools @@ -150,6 +152,17 @@ try: webbrowser_available = True except: webbrowser_available = False +# used for github upgrades +import sys +import site +import shutil +import hashlib +import base64 +import glob +import configparser +import urllib.request +import urllib.error + warnings.simplefilter('always', UserWarning) @@ -261,6 +274,9 @@ def _timeit_summary(func): # Base64 encoded GIF file DEFAULT_BASE64_ICON = b'R0lGODlhIQAgAPcAAAAAADBpmDBqmTFqmjJrmzJsnDNtnTRrmTZtmzZumzRtnTdunDRunTRunjVvnzdwnzhwnjlxnzVwoDZxoTdyojhzozl0ozh0pDp1pjp2pjp2pzx0oj12pD52pTt3qD54pjt4qDx4qDx5qTx5qj16qj57qz57rD58rT98rkB4pkJ7q0J9rEB9rkF+rkB+r0d9qkZ/rEl7o0h8p0x9pk5/p0l+qUB+sEyBrE2Crk2Er0KAsUKAskSCtEeEtUWEtkaGuEiHuEiHukiIu0qKu0mJvEmKvEqLvk2Nv1GErVGFr1SFrVGHslaHsFCItFSIs1COvlaPvFiJsVyRuWCNsWSPsWeQs2SQtGaRtW+Wt2qVuGmZv3GYuHSdv3ievXyfvV2XxGWZwmScx2mfyXafwHikyP7TPP/UO//UPP/UPf/UPv7UP//VQP/WQP/WQf/WQv/XQ//WRP7XSf/XSv/YRf/YRv/YR//YSP/YSf/YSv/ZS//aSv/aS/7YTv/aTP/aTf/bTv/bT//cT/7aUf/cUP/cUf/cUv/cU//dVP/dVf7dVv/eVv/eV//eWP/eWf/fWv/fW/7cX/7cYf7cZP7eZf7dav7eb//gW//gXP/gXf/gXv/gX//gYP/hYf/hYv/iYf/iYv7iZP7iZf/iZv/kZv7iaP/kaP/ka//ma//lbP/lbv/mbP/mbv7hdP7lcP/ncP/nc//ndv7gef7gev7iff7ke/7kfv7lf//ocf/ocv/odP/odv/peP/pe//ofIClw4Ory4GszoSszIqqxI+vyoSv0JGvx5OxyZSxyZSzzJi0y5m2zpC10pi715++16C6z6a/05/A2qHC3aXB2K3I3bLH2brP4P7jgv7jh/7mgf7lhP7mhf7liv/qgP7qh/7qiP7rjf7sjP7nkv7nlv7nmP7pkP7qkP7rkv7rlv7slP7sl/7qmv7rnv7snv7sn/7un/7sqv7vq/7vrf7wpv7wqf7wrv7wsv7wtv7ytv7zvP7zv8LU48LV5c3a5f70wP7z0AAAACH5BAEAAP8ALAAAAAAhACAAAAj/AP8JHEiwoMGDCA1uoYIF4bhK1vwlPOjlQICLApwVpFTGzBk1siYSrCLgoskFyQZKMsOypRyR/GKYnBkgQbF/s8603KnmWkIaNIMaw6lzZ8tYB2cIWMo0KIJj/7YV9XgGDRo14gpOIUBggNevXpkKGCDsXySradSoZcMmDsFnDxpEKEC3bl2uXCFQ+7emjV83bt7AgTNroJINAq0wWBxBgYHHdgt0+cdnMJw5c+jQqYNnoARkAx04kPEvS4PTqBswuPIPUp06duzcuYMHT55wAjkwEahsQgqBNSQIHy582D9BePTs2dOnjx8/f1gJ9GXhRpTqApFQoDChu3cOAps///9D/g+gQvYGjrlw4cU/fUnYX6hAn34HgZMABQo0iJB/Qoe8UxAXOQiEg3wIXvCBQLUU4mAhh0R4SCLqJOSEBhhqkAEGHIYgUDaGICIiIoossogj6yBUTQ4htNgiCCB4oIJAtJTIyI2MOOLIIxMtQQIJIwQZpAgwCKRNI43o6Igll1ySSTsI7dOECSaUYOWVKwhkiyVMYuJlJpp0IpA6oJRTkBQopHnCmmu2IBA2mmQi5yZ0fgJKPP+0IwoooZwzkDQ2uCCoCywUyoIW/5DDyaKefOLoJ6LU8w87pJgDTzqmDNSMDpzqYMOnn/7yTyiglBqKKKOMUopA7JgCy0DdeMEjUDM71GqrrcH8QwqqqpbiayqToqJKLwN5g45A0/TAw7LL2krGP634aoopp5yiiiqrZLuKK+jg444uBIHhw7g+MMsDFP/k4wq22rririu4xItLLriAUxAQ5ObrwzL/0PPKu7fIK3C8uxz0w8EIIwzMP/cM7HC88hxEzBBCBGGxxT8AwQzDujws7zcJQVMEEUKUbPITAt1D78OSivSFEUXEXATKA+HTscC80CPSQNGEccQRYhjUDzfxcjPPzkgnLVBAADs=' +DEFAULT_BASE64_ICON_16_BY_16 = b'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKCSURBVDhPVZNbSFRRFIb35YwXItBIGtDsiqENEUTRjJlZkJggPSUYBD0UhULElE6hBY6ID/ZSpD1IDxaCEPhUaFLRQyWRNxIJe8syMxCjMCbB07fOsaMt+GftvWf//7/2Whyt1sTei/fCpDqQBTrGOi9Myrk7URwhnQUfQLeOvErJuUQgADlK6gObvAOl5sHx0doHljwARFRiCpxG5J1sjPxALiYNgn9kiQ3gafdYUYzseCd+FICX7sShw7LR++q6cl3XHaXQHFdOJLxFsJtvKHnbUr1nqp01hhStpXAzo7TZZXOjJ+9orT9pY74aY3ZobZZYW8D/GpjM19Ob088fmJxW2tkC4AJt17Oeg2MLrHX6jXWes16w1sbBkrFWBTB2nTLpv5VJg7wGNhRDwCS0tR1cbECkidwMQohAdoScqiz8/FCZUKlPCgSWlQ71elOI1fcco9hCXp1kS7dX3u+qVOm2L4nW8qE4Neetvl8v83NOb++9703BcUI/cU3imuWV7JedKtv5LdFaMRzHLW+N+zJoVDZzRLj6SFNfPlMYwy5bDiRcCojmz15tKx+6hKPv7LvjrG/Q2RoOwjSyzNDlahyzA2dAJeNtFcMHA2cfLn24STNr6P4I728jJ7hvf/lEGuaXLnkRAp0PyFK+hlyLSJGyGWnKyeBi2oJU0IPIjNd15uuL2f2PJgueQBKhVRETCgNeYU+xaeEpnWaw8cQPRM7g/McT8eF0De9u7P+49TqXF7no98BDEEkdvvXem8LAtfJniFRB/A5XeiAiG2+/icgHVQUW5d5KyAhl3M2y+U+ysv1FDukyKGQW3Y+vHJWvU7mz8RJSPZgDd3H2RqiUUn8BSQuaBvGjGpsAAAAASUVORK5CYII=' + + DEFAULT_BASE64_LOADING_GIF = b'R0lGODlhQABAAKUAAAQCBJyenERCRNTS1CQiJGRmZLS2tPTy9DQyNHR2dAwODKyqrFRSVNze3GxubMzKzPz6/Dw6PAwKDKSmpExKTNza3CwqLLy+vHx+fBQWFLSytAQGBKSipERGRNTW1CQmJGxqbLy6vPT29DQ2NHx6fBQSFKyurFRWVOTi5HRydPz+/Dw+PP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCQAsACwAAAAAQABAAAAG/kCWcEgsGo/IpHLJbDqf0CjxwEmkJgepdrvIAL6A0mJLdi7AaMC4zD4eSmlwKduuCwNxdMDOfEw4D0oOeWAOfEkmBGgEJkgphF8ph0cYhCRHeJB7SCgJAgIJKFpnkGtTCoQKdEYGEmgSBlEqipAEEEakcROcqGkSok8PkGCBRhNwcrtICYQJUJnDm0YHASkpAatHK4Qrz8Nf0mTbed3B3wDFZY95kk8QtIS2bQ29r8BPE8PKbRquYBuxpJCwdKhBghUrQpFZAA8AgX2T7DwIACiixYsYM2rc+OSAhwrZOEa5QGHDlw0dLoiEAqEAoQK3VjJxCQmEzCUhzgXciOKE/gIFJ+4NEXBOAEcPyL6UqEBExLkvIjYyiMOAyICnAAZs9IdGgVWsWjWaTON1yAGsUTVOTUOhyLhh5TQi7cqUyIVzKjmiYCBBQtAjNAnZvKmk5cuYhJVc6DAWZd7ETTx6CAm5suXLRQY4sPDTQoqwmIlAADE2DYi0oUUQhbQC8WUQ5wZf9oDVA58KdaPAflqgTgMEXxA0iPIB64c6I9AgiFL624Y2FeLkbtJ82HM2tNPYfmLBOHLlUQJ/6z0POADhUa4+3V7HA/vw58gfEaFBA+qMIt6Su9/UPAL+F4mwWxwwJZGLGitp9kFfHzgAGhIHmhKaESIkB8AIrk1YBAQmDJiQoYYghijiiFAEAQAh+QQJCQApACwAAAAAQABAAIUEAgSEgoREQkTU0tRkYmQ0MjSkpqTs6ux0cnQUEhSMjozc3ty0trT09vRUUlRsamw8OjwMCgxMSkx8fnwcGhyUlpTk5uS8vrz8/vwEBgSMioxERkTc2txkZmQ0NjS0srT08vR0dnQUFhSUkpTk4uS8urz8+vxsbmw8Pjz+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/sCUcEgsGo/IpHLJbDqf0Kh0Sl0aPACAx1DtOh/ZMODhLSMNYjHXzBZi01lPm42BizHz5CAk2YQGSSYZdll4eUUYCHAhJkhvcAWHRiGECGeEa0gNAR4QEw1TA4RZgEcdcB1KBwViBQdSiqOWZ6wABZlIE3ATUhujAAJsj2FyUQK/wWbDcVInvydsumm8UaKjpWWrra+whNBtDRMeHp9UJs5pJ4aSXgMnGxsI2Oz09fb3+Pn6+/xEJh8KRjBo1M/JiARiEowoyIQAIQIMk1T4tXAfBw6aEI5KAArfgjcFFhj58CsLg3zDIhXRUBKABnwc4GAkoqDly3vWxMxLQbLk/kl8tbKoJAJCIyGO+RbUCnlkxC8F/DjsLOLQDsSISRREEBMBKlYlDRgoUMCg49ezaNOqVQJCqtm1Qy5IGAQgw4YLcFOYOGWnA8G0fAmRSVui5c+zx0omM2NBgwYLUhq0zPKWSIMFHCojsUAhiwjIUHKWnPpBAF27H5YEEBOg2mQA80A4ICQBRBJpWVpDAfHabAMUv1BoFkJChGcSUoCXREGEUslZRxoHAB3lQku8Qg7Q/ZWB26HAdgYLmTi5Aru9hPwSqdryKrsLG07fNTJ7soN7IAZwsH2EfUn3ETk1WUVYWbDdKBlQh1Usv0D3VQPLpOHBcAyBIAFt/K31AQrbBqGQWhtBAAAh+QQJCQAyACwAAAAAQABAAIUEAgSEgoTEwsREQkTk4uQsLiykoqRkYmQUEhTU0tRUUlT08vS0srSMjox8enwMCgzMysw8OjwcGhxcWlz8+vy8urxMSkzs6uysqqxsamzc2tyUlpQEBgSMiozExsTk5uQ0NjSkpqRkZmQUFhRUVlT09vS0trSUkpR8fnwMDgzMzsw8PjwcHhxcXlz8/vy8vrxMTkzc3tz+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/kCZcEgsGo/IpHLJbDqf0Kh0Sq1ar8nEgMOxqLBgZCIFKAMeibB6aDGbB2u1i+Muc1xxJSWmoSwpdHUcfnlGJSgIZSkoJUptdXCFRRQrdQArhEcqD24PX0wUmVMOlmUOSiqPXkwLLQ8PLQtTFCOlAAiiVyRuJFMatmVpYIB1jVEJwADCWCWBdsZQtLa4artmvaO2p2oXrhyxVCWVdSvQahR4ViUOZAApDuaSVhQaGvHy+Pn6+/z9/v8AAzrxICJCBBEeBII6YOnAPYVDWthqAfGIgGQC/H3o0OEDEonAKPL7IKHMCI9GQCQD0S+AmwBHVAJjyQ/FyyMgJ/YjUAvA/ggCFjFqDNAxSc46IitOOlqmRS6lQwSIABHhwAuoWLNq3cq1ogcHLVqgyFiFAoMGJ0w8teJBphsQCaWcaFcGwYkwITiV4hAiCsNSB7B4cLYXwpMNye5WcVEgWZkC6ZaUSAQMwUMnFRybqdCEgWYTVUhpBrBtSQfNHZC48BDCgIfIRKxpxrakAWojLjaUNCNhA2wZsh3TVuLZMWgiJRTYgiFKtObSShbQLZUinohkIohkHs25yYnERVRo/iSDQmPHBdYi+Wsp6ZDrjrNH1Uz2SYPpKRocOZ+sQJEQhLnBgQFTlHBWAyZcxoJmEhjRliVw4cMfMP4ZQYEADpDQggMvJ/yWB3zYYQWBZnFBxV4p8mFVAgzLqacQBSf0ZNIJLla0mgGu1ThFEAAh+QQJCQAqACwAAAAAQABAAIUEAgSUkpRERkTMyswkIiTs6uy0trRkZmQ0MjTU1tQcGhykpqRUVlT09vTEwsQsKix8enwMCgycnpzU0tS8vrw8Ojzc3txcXlz8/vwEBgSUlpRMSkzMzswkJiT08vS8urxsamw0NjTc2twcHhysqqz8+vzExsQsLix8fnxkYmT+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/kCVcEgsGo/IpHLJbDqf0Kh0Sq1ar8tEAstdWk4AwMnSLRfBYbF5nUint+tu2w2Ax5OFghMdPt2TBg9hDwZMImgnIn9HH3QAhUxaTw0LCw1WHY4dax6CAA8eVAWOYXplEm4SoqQApl2oaapUmXSbZgW0HaFUBo6QZpQLu1UGub+LWHnIy8zNzs/Q0dLTzSYQFxcoDtRMAwiOCCZJDRwDl88kGawZC0YlEOoAGRDnywPx6wNEHnxpJ8N/SvRjdaLEkAOsDiyjwMrRByEe8NHJADAOhIZ0IAgZgFHcIgYY3TAQYqIjMpAhw4xUEXFdxTUXUwLQKAQhKYXIGsl8CHGg/piXa0p4wvgAA5EG8MLMq4esZEiPRRoMMMGU2QKJbthxQ2LiG51wW5NgcACBwQUIFIyGXcu2bdgGGjZ06LBBQ1UoJg5UqHAAKhcTBByN8OukRApHKe5OcYA1TQbCTC6wuoClQeCGIxQjcYBxm5UAKQM8kdyQshUBKQU8CYERwZURKUc88crKNZIJZRlAmIAEdkjZTkhPPtLAppsDd1GHVO2Ec0PPREoodyTAIBHQIUWPHm5EA0btQxoowKgAaJISwtNcsF7ENyvgRCg0Vgq5iYMDISqkoIDEQkoyRZjgXhojQHcHRyHpYwRcAhBAgAB2LeNfSACyNaBgbqngXUPgGLElHSvVZahCA4fRcYFma3GQGwQciAhNEAAh+QQJCQAwACwAAAAAQABAAIUEAgSEgoTEwsRERkTk4uQkIiSkpqRsamwUEhTU0tT08vSUkpRUUlQ0MjS0trQMCgzMyszs6ux8enwcGhzc2tz8+vyMioxMTkysrqw8OjwEBgSEhoTExsRMSkzk5uQkJiSsqqxsbmwUFhTU1tT09vSUlpRUVlQ0NjS8vrwMDgzMzszs7ux8fnwcHhzc3tz8/vz+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/kCYcEgsGo/IpHLJbDqf0Kh0Sq1ar9hs1sNiebRgowsBACBczJcKA1K9wkxWucxSVgKTOUC0qcCTcnN1SBEnenoZX39iZAApaEcVhod6J35SFSgoJE4EXYpHFpSUAVIqBWUFKlkVIqOHIpdOJHlzE5xXEK+UHFAClChYBruHBlAowMLEesZPtHoiuFa6y2W9UBAtZS2rWK3VsVIkmtJYosuDi1Ekk68n5epPhe4R8VR3rnN8svZTLxAg2vDrR7CgwYMItZAo0eHDhw4l4CVMwgHVoRbXjrygMOLNQQEaXmnISARErQnNCFbQtqsFPBCUUtpbUG0BkRe19EzwaG9A/rUBREa8GkHQIrEWRCgMJcjyKJFvsHjG87kMaMmYBWkus1nEwEmZ9p7tmqBA44gRA/uhCDlq5MQlHJrOaSHgLZOFAwoUGBDRrt+/gAMLhkMiwYiyV0iogCARCwUTbDWYoHBPQmQJjak4eEDpgQMpKxpQarAiCwXOox4QhXLg1YEsDIgxgKKALSUNiKvUXpb5CLVXJKeoqNatCQdiwY2QyH0kAfEnu9syJ0Jiw4dUGxorqNb7SOtRr4+saDeH9BETsqOEHl36yIVXF46MQN15NRQSlstowIzk+K7kMGzW2WdUKAABB90FQEwp8l1g2wX2xfOda0oolkB3YWyw4GBCIfgHHIdCvDdKByAKsd4h5pUIAwkBsNRCdioWoUB7MRoUBAAh+QQJCQAuACwAAAAAQABAAIUEAgSEhoTMzsxMSkykpqQcHhz08vRkYmQUEhSUlpS0trTc3twsLixsbmwMCgzU1tSsrqz8+vycnpyMjoxUUlQkJiRsamwcGhy8vrw0NjR0dnQEBgTU0tSsqqz09vRkZmQUFhScmpy8urzk5uQ0MjR0cnQMDgzc2ty0srT8/vykoqSUkpRUVlQsKiz+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/kCXcEgsGo8RRWlAaSgix6h0Sp2KKoCstiKqer/fkHasTYDP6KFoQ25303BqBNsmV6DxvBFSr0P0gEMNfW0WgYEDhGQDRwsTFhYTC4dTiYpajEQeB2xjBx6URxaXWoZDHiR9JKChRHykAH9DB4oHcQIlJQJRc6R3Qwukk2gcnRscUSKkb0ITpBNpo6VSCZ11ZkS0l7Zo0lmmUQp0YxUKRtq1aQLGyFNJDUxOeEXOl9DqDbqhJ6QnrYDo6nD7l8cDgz4MWBHMYyBglgMGFh46MeHDhwn+JGrcyLGjx48gO3rg8CBiSDQnWBhjkfFkFQUO2jgwF8UACgUmPz6IWcfB/oMjGBBkQYABJAVFFIwYMDEGQc6NBqz1USjk1RhZHAWQ2kUERRsUHrVe4jpk6RgTTzV6IEVVCAamAEwU/XiUUNIjNlGk5bizj0+XVGDKpAl4yoO6WSj8LOzFgwAObRlLnky5suXLEg2o0FCCwF40KU48SEGwg1AtCDrk6XAhywUCrTr0UZ1GNhnYhwycbuMUdGsyF0gHkqBIApoHfRYDKqGoAcrkhzQoKoEmAog2IIRHSSEiQAAR84wQJ2Qcje0xuKOcaDGmhfIiZuughUPg9+spI66TATEiyvnbeaTwwAPhidLHB1IQsBsACKS3kX7YTWGABLlI8BlBEShSIGUQIO6HmRDekIHgh/lh19+HLjzA3hbvfZiEdwpoh+KMjAUBACH5BAkJACYALAAAAABAAEAAhQQCBISGhMzKzERCRDQyNKSmpOzq7GRiZBQSFHRydJyanNTW1LS2tPz6/Dw6PAwODLSytPTy9GxubBweHHx6fKSipNze3AQGBIyKjMzOzExOTDQ2NKyqrOzu7GRmZBQWFHR2dJyenNza3Ly+vPz+/Dw+PP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb+QJNwSCwaj8ikcslsmjoYx+fjwHSc2KyS8QF4vwiGdjxmXL5or5jMXnYQ6TTi2q4bA/F4wM60UDZTGxQWRw55aRt8SSQUhyAkRQ+HaA+KRw0akwAaDUSSmgCVRg0hA1MDCp1ZIKAACUQbrYlFBrGIBlgirV4LQ3ige0QNtnEbqkwSuwASQ2+aD3RDCpoKTgTKBEQMmmtEhpMlTp+tokMMcGkP3UToh+VL46DvQh0BGwgIGwHRkc/W2HW+HQrXJNkuZm2mTarWZIGyXm2GHTKGhRWoV3ZqFcOFBZMmTooaKCiBr0SqMQ0sxgFxzJIiESAI4CMAQoTLmzhz6tzJs6f+z59Ah0SoACJBgQhByXDoAoZD0iwcDjlFIuDAAQFPOzCNM+dIhjMALmRIGkJTiCMe0BxIavAQwiIH1CZNoAljka9exJI1iySDVaxJneV5gPQpk6h5Chh2UqAdAASKFzvpEKJoCH6SM2vezLmz58+gQ7fhsOHCBQeR20SAwKDwzbZf3o4ZgQ7BiJsFDqXOEiFeV0sCEZGBEGcqHxKaIGkhngaCJRJg41xQnkWwF8IuiQknM+LTg9tMBAQIADhJ7sRtOrDGfIRE3C8HWhqB7UV2Twx6lhQofWHDbp8TxDGBaEIgl4d8nwWYxoAEmvALGsEQ6J5aCIYmHnkNZqghgUEBAAAh+QQJCQAnACwAAAAAQABAAIUEAgSEgoRERkTEwsTk4uRkYmQ0MjQUFhRUVlTU1tT08vSkpqQMCgxMTkzMysxsbmz8+vzs6uwcHhxcXlzc3tysrqwEBgSEhoRMSkzExsRkZmQ8OjwcGhxcWlzc2tz09vSsqqwMDgxUUlTMzsx0dnT8/vzs7uz+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG/sCTcEgsGo/IpHLJbA5NjozJSa02RxiAFiAYWb/g08Ky3VoW4TRzxCiXLV613Jh1lwVzJ4RCgCQjdnZTeUkZImQAFiIZRxmBbgOERyUkjyQlRQOPZZFIFCAVHmGVmyRFgJtag0UUAncUVpqpAJ1Drpt4RhQHdgewVHWpGEUOiHZwR7d2uU0fbbMWfkRjx2hGHqkJTtizWqLEylwOSAup1kzc3d9GERlSShWpIE4fxpvRaumB2k7BuHPh7lSRlapWml29flEhZYkQARF31lGBwNANCWmEPIAAwS9MhgaILDQwKEnSHgoYS6pcqRJCSpZzMhTgBeBAAZIwrXzo8AjB/oecXxQYSGVgFdAmCLohODoEhAELFjacE+KoGy2mD+w8IJLU6lKgIB6d42C15tENjwwMKatFQc4SqTCdYAvALcwS9t7IpdntwNGhgdQK4en1aNhA5wjOwrkyq5utXJUyFbLgqQUDU4UIJWp3MhMFXe0gMOqZyYAJZAFwmMC4dBMIP13Lnk27tu3buHPnSYABKoaOYRwUKMBIZYJnWhgAtzIiZBxJ/rQw+6KhTIGSEPImkvulgPWSeI+9pNJcC7KS0bmoGTFhwnNJx8sod10BAYIKTRLcErD86IUyAeiGhAn2WECagCeMYMd7CJ5A4BsHIhgAgA0eUd99FWao4YYcAy4RBAA7OEloRWRqYW9jdzhOTjdUeHV4MTVCcmpRRWxDKzdGSWtiWnV5UUlCY0t5QTlKYmUzU25OM3ArSDd0K3JOMEtOTw==' PSG_DEBUGGER_LOGO = b'R0lGODlhMgAtAPcAAAAAADD/2akK/4yz0pSxyZWyy5u3zZ24zpW30pG52J250J+60aC60KS90aDC3a3E163F2K3F2bPI2bvO3rzP3qvJ4LHN4rnR5P/zuf/zuv/0vP/0vsDS38XZ6cnb6f/xw//zwv/yxf/1w//zyP/1yf/2zP/3z//30wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAyAC0AAAj/AP8JHEiwoMGDCBMqXMiwoUOFAiJGXBigYoAPDxlK3CigwUGLIAOEyIiQI8cCBUOqJFnQpEkGA1XKZPlPgkuXBATK3JmRws2bB3TuXNmQw8+jQoeCbHj0qIGkSgNobNoUqlKIVJs++BfV4oiEWalaHVpyosCwJidw7Sr1YMQFBDn+y4qSbUW3AiDElXiWqoK1bPEKGLixr1jAXQ9GuGn4sN22Bl02roo4Kla+c8OOJbsQM9rNPJlORlr5asbPpTk/RP2YJGu7rjWnDm2RIQLZrSt3zgp6ZmqwmkHAng3ccWDEMe8Kpnw8JEHlkXnPdh6SxHPILaU/dp60LFUP07dfRq5aYntohAO0m+c+nvT6pVMPZ3jv8AJu8xktyNbw+ATJDtKFBx9NlA20gWU0DVQBYwZhsJMICRrkwEYJJGRCSBtEqGGCAQEAOw==' @@ -410,6 +426,12 @@ EVENT_TIMEOUT = TIMEOUT_EVENT = TIMEOUT_KEY = '__TIMEOUT__' WIN_CLOSED = WINDOW_CLOSED = None WINDOW_CLOSE_ATTEMPTED_EVENT = WIN_X_EVENT = WIN_CLOSE_ATTEMPTED_EVENT = '-WINDOW CLOSE ATTEMPTED-' +TITLEBAR_MINIMIZE_KEY = '__TITLEBAR MINIMIZE__' +TITLEBAR_MAXIMIZE_KEY = '__TITLEBAR MAXIMIZE__' +TITLEBAR_CLOSE_KEY = '__TITLEBAR CLOSE__' +TITLEBAR_IMAGE_KEY = '__TITLEBAR IMAGE__' +TITLEBAR_DO_NOT_USE_AN_ICON = '__TITLEBAR_NO_ICON__' + # Key indicating should not create any return values for element WRITE_ONLY_KEY = '__WRITE ONLY__' @@ -418,6 +440,9 @@ MENU_KEY_SEPARATOR = '::' ENABLE_TK_WINDOWS = False +USE_CUSTOM_TITLEBAR = False +TITLEBAR_METADATA_MARKER = 'This window has a titlebar' + SUPPRESS_ERROR_POPUPS = False SUPPRESS_RAISE_KEY_ERRORS = False SUPPRESS_KEY_GUESSING = False @@ -438,6 +463,14 @@ SYMBOL_LEFT = '◄' SYMBOL_DOWN = '▼' SYMBOL_X = '❎' +if sum([int(i) for i in tclversion_detailed.split('.')]) > 19: + SYMBOL_TITLEBAR_MINIMIZE = '_' + SYMBOL_TITLEBAR_MAXIMIZE = '◻' + SYMBOL_TITLEBAR_CLOSE = 'X' +else: + SYMBOL_TITLEBAR_MINIMIZE = '_' + SYMBOL_TITLEBAR_MAXIMIZE = 'O' + SYMBOL_TITLEBAR_CLOSE = 'X' # ====================================================================== # # One-liner functions that are handy as f_ck # @@ -445,11 +478,11 @@ SYMBOL_X = '❎' def RGB(red, green, blue): """ Given integer values of Red, Green, Blue, return a color string "#RRGGBB" - :param red: Red portion from 0 to 255 + :param red: Red portion from 0 to 255 :type red: (int) - :param green: Green portion from 0 to 255 + :param green: Green portion from 0 to 255 :type green: (int) - :param blue: Blue portion from 0 to 255 + :param blue: Blue portion from 0 to 255 :type blue: (int) :return: A single RGB String in the format "#RRGGBB" where each pair is a hex number. :rtype: (str) @@ -646,13 +679,13 @@ class Element(): :param auto_size_text: True if the Widget should be shrunk to exactly fit the number of chars to show :type auto_size_text: bool :param font: specifies the font family, size, etc (see docs for exact formats) - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param background_color: color of background. Can be in #RRGGBB format or a color name "black" :type background_color: (str) :param text_color: element's text color. Can be in #RRGGBB format or a color name "black" :type text_color: (str) :param key: Identifies an Element. Should be UNIQUE to this window. - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -720,8 +753,8 @@ class Element(): self.ParentForm.LastButtonClicked = self.MenuItemChosen self.ParentForm.FormRemainedOpen = True _exit_mainloop(self.ParentForm) - # Window._window_that_exited = self.ParentForm - # self.ParentForm.TKroot.quit() # kick the users out of the mainloop + # Window._window_that_exited = self.ParentForm + # self.ParentForm.TKroot.quit() # kick the users out of the mainloop def _FindReturnKeyBoundButton(self, form): """ @@ -729,8 +762,8 @@ class Element(): "Container Element" is encountered. Func has to walk entire window including these "sub-forms" :param form: the Window object to search - :return: Union[Button, None] Button Object if a button is found, else None if no button found - :rtype: Button Object if a button is found, else None if no button found + :return: Button Object if a button is found, else None + :rtype: Button | None """ for row in form.Rows: for element in row: @@ -767,10 +800,52 @@ class Element(): :param event: """ - self._generic_callback_handler(self.DisplayText) + # If this is a minimize button for a custom titlebar, then minimize the window + if self.Key == TITLEBAR_MINIMIZE_KEY: + if sys.platform == 'linux': + print('* linix minimize *') + self.ParentForm.TKroot.wm_attributes("-type", "normal") + self.ParentForm.TKroot.state('icon') + return + self.ParentForm.maximize() + # self.ParentForm.TKroot.wm_overrideredirect(False) + self.ParentForm.minimize() + self.ParentForm.TKroot.wm_overrideredirect(False) + self.ParentForm.TKroot.deiconify() + self._skip_first_restore_callback = True + self.ParentForm.TKroot.bind('', self._titlebar_restore) + else: + self.ParentForm.TKroot.wm_overrideredirect(False) + self.ParentForm.Minimize() + self.ParentForm.TKroot.bind('', self._titlebar_restore) + elif self.Key == TITLEBAR_MAXIMIZE_KEY: + if self.ParentForm.maximized: + self.ParentForm.normal() + else: + self.ParentForm.maximize() + elif self.Key == TITLEBAR_CLOSE_KEY: + self.ParentForm._OnClosingCallback() + else: + self._generic_callback_handler(self.DisplayText) return + def _titlebar_restore(self, event): + print('restoring') + if sys.platform == 'linux': + if self._skip_first_restore_callback: + self._skip_first_restore_callback = False + return + self.ParentForm.TKroot.unbind('') + + # self.ParentForm.TKroot.wm_overrideredirect(True) + self.ParentForm.TKroot.wm_attributes("-type", "dock") + + else: + self.ParentForm.TKroot.unbind('') + self.ParentForm.TKroot.wm_overrideredirect(True) + self.ParentForm.normal() + def _ReturnKeyHandler(self, event): """ Internal callback for the ENTER / RETURN key. Results in calling the ButtonCallBack for element that has the return key bound to it, just as if button was clicked. @@ -1070,8 +1145,8 @@ class Element(): warnings.warn('You cannot Update element with key = {} until the window has been Read or Finalized'.format(self.Key), UserWarning) if not SUPPRESS_ERROR_POPUPS: popup_error('Unable to complete operation on element with key {}'.format(self.Key), - 'You cannot perform operations (such as calling update) on an Element until Window is read or finalized.', - 'Adding a "finalize=True" parameter to your Window creation will likely fix this.', image=_random_error_icon()) + 'You cannot perform operations (such as calling update) on an Element until Window is read or finalized.', + 'Adding a "finalize=True" parameter to your Window creation will likely fix this.', image=_random_error_icon()) return False @@ -1115,7 +1190,7 @@ class Element(): # ---------------------------------------------------------------------- # # Input Class # # ---------------------------------------------------------------------- # -class InputText(Element): +class Input(Element): """ Display a single text input field. Based on the tkinter Widget `Entry` """ @@ -1140,7 +1215,7 @@ class InputText(Element): :param text_color: color of the text :type text_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param border_width: width of border around element in pixels @@ -1152,9 +1227,9 @@ class InputText(Element): :param do_not_clear: If False then the field will be set to blank after ANY event (button, any event) (Default = True) :type do_not_clear: (bool) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param focus: Determines if initial focus should go to this element. :type focus: (bool) :param pad: Amount of padding to put around element. Normally (horizontal pixels, vertical pixels) but can be split apart further into ((horizontal left, horizontal right), (vertical above, vertical below)) @@ -1168,7 +1243,7 @@ class InputText(Element): :param disabled_readonly_text_color: If state is set to readonly or disabled, the color to use for the text :type disabled_readonly_text_color: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element (Default = True) :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -1211,7 +1286,7 @@ class InputText(Element): :param background_color: change color of the background :type background_color: (str) :param move_cursor_to: Moves the cursor to a particular offset. Defaults to 'end' - :type move_cursor_to: Union[int, str] + :type move_cursor_to: int | str """ if not self._widget_was_created(): # if widget hasn't been created yet, then don't allow return @@ -1262,9 +1337,9 @@ class InputText(Element): # ------------------------- INPUT TEXT Element lazy functions ------------------------- # -In = InputText -Input = InputText -I = InputText +In = Input +InputText = Input +I = Input # ---------------------------------------------------------------------- # @@ -1298,9 +1373,9 @@ class Combo(Element): :param disabled: set disable state for element :type disabled: (bool) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text that will appear when mouse hovers over this element @@ -1308,7 +1383,7 @@ class Combo(Element): :param readonly: make element readonly (user can't change). True means user cannot change :type readonly: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -1344,7 +1419,7 @@ class Combo(Element): :param readonly: if True make element readonly (user cannot change any choices). Enables the element if either choice are made. :type readonly: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param visible: control visibility of element :type visible: (bool) """ @@ -1398,7 +1473,7 @@ class Combo(Element): You should be using values from your call to window.Read instead. Know what you're doing if you use it. :return: Returns the value of what is currently chosen - :rtype: Union[Any, None] + :rtype: Any | None """ try: if self.TKCombo.current() == -1: # if the current value was not in the original list @@ -1451,9 +1526,9 @@ class OptionMenu(Element): :param text_color: color of the text :type text_color: (str) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text that will appear when mouse hovers over this element @@ -1558,7 +1633,7 @@ class Listbox(Element): :param auto_size_text: True if element should be the same size as the contents :type auto_size_text: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param font: specifies the font family, size, etc :param no_scrollbar: ??? :type no_scrollbar: ??? (bool) @@ -1567,15 +1642,15 @@ class Listbox(Element): :param text_color: color of the text :type text_color: (str) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -1616,7 +1691,7 @@ class Listbox(Element): :param disabled: disable or enable state of the element :type disabled: (bool) :param set_to_index: highlights the item(s) indicated. If parm is an int one entry will be set. If is a list, then each entry in list is highlighted - :type set_to_index: Union[int, list, tuple] + :type set_to_index: int | list | tuple :param scroll_to_index: scroll the listbox so that this index is the first shown :type scroll_to_index: (int) :param mode: changes the select mode according to tkinter's listbox widget @@ -1764,11 +1839,11 @@ class Radio(Element): :param text_color: color of the text :type text_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -1917,7 +1992,7 @@ class Checkbox(Element): :param auto_size_text: if True will size the element to match the length of the text :type auto_size_text: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param background_color: color of background :type background_color: (str) :param text_color: color of the text @@ -1929,9 +2004,9 @@ class Checkbox(Element): :param disabled: set disable state :type disabled: (bool) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -2084,15 +2159,15 @@ class Spin(Element): :param auto_size_text: if True will size the element to match the length of the text :type auto_size_text: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param background_color: color of background :type background_color: (str) :param text_color: color of the text :type text_color: (str) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -2209,7 +2284,7 @@ class Spin(Element): set_focus = Element.SetFocus set_tooltip = Element.SetTooltip update = Update - +Sp = Spin # type: Spin # ---------------------------------------------------------------------- # # Multiline # @@ -2251,9 +2326,9 @@ class Multiline(Element): :param do_not_clear: if False the element will be cleared any time the Window.Read call returns :type do_not_clear: (bool) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param write_only: If True then no entry will be added to the values dictionary when the window is read :type write_only: bool :param auto_refresh: If True then anytime the element is updated, the window will be refreshed so that the change is immediately displayed @@ -2269,7 +2344,7 @@ class Multiline(Element): :param focus: if True initial focus will go to this element :type focus: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -2277,7 +2352,7 @@ class Multiline(Element): :param justification: text justification. left, right, center. Can use single characters l, r, c. :type justification: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -2326,7 +2401,7 @@ class Multiline(Element): :param append: if True then new value will be added onto the end of the current value. if False then contents will be replaced. :type append: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param text_color: color of the text :type text_color: (str) :param background_color: color of background @@ -2470,7 +2545,7 @@ class Multiline(Element): Restore a previously re-reouted stdout back to the original destination """ if self.previous_stdout: - sys.stdout = self.previous_stdout + sys.stdout = self.previous_stdout def restore_stderr(self): @@ -2562,11 +2637,11 @@ class Text(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str or int or tuple or object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param grab: If True can grab this element and move the window around. Default is False :type grab: (bool) :param tooltip: text, that will appear when mouse hovers over the element @@ -2604,7 +2679,7 @@ class Text(Element): :param text_color: color of the text :type text_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param visible: set visibility state of the element :type visible: (bool) """ @@ -2673,7 +2748,7 @@ class StatusBar(Element): :param relief: relief style. Values are same as progress meter relief values. Can be a constant or a string: `RELIEF_RAISED RELIEF_SUNKEN RELIEF_FLAT RELIEF_RIDGE RELIEF_GROOVE RELIEF_SOLID` :type relief: (enum) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param text_color: color of the text :type text_color: (str) :param background_color: color of background @@ -2683,11 +2758,11 @@ class StatusBar(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param visible: set visibility state of the element @@ -2724,7 +2799,7 @@ class StatusBar(Element): :param text_color: color of the text :type text_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param visible: set visibility state of the element :type visible: (bool) """ @@ -2751,6 +2826,7 @@ class StatusBar(Element): set_tooltip = Element.SetTooltip update = Update +SBar = StatusBar # ---------------------------------------------------------------------- # # TKProgressBar # @@ -2766,7 +2842,7 @@ class TKProgressBar(): orientation='horizontal', BarColor=(None, None), key=None): """ :param root: The root window bar is to be shown in - :type root: Union[tk.Tk, tk.TopLevel] + :type root: tk.Tk | tk.TopLevel :param max: Maximum value the bar will be measuring :type max: (int) :param length: length in pixels of the bar @@ -2784,7 +2860,7 @@ class TKProgressBar(): :param BarColor: The 2 colors that make up a progress bar. One is the background, the other is the bar :type BarColor: Tuple[str, str] :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object """ self.Length = length @@ -2865,7 +2941,7 @@ class TKOutput(tk.Frame): def __init__(self, parent, width, height, bd, background_color=None, text_color=None, echo_stdout_stderr=False, font=None, pad=None): """ :param parent: The "Root" that the Widget will be in - :type parent: Union[tk.Tk, tk.Toplevel] + :type parent: tk.Tk | tk.Toplevel :param width: Width in characters :type width: (int) :param height: height in rows @@ -2879,7 +2955,7 @@ class TKOutput(tk.Frame): :param echo_stdout_stderr: If True then output to stdout will be output to this element AND also to the normal console location :type echo_stdout_stderr: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) """ @@ -2976,15 +3052,15 @@ class Output(Element): :param echo_stdout_stderr: If True then output to stdout will be output to this element AND also to the normal console location :type echo_stdout_stderr: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -3097,7 +3173,7 @@ class Button(Element): :param button_type: You should NOT be setting this directly. ONLY the shortcut functions set this :type button_type: (int) :param target: key or (row,col) target for the button. Note that -1 for column means 1 element to the left of this one. The constant ThisRow is used to indicate the current row. The Button itself is a valid target for some types of button - :type target: Union[str, Tuple[int, int]] + :type target: str | Tuple[int, int] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param file_types: the filetypes that will be used to match files. To indicate all files: (("ALL Files", "*.*"),). Note - NOT SUPPORTED ON MAC @@ -3115,7 +3191,7 @@ class Button(Element): :param image_filename: image filename if there is a button image. GIFs and PNGs only. :type image_filename: (str) :param image_data: Raw or Base64 representation of the image to put on button. Choose either filename or data - :type image_data: Union[bytes, str] + :type image_data: bytes | str :param image_size: Size of the image in pixels (width, height) :type image_size: (int, int) :param image_subsample: amount to reduce the size of the image. Divides the size by this number. 2=1/2, 3=1/3, 4=1/4, etc @@ -3135,7 +3211,7 @@ class Button(Element): :param use_ttk_buttons: True = use ttk buttons. False = do not use ttk buttons. None (Default) = use ttk buttons only if on a Mac and not with button images :type use_ttk_buttons: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param bind_return_key: If True the return key will cause this button to be pressed :type bind_return_key: (bool) :param focus: if True, initial focus will be put on this button @@ -3143,9 +3219,9 @@ class Button(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -3159,15 +3235,18 @@ class Button(Element): self.Target = target self.ButtonText = str(button_text) # Button colors can be a tuple (text, background) or a string with format "text on background" + bc = button_color if button_color is None: - button_color = DEFAULT_BUTTON_COLOR + bc = DEFAULT_BUTTON_COLOR else: try: if isinstance(button_color,str): - button_color = button_color.split(' on ') + bc = button_color.split(' on ') except Exception as e: print('* cprint warning * you messed up with color formatting', e) - self.ButtonColor = button_color + if bc[1] is None: + bc = (bc[0], theme_button_color()[1]) + self.ButtonColor = bc # experimental code to compute disabled button text color # if disabled_button_color is None: # try: @@ -3230,7 +3309,7 @@ class Button(Element): highlight_color = 'red' return (highlight_color, highlight_background) - # Realtime button release callback + # Realtime button release callback def ButtonReleaseCallBack(self, parm): """ Not a user callable function. Called by tkinter when a "realtime" button is released @@ -3332,6 +3411,7 @@ class Button(Element): target_element, strvar, should_submit_window = self._find_target() filetypes = (("ALL Files", "*.*"),) if self.FileTypes is None else self.FileTypes + if self.BType == BUTTON_TYPE_BROWSE_FOLDER: if sys.platform == 'darwin': # macs don't like seeing the parent window (go firgure) folder_name = tk.filedialog.askdirectory(initialdir=self.InitialFolder) # show the 'get folder' dialog box @@ -3370,7 +3450,7 @@ class Button(Element): elif self.BType == BUTTON_TYPE_SAVEAS_FILE: if sys.platform == 'darwin': file_name = tk.filedialog.asksaveasfilename(defaultextension=self.DefaultExtension, - initialdir=self.InitialFolder) # show the 'get file' dialog box + initialdir=self.InitialFolder) # show the 'get file' dialog box else: file_name = tk.filedialog.asksaveasfilename(filetypes=filetypes,defaultextension=self.DefaultExtension, initialdir=self.InitialFolder, parent=self.ParentForm.TKroot) # show the 'get file' dialog box if file_name: @@ -3394,6 +3474,7 @@ class Button(Element): self.ParentForm.TKroot.destroy() Window._DecrementOpenCount() elif self.BType == BUTTON_TYPE_READ_FORM: # LEAVE THE WINDOW OPEN!! DO NOT CLOSE + # This is a PLAIN BUTTON # first, get the results table built # modify the Results table in the parent FlexForm object if self.Key is not None: @@ -3477,6 +3558,9 @@ class Button(Element): return + + + def Update(self, text=None, button_color=(None, None), disabled=None, image_data=None, image_filename=None, visible=None, image_subsample=None, disabled_button_color=(None, None), image_size=None): """ @@ -3488,7 +3572,7 @@ class Button(Element): :param disabled: disable or enable state of the element :type disabled: (bool) :param image_data: Raw or Base64 representation of the image to put on button. Choose either filename or data - :type image_data: Union[bytes, str] + :type image_data: bytes | str :param image_filename: image filename if there is a button image. GIFs and PNGs only. :type image_filename: (str) :param disabled_button_color: colors to use when button is disabled (text, background). Use None for a color if don't want to change. Only ttk buttons support both text and background colors. tk buttons only support changing text color @@ -3627,7 +3711,7 @@ class ButtonMenu(Element): :param image_filename: image filename if there is a button image. GIFs and PNGs only. :type image_filename: (str) :param image_data: Raw or Base64 representation of the image to put on button. Choose either filename or data - :type image_data: Union[bytes, str] + :type image_data: bytes | str :param image_size: Size of the image in pixels (width, height) :type image_size: (int, int) :param image_subsample: amount to reduce the size of the image. Divides the size by this number. 2=1/2, 3=1/3, 4=1/4, etc @@ -3647,15 +3731,15 @@ class ButtonMenu(Element): :param disabled_text_color: color to use for text when item is disabled. Can be in #RRGGBB format or a color name "black" :type disabled_text_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param item_font: specifies the font family, size, etc, for the menu items - :type item_font: Union[str, Tuple[str, int]] + :type item_font: str | Tuple[str, int] :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tearoff: Determines if menus should allow them to be torn off :type tearoff: (bool) :param visible: set visibility state of the element @@ -3746,7 +3830,7 @@ class ButtonMenu(Element): BMenu = ButtonMenu - +BM = ButtonMenu # ---------------------------------------------------------------------- # # ProgreessBar # @@ -3775,9 +3859,9 @@ class ProgressBar(Element): :param relief: relief style. Values are same as progress meter relief values. Can be a constant or a string: `RELIEF_RAISED RELIEF_SUNKEN RELIEF_FLAT RELIEF_RIDGE RELIEF_GROOVE RELIEF_SOLID` (Default value = DEFAULT_PROGRESS_BAR_RELIEF) :type relief: (str) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param visible: set visibility state of the element @@ -3879,6 +3963,7 @@ class ProgressBar(Element): PBar = ProgressBar Prog = ProgressBar +Progress = ProgressBar # ---------------------------------------------------------------------- # @@ -3894,7 +3979,7 @@ class Image(Element): :param filename: image filename if there is a button image. GIFs and PNGs only. :type filename: (str) :param data: Raw or Base64 representation of the image to put on button. Choose either filename or data - :type data: Union[bytes, str] + :type data: bytes | str :param background_color: color of background :type background_color: :param size: (width, height) size of image in pixels @@ -3902,13 +3987,13 @@ class Image(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param enable_events: Turns on the element specific events. For an Image element, the event is "image clicked" @@ -3944,7 +4029,7 @@ class Image(Element): :param filename: filename to the new image to display. :type filename: (str) :param data: Base64 encoded string OR a tk.PhotoImage object - :type data: Union[str, tkPhotoImage] + :type data: str | tkPhotoImage :param size: size of a image (w,h) w=characters-wide, h=rows-high :type size: Tuple[int,int] :param visible: control visibility of element @@ -3989,7 +4074,7 @@ class Image(Element): Show an Animated GIF. Call the function as often as you like. The function will determine when to show the next frame and will automatically advance to the next frame at the right time. NOTE - does NOT perform a sleep call to delay :param source: Filename or Base64 encoded string containing Animated GIF - :type source: Union[str,bytes] + :type source: str | bytes :param time_between_frames: Number of milliseconds to wait between showing frames :type time_between_frames: (int) """ @@ -4040,7 +4125,7 @@ class Image(Element): Show an Animated GIF. Call the function as often as you like. The function will determine when to show the next frame and will automatically advance to the next frame at the right time. NOTE - does NOT perform a sleep call to delay :param source: Filename or Base64 encoded string containing Animated GIF - :type source: Union[str,bytes] + :type source: str | bytes :param time_between_frames: Number of milliseconds to wait between showing frames :type time_between_frames: (int) """ @@ -4089,7 +4174,7 @@ class Image(Element): set_tooltip = Element.SetTooltip update = Update update_animation = UpdateAnimation - +Im = Image # ---------------------------------------------------------------------- # # Canvas # @@ -4108,13 +4193,13 @@ class Canvas(Element): :param pad: Amount of padding to put around element :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param border_width: width of border around element in pixels. Not normally used with Canvas element @@ -4188,13 +4273,13 @@ class Graph(Element): :param enable_events: If True then clicks on the Graph are immediately reported as an event. Use this instead of change_submits :type enable_events: (bool) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element (Default = True) :type visible: (bool) :param float_values: If True x,y coordinates are returned as floats, not ints @@ -4228,9 +4313,9 @@ class Graph(Element): """ Not user callable. Used to convert user's coordinates into the ones used by tkinter :param x_in: The x coordinate to convert - :type x_in: Union[int, float] + :type x_in: int | float :param y_in: The y coordinate to convert - :type y_in: Union[int, float] + :type y_in: int | float :return: Tuple[int, int] The converted canvas coordinates :rtype: Tuple[int, int] """ @@ -4255,7 +4340,7 @@ class Graph(Element): :param y_in: (int) The y coordinate in canvas coordinates :type y_in: :return: The converted USER coordinates - :rtype: Union[Tuple[int, int], Tuple[float, float]] + :rtype: Tuple[int, int] | Tuple[float, float] """ if None in (x_in, y_in): return None, None @@ -4273,15 +4358,15 @@ class Graph(Element): """ Draws a line from one point to another point using USER'S coordinates. Can set the color and width of line :param point_from: Starting point for line - :type point_from: Union[Tuple[int, int], Tuple[float, float]] + :type point_from: Tuple[int, int] | Tuple[float, float] :param point_to: Ending point for line - :type point_to: Union[Tuple[int, int], Tuple[float, float]] + :type point_to: Tuple[int, int] | Tuple[float, float] :param color: Color of the line :type color: (str) :param width: width of line in pixels :type width: (int) :return: id returned from tktiner or None if user closed the window. id is used when you - :rtype: Union[int, None] + :rtype: int | None """ if point_from == (None, None): return @@ -4302,13 +4387,13 @@ class Graph(Element): Draw a series of lines given list of points :param points: list of points that define the polygon - :type points: List[Union[Tuple[int, int], Tuple[float, float]]] + :type points: List[Tuple[int, int] | Tuple[float, float]] :param color: Color of the line :type color: (str) :param width: width of line in pixels :type width: (int) :return: id returned from tktiner or None if user closed the window. id is used when you - :rtype: Union[int, None] + :rtype: int | None """ converted_points = [self._convert_xy_to_canvas_xy(point[0], point[1]) for point in points] @@ -4325,13 +4410,13 @@ class Graph(Element): """ Draws a "dot" at the point you specify using the USER'S coordinate system :param point: Center location using USER'S coordinate system - :type point: Union [Tuple[int, int], Tuple[float, float]] + :type point: Tuple[int, int] | Tuple[float, float] :param size: Radius? (Or is it the diameter?) in user's coordinate values. - :type size: Union[int, float] + :type size: int | float :param color: color of the point to draw :type color: (str) :return: id returned from tkinter that you'll need if you want to manipulate the point - :rtype: Union[int, None] + :rtype: int | None """ if point == (None, None): return @@ -4359,9 +4444,9 @@ class Graph(Element): """ Draws a circle, cenetered at the location provided. Can set the fill and outline colors :param center_location: Center location using USER'S coordinate system - :type center_location: Union [Tuple[int, int], Tuple[float, float]] + :type center_location: Tuple[int, int] | Tuple[float, float] :param radius: Radius in user's coordinate values. - :type radius: Union[int, float] + :type radius: int | float :param fill_color: color of the point to draw :type fill_color: (str) :param line_color: color of the outer line that goes around the circle (sorry, can't set thickness) @@ -4369,7 +4454,7 @@ class Graph(Element): :param line_width: width of the line around the circle, the outline, in pixels :type line_width: (int) :return: id returned from tkinter that you'll need if you want to manipulate the circle - :rtype: Union[int, None] + :rtype: int | None """ if center_location == (None, None): return @@ -4396,9 +4481,9 @@ class Graph(Element): """ Draws an oval based on coordinates in user coordinate system. Provide the location of a "bounding rectangle" :param top_left: the top left point of bounding rectangle - :type top_left: Union[Tuple[int, int], Tuple[float, float]] + :type top_left: Tuple[int, int] | Tuple[float, float] :param bottom_right: the bottom right point of bounding rectangle - :type bottom_right: Union[Tuple[int, int], Tuple[float, float]] + :type bottom_right: Tuple[int, int] | Tuple[float, float] :param fill_color: color of the interrior :type fill_color: (str) :param line_color: color of outline of oval @@ -4406,7 +4491,7 @@ class Graph(Element): :param line_width: width of the line around the oval, the outline, in pixels :type line_width: (int) :return: id returned from tkinter that you'll need if you want to manipulate the oval - :rtype: Union[int, None] + :rtype: int | None """ converted_top_left = self._convert_xy_to_canvas_xy(top_left[0], top_left[1]) converted_bottom_right = self._convert_xy_to_canvas_xy(bottom_right[0], bottom_right[1]) @@ -4426,9 +4511,9 @@ class Graph(Element): """ Draws different types of arcs. Uses a "bounding box" to define location :param top_left: the top left point of bounding rectangle - :type top_left: Union[Tuple[int, int], Tuple[float, float]] + :type top_left: Tuple[int, int] | Tuple[float, float] :param bottom_right: the bottom right point of bounding rectangle - :type bottom_right: Union[Tuple[int, int], Tuple[float, float]] + :type bottom_right: Tuple[int, int] | Tuple[float, float] :param extent: Andle to end drawing. Used in conjunction with start_angle :type extent: (float) :param start_angle: Angle to begin drawing. Used in conjunction with extent @@ -4440,7 +4525,7 @@ class Graph(Element): :param fill_color: color to fill the area :type fill_color: (str) :return: id returned from tkinter that you'll need if you want to manipulate the arc - :rtype: Union[int, None] + :rtype: int | None """ converted_top_left = self._convert_xy_to_canvas_xy(top_left[0], top_left[1]) converted_bottom_right = self._convert_xy_to_canvas_xy(bottom_right[0], bottom_right[1]) @@ -4463,17 +4548,17 @@ class Graph(Element): Draw a rectangle given 2 points. Can control the line and fill colors :param top_left: the top left point of rectangle - :type top_left: Union[Tuple[int, int], Tuple[float, float]] + :type top_left: Tuple[int, int] | Tuple[float, float] :param bottom_right: the bottom right point of rectangle - :type bottom_right: Union[Tuple[int, int], Tuple[float, float]] + :type bottom_right: Tuple[int, int] | Tuple[float, float] :param fill_color: color of the interior :type fill_color: (str) :param line_color: color of outline :type line_color: (str) :param line_width: width of the line in pixels :type line_width: (int) - :return: Union[int, None] id returned from tkinter that you'll need if you want to manipulate the rectangle - :rtype: Union[int, None] + :return: int | None id returned from tkinter that you'll need if you want to manipulate the rectangle + :rtype: int | None """ converted_top_left = self._convert_xy_to_canvas_xy(top_left[0], top_left[1]) @@ -4498,7 +4583,7 @@ class Graph(Element): Draw a polygon given list of points :param points: list of points that define the polygon - :type points: List[Union[Tuple[int, int], Tuple[float, float]]] + :type points: List[Tuple[int, int] | Tuple[float, float]] :param fill_color: color of the interior :type fill_color: (str) :param line_color: color of outline @@ -4506,7 +4591,7 @@ class Graph(Element): :param line_width: width of the line in pixels :type line_width: (int) :return: id returned from tkinter that you'll need if you want to manipulate the rectangle - :rtype: Union[int, None] + :rtype: int | None """ converted_points = [self._convert_xy_to_canvas_xy(point[0], point[1]) for point in points] @@ -4529,17 +4614,17 @@ class Graph(Element): :param text: text to display :type text: (str) :param location: location to place first letter - :type location: Union[Tuple[int, int], Tuple[float, float]] + :type location: Tuple[int, int] | Tuple[float, float] :param color: text color :type color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param angle: Angle 0 to 360 to draw the text. Zero represents horizontal text :type angle: (float) :param text_location: "anchor" location for the text. Values start with TEXT_LOCATION_ :type text_location: (enum) :return: id returned from tkinter that you'll need if you want to manipulate the text - :rtype: Union[int, None] + :rtype: int | None """ text = str(text) if location == (None, None): @@ -4562,11 +4647,11 @@ class Graph(Element): :param filename: if image is in a file, path and filename for the image. (GIF and PNG only!) :type filename: (str) :param data: if image is in Base64 format or raw? format then use instead of filename - :type data: Union[str, bytes] + :type data: str | bytes :param location: the (x,y) location to place image's top left corner - :type location: Union[Tuple[int, int], Tuple[float, float]] + :type location: Tuple[int, int] | Tuple[float, float] :return: id returned from tkinter that you'll need if you want to manipulate the image - :rtype: Union[int, None] + :rtype: int | None """ if location == (None, None): return @@ -4644,9 +4729,9 @@ class Graph(Element): Moves the entire drawing area (the canvas) by some delta from the current position. Units are indicated in your coordinate system indicated number of ticks in your coordinate system :param x_direction: how far to move in the "X" direction in your coordinates - :type x_direction: Union[int, float] + :type x_direction: int | float :param y_direction: how far to move in the "Y" direction in your coordinates - :type y_direction: Union[int, float] + :type y_direction: int | float """ zero_converted = self._convert_xy_to_canvas_xy(0, 0) shift_converted = self._convert_xy_to_canvas_xy(x_direction, y_direction) @@ -4664,9 +4749,9 @@ class Graph(Element): :param figure: Previously obtained figure-id. These are returned from all Draw methods :type figure: (id) :param x_direction: delta to apply to position in the X direction - :type x_direction: Union[int, float] + :type x_direction: int | float :param y_direction: delta to apply to position in the Y direction - :type y_direction: Union[int, float] + :type y_direction: int | float """ zero_converted = self._convert_xy_to_canvas_xy(0, 0) shift_converted = self._convert_xy_to_canvas_xy(x_direction, y_direction) @@ -4684,9 +4769,9 @@ class Graph(Element): :param figure: Previously obtained figure-id. These are returned from all Draw methods :type figure: (id) :param x: location on X axis (in user coords) to move the upper left corner of the figure - :type x: Union[int, float] + :type x: int | float :param y: location on Y axis (in user coords) to move the upper left corner of the figure - :type y: Union[int, float] + :type y: int | float """ zero_converted = self._convert_xy_to_canvas_xy(0, 0) @@ -4723,7 +4808,7 @@ class Graph(Element): Returns a list of figures located at a particular x,y location within the Graph :param location: point to check - :type location: Union[Tuple[int, int], Tuple[float, float]] + :type location: Tuple[int, int] | Tuple[float, float] :return: a list of previously drawn "Figures" (returned from the drawing primitives) :rtype: List[int] """ @@ -4738,7 +4823,7 @@ class Graph(Element): :param figure: a previously drawing figure :type figure: object :return: upper left x, upper left y, lower right x, lower right y - :rtype: Union[Tuple[int, int, int, int], Tuple[float, float, float, float]] + :rtype: Tuple[int, int, int, int] | Tuple[float, float, float, float] """ box = self.TKCanvas.bbox(figure) top_left = self._convert_canvas_xy_to_xy(box[0], box[1]) @@ -4864,7 +4949,7 @@ class Graph(Element): set_tooltip = Element.SetTooltip tk_canvas = TKCanvas update = Update - +G = Graph # ---------------------------------------------------------------------- # # Frame # @@ -4893,19 +4978,19 @@ class Frame(Element): :param size: (width, height) (note this parameter may not always work) :type size: (int, int) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param border_width: width of border around element in pixels :type border_width: (int) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param element_justification: All elements inside the Frame will have this justification 'left', 'right', 'center' are valid values @@ -4961,7 +5046,7 @@ class Frame(Element): 'The offensive list is:', element, 'This list will be stripped from your layout', - keep_on_top=True + keep_on_top=True ) continue elif callable(element) and not isinstance(element, Element): @@ -5056,7 +5141,7 @@ class Frame(Element): set_focus = Element.SetFocus set_tooltip = Element.SetTooltip update = Update - +Fr = Frame # ---------------------------------------------------------------------- # # Vertical Separator # @@ -5074,9 +5159,9 @@ class VerticalSeparator(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object """ key = key if key is not None else k @@ -5105,9 +5190,9 @@ class HorizontalSeparator(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object """ self.Orientation = 'horizontal' # for now only vertical works @@ -5145,7 +5230,7 @@ class Tab(Element): :param background_color: color of background of the entire layout :type background_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param disabled: If True button will be created disabled @@ -5153,13 +5238,13 @@ class Tab(Element): :param border_width: width of border around element in pixels :type border_width: (int) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param element_justification: All elements inside the Tab will have this justification 'left', 'right', 'center' are valid values @@ -5361,7 +5446,7 @@ class TabGroup(Element): :param background_color: color of background area that tabs are located on :type background_color: (str) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param change_submits: * DEPRICATED DO NOT USE. Use `enable_events` instead :type change_submits: (bool) :param enable_events: If True then switching tabs will generate an Event @@ -5373,9 +5458,9 @@ class TabGroup(Element): :param theme: DEPRICATED - You can only specify themes using set options or when window is created. It's not possible to do it on an element basis :type theme: (enum) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param visible: set visibility state of the element @@ -5507,7 +5592,7 @@ class TabGroup(Element): :param tab_name: name of a tab :type tab_name: str :return: Returns the key or None if no key found - :rtype: Union[key, None] + :rtype: key | None """ for row in self.Rows: for element in row: @@ -5523,7 +5608,7 @@ class TabGroup(Element): are using this method correctly? :return: The key of the currently selected tab or the tab's text if it has no key - :rtype: Union[Any, None] + :rtype: Any | None """ try: @@ -5557,13 +5642,13 @@ class Slider(Element): text_color=None, key=None, k=None, pad=None, tooltip=None, visible=True, metadata=None): """ :param range: slider's range (min value, max value) - :type range: Union[Tuple[int, int], Tuple[float, float]] + :type range: Tuple[int, int] | Tuple[float, float] :param default_value: starting value for the slider - :type default_value: Union[int, float] + :type default_value: int | float :param resolution: the smallest amount the slider can be moved - :type resolution: Union[int, float] + :type resolution: int | float :param tick_interval: how often a visible tick should be shown next to slider - :type tick_interval: Union[int, float] + :type tick_interval: int | float :param orientation: 'horizontal' or 'vertical' ('h' or 'v' also work) :type orientation: (str) :param disable_number_display: if True no number will be displayed by the Slider Element @@ -5581,15 +5666,15 @@ class Slider(Element): :param size: (w=characters-wide, h=rows-high) :type size: (int, int) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param background_color: color of slider's background :type background_color: (str) :param text_color: color of the slider's text :type text_color: (str) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param tooltip: text, that will appear when mouse hovers over the element @@ -5626,9 +5711,9 @@ class Slider(Element): Changes some of the settings for the Slider Element. Must call `Window.Read` or `Window.Finalize` prior :param value: sets current slider value - :type value: Union[int, float] + :type value: int | float :param range: Sets a new range for slider - :type range: Union[Tuple[int, int], Tuple[float, float] + :type range: Tuple[int, int] | Tuple[float, float :param disabled: disable or enable state of the element :type disabled: (bool) :param visible: control visibility of element @@ -5674,6 +5759,7 @@ class Slider(Element): set_tooltip = Element.SetTooltip update = Update +Sl = Slider # ---------------------------------------------------------------------- # # TkFixedFrame (Used by Column) # @@ -5837,11 +5923,11 @@ class Column(Element): :param vertical_scroll_only: if Truen then no horizontal scrollbar will be shown :type vertical_scroll_only: (bool) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param visible: set visibility state of the element :type visible: (bool) :param justification: set justification for the Column itself. Note entire row containing the Column will be affected @@ -6047,9 +6133,9 @@ class Pane(Element): :param border_width: width of border around element in pixels :type border_width: (int) :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -6360,11 +6446,11 @@ class Menu(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param key: Value that uniquely identifies this element from all other elements. Used when Finding an element or in return values. Must be unique to the window - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -6464,7 +6550,7 @@ class Table(Element): key=None, k=None, tooltip=None, right_click_menu=None, visible=True, metadata=None): """ :param values: ??? - :type values: List[List[Union[str, int, float]]] + :type values: List[List[str | int | float]] :param headings: The headings to show on the top line :type headings: List[str] :param visible_column_map: One entry for each column. False indicates the column is not shown @@ -6486,7 +6572,7 @@ class Table(Element): :param row_height: height of a single row in pixels :type row_height: (int) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param justification: 'left', 'right', 'center' are valid choices :type justification: (str) :param text_color: color of the text @@ -6502,9 +6588,9 @@ class Table(Element): :param header_background_color: sets the background color for the header :type header_background_color: (str) :param header_font: specifies the font family, size, etc - :type header_font: Union[str, Tuple[str, int]] + :type header_font: str | Tuple[str, int] :param row_colors: list of tuples of (row, background color) OR (row, foreground color, background color). Sets the colors of listed rows to the color(s) provided (note the optional foreground color) - :type row_colors: List[Union[Tuple[int, str], Tuple[Int, str, str]] + :type row_colors: List[Tuple[int, str] | Tuple[Int, str, str]] :param vertical_scroll_only: if True only the vertical scrollbar will be visible :type vertical_scroll_only: (bool) :param hide_vertical_scroll: if True vertical scrollbar will be hidden @@ -6520,13 +6606,13 @@ class Table(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -6586,7 +6672,7 @@ class Table(Element): Changes some of the settings for the Table Element. Must call `Window.Read` or `Window.Finalize` prior :param values: A new 2-dimensional table to show - :type values: List[List[Union[str, int, float]]] + :type values: List[List[str | int | float]] :param num_rows: How many rows to display at a time :type num_rows: (int) :param visible: if True then will be visible @@ -6596,7 +6682,7 @@ class Table(Element): :param alternating_row_color: the color to make every other row :type alternating_row_color: (str) :param row_colors: list of tuples of (row, background color) OR (row, foreground color, background color). Changes the colors of listed rows to the color(s) provided (note the optional foreground color) - :type row_colors: List[Union[Tuple[int, str], Tuple[Int, str, str]] + :type row_colors: List[Tuple[int, str] | Tuple[Int, str, str]] """ if not self._widget_was_created(): # if widget hasn't been created yet, then don't allow return @@ -6753,7 +6839,7 @@ class Tree(Element): :param enable_events: Turns on the element specific events. Tree events happen when row is clicked :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param justification: 'left', 'right', 'center' are valid choices :type justification: (str) :param text_color: color of the text @@ -6767,7 +6853,7 @@ class Tree(Element): :param header_background_color: sets the background color for the header :type header_background_color: (str) :param header_font: specifies the font family, size, etc - :type header_font: Union[str, Tuple[str, int]] + :type header_font: str | Tuple[str, int] :param num_rows: The number of rows of the table to display at a time :type num_rows: (int) :param row_height: height of a single row in pixels @@ -6775,13 +6861,13 @@ class Tree(Element): :param pad: Amount of padding to put around element (left/right, top/bottom) or ((left, right), (top, bottom)) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: Used with window.FindElement and with return values to uniquely identify this element to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: [Union[List[str],str]]] + :type right_click_menu: List[List[str] | str]] :param visible: set visibility state of the element :type visible: (bool) :param metadata: User metadata that can be set to ANYTHING @@ -6898,13 +6984,13 @@ class Tree(Element): :param values: Representation of the tree :type values: (TreeData) :param key: identifies a particular item in tree to update - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param value: sets the node identified by key to a particular value :type value: (Any) :param text: sets the node identified by ket to this string :type text: (str) :param icon: can be either a base64 icon or a filename for the icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param visible: control visibility of element :type visible: (bool) """ @@ -6978,13 +7064,13 @@ class TreeData(object): :param parent: The parent Node :type parent: (TreeData.Node) :param key: Used to uniquely identify this node - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param text: The text that is displayed at this node's location :type text: (str) :param values: The list of values that are displayed at this node :type values: List[Any] :param icon: just a icon - :type icon: Union[str, bytes] + :type icon: str | bytes """ self.parent = parent # type: TreeData.Node @@ -6992,7 +7078,7 @@ class TreeData(object): self.key = key # type: str self.text = text # type: str self.values = values # type: List[Any] - self.icon = icon # type: Union[str, bytes] + self.icon = icon # type: str | bytes def _Add(self, node): self.children.append(node) @@ -7001,7 +7087,7 @@ class TreeData(object): """ Instantiate the object, initializes the Tree Data, creates a root node for you """ - self.tree_dict = {} # type: Dict[str : TreeData.Node] + self.tree_dict = {} # type: Dict[str, TreeData.Node] self.root_node = self.Node("", "", 'root', [], None) # The root node self.tree_dict[""] = self.root_node # Start the tree out with the root node @@ -7024,13 +7110,13 @@ class TreeData(object): :param parent: the parent Node :type parent: (Node) :param key: Used to uniquely identify this node - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param text: The text that is displayed at this node's location :type text: (str) :param values: The list of values that are displayed at this node :type values: List[Any] :param icon: icon - :type icon: Union[str, bytes] + :type icon: str | bytes """ node = self.Node(parent, key, text, values, icon) @@ -7126,8 +7212,8 @@ class Window: NumOpenWindows = 0 _user_defined_icon = None hidden_master_root = None # type: tk.Tk - _animated_popup_dict = {} - _active_windows = {} # type: Dict[Window:tk.Tk()] + _animated_popup_dict = {} # type: Dict + _active_windows = {} # type: Dict[Window, tk.Tk()] _move_all_windows = False # if one window moved, they will move _window_that_exited = None # type: Window _root_running_mainloop = None # type: tk.Tk() # (may be the hidden root or a window's root) @@ -7176,7 +7262,7 @@ class Window: :param button_color: Default button colors for all buttons in the window :type button_color: Tuple[str, str] or str :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param progress_bar_color: (bar color, background color) Sets the default colors for all progress bars in the window :type progress_bar_color: Tuple[str, str] :param background_color: color of background @@ -7188,7 +7274,7 @@ class Window: :param auto_close_duration: Number of seconds to wait before closing the window :type auto_close_duration: (int) :param icon: Can be either a filename or Base64 value. For Windows if filename, it MUST be ICO format. For Linux, must NOT be ICO - :type icon: Union[str, str] + :type icon: str :param force_toplevel: If True will cause this window to skip the normal use of a hidden master window :type force_toplevel: (bool) :param alpha_channel: Sets the opacity of the window. 0 = invisible 1 = completely visible. Values bewteen 0 & 1 will produce semi-transparent windows in SOME environments (The Raspberry Pi always has this value at 1 and cannot change. @@ -7198,7 +7284,7 @@ class Window: :param use_default_focus: If True will use the default focus algorithm to set the focus to the "Correct" element :type use_default_focus: (bool) :param text_justification: Default text justification for all Text Elements in window - :type text_justification: Union['left', 'right', 'center'] + :type text_justification: 'left' | 'right' | 'center' :param no_titlebar: If true, no titlebar nor frame will be shown on window. This means you cannot minimize the window and it will not show up on the taskbar :type no_titlebar: (bool) :param grab_anywhere: If True can use mouse to click and drag to move the window. Almost every location of the window will work except input fields on some systems @@ -7212,7 +7298,7 @@ class Window: :param disable_minimize: if True the user won't be able to minimize window. Good for taking over entire screen and staying that way. :type disable_minimize: (bool) :param right_click_menu: A list of lists of Menu items to show when this element is right clicked. See user docs for exact format. - :type right_click_menu: List[List[Union[List[str],str]]] + :type right_click_menu: List[List[ List[str] | str ]] :param transparent_color: Any portion of the window that has this color will be completely transparent. You can even click through these spots to the window under this window. :type transparent_color: (str) :param debugger_enabled: If True then the internal debugger will be enabled @@ -7224,7 +7310,7 @@ class Window: :param right_click_menu_disabled_text_color: Text color for disabled right click menu items :type right_click_menu_disabled_text_color: (str) :param right_click_menu_font: Font for right click menus - :type right_click_menu_font: Union[str, Tuple[str, int]] + :type right_click_menu_font: str | Tuple[str, int] :param finalize: If True then the Finalize method will be called. Use this rather than chaining .Finalize for cleaner code :type finalize: (bool) :param element_justification: All elements in the Window itself will have this justification 'left', 'right', 'center' are valid values @@ -7331,6 +7417,16 @@ class Window: self.auto_close_timer_needs_starting = False self.finalize_in_progress = False self.close_destroys_window = not enable_close_attempted_event if enable_close_attempted_event is not None else None + self.override_custom_titlebar = False + + + if USE_CUSTOM_TITLEBAR: + self.Margins = (0,0) + self.NoTitleBar = True + + if no_titlebar is True: + self.override_custom_titlebar = True + if layout is not None and type(layout) not in (list, tuple): warnings.warn('Your layout is not a list or tuple... this is not good!') @@ -7430,6 +7526,10 @@ class Window: element.Position = (CurrentRowNumber, i) element.ParentContainer = self CurrentRow.append(element) + # if this element is a titlebar, then automatically set the window margins to (0,0) and turn off normal titlebar + if element.metadata == TITLEBAR_METADATA_MARKER: + self.Margins = (0,0) + self.NoTitleBar = True # ------------------------- Append the row to list of Rows ------------------------- # self.Rows.append(CurrentRow) @@ -7456,6 +7556,7 @@ class Window: continue self.AddRow(*row) + def Layout(self, rows): """ Second of two preferred ways of telling a Window what its layout is. The other way is to pass the layout as @@ -7468,7 +7569,15 @@ class Window: :return: self so that you can chain method calls :rtype: (Window) """ - self.AddRows(rows) + if USE_CUSTOM_TITLEBAR and not self.override_custom_titlebar: + if self.WindowIcon == DEFAULT_WINDOW_ICON: + icon = DEFAULT_BASE64_ICON_16_BY_16 + else: + icon = self.WindowIcon + new_rows = [Titlebar(title=self.Title,icon=icon, text_color=None, background_color=None, )] + rows + else: + new_rows = rows + self.AddRows(new_rows) self._BuildKeyDict() return self @@ -7478,7 +7587,7 @@ class Window: Adds new rows to an existing container element inside of this window :param container: The container Element the layout will be placed inside of - :type container: (Union[Frame, Column, Tab]) + :type container: Frame | Column | Tab :param rows: The layout to be added :type rows: (List[List[Element]]) :return: (Window) self so could be chained @@ -7716,7 +7825,7 @@ class Window: :param close: if True the window will be closed prior to returning :type close: (bool) :return: (event, values) - :rtype: Tuple[(Any), Union[Dict[Any:Any]], List[Any], None] + :rtype: Tuple[(Any), Dict[Any, Any], List[Any], None] """ # ensure called only 1 time through a single read cycle if not Window._read_call_from_debugger: @@ -7761,7 +7870,7 @@ class Window: :param timeout_key: The value that will be returned from the call if the timer expired :type timeout_key: (Any) :return: (event, values) (event or timeout_key or None, Dictionary of values or List of values from all elements in the Window) - :rtype: Tuple[(Any), Union[Dict[Any:Any]], List[Any], None] + :rtype: Tuple[(Any), Dict[Any, Any], List[Any], None] """ # if there are events in the thread event queue, then return those events before doing anything else. @@ -7883,8 +7992,7 @@ class Window: if self._queued_thread_event_available(): self.ReturnValues = results = _BuildResults(self, False, self) return results - if not self.XFound and self.Timeout != 0 and self.Timeout is not None and self.ReturnValues[ - 0] is None: # Special Qt case because returning for no reason so fake timeout + if not self.XFound and self.Timeout != 0 and self.Timeout is not None and self.ReturnValues[0] is None: # Special Qt case because returning for no reason so fake timeout self.ReturnValues = self.TimeoutKey, self.ReturnValues[1] # fake a timeout elif not self.XFound and self.ReturnValues[0] is None: # Return a timeout event... can happen when autoclose used on another window # print("*** Faking timeout ***") @@ -7895,8 +8003,8 @@ class Window: """ Should be NEVER called directly by the user. The user can call Window.Read(timeout=0) to get same effect - :return: Tuple[(Any), Union[Dict[Any:Any], List[Any], None] (event, values) - (event or timeout_key or None, Dictionary of values or List of values from all elements in the Window + :return: (event, values). (event or timeout_key or None, Dictionary of values or List of values from all elements in the Window) + :rtype: Tuple[(Any), Dict[Any, Any] | List[Any] | None] """ if self.TKrootDestroyed: try: @@ -7989,7 +8097,7 @@ class Window: Fill in elements that are input fields with data based on a 'values dictionary' :param values_dict: pairs - :type values_dict: (Dict[Any:Any]) - {Element_key : value} + :type values_dict: (Dict[Any, Any]) - {Element_key : value} :return: returns self so can be chained with other methods :rtype: (Window) """ @@ -8032,11 +8140,11 @@ class Window: checked for. :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param silent_on_error: If True do not display popup nor print warning of key errors :type silent_on_error: (bool) - :return: Return value can be: the Element that matches the supplied key if found; an Error Element if silent_on_error is False; None if silent_on_error True; - :rtype: Union[Element, Error Element, None] + :return: Return value can be: the Element that matches the supplied key if found; an Error Element if silent_on_error is False; None if silent_on_error True; + :rtype: Element | Error Element | None """ try: element = self.AllKeysDict[key] @@ -8061,11 +8169,11 @@ class Window: key_message = 'A close key was found: {}'.format(closest_key) if closest_key is not None else 'No key found that resembles your key' popup_error('Key error in locating your element', - 'Bad key = {}\n'.format(key), + 'Bad key = {}\n'.format(key), key_message, error_message, - line_width=100, - keep_on_top=True, image=_random_error_icon()) + line_width=100, + keep_on_top=True, image=_random_error_icon()) # if not SUPPRESS_RAISE_KEY_ERRORS: # raise KeyError(key) # else: @@ -8090,7 +8198,7 @@ class Window: """ Returns the Element that currently has focus as reported by tkinter. If no element is found None is returned! :return: An Element if one has been found with focus or None if no element found - :rtype: Union[Element, None] + :rtype: Element | None """ element = _FindElementWithFocusInSubForm(self) return element @@ -8112,7 +8220,7 @@ class Window: :param top_window: The highest level of the window :type top_window: (Window) :param window: The "sub-window" (container element) to be searched - :type window: Union[Column, Frame, TabGroup, Pane, Tab] + :type window: Column | Frame | TabGroup | Pane | Tab :param key_dict: The dictionary as it currently stands.... used as part of recursive call :return: (dict) Dictionary filled with all keys in the window """ @@ -8181,7 +8289,7 @@ class Window: :param top_window: The highest level of the window :type top_window: (Window) :param window: The "sub-window" (container element) to be searched - :type window: Union[Column, Frame, TabGroup, Pane, Tab] + :type window: Column | Frame | TabGroup | Pane | Tab :param elem_list: The element list as it currently stands.... used as part of recursive call :type elem_list: ??? :return: List of all elements in this sub-window @@ -8235,7 +8343,7 @@ class Window: Get the screen dimensions. NOTE - you must have a window already open for this to work (blame tkinter not me) :return: Tuple containing width and height of screen in pixels - :rtype: Union[Tuple[None, None], Tuple[width, height]] + :rtype: Tuple[None, None] | Tuple[width, height] """ if self.TKrootDestroyed or self.TKroot is None: @@ -8793,7 +8901,7 @@ class Window: :param bind_string: The string tkinter expected in its bind function :type bind_string: (str) :param key: The event that will be generated when the tkinter event occurs - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object """ if not self._is_window_created(): return @@ -9003,7 +9111,7 @@ class Window: Returns a dictionary with all keys and their corresponding elements { key : Element } :return: Dictionary of keys and elements - :rtype: Dict[Any:Element] + :rtype: Dict[Any, Element] """ return self.AllKeysDict @@ -9024,9 +9132,9 @@ class Window: window['element key'].Update :param key: The key to find - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :return: The element found or None if no element was found - :rtype: Union[Element, None] + :rtype: Element | None """ return self.FindElement(key) @@ -9038,7 +9146,7 @@ class Window: window(timeout=50) == window.Read(timeout=50) :return: The famous event, values that Read returns. - :rtype: Tuple[Any, Dict[Any:Any]] + :rtype: Tuple[Any, Dict[Any, Any]] """ return self.Read(*args, **kwargs) @@ -9047,8 +9155,8 @@ class Window: warnings.warn('You cannot perform operations on a Window until it is read or finalized. Adding a "finalize=True" parameter to your Window creation will fix this', UserWarning) if not SUPPRESS_ERROR_POPUPS: popup_error('You cannot perform operations on a Window until it is read or finalized.', - 'Yea, I know, it\'s a weird thing, but just fix it and keep going.... ', - 'Adding a "finalize=True" parameter to your Window creation will likely fix this', image=_random_error_icon()) + 'Yea, I know, it\'s a weird thing, but just fix it and keep going.... ', + 'Adding a "finalize=True" parameter to your Window creation will likely fix this', image=_random_error_icon()) return False return True @@ -9229,21 +9337,21 @@ def read_all_windows(timeout=None, timeout_key=TIMEOUT_KEY): - ###### ## ## ###### ######## ######## ## ## +###### ## ## ###### ######## ######## ## ## ## ## ## ## ## ## ## ## ### ### ## #### ## ## ## #### #### - ###### ## ###### ## ###### ## ### ## - ## ## ## ## ## ## ## +###### ## ###### ## ###### ## ### ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## - ###### ## ###### ## ######## ## ## +###### ## ###### ## ######## ## ## ######## ######## ### ## ## - ## ## ## ## ## ## ## - ## ## ## ## ## #### - ## ######## ## ## ## - ## ## ## ######### ## - ## ## ## ## ## ## - ## ## ## ## ## ## +## ## ## ## ## ## ## +## ## ## ## ## #### +## ######## ## ## ## +## ## ## ######### ## +## ## ## ## ## ## +## ## ## ## ## ## # ------------------------------------------------------------------------- # # SystemTray - class for implementing a psyeudo tray # @@ -9330,8 +9438,8 @@ class SystemTray: else: image_elem = Image(background_color='red', enable_events=True, tooltip=tooltip, key='-IMAGE-') layout = [ - [image_elem], - ] + [image_elem], + ] self.window = Window('Window Title', layout, element_padding=(0, 0), margins=(0, 0), grab_anywhere=True, no_titlebar=True, transparent_color='red', keep_on_top=True, right_click_menu=menu, location=(screen_size[0] - 100, screen_size[1] - 100), finalize=True) self.window['-IMAGE-'].bind('', '+DOUBLE_CLICK') @@ -9374,19 +9482,19 @@ class SystemTray: """ Shows a balloon above icon in system tray :param title: Title shown in balloon - :type title: + :type title: str :param message: Message to be displayed - :type message: + :type message: str :param filename: Optional icon filename - :type filename: + :type filename: str :param data: Optional in-ram icon - :type data: + :type data: b'' :param data_base64: Optional base64 icon - :type data_base64: + :type data_base64: b'' :param time: Amount of time to display message in milliseconds. If tuple, first item is fade in/out duration - :type time: Union[int, Tuple[int, int]] - :return: The event that happened during the display such as user clicked on message - :rtype: (Any) + :type time: int | Tuple[int, int] + :return: The event that happened during the display such as user clicked on message + :rtype: Any """ if isinstance(time, tuple): @@ -9450,7 +9558,7 @@ class SystemTray: :param message: Text message that makes up the majority of the window :type message: (str) :param icon: A base64 encoded PNG/GIF image or PNG/GIF filename that will be displayed in the window - :type icon: Union[bytes, str] + :type icon: bytes | str :param display_duration_in_ms: Number of milliseconds to show the window :type display_duration_in_ms: (int) :param fade_in_duration: Number of milliseconds to fade window in and out @@ -9569,7 +9677,7 @@ def pin(elem, vertical_alignment=None, shrink=True): :param elem: the element to put into the layout :type elem: Element :param vertical_alignment: Aligns elements vertically. 'top', 'center', 'bottom'. Can be shortened to 't', 'c', 'b' - :type vertical_alignment: Union[str, None] + :type vertical_alignment: str | None :param shrink: If True, then the space will shrink down to a single pixel when hidden. False leaves the area large and blank :type shrink: bool :return: A column element containing the provided element @@ -9586,9 +9694,9 @@ def vtop(elem_or_row): Align an element or a row of elements to the top of the row that contains it :param elem_or_row: the element or row of elements - :type elem_or_row: Union[Element, List[Element], Tuple[Element]] + :type elem_or_row: Element | List[Element] | Tuple[Element] :return: A column element containing the provided element aligned to the top or list of elements (a row) - :rtype: Union[Column, List[Column]] + :rtype: Column | List[Column] """ if isinstance(elem_or_row, list) or isinstance(elem_or_row, tuple): @@ -9602,9 +9710,9 @@ def vcenter(elem_or_row): Align an element or a row of elements to the center of the row that contains it :param elem_or_row: the element or row of elements - :type elem_or_row: Union[Element, List[Element], Tuple[Element]] + :type elem_or_row: Element | List[Element] | Tuple[Element] :return: A column element containing the provided element aligned to the center or list of elements (a row) - :rtype: Union[Column, List[Column]] + :rtype: Column | List[Column] """ if isinstance(elem_or_row, list) or isinstance(elem_or_row, tuple): @@ -9619,9 +9727,9 @@ def vbottom(elem_or_row): Align an element or a row of elements to the bottom of the row that contains it :param elem_or_row: the element or row of elements - :type elem_or_row: Union[Element, List[Element], Tuple[Element]] + :type elem_or_row: Element | List[Element] | Tuple[Element] :return: A column element containing the provided element aligned to the bottom or list of elements (a row) - :rtype: Union[Column, List[Column]] + :rtype: Column | List[Column] """ if isinstance(elem_or_row, list) or isinstance(elem_or_row, tuple): @@ -9631,6 +9739,51 @@ def vbottom(elem_or_row): return Column([[elem_or_row]], pad=(0,0), vertical_alignment='bottom') + + + +def Titlebar(title='',icon=None, text_color=None, background_color=None, font=None): + """ + Creates a "row" that can be added to a layout. This row looks like a titlebar + :param icon: Can be either a filename or Base64 value. For Windows if filename, it MUST be ICO format. For Linux, must NOT be ICO + :type icon: str or bytes + :param title: The "title" to show in the titlebar + :type title: str + :param text_color: Text color for titlebar + :type text_color: str + :param background_color: Background color for titlebar + :type background_color: str + :param font: Font to be used for the text and the symbols + :type font: str + :return: A list of elements (i.e. a "row" for a layout) + :rtype: List[Element] + """ + bc = background_color or theme_button_color()[1] + tc = text_color or theme_button_color()[0] + font = font or ('Helvetica', 12) + + if isinstance(icon, bytes): + icon_and_text_portion = [Image(data=icon, background_color=bc, key=TITLEBAR_IMAGE_KEY)] + elif icon == TITLEBAR_DO_NOT_USE_AN_ICON: + icon_and_text_portion = [] + elif icon is not None: + icon_and_text_portion = [Image(filename=icon, background_color=bc, key=TITLEBAR_IMAGE_KEY)] + else: + icon_and_text_portion = [Image(data=DEFAULT_BASE64_ICON_16_BY_16, background_color=bc, key=TITLEBAR_IMAGE_KEY)] + + icon_and_text_portion += [T(title, text_color=tc, background_color=bc, font=font, grab=True)] + + + return [Column([icon_and_text_portion], pad=(0, 0), background_color=bc, metadata=TITLEBAR_METADATA_MARKER), Column([[T(SYMBOL_TITLEBAR_MINIMIZE, text_color=tc, background_color=bc, enable_events=True, font=font, key=TITLEBAR_MINIMIZE_KEY), + T(SYMBOL_TITLEBAR_MAXIMIZE, text_color=tc, background_color=bc, enable_events=True, font=font,key=TITLEBAR_MAXIMIZE_KEY), + Text(SYMBOL_TITLEBAR_CLOSE, text_color=tc, background_color=bc, font=font, enable_events=True, key=TITLEBAR_CLOSE_KEY), + ]], element_justification='r', expand_x=True, grab=True, pad=(0, 0), background_color=bc)] + + + + + + # ------------------------- FOLDER BROWSE Element lazy function ------------------------- # def FolderBrowse(button_text='Browse', target=(ThisRow, -1), initial_folder=None, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, disabled=False, change_submits=False, enable_events=False, @@ -9638,15 +9791,15 @@ def FolderBrowse(button_text='Browse', target=(ThisRow, -1), initial_folder=None """ :param button_text: text in the button (Default value = 'Browse') :type button_text: (str) - :param target: target for the button (Default value = (ThisRow, -1)) + :param target: target for the button (Default value = (ThisRow, -1)) :type target: key or (row,col) - :param initial_folder: starting path for folders and files + :param initial_folder: starting path for folders and files :type initial_folder: (str) - :param tooltip: text, that will appear when mouse hovers over the element + :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :param disabled: set disable state for element (Default = False) @@ -9656,13 +9809,13 @@ def FolderBrowse(button_text='Browse', target=(ThisRow, -1), initial_folder=None :param enable_events: Turns on the element specific events.(Default = False) :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] - :param pad: Amount of padding to put around element + :type font: str | Tuple[str, int] + :param pad: Amount of padding to put around element :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) - :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :param key: Used with window.FindElement and with return values to uniquely identify this element + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: The Button created :rtype: (Button) """ @@ -9685,12 +9838,12 @@ def FileBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fil :param target: key or (row,col) target for the button (Default value = (ThisRow, -1)) :param file_types: filter file types (Default value = (("ALL Files", "*.*"))) :type file_types: Tuple[Tuple[str, str], ...] - :param initial_folder: starting path for folders and files + :param initial_folder: starting path for folders and files :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9699,15 +9852,15 @@ def FileBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fil :param enable_events: Turns on the element specific events.(Default = False) :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param disabled: set disable state for element (Default = False) :type disabled: (bool) :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9729,17 +9882,17 @@ def FilesBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fi :param button_text: text in the button (Default value = 'Browse') :type button_text: (str) :param target: key or (row,col) target for the button (Default value = (ThisRow, -1)) - :param file_types: (Default value = (("ALL Files", "*.*"))) + :param file_types: (Default value = (("ALL Files", "*.*"))) :type file_types: Tuple[Tuple[str, str], ...] :param disabled: set disable state for element (Default = False) :type disabled: (bool) - :param initial_folder: starting path for folders and files + :param initial_folder: starting path for folders and files :type initial_folder: (str) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9748,13 +9901,13 @@ def FilesBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fi :param enable_events: Turns on the element specific events.(Default = False) :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9774,19 +9927,19 @@ def FileSaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL :param button_text: text in the button (Default value = 'Save As...') :type button_text: (str) :param target: key or (row,col) target for the button (Default value = (ThisRow, -1)) - :param file_types: (Default value = (("ALL Files", "*.*"))) + :param file_types: (Default value = (("ALL Files", "*.*"))) :type file_types: Tuple[Tuple[str, str], ...] - :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) + :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) :type default_extension: (str) - :param initial_folder: starting path for folders and files + :param initial_folder: starting path for folders and files :type initial_folder: (str) :param disabled: set disable state for element (Default = False) :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9795,13 +9948,13 @@ def FileSaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL :param enable_events: Turns on the element specific events.(Default = False) :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9821,19 +9974,19 @@ def SaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Fil :param button_text: text in the button (Default value = 'Save As...') :type button_text: (str) :param target: key or (row,col) target for the button (Default value = (ThisRow, -1)) - :param file_types: (Default value = (("ALL Files", "*.*"))) + :param file_types: (Default value = (("ALL Files", "*.*"))) :type file_types: Tuple[Tuple[str, str], ...] - :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) + :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) :type default_extension: (str) - :param initial_folder: starting path for folders and files + :param initial_folder: starting path for folders and files :type initial_folder: (str) :param disabled: set disable state for element (Default = False) :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9842,13 +9995,13 @@ def SaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Fil :param enable_events: Turns on the element specific events.(Default = False) :type enable_events: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9865,9 +10018,9 @@ def Save(button_text='Save', size=(None, None), auto_size_button=None, button_co :param button_text: text in the button (Default value = 'Save') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9877,16 +10030,16 @@ def Save(button_text='Save', size=(None, None), auto_size_button=None, button_co :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param focus: if focus should be set to this :type focus: idk_yetReally :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9902,9 +10055,9 @@ def Submit(button_text='Submit', size=(None, None), auto_size_button=None, butto :param button_text: text in the button (Default value = 'Submit') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9914,16 +10067,16 @@ def Submit(button_text='Submit', size=(None, None), auto_size_button=None, butto :type bind_return_key: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param focus: if focus should be set to this :type focus: idk_yetReally :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9940,9 +10093,9 @@ def Open(button_text='Open', size=(None, None), auto_size_button=None, button_co :param button_text: text in the button (Default value = 'Open') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9952,16 +10105,16 @@ def Open(button_text='Open', size=(None, None), auto_size_button=None, button_co :type bind_return_key: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param focus: if focus should be set to this :type focus: idk_yetReally :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -9977,9 +10130,9 @@ def OK(button_text='OK', size=(None, None), auto_size_button=None, button_color= :param button_text: text in the button (Default value = 'OK') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -9989,16 +10142,16 @@ def OK(button_text='OK', size=(None, None), auto_size_button=None, button_color= :type bind_return_key: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param focus: if focus should be set to this :type focus: idk_yetReally :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10014,9 +10167,9 @@ def Ok(button_text='Ok', size=(None, None), auto_size_button=None, button_color= :param button_text: text in the button (Default value = 'Ok') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10026,16 +10179,16 @@ def Ok(button_text='Ok', size=(None, None), auto_size_button=None, button_color= :type bind_return_key: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param focus: if focus should be set to this :type focus: idk_yetReally :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10051,9 +10204,9 @@ def Cancel(button_text='Cancel', size=(None, None), auto_size_button=None, butto :param button_text: text in the button (Default value = 'Cancel') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10061,17 +10214,17 @@ def Cancel(button_text='Cancel', size=(None, None), auto_size_button=None, butto :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: if focus should be set to this :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10087,9 +10240,9 @@ def Quit(button_text='Quit', size=(None, None), auto_size_button=None, button_co :param button_text: text in the button (Default value = 'Quit') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10097,17 +10250,17 @@ def Quit(button_text='Quit', size=(None, None), auto_size_button=None, button_co :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: if focus should be set to this :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10123,9 +10276,9 @@ def Exit(button_text='Exit', size=(None, None), auto_size_button=None, button_co :param button_text: text in the button (Default value = 'Exit') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10133,17 +10286,17 @@ def Exit(button_text='Exit', size=(None, None), auto_size_button=None, button_co :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: if focus should be set to this :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10159,9 +10312,9 @@ def Yes(button_text='Yes', size=(None, None), auto_size_button=None, button_colo :param button_text: text in the button (Default value = 'Yes') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10169,17 +10322,17 @@ def Yes(button_text='Yes', size=(None, None), auto_size_button=None, button_colo :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = True) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: if focus should be set to this :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10195,9 +10348,9 @@ def No(button_text='No', size=(None, None), auto_size_button=None, button_color= :param button_text: text in the button (Default value = 'No') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str @@ -10205,17 +10358,17 @@ def No(button_text='No', size=(None, None), auto_size_button=None, button_color= :type disabled: (bool) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: if focus should be set to this :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10231,16 +10384,16 @@ def Help(button_text='Help', size=(None, None), auto_size_button=None, button_co :param button_text: text in the button (Default value = 'Help') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str :param disabled: set disable state for element (Default = False) :type disabled: (bool) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event @@ -10249,9 +10402,9 @@ def Help(button_text='Help', size=(None, None), auto_size_button=None, button_co :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10267,16 +10420,16 @@ def Debug(button_text='', size=(None, None), auto_size_button=None, button_color :param button_text: text in the button (Default value = '') :type button_text: (str) - :param size: (w,h) w=characters-wide, h=rows-high + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str :param disabled: set disable state for element (Default = False) :type disabled: (bool) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event @@ -10285,9 +10438,9 @@ def Debug(button_text='', size=(None, None), auto_size_button=None, button_color :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param metadata: Anything you want to store along with this button :type metadata: (Any) :return: returns a button @@ -10319,12 +10472,12 @@ def SimpleButton(button_text, image_filename=None, image_data=None, image_size=( :type tooltip: (str) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param disabled: set disable state for element (Default = False) @@ -10334,9 +10487,9 @@ def SimpleButton(button_text, image_filename=None, image_data=None, image_size=( :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10367,12 +10520,12 @@ def CloseButton(button_text, image_filename=None, image_data=None, image_size=(N :type tooltip: (str) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param disabled: set disable state for element (Default = False) @@ -10382,9 +10535,9 @@ def CloseButton(button_text, image_filename=None, image_data=None, image_size=(N :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :return: returns a button :rtype: (Button) """ @@ -10417,12 +10570,12 @@ def ReadButton(button_text, image_filename=None, image_data=None, image_size=(No :type tooltip: (str) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param disabled: set disable state for element (Default = False) @@ -10432,9 +10585,9 @@ def ReadButton(button_text, image_filename=None, image_data=None, image_size=(No :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param border_width: width of border around element :type border_width: (int) :param metadata: Anything you want to store along with this button @@ -10474,12 +10627,12 @@ def RealtimeButton(button_text, image_filename=None, image_data=None, image_size :type tooltip: (str) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param disabled: set disable state for element (Default = False) :type disabled: (bool) :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event @@ -10489,9 +10642,9 @@ def RealtimeButton(button_text, image_filename=None, image_data=None, image_size :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param border_width: width of border around element :type border_width: (int) :param metadata: Anything you want to store along with this button @@ -10526,12 +10679,12 @@ def DummyButton(button_text, image_filename=None, image_data=None, image_size=(N :type tooltip: (str) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param disabled: set disable state for element (Default = False) :type disabled: (bool) :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event @@ -10541,9 +10694,9 @@ def DummyButton(button_text, image_filename=None, image_data=None, image_size=(N :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param metadata: Anything you want to store along with this button :type metadata: (Any) :param border_width: width of border around element @@ -10571,33 +10724,33 @@ def CalendarButton(button_text, target=(ThisRow, -1), close_when_date_chosen=Tru :param button_text: text in the button :type button_text: (str) :param target: Key or "coordinate" (see docs) of target element - :type target: Union[(int, int), Any] - :param close_when_date_chosen: (Default = True) - :type close_when_date_chosen: bool - :param default_date_m_d_y: Beginning date to show - :type default_date_m_d_y: (int, int or None, int) + :type target: (int, int) | Any + :param close_when_date_chosen: (Default = True) + :type close_when_date_chosen: bool + :param default_date_m_d_y: Beginning date to show + :type default_date_m_d_y: (int, int or None, int) :param image_filename: image filename if there is a button image :type image_filename: image filename if there is a button image :param image_data: in-RAM image to be displayed on button :type image_data: in-RAM image to be displayed on button :param image_size: image size (O.K.) - :type image_size: (Default = (None)) + :type image_size: (Default = (None)) :param image_subsample: amount to reduce the size of the image :type image_subsample: amount to reduce the size of the image :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param border_width: width of border around element - :type border_width: width of border around element + :param border_width: width of border around element + :type border_width: width of border around element :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str :param disabled: set disable state for element (Default = False) :type disabled: (bool) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: (Default = False) If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: bool :param focus: if focus should be set to this @@ -10605,9 +10758,9 @@ def CalendarButton(button_text, target=(ThisRow, -1), close_when_date_chosen=Tru :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param locale: defines the locale used to get day names :type locale: str :param format: formats result using this strftime format @@ -10656,30 +10809,30 @@ def ColorChooserButton(button_text, target=(None, None), image_filename=None, im :param button_text: text in the button :type button_text: (str) :param target: key or (row,col) target for the button. Note that -1 for column means 1 element to the left of this one. The constant ThisRow is used to indicate the current row. The Button itself is a valid target for some types of button - :type target: Union[str, Tuple[int, int]] + :type target: str | Tuple[int, int] :type image_filename: (str) :param image_filename: image filename if there is a button image. GIFs and PNGs only. :type image_filename: (str) :param image_data: Raw or Base64 representation of the image to put on button. Choose either filename or data - :type image_data: Union[bytes, str] + :type image_data: bytes | str :param image_size: Size of the image in pixels (width, height) :type image_size: (int, int) :param image_subsample: amount to reduce the size of the image. Divides the size by this number. 2=1/2, 3=1/3, 4=1/4, etc :type image_subsample: (int) :param tooltip: text, that will appear when mouse hovers over the element :type tooltip: (str) - :param border_width: width of border around element + :param border_width: width of border around element :type border_width: (int) :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param auto_size_button: True if button size is determined by button text + :param auto_size_button: True if button size is determined by button text :type auto_size_button: (bool) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str :param disabled: set disable state for element (Default = False) :type disabled: (bool) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param bind_return_key: If True, then the return key will cause a the Listbox to generate an event :type bind_return_key: (bool) :param focus: Determines if initial focus should go to this element. @@ -10687,9 +10840,9 @@ def ColorChooserButton(button_text, target=(None, None), image_filename=None, im :param pad: Amount of padding to put around element in pixels (left/right, top/bottom) :type pad: (int, int) or ((int, int),(int,int)) or (int,(int,int)) or ((int, int),int) :param key: key for uniquely identify this element (for window.FindElement) - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param k: Same as the Key. You can use either k or key. Which ever is set will be used. - :type k: Union[str, int, tuple, object] + :type k: str | int | tuple | object :param metadata: User metadata that can be set to ANYTHING :type metadata: (Any) :return: returns a button @@ -10938,8 +11091,8 @@ def _BuildResultsForSubform(form, initialize_only, top_level_form): AddToReturnList(form, value) AddToReturnDictionary(top_level_form, element, value) elif (element.Type == ELEM_TYPE_BUTTON and - element.BType == BUTTON_TYPE_COLOR_CHOOSER and - element.Target == (None, None)) or \ + element.BType == BUTTON_TYPE_COLOR_CHOOSER and + element.Target == (None, None)) or \ (element.Type == ELEM_TYPE_BUTTON and element.Key is not None and (element.BType in (BUTTON_TYPE_SAVEAS_FILE, BUTTON_TYPE_BROWSE_FILE, BUTTON_TYPE_BROWSE_FILES, @@ -10968,6 +11121,14 @@ def _BuildResultsForSubform(form, initialize_only, top_level_form): AddToReturnList(form, value) form.ReturnValuesDictionary[event] = value + # This is SO dodgy.... if the Titlebar element's X was clicked, act like the real window was closed + # if not initialize_only and event == TITLEBAR_CLOSE_KEY and form == top_level_form: + # form._OnClosingCallback() + # if form.close_destroys_window: + # event = WINDOW_CLOSED + # else: + # event = WINDOW_CLOSE_ATTEMPTED_EVENT + if not form.UseDictionary: form.ReturnValues = event, form.ReturnValuesList else: @@ -10981,10 +11142,10 @@ def FillFormWithValues(window, values_dict): """ Fills a window with values provided in a values dictionary { element_key : new_value } - :param window: The window object to fill + :param window: The window object to fill :type window: (Window) - :param values_dict: A dictionary with element keys as key and value is values parm for Update call - :type values_dict: (Dict[Any:Any]) + :param values_dict: A dictionary with element keys as key and value is values parm for Update call + :type values_dict: (Dict[Any, Any]) :return: None :rtype: None """ @@ -11003,7 +11164,7 @@ def _FindElementWithFocusInSubForm(form): :param form: a Window, Column, Frame, or TabGroup (container elements) :type form: container elements :return: Element - :rtyp0e: Union[Element, None] + :rtype: Element | None """ for row_num, row in enumerate(form.Rows): for col_num, element in enumerate(row): @@ -11058,9 +11219,9 @@ def AddMenuItem(top_menu, sub_menu_info, element, is_sub_menu=False, skip=False, :param sub_menu_info: ??? :param element: ??? :type element: idk_yetReally - :param is_sub_menu: (Default = False) + :param is_sub_menu: (Default = False) :type is_sub_menu: (bool) - :param skip: (Default = False) + :param skip: (Default = False) :type skip: (bool) """ @@ -12276,11 +12437,11 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): width, height = element_size if photo is not None: element.tktext_label = tk.Label(tk_row_frame, image=photo, width=width, - height=height, - bd=border_depth) + height=height, + bd=border_depth) else: element.tktext_label = tk.Label(tk_row_frame, width=width, height=height, - bd=border_depth) + bd=border_depth) if not element.BackgroundColor in (None, COLOR_SYSTEM_DEFAULT): element.tktext_label.config(background=element.BackgroundColor) @@ -12306,7 +12467,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): width, height = element_size if element._TKCanvas is None: element._TKCanvas = tk.Canvas(tk_row_frame, width=width, height=height, - bd=border_depth) + bd=border_depth) else: element._TKCanvas.master = tk_row_frame if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT: @@ -12795,8 +12956,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): if tclversion_detailed == '8.6.9' and ENABLE_TREEVIEW_869_PATCH: print('*** tk version 8.6.9 detected.... patching ttk treeview code ***') tree_style.map(style_name, - foreground=_fixed_map(tree_style, style_name, 'foreground', element.SelectedRowColors), - background=_fixed_map(tree_style, style_name, 'background', element.SelectedRowColors)) + foreground=_fixed_map(tree_style, style_name, 'foreground', element.SelectedRowColors), + background=_fixed_map(tree_style, style_name, 'background', element.SelectedRowColors)) # ------------------------- Separator placement element ------------------------- # elif element_type == ELEM_TYPE_SEPARATOR: @@ -12922,23 +13083,26 @@ def _convert_window_to_tk(window): master = window.TKroot master.title(window.Title) InitializeResults(window) - try: - if window.NoTitleBar: - if sys.platform == 'linux': - window.TKroot.wm_attributes("-type", "splash") - else: - window.TKroot.wm_overrideredirect(True) - # Special case for Mac. Need to clear flag again if not tkinter version 8.6.10+ - if sys.platform.startswith('darwin') and ENABLE_MAC_NOTITLEBAR_PATCH and (sum([int(i) for i in tclversion_detailed.split('.')]) < 24): - print('* Applying Mac no_titlebar patch *') - window.TKroot.wm_overrideredirect(False) - except: - pass + # try: + # if window.NoTitleBar: + # if sys.platform == 'linux': + # window.TKroot.wm_attributes("-type", "splash") + # else: + # window.TKroot.wm_overrideredirect(True) + # # Special case for Mac. Need to clear flag again if not tkinter version 8.6.10+ + # if sys.platform.startswith('darwin') and ENABLE_MAC_NOTITLEBAR_PATCH and (sum([int(i) for i in tclversion_detailed.split('.')]) < 24): + # print('* Applying Mac no_titlebar patch *') + # window.TKroot.wm_overrideredirect(False) + # except: + # print('** Problem setting no titlebar **') + # pass PackFormIntoFrame(window, master, window) window.TKroot.configure(padx=window.Margins[0], pady=window.Margins[1]) + + # ....................................... DONE creating and laying out window ..........................# if window._Size != (None, None): master.geometry("%sx%s" % (window._Size[0], window._Size[1])) @@ -12968,6 +13132,21 @@ def _convert_window_to_tk(window): window.starting_window_position = (int(x), (int(y))) master.update_idletasks() # don't forget + try: + if window.NoTitleBar: + if sys.platform == 'linux': + # window.TKroot.wm_attributes("-type", 'splash') + window.TKroot.wm_attributes("-type", 'dock') + else: + window.TKroot.wm_overrideredirect(True) + # Special case for Mac. Need to clear flag again if not tkinter version 8.6.10+ + if sys.platform.startswith('darwin') and ENABLE_MAC_NOTITLEBAR_PATCH and (sum([int(i) for i in tclversion_detailed.split('.')]) < 24): + print('* Applying Mac no_titlebar patch *') + window.TKroot.wm_overrideredirect(False) + except: + print('** Problem setting no titlebar **') + pass + return @@ -13228,7 +13407,7 @@ class QuickMeter(object): :param max_value: max value of QuickMeter :type max_value: (int) :param key: Used with window.FindElement and with return values to uniquely identify this element - :type key: Union[str, int, tuple, object] + :type key: str | int | tuple | object :param *args: stuff to output :type *args: (Any) :param orientation: 'horizontal' or 'vertical' ('h' or 'v' work) (Default value = 'vertical' / 'v') @@ -13340,19 +13519,19 @@ def OneLineProgressMeter(title, current_value, max_value, key='OK for 1 meter', :type current_value: (int) :param max_value: max value of QuickMeter :type max_value: (int) - :param key: Used to differentiate between mutliple meters. Used to cancel meter early. Now optional as there is a default value for single meters - :type key: Union[str, int, tuple, object] + :param key: Used to differentiate between mutliple meters. Used to cancel meter early. Now optional as there is a default value for single meters + :type key: str | int | tuple | object :param *args: stuff to output :type *args: (Any) - :param orientation: 'horizontal' or 'vertical' ('h' or 'v' work) (Default value = 'vertical' / 'v') + :param orientation: 'horizontal' or 'vertical' ('h' or 'v' work) (Default value = 'vertical' / 'v') :type orientation: (str) - :param bar_color: color of a bar line + :param bar_color: color of a bar line :type bar_color: Tuple(str, str) :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param size: (w,h) w=characters-wide, h=rows-high (Default value = DEFAULT_PROGRESS_BAR_SIZE) + :param size: (w,h) w=characters-wide, h=rows-high (Default value = DEFAULT_PROGRESS_BAR_SIZE) :type size: (int, int) - :param border_width: width of border around element + :param border_width: width of border around element :type border_width: (int) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) @@ -13376,7 +13555,7 @@ def OneLineProgressMeterCancel(key='OK for 1 meter'): """ Cancels and closes a previously created One Line Progress Meter window - :param key: Key used when meter was created + :param key: Key used when meter was created :type key: (Any) :return: None :rtype: None @@ -13424,7 +13603,7 @@ class _DebugWin(): :param location: Location of upper left corner of the window :type location: Tuple[int, int] :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) @@ -13523,10 +13702,10 @@ def EasyPrint(*args, size=(None, None), end=None, sep=None, location=(None, None :type end: (str) :param sep: separator character :type sep: (str) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param no_button: don't show button @@ -13537,9 +13716,9 @@ def EasyPrint(*args, size=(None, None), end=None, sep=None, location=(None, None :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] :param do_not_reroute_stdout: do not reroute stdout :type do_not_reroute_stdout: (bool) @@ -13706,13 +13885,13 @@ def _print_to_element(multiline_element, *args, end=None, sep=None, text_color=N """ Print like Python normally prints except route the output to a multline element and also add colors if desired - :param multiline_element: The multiline element to be output to + :param multiline_element: The multiline element to be output to :type multiline_element: (Multiline) - :param args: The arguments to print + :param args: The arguments to print :type args: List[Any] - :param end: The end char to use just like print uses + :param end: The end char to use just like print uses :type end: (str) - :param sep: The separation character like print uses + :param sep: The separation character like print uses :type sep: (str) :param text_color: color of the text :type text_color: (str) @@ -13749,7 +13928,7 @@ def SetGlobalIcon(icon): window is created. :param icon: Either a Base64 byte string or a filename - :type icon: Union[bytes, str] + :type icon: bytes | str :return: None :rtype: None """ @@ -13770,10 +13949,10 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e text_justification=None, background_color=None, element_background_color=None, text_element_background_color=None, input_elements_background_color=None, input_text_color=None, scrollbar_color=None, text_color=None, element_text_color=None, debug_win_size=(None, None), - window_location=(None, None), error_button_color=(None, None), tooltip_time=None, tooltip_font=None, use_ttk_buttons=None, ttk_theme=None, suppress_error_popups=None, suppress_raise_key_errors=None, suppress_key_guessing=None, enable_treeview_869_patch=None, enable_mac_notitlebar_patch=None): + window_location=(None, None), error_button_color=(None, None), tooltip_time=None, tooltip_font=None, use_ttk_buttons=None, ttk_theme=None, suppress_error_popups=None, suppress_raise_key_errors=None, suppress_key_guessing=None, enable_treeview_869_patch=None, enable_mac_notitlebar_patch=None, use_custom_titlebar=None): """ :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param button_color: Color of the button (text, background) :type button_color: Tuple[str, str] or str :param element_size: element size (width, height) in characters @@ -13788,9 +13967,9 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e :type auto_size_text: bool :param auto_size_buttons: True if Buttons in this Window should be sized to exactly fit the text on this. :type auto_size_buttons: (bool) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] - :param border_width: width of border around element + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] + :param border_width: width of border around element :type border_width: (int) :param slider_border_width: ??? :type slider_border_width: ??? @@ -13805,7 +13984,7 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e :param progress_meter_border_depth: ??? :type progress_meter_border_depth: ??? - :param progress_meter_style: You can no longer set a progress bar style. All ttk styles must be the same for the window + :param progress_meter_style: You can no longer set a progress bar style. All ttk styles must be the same for the window :type progress_meter_style: ??? :param progress_meter_relief: :type progress_meter_relief: ??? @@ -13814,7 +13993,7 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e :param progress_meter_size: ??? :type progress_meter_size: ??? :param text_justification: Default text justification for all Text Elements in window - :type text_justification: Union['left', 'right', 'center'] + :type text_justification: 'left' | 'right' | 'center' :param background_color: color of background :type background_color: (str) :param element_background_color: element background color @@ -13832,29 +14011,31 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e :param element_text_color: ??? :type element_text_color: ??? :param debug_win_size: window size - :type debug_win_size: Tuple[int, int] - :param window_location: (Default = (None)) + :type debug_win_size: Tuple[int, int] + :param window_location: (Default = (None)) :type window_location: ??? - :param error_button_color: (Default = (None)) + :param error_button_color: (Default = (None)) :type error_button_color: ??? - :param tooltip_time: time in milliseconds to wait before showing a tooltip. Default is 400ms + :param tooltip_time: time in milliseconds to wait before showing a tooltip. Default is 400ms :type tooltip_time: (int) - :param tooltip_font: font to use for all tooltips + :param tooltip_font: font to use for all tooltips :type tooltip_font: str or Tuple[str, int] or Tuple[str, int, str] :param use_ttk_buttons: if True will cause all buttons to be ttk buttons :type use_ttk_buttons: (bool) :param ttk_theme: Theme to use with ttk widgets. Choices (on Windows) include - 'default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative' - :type ttk_theme: (str) + :type ttk_theme: (str) :param suppress_error_popups: If True then error popups will not be shown if generated internally to PySimpleGUI - :type suppress_error_popups: (bool) + :type suppress_error_popups: (bool) :param suppress_raise_key_errors: If True then key errors won't be raised (you'll still get popup error) - :type suppress_raise_key_errors: (bool) + :type suppress_raise_key_errors: (bool) :param suppress_key_guessing: If True then key errors won't try and find closest matches for you - :type suppress_key_guessing: (bool) + :type suppress_key_guessing: (bool) :param enable_treeview_869_patch: If True, then will use the treeview color patch for tk 8.6.9 - :type enable_treeview_869_patch: (bool) + :type enable_treeview_869_patch: (bool) :param enable_mac_notitlebar_patch: If True then Windows with no titlebar use an alternative technique when tkinter version < 8.6.10 - :type enable_mac_notitlebar_patch: (bool) + :type enable_mac_notitlebar_patch: (bool) + :param use_custom_titlebar: If True then a custom titlebar is used instead of the normal system titlebar + :type use_custom_titlebar: (bool) :return: None :rtype: None """ @@ -13899,6 +14080,7 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e global SUPPRESS_KEY_GUESSING global ENABLE_TREEVIEW_869_PATCH global ENABLE_MAC_NOTITLEBAR_PATCH + global USE_CUSTOM_TITLEBAR # global _my_windows if icon: @@ -14026,6 +14208,8 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e if enable_mac_notitlebar_patch is not None: ENABLE_MAC_NOTITLEBAR_PATCH = enable_mac_notitlebar_patch + if use_custom_titlebar is not None: + USE_CUSTOM_TITLEBAR = use_custom_titlebar return True @@ -14049,157 +14233,157 @@ def SetOptions(icon=None, button_color=None, element_size=(None, None), button_e # of the elements. # ############################################################## LOOK_AND_FEEL_TABLE = { -"SystemDefault": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"SystemDefaultForReal": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"SystemDefault1": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"Material1": {"BACKGROUND": "#E3F2FD","TEXT": "#000000","INPUT": "#86A8FF","TEXT_INPUT": "#000000","SCROLL": "#86A8FF","BUTTON": ("#FFFFFF", "#5079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, -"Material2": {"BACKGROUND": "#FAFAFA","TEXT": "#000000","INPUT": "#004EA1","TEXT_INPUT": "#FFFFFF","SCROLL": "#5EA7FF","BUTTON": ("#FFFFFF", "#0079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, -"Reddit": {"BACKGROUND": "#ffffff","TEXT": "#1a1a1b","INPUT": "#dae0e6","TEXT_INPUT": "#222222","SCROLL": "#a5a4a4","BUTTON": ("#FFFFFF", "#0079d3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#ff5414","ACCENT2": "#33a8ff","ACCENT3": "#dbf0ff",}, -"Topanga": {"BACKGROUND": "#282923","TEXT": "#E7DB74","INPUT": "#393a32","TEXT_INPUT": "#E7C855","SCROLL": "#E7C855","BUTTON": ("#E7C855", "#284B5A"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#c15226","ACCENT2": "#7a4d5f","ACCENT3": "#889743",}, -"GreenTan": {"BACKGROUND": "#9FB8AD","TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": "#F7F3EC","TEXT_INPUT": "#000000","SCROLL": "#F7F3EC","BUTTON": ("#FFFFFF", "#475841"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Dark": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightGreen": {"BACKGROUND": "#B7CECE","TEXT": "#000000","INPUT": "#FDFFF7","TEXT_INPUT": "#000000","SCROLL": "#FDFFF7","BUTTON": ("#FFFFFF", "#658268"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"ACCENT1": "#76506d","ACCENT2": "#5148f1","ACCENT3": "#0a1c84","PROGRESS_DEPTH": 0,}, -"Dark2": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#FFFFFF","TEXT_INPUT": "#000000","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Black": {"BACKGROUND": "#000000","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#000000", "#FFFFFF"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Tan": {"BACKGROUND": "#fdf6e3","TEXT": "#268bd1","INPUT": "#eee8d5","TEXT_INPUT": "#6c71c3","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063542"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"TanBlue": {"BACKGROUND": "#e5dece","TEXT": "#063289","INPUT": "#f9f8f4","TEXT_INPUT": "#242834","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkTanBlue": {"BACKGROUND": "#242834","TEXT": "#dfe6f8","INPUT": "#97755c","TEXT_INPUT": "#FFFFFF","SCROLL": "#a9afbb","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkAmber": {"BACKGROUND": "#2c2825","TEXT": "#fdcb52","INPUT": "#705e52","TEXT_INPUT": "#fdcb52","SCROLL": "#705e52","BUTTON": ("#000000", "#fdcb52"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlue": {"BACKGROUND": "#1a2835","TEXT": "#d1ecff","INPUT": "#335267","TEXT_INPUT": "#acc2d0","SCROLL": "#1b6497","BUTTON": ("#000000", "#fafaf8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Reds": {"BACKGROUND": "#280001","TEXT": "#FFFFFF","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#763e00","BUTTON": ("#000000", "#daad28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Green": {"BACKGROUND": "#82a459","TEXT": "#000000","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#e3ecf3","BUTTON": ("#FFFFFF", "#517239"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"BluePurple": {"BACKGROUND": "#A5CADD","TEXT": "#6E266E","INPUT": "#E0F5FF","TEXT_INPUT": "#000000","SCROLL": "#E0F5FF","BUTTON": ("#FFFFFF", "#303952"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Purple": {"BACKGROUND": "#B0AAC2","TEXT": "#000000","INPUT": "#F2EFE8","SCROLL": "#F2EFE8","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#C2D4D8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"BlueMono": {"BACKGROUND": "#AAB6D3","TEXT": "#000000","INPUT": "#F1F4FC","SCROLL": "#F1F4FC","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#7186C7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"GreenMono": {"BACKGROUND": "#A8C1B4","TEXT": "#000000","INPUT": "#DDE0DE","SCROLL": "#E3E3E3","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#6D9F85"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"BrownBlue": {"BACKGROUND": "#64778d","TEXT": "#FFFFFF","INPUT": "#f0f3f7","SCROLL": "#A6B2BE","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#283b5b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"BrightColors": {"BACKGROUND": "#b4ffb4","TEXT": "#000000","INPUT": "#ffff64","SCROLL": "#ffb482","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#ffa0dc"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"NeutralBlue": {"BACKGROUND": "#92aa9d","TEXT": "#000000","INPUT": "#fcfff6","SCROLL": "#fcfff6","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#d0dbbd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Kayak": {"BACKGROUND": "#a7ad7f","TEXT": "#000000","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#5d907d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"SandyBeach": {"BACKGROUND": "#efeccb","TEXT": "#012f2f","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#012f2f","BUTTON": ("#FFFFFF", "#046380"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"TealMono": {"BACKGROUND": "#a8cfdd","TEXT": "#000000","INPUT": "#dfedf2","SCROLL": "#dfedf2","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#183440"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"Default": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"Default1": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"DefaultNoMoreNagging": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"LightBlue": {"BACKGROUND": "#E3F2FD","TEXT": "#000000","INPUT": "#86A8FF","TEXT_INPUT": "#000000","SCROLL": "#86A8FF","BUTTON": ("#FFFFFF", "#5079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, -"LightGrey": {"BACKGROUND": "#FAFAFA","TEXT": "#000000","INPUT": "#004EA1","TEXT_INPUT": "#FFFFFF","SCROLL": "#5EA7FF","BUTTON": ("#FFFFFF", "#0079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, -"LightGrey1": {"BACKGROUND": "#ffffff","TEXT": "#1a1a1b","INPUT": "#dae0e6","TEXT_INPUT": "#222222","SCROLL": "#a5a4a4","BUTTON": ("#FFFFFF", "#0079d3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#ff5414","ACCENT2": "#33a8ff","ACCENT3": "#dbf0ff",}, -"DarkBrown": {"BACKGROUND": "#282923","TEXT": "#E7DB74","INPUT": "#393a32","TEXT_INPUT": "#E7C855","SCROLL": "#E7C855","BUTTON": ("#E7C855", "#284B5A"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#c15226","ACCENT2": "#7a4d5f","ACCENT3": "#889743",}, -"LightGreen1": {"BACKGROUND": "#9FB8AD","TEXT": "#000000","INPUT": "#F7F3EC","TEXT_INPUT": "#000000","SCROLL": "#F7F3EC","BUTTON": ("#FFFFFF", "#475841"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightGreen2": {"BACKGROUND": "#B7CECE","TEXT": "#000000","INPUT": "#FDFFF7","TEXT_INPUT": "#000000","SCROLL": "#FDFFF7","BUTTON": ("#FFFFFF", "#658268"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"ACCENT1": "#76506d","ACCENT2": "#5148f1","ACCENT3": "#0a1c84","PROGRESS_DEPTH": 0,}, -"DarkGrey1": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#FFFFFF","TEXT_INPUT": "#000000","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlack": {"BACKGROUND": "#000000","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#000000", "#FFFFFF"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBrown": {"BACKGROUND": "#fdf6e3","TEXT": "#268bd1","INPUT": "#eee8d5","TEXT_INPUT": "#6c71c3","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063542"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBrown1": {"BACKGROUND": "#e5dece","TEXT": "#063289","INPUT": "#f9f8f4","TEXT_INPUT": "#242834","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlue1": {"BACKGROUND": "#242834","TEXT": "#dfe6f8","INPUT": "#97755c","TEXT_INPUT": "#FFFFFF","SCROLL": "#a9afbb","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBrown1": {"BACKGROUND": "#2c2825","TEXT": "#fdcb52","INPUT": "#705e52","TEXT_INPUT": "#fdcb52","SCROLL": "#705e52","BUTTON": ("#000000", "#fdcb52"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlue2": {"BACKGROUND": "#1a2835","TEXT": "#d1ecff","INPUT": "#335267","TEXT_INPUT": "#acc2d0","SCROLL": "#1b6497","BUTTON": ("#000000", "#fafaf8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBrown2": {"BACKGROUND": "#280001","TEXT": "#FFFFFF","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#763e00","BUTTON": ("#000000", "#daad28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGreen": {"BACKGROUND": "#82a459","TEXT": "#000000","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#e3ecf3","BUTTON": ("#FFFFFF", "#517239"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBlue1": {"BACKGROUND": "#A5CADD","TEXT": "#6E266E","INPUT": "#E0F5FF","TEXT_INPUT": "#000000","SCROLL": "#E0F5FF","BUTTON": ("#FFFFFF", "#303952"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightPurple": {"BACKGROUND": "#B0AAC2","TEXT": "#000000","INPUT": "#F2EFE8","SCROLL": "#F2EFE8","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#C2D4D8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBlue2": {"BACKGROUND": "#AAB6D3","TEXT": "#000000","INPUT": "#F1F4FC","SCROLL": "#F1F4FC","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#7186C7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightGreen3": {"BACKGROUND": "#A8C1B4","TEXT": "#000000","INPUT": "#DDE0DE","SCROLL": "#E3E3E3","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#6D9F85"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlue3": {"BACKGROUND": "#64778d","TEXT": "#FFFFFF","INPUT": "#f0f3f7","SCROLL": "#A6B2BE","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#283b5b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightGreen4": {"BACKGROUND": "#b4ffb4","TEXT": "#000000","INPUT": "#ffff64","SCROLL": "#ffb482","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#ffa0dc"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightGreen5": {"BACKGROUND": "#92aa9d","TEXT": "#000000","INPUT": "#fcfff6","SCROLL": "#fcfff6","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#d0dbbd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBrown2": {"BACKGROUND": "#a7ad7f","TEXT": "#000000","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#5d907d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBrown3": {"BACKGROUND": "#efeccb","TEXT": "#012f2f","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#012f2f","BUTTON": ("#FFFFFF", "#046380"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBlue3": {"BACKGROUND": "#a8cfdd","TEXT": "#000000","INPUT": "#dfedf2","SCROLL": "#dfedf2","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#183440"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"LightBrown4": {"BACKGROUND": "#d7c79e","TEXT": "#a35638","INPUT": "#9dab86","TEXT_INPUT": "#000000","SCROLL": "#a35638","BUTTON": ("#FFFFFF", "#a35638"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#a35638", "#9dab86", "#e08f62", "#d7c79e"],}, -"DarkTeal": {"BACKGROUND": "#003f5c","TEXT": "#fb5b5a","INPUT": "#bc4873","TEXT_INPUT": "#FFFFFF","SCROLL": "#bc4873","BUTTON": ("#FFFFFF", "#fb5b5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#003f5c", "#472b62", "#bc4873", "#fb5b5a"],}, -"DarkPurple": {"BACKGROUND": "#472b62","TEXT": "#fb5b5a","INPUT": "#bc4873","TEXT_INPUT": "#FFFFFF","SCROLL": "#bc4873","BUTTON": ("#FFFFFF", "#472b62"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#003f5c", "#472b62", "#bc4873", "#fb5b5a"],}, -"LightGreen6": {"BACKGROUND": "#eafbea","TEXT": "#1f6650","INPUT": "#6f9a8d","TEXT_INPUT": "#FFFFFF","SCROLL": "#1f6650","BUTTON": ("#FFFFFF", "#1f6650"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#1f6650", "#6f9a8d", "#ea5e5e", "#eafbea"],}, -"DarkGrey2": {"BACKGROUND": "#2b2b28","TEXT": "#f8f8f8","INPUT": "#f1d6ab","TEXT_INPUT": "#000000","SCROLL": "#f1d6ab","BUTTON": ("#2b2b28", "#e3b04b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#2b2b28", "#e3b04b", "#f1d6ab", "#f8f8f8"],}, -"LightBrown6": {"BACKGROUND": "#f9b282","TEXT": "#8f4426","INPUT": "#de6b35","TEXT_INPUT": "#FFFFFF","SCROLL": "#8f4426","BUTTON": ("#FFFFFF", "#8f4426"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#8f4426", "#de6b35", "#64ccda", "#f9b282"],}, -"DarkTeal1": {"BACKGROUND": "#396362","TEXT": "#ffe7d1","INPUT": "#f6c89f","TEXT_INPUT": "#000000","SCROLL": "#f6c89f","BUTTON": ("#ffe7d1", "#4b8e8d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#396362", "#4b8e8d", "#f6c89f", "#ffe7d1"],}, -"LightBrown7": {"BACKGROUND": "#f6c89f","TEXT": "#396362","INPUT": "#4b8e8d","TEXT_INPUT": "#FFFFFF","SCROLL": "#396362","BUTTON": ("#FFFFFF", "#396362"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#396362", "#4b8e8d", "#f6c89f", "#ffe7d1"],}, -"DarkPurple1": {"BACKGROUND": "#0c093c","TEXT": "#fad6d6","INPUT": "#eea5f6","TEXT_INPUT": "#000000","SCROLL": "#eea5f6","BUTTON": ("#FFFFFF", "#df42d1"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#0c093c", "#df42d1", "#eea5f6", "#fad6d6"],}, -"DarkGrey3": {"BACKGROUND": "#211717","TEXT": "#dfddc7","INPUT": "#f58b54","TEXT_INPUT": "#000000","SCROLL": "#f58b54","BUTTON": ("#dfddc7", "#a34a28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#211717", "#a34a28", "#f58b54", "#dfddc7"],}, -"LightBrown8": {"BACKGROUND": "#dfddc7","TEXT": "#211717","INPUT": "#a34a28","TEXT_INPUT": "#dfddc7","SCROLL": "#211717","BUTTON": ("#dfddc7", "#a34a28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#211717", "#a34a28", "#f58b54", "#dfddc7"],}, -"DarkBlue4": {"BACKGROUND": "#494ca2","TEXT": "#e3e7f1","INPUT": "#c6cbef","TEXT_INPUT": "#000000","SCROLL": "#c6cbef","BUTTON": ("#FFFFFF", "#8186d5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#494ca2", "#8186d5", "#c6cbef", "#e3e7f1"],}, -"LightBlue4": {"BACKGROUND": "#5c94bd","TEXT": "#470938","INPUT": "#1a3e59","TEXT_INPUT": "#FFFFFF","SCROLL": "#470938","BUTTON": ("#FFFFFF", "#470938"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#470938", "#1a3e59", "#5c94bd", "#f2d6eb"],}, -"DarkTeal2": {"BACKGROUND": "#394a6d","TEXT": "#c0ffb3","INPUT": "#52de97","TEXT_INPUT": "#000000","SCROLL": "#52de97","BUTTON": ("#c0ffb3", "#394a6d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#394a6d", "#3c9d9b", "#52de97", "#c0ffb3"],}, -"DarkTeal3": {"BACKGROUND": "#3c9d9b","TEXT": "#c0ffb3","INPUT": "#52de97","TEXT_INPUT": "#000000","SCROLL": "#52de97","BUTTON": ("#c0ffb3", "#394a6d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#394a6d", "#3c9d9b", "#52de97", "#c0ffb3"],}, -"DarkPurple5": {"BACKGROUND": "#730068","TEXT": "#f6f078","INPUT": "#01d28e","TEXT_INPUT": "#000000","SCROLL": "#01d28e","BUTTON": ("#f6f078", "#730068"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#730068", "#434982", "#01d28e", "#f6f078"],}, -"DarkPurple2": {"BACKGROUND": "#202060","TEXT": "#b030b0","INPUT": "#602080","TEXT_INPUT": "#FFFFFF","SCROLL": "#602080","BUTTON": ("#FFFFFF", "#202040"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#202040", "#202060", "#602080", "#b030b0"],}, -"DarkBlue5": {"BACKGROUND": "#000272","TEXT": "#ff6363","INPUT": "#a32f80","TEXT_INPUT": "#FFFFFF","SCROLL": "#a32f80","BUTTON": ("#FFFFFF", "#341677"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#000272", "#341677", "#a32f80", "#ff6363"],}, -"LightGrey2": {"BACKGROUND": "#f6f6f6","TEXT": "#420000","INPUT": "#d4d7dd","TEXT_INPUT": "#420000","SCROLL": "#420000","BUTTON": ("#420000", "#d4d7dd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#420000", "#d4d7dd", "#eae9e9", "#f6f6f6"],}, -"LightGrey3": {"BACKGROUND": "#eae9e9","TEXT": "#420000","INPUT": "#d4d7dd","TEXT_INPUT": "#420000","SCROLL": "#420000","BUTTON": ("#420000", "#d4d7dd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#420000", "#d4d7dd", "#eae9e9", "#f6f6f6"],}, -"DarkBlue6": {"BACKGROUND": "#01024e","TEXT": "#ff6464","INPUT": "#8b4367","TEXT_INPUT": "#FFFFFF","SCROLL": "#8b4367","BUTTON": ("#FFFFFF", "#543864"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#01024e", "#543864", "#8b4367", "#ff6464"],}, -"DarkBlue7": {"BACKGROUND": "#241663","TEXT": "#eae7af","INPUT": "#a72693","TEXT_INPUT": "#eae7af","SCROLL": "#a72693","BUTTON": ("#eae7af", "#160f30"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#160f30", "#241663", "#a72693", "#eae7af"],}, -"LightBrown9": {"BACKGROUND": "#f6d365","TEXT": "#3a1f5d","INPUT": "#c83660","TEXT_INPUT": "#f6d365","SCROLL": "#3a1f5d","BUTTON": ("#f6d365", "#c83660"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3a1f5d", "#c83660", "#e15249", "#f6d365"],}, -"DarkPurple3": {"BACKGROUND": "#6e2142","TEXT": "#ffd692","INPUT": "#e16363","TEXT_INPUT": "#ffd692","SCROLL": "#e16363","BUTTON": ("#ffd692", "#943855"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#6e2142", "#943855", "#e16363", "#ffd692"],}, -"LightBrown10": {"BACKGROUND": "#ffd692","TEXT": "#6e2142","INPUT": "#943855","TEXT_INPUT": "#FFFFFF","SCROLL": "#6e2142","BUTTON": ("#FFFFFF", "#6e2142"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#6e2142", "#943855", "#e16363", "#ffd692"],}, -"DarkPurple4": {"BACKGROUND": "#200f21","TEXT": "#f638dc","INPUT": "#5a3d5c","TEXT_INPUT": "#FFFFFF","SCROLL": "#5a3d5c","BUTTON": ("#FFFFFF", "#382039"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#200f21", "#382039", "#5a3d5c", "#f638dc"],}, -"LightBlue5": {"BACKGROUND": "#b2fcff","TEXT": "#3e64ff","INPUT": "#5edfff","TEXT_INPUT": "#000000","SCROLL": "#3e64ff","BUTTON": ("#FFFFFF", "#3e64ff"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e64ff", "#5edfff", "#b2fcff", "#ecfcff"],}, -"DarkTeal4": {"BACKGROUND": "#464159","TEXT": "#c7f0db","INPUT": "#8bbabb","TEXT_INPUT": "#000000","SCROLL": "#8bbabb","BUTTON": ("#FFFFFF", "#6c7b95"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, -"LightTeal": {"BACKGROUND": "#c7f0db","TEXT": "#464159","INPUT": "#6c7b95","TEXT_INPUT": "#FFFFFF","SCROLL": "#464159","BUTTON": ("#FFFFFF", "#464159"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, -"DarkTeal5": {"BACKGROUND": "#8bbabb","TEXT": "#464159","INPUT": "#6c7b95","TEXT_INPUT": "#FFFFFF","SCROLL": "#464159","BUTTON": ("#c7f0db", "#6c7b95"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, -"LightGrey4": {"BACKGROUND": "#faf5ef","TEXT": "#672f2f","INPUT": "#99b19c","TEXT_INPUT": "#672f2f","SCROLL": "#672f2f","BUTTON": ("#672f2f", "#99b19c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, -"LightGreen7": {"BACKGROUND": "#99b19c","TEXT": "#faf5ef","INPUT": "#d7d1c9","TEXT_INPUT": "#000000","SCROLL": "#d7d1c9","BUTTON": ("#FFFFFF", "#99b19c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, -"LightGrey5": {"BACKGROUND": "#d7d1c9","TEXT": "#672f2f","INPUT": "#99b19c","TEXT_INPUT": "#672f2f","SCROLL": "#672f2f","BUTTON": ("#FFFFFF", "#672f2f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, -"DarkBrown3": {"BACKGROUND": "#a0855b","TEXT": "#f9f6f2","INPUT": "#f1d6ab","TEXT_INPUT": "#000000","SCROLL": "#f1d6ab","BUTTON": ("#FFFFFF", "#38470b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#38470b", "#a0855b", "#f1d6ab", "#f9f6f2"],}, -"LightBrown11": {"BACKGROUND": "#f1d6ab","TEXT": "#38470b","INPUT": "#a0855b","TEXT_INPUT": "#FFFFFF","SCROLL": "#38470b","BUTTON": ("#f9f6f2", "#a0855b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#38470b", "#a0855b", "#f1d6ab", "#f9f6f2"],}, -"DarkRed": {"BACKGROUND": "#83142c","TEXT": "#f9d276","INPUT": "#ad1d45","TEXT_INPUT": "#FFFFFF","SCROLL": "#ad1d45","BUTTON": ("#f9d276", "#ad1d45"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#44000d", "#83142c", "#ad1d45", "#f9d276"],}, -"DarkTeal6": {"BACKGROUND": "#204969","TEXT": "#fff7f7","INPUT": "#dadada","TEXT_INPUT": "#000000","SCROLL": "#dadada","BUTTON": ("#000000", "#fff7f7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#204969", "#08ffc8", "#dadada", "#fff7f7"],}, -"DarkBrown4": {"BACKGROUND": "#252525","TEXT": "#ff0000","INPUT": "#af0404","TEXT_INPUT": "#FFFFFF","SCROLL": "#af0404","BUTTON": ("#FFFFFF", "#252525"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#252525", "#414141", "#af0404", "#ff0000"],}, -"LightYellow": {"BACKGROUND": "#f4ff61","TEXT": "#27aa80","INPUT": "#32ff6a","TEXT_INPUT": "#000000","SCROLL": "#27aa80","BUTTON": ("#f4ff61", "#27aa80"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#27aa80", "#32ff6a", "#a8ff3e", "#f4ff61"],}, -"DarkGreen1": {"BACKGROUND": "#2b580c","TEXT": "#fdef96","INPUT": "#f7b71d","TEXT_INPUT": "#000000","SCROLL": "#f7b71d","BUTTON": ("#fdef96", "#2b580c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#2b580c", "#afa939", "#f7b71d", "#fdef96"],}, -"LightGreen8": {"BACKGROUND": "#c8dad3","TEXT": "#63707e","INPUT": "#93b5b3","TEXT_INPUT": "#000000","SCROLL": "#63707e","BUTTON": ("#FFFFFF", "#63707e"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#63707e", "#93b5b3", "#c8dad3", "#f2f6f5"],}, -"DarkTeal7": {"BACKGROUND": "#248ea9","TEXT": "#fafdcb","INPUT": "#aee7e8","TEXT_INPUT": "#000000","SCROLL": "#aee7e8","BUTTON": ("#000000", "#fafdcb"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#248ea9", "#28c3d4", "#aee7e8", "#fafdcb"],}, -"DarkBlue8": {"BACKGROUND": "#454d66","TEXT": "#d9d872","INPUT": "#58b368","TEXT_INPUT": "#000000","SCROLL": "#58b368","BUTTON": ("#000000", "#009975"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#009975", "#454d66", "#58b368", "#d9d872"],}, -"DarkBlue9": {"BACKGROUND": "#263859","TEXT": "#ff6768","INPUT": "#6b778d","TEXT_INPUT": "#FFFFFF","SCROLL": "#6b778d","BUTTON": ("#ff6768", "#263859"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#17223b", "#263859", "#6b778d", "#ff6768"],}, -"DarkBlue10": {"BACKGROUND": "#0028ff","TEXT": "#f1f4df","INPUT": "#10eaf0","TEXT_INPUT": "#000000","SCROLL": "#10eaf0","BUTTON": ("#f1f4df", "#24009c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#24009c", "#0028ff", "#10eaf0", "#f1f4df"],}, -"DarkBlue11": {"BACKGROUND": "#6384b3","TEXT": "#e6f0b6","INPUT": "#b8e9c0","TEXT_INPUT": "#000000","SCROLL": "#b8e9c0","BUTTON": ("#e6f0b6", "#684949"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#684949", "#6384b3", "#b8e9c0", "#e6f0b6"],}, -"DarkTeal8": {"BACKGROUND": "#71a0a5","TEXT": "#212121","INPUT": "#665c84","TEXT_INPUT": "#FFFFFF","SCROLL": "#212121","BUTTON": ("#fab95b", "#665c84"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#212121", "#665c84", "#71a0a5", "#fab95b"],}, -"DarkRed1": {"BACKGROUND": "#c10000","TEXT": "#eeeeee","INPUT": "#dedede","TEXT_INPUT": "#000000","SCROLL": "#dedede","BUTTON": ("#c10000", "#eeeeee"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#c10000", "#ff4949", "#dedede", "#eeeeee"],}, -"LightBrown5": {"BACKGROUND": "#fff591","TEXT": "#e41749","INPUT": "#f5587b","TEXT_INPUT": "#000000","SCROLL": "#e41749","BUTTON": ("#fff591", "#e41749"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#e41749", "#f5587b", "#ff8a5c", "#fff591"],}, -"LightGreen9": {"BACKGROUND": "#f1edb3","TEXT": "#3b503d","INPUT": "#4a746e","TEXT_INPUT": "#f1edb3","SCROLL": "#3b503d","BUTTON": ("#f1edb3", "#3b503d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3b503d", "#4a746e", "#c8cf94", "#f1edb3"],"DESCRIPTION": ["Green", "Turquoise", "Yellow"],}, -"DarkGreen2": {"BACKGROUND": "#3b503d","TEXT": "#f1edb3","INPUT": "#c8cf94","TEXT_INPUT": "#000000","SCROLL": "#c8cf94","BUTTON": ("#f1edb3", "#3b503d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3b503d", "#4a746e", "#c8cf94", "#f1edb3"],"DESCRIPTION": ["Green", "Turquoise", "Yellow"],}, -"LightGray1": {"BACKGROUND": "#f2f2f2","TEXT": "#222831","INPUT": "#393e46","TEXT_INPUT": "#FFFFFF","SCROLL": "#222831","BUTTON": ("#f2f2f2", "#222831"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#222831", "#393e46", "#f96d00", "#f2f2f2"],"DESCRIPTION": ["#000000", "Grey", "Orange", "Grey", "Autumn"],}, -"DarkGrey4": {"BACKGROUND": "#52524e","TEXT": "#e9e9e5","INPUT": "#d4d6c8","TEXT_INPUT": "#000000","SCROLL": "#d4d6c8","BUTTON": ("#FFFFFF", "#9a9b94"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#52524e", "#9a9b94", "#d4d6c8", "#e9e9e5"],"DESCRIPTION": ["Grey", "Pastel", "Winter"],}, -"DarkBlue12": {"BACKGROUND": "#324e7b","TEXT": "#f8f8f8","INPUT": "#86a6df","TEXT_INPUT": "#000000","SCROLL": "#86a6df","BUTTON": ("#FFFFFF", "#5068a9"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#324e7b", "#5068a9", "#86a6df", "#f8f8f8"],"DESCRIPTION": ["Blue", "Grey", "Cold", "Winter"],}, -"DarkPurple6": {"BACKGROUND": "#070739","TEXT": "#e1e099","INPUT": "#c327ab","TEXT_INPUT": "#e1e099","SCROLL": "#c327ab","BUTTON": ("#e1e099", "#521477"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#070739", "#521477", "#c327ab", "#e1e099"],"DESCRIPTION": ["#000000", "Purple", "Yellow", "Dark"],}, -"DarkPurple7": {"BACKGROUND": "#191930","TEXT": "#B1B7C5","INPUT": "#232B5C","TEXT_INPUT": "#D0E3E7","SCROLL": "#B1B7C5","BUTTON": ("#272D38", "#B1B7C5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBlue13": {"BACKGROUND": "#203562","TEXT": "#e3e8f8","INPUT": "#c0c5cd","TEXT_INPUT": "#000000","SCROLL": "#c0c5cd","BUTTON": ("#FFFFFF", "#3e588f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#203562", "#3e588f", "#c0c5cd", "#e3e8f8"],"DESCRIPTION": ["Blue", "Grey", "Wedding", "Cold"],}, -"DarkBrown5": {"BACKGROUND": "#3c1b1f","TEXT": "#f6e1b5","INPUT": "#e2bf81","TEXT_INPUT": "#000000","SCROLL": "#e2bf81","BUTTON": ("#3c1b1f", "#f6e1b5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3c1b1f", "#b21e4b", "#e2bf81", "#f6e1b5"],"DESCRIPTION": ["Brown", "Red", "Yellow", "Warm"],}, -"DarkGreen3": {"BACKGROUND": "#062121","TEXT": "#eeeeee","INPUT": "#e4dcad","TEXT_INPUT": "#000000","SCROLL": "#e4dcad","BUTTON": ("#eeeeee", "#181810"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#062121", "#181810", "#e4dcad", "#eeeeee"],"DESCRIPTION": ["#000000", "#000000", "Brown", "Grey"],}, -"DarkBlack1": {"BACKGROUND": "#181810","TEXT": "#eeeeee","INPUT": "#e4dcad","TEXT_INPUT": "#000000","SCROLL": "#e4dcad","BUTTON": ("#FFFFFF", "#062121"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#062121", "#181810", "#e4dcad", "#eeeeee"],"DESCRIPTION": ["#000000", "#000000", "Brown", "Grey"],}, -"DarkGrey5": {"BACKGROUND": "#343434","TEXT": "#f3f3f3","INPUT": "#e9dcbe","TEXT_INPUT": "#000000","SCROLL": "#e9dcbe","BUTTON": ("#FFFFFF", "#8e8b82"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#343434", "#8e8b82", "#e9dcbe", "#f3f3f3"],"DESCRIPTION": ["Grey", "Brown"],}, -"LightBrown12": {"BACKGROUND": "#8e8b82","TEXT": "#f3f3f3","INPUT": "#e9dcbe","TEXT_INPUT": "#000000","SCROLL": "#e9dcbe","BUTTON": ("#f3f3f3", "#8e8b82"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#343434", "#8e8b82", "#e9dcbe", "#f3f3f3"],"DESCRIPTION": ["Grey", "Brown"],}, -"DarkTeal9": {"BACKGROUND": "#13445a","TEXT": "#fef4e8","INPUT": "#446878","TEXT_INPUT": "#FFFFFF","SCROLL": "#446878","BUTTON": ("#fef4e8", "#446878"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#13445a", "#970747", "#446878", "#fef4e8"],"DESCRIPTION": ["Red", "Grey", "Blue", "Wedding", "Retro"],}, -"DarkBlue14": {"BACKGROUND": "#21273d","TEXT": "#f1f6f8","INPUT": "#b9d4f1","TEXT_INPUT": "#000000","SCROLL": "#b9d4f1","BUTTON": ("#FFFFFF", "#6a759b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#21273d", "#6a759b", "#b9d4f1", "#f1f6f8"],"DESCRIPTION": ["Blue", "#000000", "Grey", "Cold", "Winter"],}, -"LightBlue6": {"BACKGROUND": "#f1f6f8","TEXT": "#21273d","INPUT": "#6a759b","TEXT_INPUT": "#FFFFFF","SCROLL": "#21273d","BUTTON": ("#f1f6f8", "#6a759b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#21273d", "#6a759b", "#b9d4f1", "#f1f6f8"],"DESCRIPTION": ["Blue", "#000000", "Grey", "Cold", "Winter"],}, -"DarkGreen4": {"BACKGROUND": "#044343","TEXT": "#e4e4e4","INPUT": "#045757","TEXT_INPUT": "#e4e4e4","SCROLL": "#045757","BUTTON": ("#e4e4e4", "#045757"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#222222", "#044343", "#045757", "#e4e4e4"],"DESCRIPTION": ["#000000", "Turquoise", "Grey", "Dark"],}, -"DarkGreen5": {"BACKGROUND": "#1b4b36","TEXT": "#e0e7f1","INPUT": "#aebd77","TEXT_INPUT": "#000000","SCROLL": "#aebd77","BUTTON": ("#FFFFFF", "#538f6a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#1b4b36", "#538f6a", "#aebd77", "#e0e7f1"],"DESCRIPTION": ["Green", "Grey"],}, -"DarkTeal10": {"BACKGROUND": "#0d3446","TEXT": "#d8dfe2","INPUT": "#71adb5","TEXT_INPUT": "#000000","SCROLL": "#71adb5","BUTTON": ("#FFFFFF", "#176d81"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#0d3446", "#176d81", "#71adb5", "#d8dfe2"],"DESCRIPTION": ["Grey", "Turquoise", "Winter", "Cold"],}, -"DarkGrey6": {"BACKGROUND": "#3e3e3e","TEXT": "#ededed","INPUT": "#68868c","TEXT_INPUT": "#ededed","SCROLL": "#68868c","BUTTON": ("#FFFFFF", "#405559"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e3e3e", "#405559", "#68868c", "#ededed"],"DESCRIPTION": ["Grey", "Turquoise", "Winter"],}, -"DarkTeal11": {"BACKGROUND": "#405559","TEXT": "#ededed","INPUT": "#68868c","TEXT_INPUT": "#ededed","SCROLL": "#68868c","BUTTON": ("#ededed", "#68868c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e3e3e", "#405559", "#68868c", "#ededed"],"DESCRIPTION": ["Grey", "Turquoise", "Winter"],}, -"LightBlue7": {"BACKGROUND": "#9ed0e0","TEXT": "#19483f","INPUT": "#5c868e","TEXT_INPUT": "#FFFFFF","SCROLL": "#19483f","BUTTON": ("#FFFFFF", "#19483f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#19483f", "#5c868e", "#ff6a38", "#9ed0e0"],"DESCRIPTION": ["Orange", "Blue", "Turquoise"],}, -"LightGreen10": {"BACKGROUND": "#d8ebb5","TEXT": "#205d67","INPUT": "#639a67","TEXT_INPUT": "#FFFFFF","SCROLL": "#205d67","BUTTON": ("#d8ebb5", "#205d67"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#205d67", "#639a67", "#d9bf77", "#d8ebb5"],"DESCRIPTION": ["Blue", "Green", "Brown", "Vintage"],}, -"DarkBlue15": {"BACKGROUND": "#151680","TEXT": "#f1fea4","INPUT": "#375fc0","TEXT_INPUT": "#f1fea4","SCROLL": "#375fc0","BUTTON": ("#f1fea4", "#1c44ac"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#151680", "#1c44ac", "#375fc0", "#f1fea4"],"DESCRIPTION": ["Blue", "Yellow", "Cold"],}, -"DarkBlue16": {"BACKGROUND": "#1c44ac","TEXT": "#f1fea4","INPUT": "#375fc0","TEXT_INPUT": "#f1fea4","SCROLL": "#375fc0","BUTTON": ("#f1fea4", "#151680"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#151680", "#1c44ac", "#375fc0", "#f1fea4"],"DESCRIPTION": ["Blue", "Yellow", "Cold"],}, -"DarkTeal12": {"BACKGROUND": "#004a7c","TEXT": "#fafafa","INPUT": "#e8f1f5","TEXT_INPUT": "#000000","SCROLL": "#e8f1f5","BUTTON": ("#fafafa", "#005691"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#004a7c", "#005691", "#e8f1f5", "#fafafa"],"DESCRIPTION": ["Grey", "Blue", "Cold", "Winter"],}, -"LightBrown13": {"BACKGROUND": "#ebf5ee","TEXT": "#921224","INPUT": "#bdc6b8","TEXT_INPUT": "#921224","SCROLL": "#921224","BUTTON": ("#FFFFFF", "#921224"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#921224", "#bdc6b8", "#bce0da", "#ebf5ee"],"DESCRIPTION": ["Red", "Blue", "Grey", "Vintage", "Wedding"],}, -"DarkBlue17": {"BACKGROUND": "#21294c","TEXT": "#f9f2d7","INPUT": "#f2dea8","TEXT_INPUT": "#000000","SCROLL": "#f2dea8","BUTTON": ("#f9f2d7", "#141829"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#141829", "#21294c", "#f2dea8", "#f9f2d7"],"DESCRIPTION": ["#000000", "Blue", "Yellow"],}, -"DarkBrown6": {"BACKGROUND": "#785e4d","TEXT": "#f2eee3","INPUT": "#baaf92","TEXT_INPUT": "#000000","SCROLL": "#baaf92","BUTTON": ("#FFFFFF", "#785e4d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#785e4d", "#ff8426", "#baaf92", "#f2eee3"],"DESCRIPTION": ["Grey", "Brown", "Orange", "Autumn"],}, -"DarkGreen6": {"BACKGROUND": "#5c715e","TEXT": "#f2f9f1","INPUT": "#ddeedf","TEXT_INPUT": "#000000","SCROLL": "#ddeedf","BUTTON": ("#f2f9f1", "#5c715e"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#5c715e", "#b6cdbd", "#ddeedf", "#f2f9f1"],"DESCRIPTION": ["Grey", "Green", "Vintage"],}, -"DarkGreen7": {"BACKGROUND": "#0C231E","TEXT": "#efbe1c","INPUT": "#153C33","TEXT_INPUT": "#efbe1c","SCROLL": "#153C33","BUTTON": ("#efbe1c", "#153C33"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey7": {"BACKGROUND": "#4b586e","TEXT": "#dddddd","INPUT": "#574e6d","TEXT_INPUT": "#dddddd","SCROLL": "#574e6d","BUTTON": ("#dddddd", "#43405d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#43405d", "#4b586e", "#574e6d", "#dddddd"],"DESCRIPTION": ["Grey", "Winter", "Cold"],}, -"DarkRed2": {"BACKGROUND": "#ab1212","TEXT": "#f6e4b5","INPUT": "#cd3131","TEXT_INPUT": "#f6e4b5","SCROLL": "#cd3131","BUTTON": ("#f6e4b5", "#ab1212"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#ab1212", "#1fad9f", "#cd3131", "#f6e4b5"],"DESCRIPTION": ["Turquoise", "Red", "Yellow"],}, -"LightGrey6": {"BACKGROUND": "#e3e3e3","TEXT": "#233142","INPUT": "#455d7a","TEXT_INPUT": "#e3e3e3","SCROLL": "#233142","BUTTON": ("#e3e3e3", "#455d7a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#233142", "#455d7a", "#f95959", "#e3e3e3"],"DESCRIPTION": ["#000000", "Blue", "Red", "Grey"],}, -"HotDogStand": {"BACKGROUND": "red","TEXT": "yellow","INPUT": "yellow","TEXT_INPUT": "#000000","SCROLL": "yellow","BUTTON": ("red", "yellow"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey8": {"BACKGROUND": "#19232D","TEXT": "#ffffff","INPUT": "#32414B","TEXT_INPUT": "#ffffff","SCROLL": "#505F69","BUTTON": ("#ffffff", "#32414B"),"PROGRESS": ("#505F69", "#32414B"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey9": {"BACKGROUND": "#36393F","TEXT": "#DCDDDE","INPUT": "#40444B","TEXT_INPUT": "#ffffff","SCROLL": "#202225","BUTTON": ("#202225", "#B9BBBE"),"PROGRESS": ("#202225", "#40444B"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey10": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#272a31","TEXT_INPUT": "#8b9fde","SCROLL": "#313641","BUTTON": ("#f5f5f6", "#2e3d5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey11": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#313641","TEXT_INPUT": "#cccdcf","SCROLL": "#313641","BUTTON": ("#f5f5f6", "#313641"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey12": {"BACKGROUND": "#1c1e23","TEXT": "#8b9fde","INPUT": "#313641","TEXT_INPUT": "#8b9fde","SCROLL": "#313641","BUTTON": ("#cccdcf", "#2e3d5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey13": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#272a31","TEXT_INPUT": "#cccdcf","SCROLL": "#313641","BUTTON": ("#8b9fde", "#313641"),"PROGRESS": ("#cccdcf", "#272a31"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkGrey14": {"BACKGROUND": "#24292e","TEXT": "#fafbfc","INPUT": "#1d2125","TEXT_INPUT": "#fafbfc","SCROLL": "#1d2125","BUTTON": ("#fafbfc", "#155398"),"PROGRESS": ("#155398", "#1d2125"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, -"DarkBrown7": {"BACKGROUND": "#2c2417","TEXT": "#baa379","INPUT": "#baa379","TEXT_INPUT": "#000000","SCROLL": "#392e1c","BUTTON": ("#000000", "#baa379"),"PROGRESS": ("#baa379", "#453923"),"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, -"Python": {"BACKGROUND": "#3d7aab","TEXT": "#ffde56","INPUT": "#295273","TEXT_INPUT": "#ffde56","SCROLL": "#295273","BUTTON": ("#ffde56", "#295273"),"PROGRESS": ("#ffde56", "#295273"),"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "SystemDefault": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "SystemDefaultForReal": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "SystemDefault1": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "Material1": {"BACKGROUND": "#E3F2FD","TEXT": "#000000","INPUT": "#86A8FF","TEXT_INPUT": "#000000","SCROLL": "#86A8FF","BUTTON": ("#FFFFFF", "#5079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, + "Material2": {"BACKGROUND": "#FAFAFA","TEXT": "#000000","INPUT": "#004EA1","TEXT_INPUT": "#FFFFFF","SCROLL": "#5EA7FF","BUTTON": ("#FFFFFF", "#0079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, + "Reddit": {"BACKGROUND": "#ffffff","TEXT": "#1a1a1b","INPUT": "#dae0e6","TEXT_INPUT": "#222222","SCROLL": "#a5a4a4","BUTTON": ("#FFFFFF", "#0079d3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#ff5414","ACCENT2": "#33a8ff","ACCENT3": "#dbf0ff",}, + "Topanga": {"BACKGROUND": "#282923","TEXT": "#E7DB74","INPUT": "#393a32","TEXT_INPUT": "#E7C855","SCROLL": "#E7C855","BUTTON": ("#E7C855", "#284B5A"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#c15226","ACCENT2": "#7a4d5f","ACCENT3": "#889743",}, + "GreenTan": {"BACKGROUND": "#9FB8AD","TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": "#F7F3EC","TEXT_INPUT": "#000000","SCROLL": "#F7F3EC","BUTTON": ("#FFFFFF", "#475841"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Dark": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightGreen": {"BACKGROUND": "#B7CECE","TEXT": "#000000","INPUT": "#FDFFF7","TEXT_INPUT": "#000000","SCROLL": "#FDFFF7","BUTTON": ("#FFFFFF", "#658268"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"ACCENT1": "#76506d","ACCENT2": "#5148f1","ACCENT3": "#0a1c84","PROGRESS_DEPTH": 0,}, + "Dark2": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#FFFFFF","TEXT_INPUT": "#000000","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Black": {"BACKGROUND": "#000000","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#000000", "#FFFFFF"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Tan": {"BACKGROUND": "#fdf6e3","TEXT": "#268bd1","INPUT": "#eee8d5","TEXT_INPUT": "#6c71c3","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063542"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "TanBlue": {"BACKGROUND": "#e5dece","TEXT": "#063289","INPUT": "#f9f8f4","TEXT_INPUT": "#242834","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkTanBlue": {"BACKGROUND": "#242834","TEXT": "#dfe6f8","INPUT": "#97755c","TEXT_INPUT": "#FFFFFF","SCROLL": "#a9afbb","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkAmber": {"BACKGROUND": "#2c2825","TEXT": "#fdcb52","INPUT": "#705e52","TEXT_INPUT": "#fdcb52","SCROLL": "#705e52","BUTTON": ("#000000", "#fdcb52"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlue": {"BACKGROUND": "#1a2835","TEXT": "#d1ecff","INPUT": "#335267","TEXT_INPUT": "#acc2d0","SCROLL": "#1b6497","BUTTON": ("#000000", "#fafaf8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Reds": {"BACKGROUND": "#280001","TEXT": "#FFFFFF","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#763e00","BUTTON": ("#000000", "#daad28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Green": {"BACKGROUND": "#82a459","TEXT": "#000000","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#e3ecf3","BUTTON": ("#FFFFFF", "#517239"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "BluePurple": {"BACKGROUND": "#A5CADD","TEXT": "#6E266E","INPUT": "#E0F5FF","TEXT_INPUT": "#000000","SCROLL": "#E0F5FF","BUTTON": ("#FFFFFF", "#303952"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Purple": {"BACKGROUND": "#B0AAC2","TEXT": "#000000","INPUT": "#F2EFE8","SCROLL": "#F2EFE8","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#C2D4D8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "BlueMono": {"BACKGROUND": "#AAB6D3","TEXT": "#000000","INPUT": "#F1F4FC","SCROLL": "#F1F4FC","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#7186C7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "GreenMono": {"BACKGROUND": "#A8C1B4","TEXT": "#000000","INPUT": "#DDE0DE","SCROLL": "#E3E3E3","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#6D9F85"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "BrownBlue": {"BACKGROUND": "#64778d","TEXT": "#FFFFFF","INPUT": "#f0f3f7","SCROLL": "#A6B2BE","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#283b5b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "BrightColors": {"BACKGROUND": "#b4ffb4","TEXT": "#000000","INPUT": "#ffff64","SCROLL": "#ffb482","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#ffa0dc"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "NeutralBlue": {"BACKGROUND": "#92aa9d","TEXT": "#000000","INPUT": "#fcfff6","SCROLL": "#fcfff6","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#d0dbbd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Kayak": {"BACKGROUND": "#a7ad7f","TEXT": "#000000","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#5d907d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "SandyBeach": {"BACKGROUND": "#efeccb","TEXT": "#012f2f","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#012f2f","BUTTON": ("#FFFFFF", "#046380"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "TealMono": {"BACKGROUND": "#a8cfdd","TEXT": "#000000","INPUT": "#dfedf2","SCROLL": "#dfedf2","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#183440"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "Default": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "Default1": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": COLOR_SYSTEM_DEFAULT,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "DefaultNoMoreNagging": {"BACKGROUND": COLOR_SYSTEM_DEFAULT,"TEXT": COLOR_SYSTEM_DEFAULT,"INPUT": COLOR_SYSTEM_DEFAULT,"TEXT_INPUT": COLOR_SYSTEM_DEFAULT,"SCROLL": COLOR_SYSTEM_DEFAULT,"BUTTON": OFFICIAL_PYSIMPLEGUI_BUTTON_COLOR,"PROGRESS": COLOR_SYSTEM_DEFAULT,"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "LightBlue": {"BACKGROUND": "#E3F2FD","TEXT": "#000000","INPUT": "#86A8FF","TEXT_INPUT": "#000000","SCROLL": "#86A8FF","BUTTON": ("#FFFFFF", "#5079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, + "LightGrey": {"BACKGROUND": "#FAFAFA","TEXT": "#000000","INPUT": "#004EA1","TEXT_INPUT": "#FFFFFF","SCROLL": "#5EA7FF","BUTTON": ("#FFFFFF", "#0079D3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 0,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#FF0266","ACCENT2": "#FF5C93","ACCENT3": "#C5003C",}, + "LightGrey1": {"BACKGROUND": "#ffffff","TEXT": "#1a1a1b","INPUT": "#dae0e6","TEXT_INPUT": "#222222","SCROLL": "#a5a4a4","BUTTON": ("#FFFFFF", "#0079d3"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#ff5414","ACCENT2": "#33a8ff","ACCENT3": "#dbf0ff",}, + "DarkBrown": {"BACKGROUND": "#282923","TEXT": "#E7DB74","INPUT": "#393a32","TEXT_INPUT": "#E7C855","SCROLL": "#E7C855","BUTTON": ("#E7C855", "#284B5A"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"ACCENT1": "#c15226","ACCENT2": "#7a4d5f","ACCENT3": "#889743",}, + "LightGreen1": {"BACKGROUND": "#9FB8AD","TEXT": "#000000","INPUT": "#F7F3EC","TEXT_INPUT": "#000000","SCROLL": "#F7F3EC","BUTTON": ("#FFFFFF", "#475841"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightGreen2": {"BACKGROUND": "#B7CECE","TEXT": "#000000","INPUT": "#FDFFF7","TEXT_INPUT": "#000000","SCROLL": "#FDFFF7","BUTTON": ("#FFFFFF", "#658268"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"ACCENT1": "#76506d","ACCENT2": "#5148f1","ACCENT3": "#0a1c84","PROGRESS_DEPTH": 0,}, + "DarkGrey1": {"BACKGROUND": "#404040","TEXT": "#FFFFFF","INPUT": "#FFFFFF","TEXT_INPUT": "#000000","SCROLL": "#707070","BUTTON": ("#FFFFFF", "#004F00"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlack": {"BACKGROUND": "#000000","TEXT": "#FFFFFF","INPUT": "#4D4D4D","TEXT_INPUT": "#FFFFFF","SCROLL": "#707070","BUTTON": ("#000000", "#FFFFFF"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBrown": {"BACKGROUND": "#fdf6e3","TEXT": "#268bd1","INPUT": "#eee8d5","TEXT_INPUT": "#6c71c3","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063542"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBrown1": {"BACKGROUND": "#e5dece","TEXT": "#063289","INPUT": "#f9f8f4","TEXT_INPUT": "#242834","SCROLL": "#eee8d5","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlue1": {"BACKGROUND": "#242834","TEXT": "#dfe6f8","INPUT": "#97755c","TEXT_INPUT": "#FFFFFF","SCROLL": "#a9afbb","BUTTON": ("#FFFFFF", "#063289"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBrown1": {"BACKGROUND": "#2c2825","TEXT": "#fdcb52","INPUT": "#705e52","TEXT_INPUT": "#fdcb52","SCROLL": "#705e52","BUTTON": ("#000000", "#fdcb52"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlue2": {"BACKGROUND": "#1a2835","TEXT": "#d1ecff","INPUT": "#335267","TEXT_INPUT": "#acc2d0","SCROLL": "#1b6497","BUTTON": ("#000000", "#fafaf8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBrown2": {"BACKGROUND": "#280001","TEXT": "#FFFFFF","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#763e00","BUTTON": ("#000000", "#daad28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGreen": {"BACKGROUND": "#82a459","TEXT": "#000000","INPUT": "#d8d584","TEXT_INPUT": "#000000","SCROLL": "#e3ecf3","BUTTON": ("#FFFFFF", "#517239"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBlue1": {"BACKGROUND": "#A5CADD","TEXT": "#6E266E","INPUT": "#E0F5FF","TEXT_INPUT": "#000000","SCROLL": "#E0F5FF","BUTTON": ("#FFFFFF", "#303952"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightPurple": {"BACKGROUND": "#B0AAC2","TEXT": "#000000","INPUT": "#F2EFE8","SCROLL": "#F2EFE8","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#C2D4D8"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBlue2": {"BACKGROUND": "#AAB6D3","TEXT": "#000000","INPUT": "#F1F4FC","SCROLL": "#F1F4FC","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#7186C7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightGreen3": {"BACKGROUND": "#A8C1B4","TEXT": "#000000","INPUT": "#DDE0DE","SCROLL": "#E3E3E3","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#6D9F85"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlue3": {"BACKGROUND": "#64778d","TEXT": "#FFFFFF","INPUT": "#f0f3f7","SCROLL": "#A6B2BE","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#283b5b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightGreen4": {"BACKGROUND": "#b4ffb4","TEXT": "#000000","INPUT": "#ffff64","SCROLL": "#ffb482","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#ffa0dc"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightGreen5": {"BACKGROUND": "#92aa9d","TEXT": "#000000","INPUT": "#fcfff6","SCROLL": "#fcfff6","TEXT_INPUT": "#000000","BUTTON": ("#000000", "#d0dbbd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBrown2": {"BACKGROUND": "#a7ad7f","TEXT": "#000000","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#5d907d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBrown3": {"BACKGROUND": "#efeccb","TEXT": "#012f2f","INPUT": "#e6d3a8","SCROLL": "#e6d3a8","TEXT_INPUT": "#012f2f","BUTTON": ("#FFFFFF", "#046380"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBlue3": {"BACKGROUND": "#a8cfdd","TEXT": "#000000","INPUT": "#dfedf2","SCROLL": "#dfedf2","TEXT_INPUT": "#000000","BUTTON": ("#FFFFFF", "#183440"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "LightBrown4": {"BACKGROUND": "#d7c79e","TEXT": "#a35638","INPUT": "#9dab86","TEXT_INPUT": "#000000","SCROLL": "#a35638","BUTTON": ("#FFFFFF", "#a35638"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#a35638", "#9dab86", "#e08f62", "#d7c79e"],}, + "DarkTeal": {"BACKGROUND": "#003f5c","TEXT": "#fb5b5a","INPUT": "#bc4873","TEXT_INPUT": "#FFFFFF","SCROLL": "#bc4873","BUTTON": ("#FFFFFF", "#fb5b5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#003f5c", "#472b62", "#bc4873", "#fb5b5a"],}, + "DarkPurple": {"BACKGROUND": "#472b62","TEXT": "#fb5b5a","INPUT": "#bc4873","TEXT_INPUT": "#FFFFFF","SCROLL": "#bc4873","BUTTON": ("#FFFFFF", "#472b62"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#003f5c", "#472b62", "#bc4873", "#fb5b5a"],}, + "LightGreen6": {"BACKGROUND": "#eafbea","TEXT": "#1f6650","INPUT": "#6f9a8d","TEXT_INPUT": "#FFFFFF","SCROLL": "#1f6650","BUTTON": ("#FFFFFF", "#1f6650"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#1f6650", "#6f9a8d", "#ea5e5e", "#eafbea"],}, + "DarkGrey2": {"BACKGROUND": "#2b2b28","TEXT": "#f8f8f8","INPUT": "#f1d6ab","TEXT_INPUT": "#000000","SCROLL": "#f1d6ab","BUTTON": ("#2b2b28", "#e3b04b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#2b2b28", "#e3b04b", "#f1d6ab", "#f8f8f8"],}, + "LightBrown6": {"BACKGROUND": "#f9b282","TEXT": "#8f4426","INPUT": "#de6b35","TEXT_INPUT": "#FFFFFF","SCROLL": "#8f4426","BUTTON": ("#FFFFFF", "#8f4426"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#8f4426", "#de6b35", "#64ccda", "#f9b282"],}, + "DarkTeal1": {"BACKGROUND": "#396362","TEXT": "#ffe7d1","INPUT": "#f6c89f","TEXT_INPUT": "#000000","SCROLL": "#f6c89f","BUTTON": ("#ffe7d1", "#4b8e8d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#396362", "#4b8e8d", "#f6c89f", "#ffe7d1"],}, + "LightBrown7": {"BACKGROUND": "#f6c89f","TEXT": "#396362","INPUT": "#4b8e8d","TEXT_INPUT": "#FFFFFF","SCROLL": "#396362","BUTTON": ("#FFFFFF", "#396362"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#396362", "#4b8e8d", "#f6c89f", "#ffe7d1"],}, + "DarkPurple1": {"BACKGROUND": "#0c093c","TEXT": "#fad6d6","INPUT": "#eea5f6","TEXT_INPUT": "#000000","SCROLL": "#eea5f6","BUTTON": ("#FFFFFF", "#df42d1"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#0c093c", "#df42d1", "#eea5f6", "#fad6d6"],}, + "DarkGrey3": {"BACKGROUND": "#211717","TEXT": "#dfddc7","INPUT": "#f58b54","TEXT_INPUT": "#000000","SCROLL": "#f58b54","BUTTON": ("#dfddc7", "#a34a28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#211717", "#a34a28", "#f58b54", "#dfddc7"],}, + "LightBrown8": {"BACKGROUND": "#dfddc7","TEXT": "#211717","INPUT": "#a34a28","TEXT_INPUT": "#dfddc7","SCROLL": "#211717","BUTTON": ("#dfddc7", "#a34a28"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#211717", "#a34a28", "#f58b54", "#dfddc7"],}, + "DarkBlue4": {"BACKGROUND": "#494ca2","TEXT": "#e3e7f1","INPUT": "#c6cbef","TEXT_INPUT": "#000000","SCROLL": "#c6cbef","BUTTON": ("#FFFFFF", "#8186d5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#494ca2", "#8186d5", "#c6cbef", "#e3e7f1"],}, + "LightBlue4": {"BACKGROUND": "#5c94bd","TEXT": "#470938","INPUT": "#1a3e59","TEXT_INPUT": "#FFFFFF","SCROLL": "#470938","BUTTON": ("#FFFFFF", "#470938"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#470938", "#1a3e59", "#5c94bd", "#f2d6eb"],}, + "DarkTeal2": {"BACKGROUND": "#394a6d","TEXT": "#c0ffb3","INPUT": "#52de97","TEXT_INPUT": "#000000","SCROLL": "#52de97","BUTTON": ("#c0ffb3", "#394a6d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#394a6d", "#3c9d9b", "#52de97", "#c0ffb3"],}, + "DarkTeal3": {"BACKGROUND": "#3c9d9b","TEXT": "#c0ffb3","INPUT": "#52de97","TEXT_INPUT": "#000000","SCROLL": "#52de97","BUTTON": ("#c0ffb3", "#394a6d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#394a6d", "#3c9d9b", "#52de97", "#c0ffb3"],}, + "DarkPurple5": {"BACKGROUND": "#730068","TEXT": "#f6f078","INPUT": "#01d28e","TEXT_INPUT": "#000000","SCROLL": "#01d28e","BUTTON": ("#f6f078", "#730068"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#730068", "#434982", "#01d28e", "#f6f078"],}, + "DarkPurple2": {"BACKGROUND": "#202060","TEXT": "#b030b0","INPUT": "#602080","TEXT_INPUT": "#FFFFFF","SCROLL": "#602080","BUTTON": ("#FFFFFF", "#202040"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#202040", "#202060", "#602080", "#b030b0"],}, + "DarkBlue5": {"BACKGROUND": "#000272","TEXT": "#ff6363","INPUT": "#a32f80","TEXT_INPUT": "#FFFFFF","SCROLL": "#a32f80","BUTTON": ("#FFFFFF", "#341677"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#000272", "#341677", "#a32f80", "#ff6363"],}, + "LightGrey2": {"BACKGROUND": "#f6f6f6","TEXT": "#420000","INPUT": "#d4d7dd","TEXT_INPUT": "#420000","SCROLL": "#420000","BUTTON": ("#420000", "#d4d7dd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#420000", "#d4d7dd", "#eae9e9", "#f6f6f6"],}, + "LightGrey3": {"BACKGROUND": "#eae9e9","TEXT": "#420000","INPUT": "#d4d7dd","TEXT_INPUT": "#420000","SCROLL": "#420000","BUTTON": ("#420000", "#d4d7dd"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#420000", "#d4d7dd", "#eae9e9", "#f6f6f6"],}, + "DarkBlue6": {"BACKGROUND": "#01024e","TEXT": "#ff6464","INPUT": "#8b4367","TEXT_INPUT": "#FFFFFF","SCROLL": "#8b4367","BUTTON": ("#FFFFFF", "#543864"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#01024e", "#543864", "#8b4367", "#ff6464"],}, + "DarkBlue7": {"BACKGROUND": "#241663","TEXT": "#eae7af","INPUT": "#a72693","TEXT_INPUT": "#eae7af","SCROLL": "#a72693","BUTTON": ("#eae7af", "#160f30"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#160f30", "#241663", "#a72693", "#eae7af"],}, + "LightBrown9": {"BACKGROUND": "#f6d365","TEXT": "#3a1f5d","INPUT": "#c83660","TEXT_INPUT": "#f6d365","SCROLL": "#3a1f5d","BUTTON": ("#f6d365", "#c83660"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3a1f5d", "#c83660", "#e15249", "#f6d365"],}, + "DarkPurple3": {"BACKGROUND": "#6e2142","TEXT": "#ffd692","INPUT": "#e16363","TEXT_INPUT": "#ffd692","SCROLL": "#e16363","BUTTON": ("#ffd692", "#943855"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#6e2142", "#943855", "#e16363", "#ffd692"],}, + "LightBrown10": {"BACKGROUND": "#ffd692","TEXT": "#6e2142","INPUT": "#943855","TEXT_INPUT": "#FFFFFF","SCROLL": "#6e2142","BUTTON": ("#FFFFFF", "#6e2142"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#6e2142", "#943855", "#e16363", "#ffd692"],}, + "DarkPurple4": {"BACKGROUND": "#200f21","TEXT": "#f638dc","INPUT": "#5a3d5c","TEXT_INPUT": "#FFFFFF","SCROLL": "#5a3d5c","BUTTON": ("#FFFFFF", "#382039"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#200f21", "#382039", "#5a3d5c", "#f638dc"],}, + "LightBlue5": {"BACKGROUND": "#b2fcff","TEXT": "#3e64ff","INPUT": "#5edfff","TEXT_INPUT": "#000000","SCROLL": "#3e64ff","BUTTON": ("#FFFFFF", "#3e64ff"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e64ff", "#5edfff", "#b2fcff", "#ecfcff"],}, + "DarkTeal4": {"BACKGROUND": "#464159","TEXT": "#c7f0db","INPUT": "#8bbabb","TEXT_INPUT": "#000000","SCROLL": "#8bbabb","BUTTON": ("#FFFFFF", "#6c7b95"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, + "LightTeal": {"BACKGROUND": "#c7f0db","TEXT": "#464159","INPUT": "#6c7b95","TEXT_INPUT": "#FFFFFF","SCROLL": "#464159","BUTTON": ("#FFFFFF", "#464159"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, + "DarkTeal5": {"BACKGROUND": "#8bbabb","TEXT": "#464159","INPUT": "#6c7b95","TEXT_INPUT": "#FFFFFF","SCROLL": "#464159","BUTTON": ("#c7f0db", "#6c7b95"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#464159", "#6c7b95", "#8bbabb", "#c7f0db"],}, + "LightGrey4": {"BACKGROUND": "#faf5ef","TEXT": "#672f2f","INPUT": "#99b19c","TEXT_INPUT": "#672f2f","SCROLL": "#672f2f","BUTTON": ("#672f2f", "#99b19c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, + "LightGreen7": {"BACKGROUND": "#99b19c","TEXT": "#faf5ef","INPUT": "#d7d1c9","TEXT_INPUT": "#000000","SCROLL": "#d7d1c9","BUTTON": ("#FFFFFF", "#99b19c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, + "LightGrey5": {"BACKGROUND": "#d7d1c9","TEXT": "#672f2f","INPUT": "#99b19c","TEXT_INPUT": "#672f2f","SCROLL": "#672f2f","BUTTON": ("#FFFFFF", "#672f2f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#672f2f", "#99b19c", "#d7d1c9", "#faf5ef"],}, + "DarkBrown3": {"BACKGROUND": "#a0855b","TEXT": "#f9f6f2","INPUT": "#f1d6ab","TEXT_INPUT": "#000000","SCROLL": "#f1d6ab","BUTTON": ("#FFFFFF", "#38470b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#38470b", "#a0855b", "#f1d6ab", "#f9f6f2"],}, + "LightBrown11": {"BACKGROUND": "#f1d6ab","TEXT": "#38470b","INPUT": "#a0855b","TEXT_INPUT": "#FFFFFF","SCROLL": "#38470b","BUTTON": ("#f9f6f2", "#a0855b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#38470b", "#a0855b", "#f1d6ab", "#f9f6f2"],}, + "DarkRed": {"BACKGROUND": "#83142c","TEXT": "#f9d276","INPUT": "#ad1d45","TEXT_INPUT": "#FFFFFF","SCROLL": "#ad1d45","BUTTON": ("#f9d276", "#ad1d45"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#44000d", "#83142c", "#ad1d45", "#f9d276"],}, + "DarkTeal6": {"BACKGROUND": "#204969","TEXT": "#fff7f7","INPUT": "#dadada","TEXT_INPUT": "#000000","SCROLL": "#dadada","BUTTON": ("#000000", "#fff7f7"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#204969", "#08ffc8", "#dadada", "#fff7f7"],}, + "DarkBrown4": {"BACKGROUND": "#252525","TEXT": "#ff0000","INPUT": "#af0404","TEXT_INPUT": "#FFFFFF","SCROLL": "#af0404","BUTTON": ("#FFFFFF", "#252525"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#252525", "#414141", "#af0404", "#ff0000"],}, + "LightYellow": {"BACKGROUND": "#f4ff61","TEXT": "#27aa80","INPUT": "#32ff6a","TEXT_INPUT": "#000000","SCROLL": "#27aa80","BUTTON": ("#f4ff61", "#27aa80"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#27aa80", "#32ff6a", "#a8ff3e", "#f4ff61"],}, + "DarkGreen1": {"BACKGROUND": "#2b580c","TEXT": "#fdef96","INPUT": "#f7b71d","TEXT_INPUT": "#000000","SCROLL": "#f7b71d","BUTTON": ("#fdef96", "#2b580c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#2b580c", "#afa939", "#f7b71d", "#fdef96"],}, + "LightGreen8": {"BACKGROUND": "#c8dad3","TEXT": "#63707e","INPUT": "#93b5b3","TEXT_INPUT": "#000000","SCROLL": "#63707e","BUTTON": ("#FFFFFF", "#63707e"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#63707e", "#93b5b3", "#c8dad3", "#f2f6f5"],}, + "DarkTeal7": {"BACKGROUND": "#248ea9","TEXT": "#fafdcb","INPUT": "#aee7e8","TEXT_INPUT": "#000000","SCROLL": "#aee7e8","BUTTON": ("#000000", "#fafdcb"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#248ea9", "#28c3d4", "#aee7e8", "#fafdcb"],}, + "DarkBlue8": {"BACKGROUND": "#454d66","TEXT": "#d9d872","INPUT": "#58b368","TEXT_INPUT": "#000000","SCROLL": "#58b368","BUTTON": ("#000000", "#009975"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#009975", "#454d66", "#58b368", "#d9d872"],}, + "DarkBlue9": {"BACKGROUND": "#263859","TEXT": "#ff6768","INPUT": "#6b778d","TEXT_INPUT": "#FFFFFF","SCROLL": "#6b778d","BUTTON": ("#ff6768", "#263859"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#17223b", "#263859", "#6b778d", "#ff6768"],}, + "DarkBlue10": {"BACKGROUND": "#0028ff","TEXT": "#f1f4df","INPUT": "#10eaf0","TEXT_INPUT": "#000000","SCROLL": "#10eaf0","BUTTON": ("#f1f4df", "#24009c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#24009c", "#0028ff", "#10eaf0", "#f1f4df"],}, + "DarkBlue11": {"BACKGROUND": "#6384b3","TEXT": "#e6f0b6","INPUT": "#b8e9c0","TEXT_INPUT": "#000000","SCROLL": "#b8e9c0","BUTTON": ("#e6f0b6", "#684949"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#684949", "#6384b3", "#b8e9c0", "#e6f0b6"],}, + "DarkTeal8": {"BACKGROUND": "#71a0a5","TEXT": "#212121","INPUT": "#665c84","TEXT_INPUT": "#FFFFFF","SCROLL": "#212121","BUTTON": ("#fab95b", "#665c84"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#212121", "#665c84", "#71a0a5", "#fab95b"],}, + "DarkRed1": {"BACKGROUND": "#c10000","TEXT": "#eeeeee","INPUT": "#dedede","TEXT_INPUT": "#000000","SCROLL": "#dedede","BUTTON": ("#c10000", "#eeeeee"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#c10000", "#ff4949", "#dedede", "#eeeeee"],}, + "LightBrown5": {"BACKGROUND": "#fff591","TEXT": "#e41749","INPUT": "#f5587b","TEXT_INPUT": "#000000","SCROLL": "#e41749","BUTTON": ("#fff591", "#e41749"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#e41749", "#f5587b", "#ff8a5c", "#fff591"],}, + "LightGreen9": {"BACKGROUND": "#f1edb3","TEXT": "#3b503d","INPUT": "#4a746e","TEXT_INPUT": "#f1edb3","SCROLL": "#3b503d","BUTTON": ("#f1edb3", "#3b503d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3b503d", "#4a746e", "#c8cf94", "#f1edb3"],"DESCRIPTION": ["Green", "Turquoise", "Yellow"],}, + "DarkGreen2": {"BACKGROUND": "#3b503d","TEXT": "#f1edb3","INPUT": "#c8cf94","TEXT_INPUT": "#000000","SCROLL": "#c8cf94","BUTTON": ("#f1edb3", "#3b503d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3b503d", "#4a746e", "#c8cf94", "#f1edb3"],"DESCRIPTION": ["Green", "Turquoise", "Yellow"],}, + "LightGray1": {"BACKGROUND": "#f2f2f2","TEXT": "#222831","INPUT": "#393e46","TEXT_INPUT": "#FFFFFF","SCROLL": "#222831","BUTTON": ("#f2f2f2", "#222831"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#222831", "#393e46", "#f96d00", "#f2f2f2"],"DESCRIPTION": ["#000000", "Grey", "Orange", "Grey", "Autumn"],}, + "DarkGrey4": {"BACKGROUND": "#52524e","TEXT": "#e9e9e5","INPUT": "#d4d6c8","TEXT_INPUT": "#000000","SCROLL": "#d4d6c8","BUTTON": ("#FFFFFF", "#9a9b94"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#52524e", "#9a9b94", "#d4d6c8", "#e9e9e5"],"DESCRIPTION": ["Grey", "Pastel", "Winter"],}, + "DarkBlue12": {"BACKGROUND": "#324e7b","TEXT": "#f8f8f8","INPUT": "#86a6df","TEXT_INPUT": "#000000","SCROLL": "#86a6df","BUTTON": ("#FFFFFF", "#5068a9"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#324e7b", "#5068a9", "#86a6df", "#f8f8f8"],"DESCRIPTION": ["Blue", "Grey", "Cold", "Winter"],}, + "DarkPurple6": {"BACKGROUND": "#070739","TEXT": "#e1e099","INPUT": "#c327ab","TEXT_INPUT": "#e1e099","SCROLL": "#c327ab","BUTTON": ("#e1e099", "#521477"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#070739", "#521477", "#c327ab", "#e1e099"],"DESCRIPTION": ["#000000", "Purple", "Yellow", "Dark"],}, + "DarkPurple7": {"BACKGROUND": "#191930","TEXT": "#B1B7C5","INPUT": "#232B5C","TEXT_INPUT": "#D0E3E7","SCROLL": "#B1B7C5","BUTTON": ("#272D38", "#B1B7C5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBlue13": {"BACKGROUND": "#203562","TEXT": "#e3e8f8","INPUT": "#c0c5cd","TEXT_INPUT": "#000000","SCROLL": "#c0c5cd","BUTTON": ("#FFFFFF", "#3e588f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#203562", "#3e588f", "#c0c5cd", "#e3e8f8"],"DESCRIPTION": ["Blue", "Grey", "Wedding", "Cold"],}, + "DarkBrown5": {"BACKGROUND": "#3c1b1f","TEXT": "#f6e1b5","INPUT": "#e2bf81","TEXT_INPUT": "#000000","SCROLL": "#e2bf81","BUTTON": ("#3c1b1f", "#f6e1b5"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3c1b1f", "#b21e4b", "#e2bf81", "#f6e1b5"],"DESCRIPTION": ["Brown", "Red", "Yellow", "Warm"],}, + "DarkGreen3": {"BACKGROUND": "#062121","TEXT": "#eeeeee","INPUT": "#e4dcad","TEXT_INPUT": "#000000","SCROLL": "#e4dcad","BUTTON": ("#eeeeee", "#181810"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#062121", "#181810", "#e4dcad", "#eeeeee"],"DESCRIPTION": ["#000000", "#000000", "Brown", "Grey"],}, + "DarkBlack1": {"BACKGROUND": "#181810","TEXT": "#eeeeee","INPUT": "#e4dcad","TEXT_INPUT": "#000000","SCROLL": "#e4dcad","BUTTON": ("#FFFFFF", "#062121"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#062121", "#181810", "#e4dcad", "#eeeeee"],"DESCRIPTION": ["#000000", "#000000", "Brown", "Grey"],}, + "DarkGrey5": {"BACKGROUND": "#343434","TEXT": "#f3f3f3","INPUT": "#e9dcbe","TEXT_INPUT": "#000000","SCROLL": "#e9dcbe","BUTTON": ("#FFFFFF", "#8e8b82"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#343434", "#8e8b82", "#e9dcbe", "#f3f3f3"],"DESCRIPTION": ["Grey", "Brown"],}, + "LightBrown12": {"BACKGROUND": "#8e8b82","TEXT": "#f3f3f3","INPUT": "#e9dcbe","TEXT_INPUT": "#000000","SCROLL": "#e9dcbe","BUTTON": ("#f3f3f3", "#8e8b82"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#343434", "#8e8b82", "#e9dcbe", "#f3f3f3"],"DESCRIPTION": ["Grey", "Brown"],}, + "DarkTeal9": {"BACKGROUND": "#13445a","TEXT": "#fef4e8","INPUT": "#446878","TEXT_INPUT": "#FFFFFF","SCROLL": "#446878","BUTTON": ("#fef4e8", "#446878"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#13445a", "#970747", "#446878", "#fef4e8"],"DESCRIPTION": ["Red", "Grey", "Blue", "Wedding", "Retro"],}, + "DarkBlue14": {"BACKGROUND": "#21273d","TEXT": "#f1f6f8","INPUT": "#b9d4f1","TEXT_INPUT": "#000000","SCROLL": "#b9d4f1","BUTTON": ("#FFFFFF", "#6a759b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#21273d", "#6a759b", "#b9d4f1", "#f1f6f8"],"DESCRIPTION": ["Blue", "#000000", "Grey", "Cold", "Winter"],}, + "LightBlue6": {"BACKGROUND": "#f1f6f8","TEXT": "#21273d","INPUT": "#6a759b","TEXT_INPUT": "#FFFFFF","SCROLL": "#21273d","BUTTON": ("#f1f6f8", "#6a759b"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#21273d", "#6a759b", "#b9d4f1", "#f1f6f8"],"DESCRIPTION": ["Blue", "#000000", "Grey", "Cold", "Winter"],}, + "DarkGreen4": {"BACKGROUND": "#044343","TEXT": "#e4e4e4","INPUT": "#045757","TEXT_INPUT": "#e4e4e4","SCROLL": "#045757","BUTTON": ("#e4e4e4", "#045757"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#222222", "#044343", "#045757", "#e4e4e4"],"DESCRIPTION": ["#000000", "Turquoise", "Grey", "Dark"],}, + "DarkGreen5": {"BACKGROUND": "#1b4b36","TEXT": "#e0e7f1","INPUT": "#aebd77","TEXT_INPUT": "#000000","SCROLL": "#aebd77","BUTTON": ("#FFFFFF", "#538f6a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#1b4b36", "#538f6a", "#aebd77", "#e0e7f1"],"DESCRIPTION": ["Green", "Grey"],}, + "DarkTeal10": {"BACKGROUND": "#0d3446","TEXT": "#d8dfe2","INPUT": "#71adb5","TEXT_INPUT": "#000000","SCROLL": "#71adb5","BUTTON": ("#FFFFFF", "#176d81"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#0d3446", "#176d81", "#71adb5", "#d8dfe2"],"DESCRIPTION": ["Grey", "Turquoise", "Winter", "Cold"],}, + "DarkGrey6": {"BACKGROUND": "#3e3e3e","TEXT": "#ededed","INPUT": "#68868c","TEXT_INPUT": "#ededed","SCROLL": "#68868c","BUTTON": ("#FFFFFF", "#405559"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e3e3e", "#405559", "#68868c", "#ededed"],"DESCRIPTION": ["Grey", "Turquoise", "Winter"],}, + "DarkTeal11": {"BACKGROUND": "#405559","TEXT": "#ededed","INPUT": "#68868c","TEXT_INPUT": "#ededed","SCROLL": "#68868c","BUTTON": ("#ededed", "#68868c"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#3e3e3e", "#405559", "#68868c", "#ededed"],"DESCRIPTION": ["Grey", "Turquoise", "Winter"],}, + "LightBlue7": {"BACKGROUND": "#9ed0e0","TEXT": "#19483f","INPUT": "#5c868e","TEXT_INPUT": "#FFFFFF","SCROLL": "#19483f","BUTTON": ("#FFFFFF", "#19483f"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#19483f", "#5c868e", "#ff6a38", "#9ed0e0"],"DESCRIPTION": ["Orange", "Blue", "Turquoise"],}, + "LightGreen10": {"BACKGROUND": "#d8ebb5","TEXT": "#205d67","INPUT": "#639a67","TEXT_INPUT": "#FFFFFF","SCROLL": "#205d67","BUTTON": ("#d8ebb5", "#205d67"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#205d67", "#639a67", "#d9bf77", "#d8ebb5"],"DESCRIPTION": ["Blue", "Green", "Brown", "Vintage"],}, + "DarkBlue15": {"BACKGROUND": "#151680","TEXT": "#f1fea4","INPUT": "#375fc0","TEXT_INPUT": "#f1fea4","SCROLL": "#375fc0","BUTTON": ("#f1fea4", "#1c44ac"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#151680", "#1c44ac", "#375fc0", "#f1fea4"],"DESCRIPTION": ["Blue", "Yellow", "Cold"],}, + "DarkBlue16": {"BACKGROUND": "#1c44ac","TEXT": "#f1fea4","INPUT": "#375fc0","TEXT_INPUT": "#f1fea4","SCROLL": "#375fc0","BUTTON": ("#f1fea4", "#151680"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#151680", "#1c44ac", "#375fc0", "#f1fea4"],"DESCRIPTION": ["Blue", "Yellow", "Cold"],}, + "DarkTeal12": {"BACKGROUND": "#004a7c","TEXT": "#fafafa","INPUT": "#e8f1f5","TEXT_INPUT": "#000000","SCROLL": "#e8f1f5","BUTTON": ("#fafafa", "#005691"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#004a7c", "#005691", "#e8f1f5", "#fafafa"],"DESCRIPTION": ["Grey", "Blue", "Cold", "Winter"],}, + "LightBrown13": {"BACKGROUND": "#ebf5ee","TEXT": "#921224","INPUT": "#bdc6b8","TEXT_INPUT": "#921224","SCROLL": "#921224","BUTTON": ("#FFFFFF", "#921224"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#921224", "#bdc6b8", "#bce0da", "#ebf5ee"],"DESCRIPTION": ["Red", "Blue", "Grey", "Vintage", "Wedding"],}, + "DarkBlue17": {"BACKGROUND": "#21294c","TEXT": "#f9f2d7","INPUT": "#f2dea8","TEXT_INPUT": "#000000","SCROLL": "#f2dea8","BUTTON": ("#f9f2d7", "#141829"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#141829", "#21294c", "#f2dea8", "#f9f2d7"],"DESCRIPTION": ["#000000", "Blue", "Yellow"],}, + "DarkBrown6": {"BACKGROUND": "#785e4d","TEXT": "#f2eee3","INPUT": "#baaf92","TEXT_INPUT": "#000000","SCROLL": "#baaf92","BUTTON": ("#FFFFFF", "#785e4d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#785e4d", "#ff8426", "#baaf92", "#f2eee3"],"DESCRIPTION": ["Grey", "Brown", "Orange", "Autumn"],}, + "DarkGreen6": {"BACKGROUND": "#5c715e","TEXT": "#f2f9f1","INPUT": "#ddeedf","TEXT_INPUT": "#000000","SCROLL": "#ddeedf","BUTTON": ("#f2f9f1", "#5c715e"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#5c715e", "#b6cdbd", "#ddeedf", "#f2f9f1"],"DESCRIPTION": ["Grey", "Green", "Vintage"],}, + "DarkGreen7": {"BACKGROUND": "#0C231E","TEXT": "#efbe1c","INPUT": "#153C33","TEXT_INPUT": "#efbe1c","SCROLL": "#153C33","BUTTON": ("#efbe1c", "#153C33"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey7": {"BACKGROUND": "#4b586e","TEXT": "#dddddd","INPUT": "#574e6d","TEXT_INPUT": "#dddddd","SCROLL": "#574e6d","BUTTON": ("#dddddd", "#43405d"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#43405d", "#4b586e", "#574e6d", "#dddddd"],"DESCRIPTION": ["Grey", "Winter", "Cold"],}, + "DarkRed2": {"BACKGROUND": "#ab1212","TEXT": "#f6e4b5","INPUT": "#cd3131","TEXT_INPUT": "#f6e4b5","SCROLL": "#cd3131","BUTTON": ("#f6e4b5", "#ab1212"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#ab1212", "#1fad9f", "#cd3131", "#f6e4b5"],"DESCRIPTION": ["Turquoise", "Red", "Yellow"],}, + "LightGrey6": {"BACKGROUND": "#e3e3e3","TEXT": "#233142","INPUT": "#455d7a","TEXT_INPUT": "#e3e3e3","SCROLL": "#233142","BUTTON": ("#e3e3e3", "#455d7a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,"COLOR_LIST": ["#233142", "#455d7a", "#f95959", "#e3e3e3"],"DESCRIPTION": ["#000000", "Blue", "Red", "Grey"],}, + "HotDogStand": {"BACKGROUND": "red","TEXT": "yellow","INPUT": "yellow","TEXT_INPUT": "#000000","SCROLL": "yellow","BUTTON": ("red", "yellow"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey8": {"BACKGROUND": "#19232D","TEXT": "#ffffff","INPUT": "#32414B","TEXT_INPUT": "#ffffff","SCROLL": "#505F69","BUTTON": ("#ffffff", "#32414B"),"PROGRESS": ("#505F69", "#32414B"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey9": {"BACKGROUND": "#36393F","TEXT": "#DCDDDE","INPUT": "#40444B","TEXT_INPUT": "#ffffff","SCROLL": "#202225","BUTTON": ("#202225", "#B9BBBE"),"PROGRESS": ("#202225", "#40444B"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey10": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#272a31","TEXT_INPUT": "#8b9fde","SCROLL": "#313641","BUTTON": ("#f5f5f6", "#2e3d5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey11": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#313641","TEXT_INPUT": "#cccdcf","SCROLL": "#313641","BUTTON": ("#f5f5f6", "#313641"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey12": {"BACKGROUND": "#1c1e23","TEXT": "#8b9fde","INPUT": "#313641","TEXT_INPUT": "#8b9fde","SCROLL": "#313641","BUTTON": ("#cccdcf", "#2e3d5a"),"PROGRESS": DEFAULT_PROGRESS_BAR_COMPUTE,"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey13": {"BACKGROUND": "#1c1e23","TEXT": "#cccdcf","INPUT": "#272a31","TEXT_INPUT": "#cccdcf","SCROLL": "#313641","BUTTON": ("#8b9fde", "#313641"),"PROGRESS": ("#cccdcf", "#272a31"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkGrey14": {"BACKGROUND": "#24292e","TEXT": "#fafbfc","INPUT": "#1d2125","TEXT_INPUT": "#fafbfc","SCROLL": "#1d2125","BUTTON": ("#fafbfc", "#155398"),"PROGRESS": ("#155398", "#1d2125"),"BORDER": 1,"SLIDER_DEPTH": 0,"PROGRESS_DEPTH": 0,}, + "DarkBrown7": {"BACKGROUND": "#2c2417","TEXT": "#baa379","INPUT": "#baa379","TEXT_INPUT": "#000000","SCROLL": "#392e1c","BUTTON": ("#000000", "#baa379"),"PROGRESS": ("#baa379", "#453923"),"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, + "Python": {"BACKGROUND": "#3d7aab","TEXT": "#ffde56","INPUT": "#295273","TEXT_INPUT": "#ffde56","SCROLL": "#295273","BUTTON": ("#ffde56", "#295273"),"PROGRESS": ("#ffde56", "#295273"),"BORDER": 1,"SLIDER_DEPTH": 1,"PROGRESS_DEPTH": 0,}, } @@ -14562,9 +14746,9 @@ def ChangeLookAndFeel(index, force=False): The number will vary for each pair. There are more DarkGrey entries than there are LightYellow for example. Default = The default settings (only button color is different than system default) Default1 = The full system default including the button (everything's gray... how sad... don't be all gray... please....) - :param index: the name of the index into the Look and Feel table (does not have to be exact, can be "fuzzy") + :param index: the name of the index into the Look and Feel table (does not have to be exact, can be "fuzzy") :type index: (str) - :param force: no longer used + :param force: no longer used :type force: (bool) :return: None :rtype: None @@ -14751,46 +14935,46 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo :param *args: Variable number of your arguments. Load up the call with stuff to see! :type *args: (Any) - :param title: Optional title for the window. If none provided, the first arg will be used instead. + :param title: Optional title for the window. If none provided, the first arg will be used instead. :type title: (str) :param button_color: Color of the buttons shown (text color, button color) - :type button_color: Union[Tuple[str, str], None] - :param background_color: Window's background color + :type button_color: Tuple[str, str] | None + :param background_color: Window's background color :type background_color: (str) - :param text_color: text color + :param text_color: text color :type text_color: (str) - :param button_type: NOT USER SET! Determines which pre-defined buttons will be shown (Default value = POPUP_BUTTONS_OK). There are many Popup functions and they call Popup, changing this parameter to get the desired effect. + :param button_type: NOT USER SET! Determines which pre-defined buttons will be shown (Default value = POPUP_BUTTONS_OK). There are many Popup functions and they call Popup, changing this parameter to get the desired effect. :type button_type: (int) - :param auto_close: If True the window will automatically close + :param auto_close: If True the window will automatically close :type auto_close: (bool) - :param auto_close_duration: time in seconds to keep window open before closing it automatically + :param auto_close_duration: time in seconds to keep window open before closing it automatically :type auto_close_duration: (int) - :param custom_text: A string or pair of strings that contain the text to display on the buttons - :type custom_text: Union[Tuple[str, str], str] - :param non_blocking: If True then will immediately return from the function without waiting for the user's input. + :param custom_text: A string or pair of strings that contain the text to display on the buttons + :type custom_text: Tuple[str, str] | str + :param non_blocking: If True then will immediately return from the function without waiting for the user's input. :type non_blocking: (bool) - :param icon: icon to display on the window. Same format as a Window call - :type icon: Union[str, bytes] - :param line_width: Width of lines in characters. Defaults to MESSAGE_BOX_LINE_WIDTH + :param icon: icon to display on the window. Same format as a Window call + :type icon: str | bytes + :param line_width: Width of lines in characters. Defaults to MESSAGE_BOX_LINE_WIDTH :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, tuple(font name, size, modifiers] - :param no_titlebar: If True will not show the frame around the window and the titlebar across the top + :param font: specifies the font family, size, etc + :type font: str | Tuple[font_name, size, modifiers] + :param no_titlebar: If True will not show the frame around the window and the titlebar across the top :type no_titlebar: (bool) - :param grab_anywhere: If True can grab anywhere to move the window. If no_titlebar is True, grab_anywhere should likely be enabled too + :param grab_anywhere: If True can grab anywhere to move the window. If no_titlebar is True, grab_anywhere should likely be enabled too :type grab_anywhere: (bool) - :param location: Location on screen to display the top left corner of window. Defaults to window centered on screen + :param location: Location on screen to display the top left corner of window. Defaults to window centered on screen :type location: Tuple[int, int] :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) :param any_key_closes: If True then will turn on return_keyboard_events for the window which will cause window to close as soon as any key is pressed. Normally the return key only will close the window. Default is false. :type any_key_closes: (bool) - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None] + :rtype: str | None """ if not args: @@ -14802,15 +14986,15 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo else: local_line_width = MESSAGE_BOX_LINE_WIDTH _title = title if title is not None else args_to_print[0] - window = Window(_title, auto_size_text=True, background_color=background_color, button_color=button_color, - auto_close=auto_close, auto_close_duration=auto_close_duration, icon=icon, font=font, - no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, return_keyboard_events=any_key_closes, modal=modal) + + layout = [[]] max_line_total, total_lines = 0, 0 if image is not None: if isinstance(image, str): - window.add_row(Image(filename=image)) + layout += [[Image(filename=image)]] else: - window.add_row(Image(data=image)) + layout += [[Image(data=image)]] + for message in args_to_print: # fancy code to check if string and convert if not is not need. Just always convert to string :-) # if not isinstance(message, str): message = str(message) @@ -14828,8 +15012,8 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo max_line_total = max(max_line_total, width_used) # height = _GetNumLinesNeeded(message, width_used) height = message_wrapped_lines - window.AddRow( - Text(message_wrapped, auto_size_text=True, text_color=text_color, background_color=background_color)) + layout += [[ + Text(message_wrapped, auto_size_text=True, text_color=text_color, background_color=background_color)]] total_lines += height if non_blocking: @@ -14839,33 +15023,37 @@ def Popup(*args, title=None, button_color=None, background_color=None, text_colo # show either an OK or Yes/No depending on paramater if custom_text != (None, None): if type(custom_text) is not tuple: - window.AddRow(PopupButton(custom_text, size=(len(custom_text), 1), button_color=button_color, focus=True, - bind_return_key=True)) + layout += [[PopupButton(custom_text, size=(len(custom_text), 1), button_color=button_color, focus=True, + bind_return_key=True)]] elif custom_text[1] is None: - window.AddRow( + layout += [[ PopupButton(custom_text[0], size=(len(custom_text[0]), 1), button_color=button_color, focus=True, - bind_return_key=True)) + bind_return_key=True)]] else: - window.AddRow(PopupButton(custom_text[0], button_color=button_color, focus=True, bind_return_key=True, - size=(len(custom_text[0]), 1)), - PopupButton(custom_text[1], button_color=button_color, size=(len(custom_text[0]), 1))) + layout += [[PopupButton(custom_text[0], button_color=button_color, focus=True, bind_return_key=True, + size=(len(custom_text[0]), 1)), + PopupButton(custom_text[1], button_color=button_color, size=(len(custom_text[0]), 1))]] elif button_type is POPUP_BUTTONS_YES_NO: - window.AddRow(PopupButton('Yes', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 5), 3), - size=(5, 1)), PopupButton('No', button_color=button_color, size=(5, 1))) + layout += [[PopupButton('Yes', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 5), 3), + size=(5, 1)), PopupButton('No', button_color=button_color, size=(5, 1))]] elif button_type is POPUP_BUTTONS_CANCELLED: - window.AddRow( - PopupButton('Cancelled', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 0), 3))) + layout += [[ + PopupButton('Cancelled', button_color=button_color, focus=True, bind_return_key=True, pad=((20, 0), 3))]] elif button_type is POPUP_BUTTONS_ERROR: - window.AddRow(PopupButton('Error', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True, - pad=((20, 0), 3))) + layout += [[PopupButton('Error', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True, + pad=((20, 0), 3))]] elif button_type is POPUP_BUTTONS_OK_CANCEL: - window.AddRow(PopupButton('OK', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True), - PopupButton('Cancel', size=(6, 1), button_color=button_color)) + layout += [[PopupButton('OK', size=(6, 1), button_color=button_color, focus=True, bind_return_key=True), + PopupButton('Cancel', size=(6, 1), button_color=button_color)]] elif button_type is POPUP_BUTTONS_NO_BUTTONS: pass else: - window.AddRow(PopupButton('OK', size=(5, 1), button_color=button_color, focus=True, bind_return_key=True, - pad=((20, 0), 3))) + layout += [[PopupButton('OK', size=(5, 1), button_color=button_color, focus=True, bind_return_key=True, + pad=((20, 0), 3))]] + + window = Window(_title, layout, auto_size_text=True, background_color=background_color, button_color=button_color, + auto_close=auto_close, auto_close_duration=auto_close_duration, icon=icon, font=font, + no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, return_keyboard_events=any_key_closes, modal=modal) if non_blocking: button, values = window.read(timeout=0) @@ -14905,17 +15093,17 @@ def PopupScrolled(*args, title=None, button_color=None, background_color=None, t :type *args: (Any) :param title: Title to display in the window. :type title: (str) - :param button_color: button color (foreground, background) + :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str - :param yes_no: If True, displays Yes and No buttons instead of Ok + :param yes_no: If True, displays Yes and No buttons instead of Ok :type yes_no: (bool) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] - :param size: (w,h) w=characters-wide, h=rows-high + :type auto_close_duration: int | float + :param size: (w,h) w=characters-wide, h=rows-high :type size: (int, int) - :param location: Location on the screen to place the upper left corner of the window + :param location: Location on the screen to place the upper left corner of the window :type location: Tuple[int, int] :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) @@ -14930,25 +15118,25 @@ def PopupScrolled(*args, title=None, button_color=None, background_color=None, t :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] - :param image: Image to include at the top of the popup window + :type font: str | Tuple[str, int] + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ if not args: return width, height = size width = width if width else MESSAGE_BOX_LINE_WIDTH - window = Window(title=title or args[0], auto_size_text=True, button_color=button_color, auto_close=auto_close, - auto_close_duration=auto_close_duration, location=location, resizable=True, font=font, background_color=background_color, - no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, modal=modal) + + layout = [[]] + if image is not None: if isinstance(image, str): - window.add_row(Image(filename=image)) + layout += [[Image(filename=image)]] else: - window.add_row(Image(data=image)) + layout += [[Image(data=image)]] max_line_total, max_line_width, total_lines, height_computed = 0, 0, 0, 0 complete_output = '' for message in args: @@ -14966,15 +15154,20 @@ def PopupScrolled(*args, title=None, button_color=None, background_color=None, t height_computed = MAX_SCROLLED_TEXT_BOX_HEIGHT if height_computed > MAX_SCROLLED_TEXT_BOX_HEIGHT else height_computed if height: height_computed = height - window.AddRow(Multiline(complete_output, size=(max_line_width, height_computed), background_color=background_color, text_color=text_color)) + layout += [[Multiline(complete_output, size=(max_line_width, height_computed), background_color=background_color, text_color=text_color)]] pad = max_line_total - 15 if max_line_total > 15 else 1 # show either an OK or Yes/No depending on paramater button = DummyButton if non_blocking else Button if yes_no: - window.AddRow(Text('', size=(pad, 1), auto_size_text=False, background_color=background_color), button('Yes'), button('No')) + layout += [[Text('', size=(pad, 1), auto_size_text=False, background_color=background_color), button('Yes'), button('No')]] else: - window.AddRow(Text('', size=(pad, 1), auto_size_text=False, background_color=background_color), - button('OK', size=(5, 1), button_color=button_color)) + layout += [[Text('', size=(pad, 1), auto_size_text=False, background_color=background_color), + button('OK', size=(5, 1), button_color=button_color)]] + + + window = Window(title=title or args[0], auto_size_text=True, button_color=button_color, auto_close=auto_close, + auto_close_duration=auto_close_duration, location=location, resizable=True, font=font, background_color=background_color, + no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, modal=modal) if non_blocking: button, values = window.Read(timeout=0) @@ -15010,30 +15203,30 @@ def PopupNoButtons(*args, title=None, background_color=None, text_color=None, au :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] - :param non_blocking: If True then will immediately return from the function without waiting for the user's input. (Default = False) + :type auto_close_duration: int | float + :param non_blocking: If True then will immediately return from the function without waiting for the user's input. (Default = False) :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True, than can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] """ + :rtype: str | None | TIMEOUT_KEY """ Popup(*args, title=title, background_color=background_color, text_color=text_color, button_type=POPUP_BUTTONS_NO_BUTTONS, auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, @@ -15061,37 +15254,37 @@ def PopupNonBlocking(*args, title=None, button_type=POPUP_BUTTONS_OK, button_col :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = False :type modal: bool :return: Reason for popup closing - :rtype: Union[str, None] + :rtype: str | None """ return Popup(*args, title=title, button_color=button_color, background_color=background_color, text_color=text_color, - button_type=button_type, - auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, - line_width=line_width, - font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) + button_type=button_type, + auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, + line_width=line_width, + font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) PopupNoWait = PopupNonBlocking @@ -15116,39 +15309,39 @@ def PopupQuick(*args, title=None, button_type=POPUP_BUTTONS_OK, button_color=Non :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = False :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_color=button_color, background_color=background_color, text_color=text_color, - button_type=button_type, - auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, - line_width=line_width, - font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) + button_type=button_type, + auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, + line_width=line_width, + font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) # --------------------------- PopupQuick - a NonBlocking, Self-closing Popup with no titlebar and no buttons --------------------------- @@ -15172,36 +15365,36 @@ def PopupQuickMessage(*args, title=None, button_type=POPUP_BUTTONS_NO_BUTTONS, b :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = False :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_color=button_color, background_color=background_color, text_color=text_color, - button_type=button_type, - auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, - line_width=line_width, - font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) + button_type=button_type, + auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, + line_width=line_width, + font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) # --------------------------- PopupNoTitlebar --------------------------- @@ -15223,36 +15416,36 @@ def PopupNoTitlebar(*args, title=None, button_type=POPUP_BUTTONS_OK, button_colo :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_color=button_color, background_color=background_color, text_color=text_color, - button_type=button_type, - auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, - line_width=line_width, - font=font, no_titlebar=True, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) + button_type=button_type, + auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, + line_width=line_width, + font=font, no_titlebar=True, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) PopupNoFrame = PopupNoTitlebar @@ -15279,39 +15472,39 @@ def PopupAutoClose(*args, title=None, button_type=POPUP_BUTTONS_OK, button_color :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_color=button_color, background_color=background_color, text_color=text_color, - button_type=button_type, - auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, - line_width=line_width, - font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) + button_type=button_type, + auto_close=auto_close, auto_close_duration=auto_close_duration, non_blocking=non_blocking, icon=icon, + line_width=line_width, + font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, image=image, modal=modal) PopupTimed = PopupAutoClose @@ -15334,32 +15527,32 @@ def PopupError(*args, title=None, button_color=(None, None), background_color=No :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ tbutton_color = DEFAULT_ERROR_BUTTON_COLOR if button_color == (None, None) else button_color return Popup(*args, title=title, button_type=POPUP_BUTTONS_ERROR, background_color=background_color, text_color=text_color, @@ -15386,32 +15579,32 @@ def PopupCancel(*args, title=None, button_color=None, background_color=None, tex :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_type=POPUP_BUTTONS_CANCELLED, background_color=background_color, text_color=text_color, @@ -15437,32 +15630,32 @@ def PopupOK(*args, title=None, button_color=None, background_color=None, text_co :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Returns text of the button that was pressed. None will be returned if user closed window with X - :rtype: Union[str, None, TIMEOUT_KEY] + :rtype: str | None | TIMEOUT_KEY """ return Popup(*args, title=title, button_type=POPUP_BUTTONS_OK, background_color=background_color, text_color=text_color, non_blocking=non_blocking, icon=icon, line_width=line_width, button_color=button_color, auto_close=auto_close, @@ -15487,32 +15680,32 @@ def PopupOKCancel(*args, title=None, button_color=None, background_color=None, t :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: clicked button - :rtype: Union["OK", "Cancel", None] + :rtype: "OK" | "Cancel" | None """ return Popup(*args, title=title, button_type=POPUP_BUTTONS_OK_CANCEL, background_color=background_color, text_color=text_color, @@ -15538,32 +15731,32 @@ def PopupYesNo(*args, title=None, button_color=None, background_color=None, text :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param auto_close: if True window will close itself - :type auto_close: (bool) + :param auto_close: if True window will close itself + :type auto_close: (bool) :param auto_close_duration: Older versions only accept int. Time in seconds until window will close - :type auto_close_duration: Union[int, float] + :type auto_close_duration: int | float :param non_blocking: if True the call will immediately return rather than waiting on user input :type non_blocking: (bool) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param line_width: Width of lines in characters :type line_width: (int) - :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :param font: specifies the font family, size, etc + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: clicked button - :rtype: Union["Yes", "No", None] + :rtype: "Yes" | "No" | None """ return Popup(*args, title=title, button_type=POPUP_BUTTONS_YES_NO, background_color=background_color, text_color=text_color, @@ -15585,42 +15778,42 @@ def PopupGetFolder(message, title=None, default_path='', no_window=False, size=( """ Display popup with text entry field and browse button so that a folder can be chosen. - :param message: message displayed to user + :param message: message displayed to user :type message: (str) - :param title: Window title + :param title: Window title :type title: (str) :param default_path: path to display to user as starting point (filled into the input field) :type default_path: (str) - :param no_window: if True, no PySimpleGUI window will be shown. Instead just the tkinter dialog is shown + :param no_window: if True, no PySimpleGUI window will be shown. Instead just the tkinter dialog is shown :type no_window: (bool) :param size: (width, height) of the InputText Element :type size: (int, int) - :param button_color: button color (foreground, background) + :param button_color: button color (foreground, background) :type button_color: Tuple[str, str] or str :param background_color: color of background :type background_color: (str) :param text_color: color of the text :type text_color: (str) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param initial_folder: location in filesystem to begin browsing + :param initial_folder: location in filesystem to begin browsing :type initial_folder: (str) - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: string representing the path chosen, None if cancelled or window closed with X - :rtype: Union[str, None] + :rtype: str | None """ # global _my_windows @@ -15652,8 +15845,8 @@ def PopupGetFolder(message, title=None, default_path='', no_window=False, size=( except: pass folder_name = tk.filedialog.askdirectory( - initialdir=initial_folder, - ) # show the 'get folder' dialog box + initialdir=initial_folder, + ) # show the 'get folder' dialog box root.destroy() if Window.NumOpenWindows == 1: @@ -15671,9 +15864,9 @@ def PopupGetFolder(message, title=None, default_path='', no_window=False, size=( else: layout = [[]] layout += [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color)], - [InputText(default_text=default_path, size=size, key='_INPUT_'), - FolderBrowse(initial_folder=initial_folder)], - [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] + [InputText(default_text=default_path, size=size, key='_INPUT_'), + FolderBrowse(initial_folder=initial_folder)], + [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] window = Window(title=title or message, layout=layout, icon=icon, auto_size_text=True, button_color=button_color, background_color=background_color, @@ -15698,22 +15891,22 @@ def PopupGetFile(message, title=None, default_path='', default_extension='', sav """ Display popup window with text entry field and browse button so that a file can be chosen by user. - :param message: message displayed to user + :param message: message displayed to user :type message: (str) - :param title: Window title + :param title: Window title :type title: (str) :param default_path: path to display to user as starting point (filled into the input field) :type default_path: (str) - :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) + :param default_extension: If no extension entered by user, add this to filename (only used in saveas dialogs) :type default_extension: (str) :param save_as: if True, the "save as" dialog is shown which will verify before overwriting :type save_as: (bool) - :param multiple_files: if True, then allows multiple files to be selected that are returned with ';' between each filename + :param multiple_files: if True, then allows multiple files to be selected that are returned with ';' between each filename :type multiple_files: (bool) :param file_types: List of extensions to show using wildcards. All files (the default) = (("ALL Files", "*.*"),) - :type file_types: Tuple[Tuple[str,str]] - :param no_window: if True, no PySimpleGUI window will be shown. Instead just the tkinter dialog is shown - :type no_window: (bool) + :type file_types: Tuple[Tuple[str,str]] + :param no_window: if True, no PySimpleGUI window will be shown. Instead just the tkinter dialog is shown + :type no_window: (bool) :param size: (width, height) of the InputText Element :type size: (int, int) :param button_color: Color of the button (text, background) @@ -15723,25 +15916,25 @@ def PopupGetFile(message, title=None, default_path='', default_extension='', sav :param text_color: color of the text :type text_color: (str) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True: can grab anywhere to move the window (Default = False) :type grab_anywhere: (bool) - :param keep_on_top: If True the window will remain above all current windows + :param keep_on_top: If True the window will remain above all current windows :type keep_on_top: (bool) - :param location: Location of upper left corner of the window + :param location: Location of upper left corner of the window :type location: Tuple[int, int] - :param initial_folder: location in filesystem to begin browsing + :param initial_folder: location in filesystem to begin browsing :type initial_folder: (str) - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: string representing the file(s) chosen, None if cancelled or window closed with X - :rtype: Union[str, None] + :rtype: str | None """ if icon is None: @@ -15821,8 +16014,8 @@ def PopupGetFile(message, title=None, default_path='', default_extension='', sav layout = [[]] layout += [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color)], - [InputText(default_text=default_path, size=size, key='_INPUT_'), browse_button], - [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] + [InputText(default_text=default_path, size=size, key='_INPUT_'), browse_button], + [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] window = Window(title=title or message, layout=layout, icon=icon, auto_size_text=True, button_color=button_color, font=font, @@ -15856,16 +16049,16 @@ def PopupGetText(message, title=None, default_text='', password_char='', size=(N :type password_char: (str) :param size: (width, height) of the InputText Element :type size: (int, int) - :param button_color: Color of the button (text, background) + :param button_color: Color of the button (text, background) :type button_color: Tuple[str, str] or str :param background_color: background color of the entire window :type background_color: (str) :param text_color: color of the message text :type text_color: (str) :param icon: filename or base64 string to be used for the window's icon - :type icon: Union[bytes, str] + :type icon: bytes | str :param font: specifies the font family, size, etc - :type font: Union[str, Tuple[str, int]] + :type font: str | Tuple[str, int] :param no_titlebar: If True no titlebar will be shown :type no_titlebar: (bool) :param grab_anywhere: If True can click and drag anywhere in the window to move the window @@ -15874,12 +16067,12 @@ def PopupGetText(message, title=None, default_text='', password_char='', size=(N :type keep_on_top: (bool) :param location: (x,y) Location on screen to display the upper left corner of window :type location: Tuple[int, int] - :param image: Image to include at the top of the popup window + :param image: Image to include at the top of the popup window :type image: (str) or (bytes) :param modal: If True then makes the popup will behave like a Modal window... all other windows are non-operational until this one is closed. Default = True :type modal: bool :return: Text entered or None if window was closed or cancel button clicked - :rtype: Union[str, None] + :rtype: str | None """ @@ -15892,8 +16085,8 @@ def PopupGetText(message, title=None, default_text='', password_char='', size=(N layout = [[]] layout += [[Text(message, auto_size_text=True, text_color=text_color, background_color=background_color, font=font)], - [InputText(default_text=default_text, size=size, key='_INPUT_', password_char=password_char)], - [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] + [InputText(default_text=default_text, size=size, key='_INPUT_', password_char=password_char)], + [Button('Ok', size=(6, 1), bind_return_key=True), Button('Cancel', size=(6, 1))]] window = Window(title=title or message, layout=layout, icon=icon, auto_size_text=True, button_color=button_color, no_titlebar=no_titlebar, background_color=background_color, grab_anywhere=grab_anywhere, keep_on_top=keep_on_top, location=location, finalize=True, modal=modal) @@ -15915,7 +16108,7 @@ def popup_get_date(start_mon=None, start_day=None, start_year=None, begin_at_sun :param start_mon: The starting month :type start_mon: (int) :param start_day: The starting day - optional. Set to None or 0 if no date to be chosen at start - :type start_day: Union[int, None] + :type start_day: int | None :param start_year: The starting year :type start_year: (int) :param begin_at_sunday_plus: Determines the left-most day in the display. 0=sunday, 1=monday, etc @@ -16010,7 +16203,7 @@ def popup_get_date(start_mon=None, start_day=None, start_year=None, begin_at_sun days_layout = make_days_layout() layout = [[B('◄◄', font=arrow_font, border_width=0, key='-YEAR-DOWN-', pad=((10,2),2)), - B('◄', font=arrow_font, border_width=0, key='-MON-DOWN-', pad=(0,2)), + B('◄', font=arrow_font, border_width=0, key='-MON-DOWN-', pad=(0,2)), Text('{} {}'.format(mon_names[cur_month - 1], cur_year), size=(16, 1), justification='c', font=mon_year_font, key='-MON-YEAR-', pad=(0,2)), B('►', font=arrow_font,border_width=0, key='-MON-UP-', pad=(0,2)), B('►►', font=arrow_font,border_width=0, key='-YEAR-UP-', pad=(2,2))]] @@ -16083,31 +16276,31 @@ def PopupAnimated(image_source, message=None, background_color=None, text_color= event loop is running every 10 ms. You don't have to worry about delaying, just call it every time through the loop. - :param image_source: Either a filename or a base64 string. - :type image_source: Union[str, bytes] - :param message: An optional message to be shown with the animation + :param image_source: Either a filename or a base64 string. + :type image_source: str | bytes + :param message: An optional message to be shown with the animation :type message: (str) :param background_color: color of background :type background_color: (str) :param text_color: color of the text :type text_color: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, tuple] - :param no_titlebar: If True then the titlebar and window frame will not be shown + :param font: specifies the font family, size, etc + :type font: str | tuple + :param no_titlebar: If True then the titlebar and window frame will not be shown :type no_titlebar: (bool) - :param grab_anywhere: If True then you can move the window just clicking anywhere on window, hold and drag + :param grab_anywhere: If True then you can move the window just clicking anywhere on window, hold and drag :type grab_anywhere: (bool) - :param keep_on_top: If True then Window will remain on top of all other windows currently shownn - :type keep_on_top: (bool) - :param location: (x,y) location on the screen to place the top left corner of your window. Default is to center on screen - :type location: (int, int) - :param alpha_channel: Window transparency 0 = invisible 1 = completely visible. Values between are see through + :param keep_on_top: If True then Window will remain on top of all other windows currently shownn + :type keep_on_top: (bool) + :param location: (x,y) location on the screen to place the top left corner of your window. Default is to center on screen + :type location: (int, int) + :param alpha_channel: Window transparency 0 = invisible 1 = completely visible. Values between are see through :type alpha_channel: (float) - :param time_between_frames: Amount of time in milliseconds between each frame + :param time_between_frames: Amount of time in milliseconds between each frame :type time_between_frames: (int) - :param transparent_color: This color will be completely see-through in your window. Can even click through + :param transparent_color: This color will be completely see-through in your window. Can even click through :type transparent_color: (str) - :param title: Title that will be shown on the window + :param title: Title that will be shown on the window :type title: (str) :param icon: Same as Window icon parameter. Can be either a filename or Base64 value. For Windows if filename, it MUST be ICO format. For Linux, must NOT be ICO :type icon: str @@ -16143,7 +16336,7 @@ def PopupAnimated(image_source, message=None, background_color=None, text_color= # Popup Notify def popup_notify(*args, title='', icon=SYSTEM_TRAY_MESSAGE_ICON_INFORMATION, display_duration_in_ms=SYSTEM_TRAY_MESSAGE_DISPLAY_DURATION_IN_MILLISECONDS, - fade_in_duration=SYSTEM_TRAY_MESSAGE_FADE_IN_DURATION, alpha=0.9, location=None): + fade_in_duration=SYSTEM_TRAY_MESSAGE_FADE_IN_DURATION, alpha=0.9, location=None): """ Displays a "notification window", usually in the bottom right corner of your display. Has an icon, a title, and a message. It is more like a "toaster" window than the normal popups. @@ -16156,7 +16349,7 @@ def popup_notify(*args, title='', icon=SYSTEM_TRAY_MESSAGE_ICON_INFORMATION, dis :param message: Text message that makes up the majority of the window :type message: (str) :param icon: A base64 encoded PNG/GIF image or PNG/GIF filename that will be displayed in the window - :type icon: Union[bytes, str] + :type icon: bytes | str :param display_duration_in_ms: Number of milliseconds to show the window :type display_duration_in_ms: (int) :param fade_in_duration: Number of milliseconds to fade window in and out @@ -16226,24 +16419,24 @@ def shell_with_animation(command, args=None, image_source=DEFAULT_BASE64_LOADING :param args: List of arguments :type args: List[str] :param image_source: Either a filename or a base64 string. - :type image_source: Union[str, bytes] - :param message: An optional message to be shown with the animation + :type image_source: str | bytes + :param message: An optional message to be shown with the animation :type message: (str) :param background_color: color of background :type background_color: (str) - :param text_color: color of the text + :param text_color: color of the text :type text_color: (str) - :param font: specifies the font family, size, etc - :type font: Union[str, tuple] + :param font: specifies the font family, size, etc + :type font: str | tuple :param no_titlebar: If True then the titlebar and window frame will not be shown :type no_titlebar: (bool) :param grab_anywhere: If True then you can move the window just clicking anywhere on window, hold and drag :type grab_anywhere: (bool) - :param keep_on_top: If True then Window will remain on top of all other windows currently shownn + :param keep_on_top: If True then Window will remain on top of all other windows currently shownn :type keep_on_top: (bool) - :param location: (x,y) location on the screen to place the top left corner of your window. Default is to center on screen + :param location: (x,y) location on the screen to place the top left corner of your window. Default is to center on screen :type location: (int, int) - :param alpha_channel: Window transparency 0 = invisible 1 = completely visible. Values between are see through + :param alpha_channel: Window transparency 0 = invisible 1 = completely visible. Values between are see through :type alpha_channel: (float) :param time_between_frames: Amount of time in milliseconds between each frame :type time_between_frames: (int) @@ -16614,7 +16807,7 @@ class UserSettings: :param key: Setting to be saved. Can be any valid dictionary key type :type key: (Any) :param value: Value to save as the setting's value. Can be anything - :type value: (Any) + :type value: (Any) """ if self.full_filename is None: self.set_location() @@ -16764,10 +16957,10 @@ def user_settings_set_entry(key, value): then a default filename will be used. After value has been modified, the settings file is written to disk. - :param key: Setting to be saved. Can be any valid dictionary key type + :param key: Setting to be saved. Can be any valid dictionary key type :type key: (Any) :param value: Value to save as the setting's value. Can be anything - :type value: (Any) + :type value: (Any) """ settings = UserSettings._default_for_function_interface settings.set(key, value) @@ -16779,7 +16972,7 @@ def user_settings_delete_entry(key): then a default filename will be used. After value has been deleted, the settings file is written to disk. - :param key: Setting to be saved. Can be any valid dictionary key type (hashable) + :param key: Setting to be saved. Can be any valid dictionary key type (hashable) :type key: (Any) """ settings = UserSettings._default_for_function_interface @@ -17165,21 +17358,21 @@ class _Debugger(): cur_col += 1 ScrolledTextBox(out_text, non_blocking=True) - ##### # # + ##### # # # # # # #### #### #### ###### # # # ## ##### #### # # # # # # # # # # # # # # # # # # # # # # ###### # # # # #### ##### # # # # # # # ###### # # # # # # # # # # # # ###### # # # # # # # # # # # # # # # # # # # # # # # # # - ##### # # #### #### #### ###### ## ## # # # #### # # + ##### # # #### #### #### ###### ## ## # # # #### # # # # # # # # ## ##### # ## ##### # ###### #### # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # ##### # ##### #### # # # # # # # - # # ###### ##### # ###### # # # # # # # # # # # # - # # # # # # # # # # # # # # # # # # # # ## - # # # # # # # # ##### ###### ###### #### ## ## # # # + # # ###### ##### # ###### # # # # # # # # # # # # + # # # # # # # # # # # # # # # # # # # # ## + # # # # # # # # ##### ###### ###### #### ## ## # # # def _choose_auto_watches(self, my_locals): ChangeLookAndFeel(COLOR_SCHEME) @@ -17251,7 +17444,7 @@ class _Debugger(): # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # ## # # # # ## ## - ## ## # # # ##### #### # # + ## ## # # # ##### #### # # def _build_floating_window(self, location=(None, None)): """ @@ -17332,7 +17525,7 @@ class _Debugger(): # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # ## # # # # ## ## - ## ## # # # ##### #### # # + ## ## # # # ##### #### # # def _refresh_floating_window(self): if not self.popout_window: @@ -17371,7 +17564,7 @@ class _Debugger(): def show_debugger_window(location=(None, None), *args): """ Shows the large main debugger window - :param location: Locations (x,y) on the screen to place upper left corner of the window + :param location: Locations (x,y) on the screen to place upper left corner of the window :type location: Tuple[int, int] :return: None :rtype: None @@ -17397,7 +17590,7 @@ def show_debugger_popout_window(location=(None, None), *args): """ Shows the smaller "popout" window. Default location is the upper right corner of your screen - :param location: Locations (x,y) on the screen to place upper left corner of the window + :param location: Locations (x,y) on the screen to place upper left corner of the window :type location: Tuple[int, int] :return: None :rtype: None @@ -17483,18 +17676,16 @@ def _random_error_icon(): # 888 888 888 .d888888 888 888 888 # 888 888 888 888 888 888 888 888 # 888 888 888 "Y888888 888 888 888 -import sys -import site -import shutil -import hashlib -import base64 -from pathlib import Path -import configparser -import urllib.request -import urllib.error -def _install(files, url=None): + +def path_stem(path): + head, tail = os.path.split(path) + retval = tail or os.path.basename(head) + return os.path.splitext(retval)[0] + + +def _copy_files_from_github(files, github_url=None): """ install one file package from GitHub or current directory @@ -17505,7 +17696,7 @@ def _install(files, url=None): the first item (files[0]) will be used as the name of the package'' optional files should be preceded with an exclamation mark (!) - url : str + github_url : str url of the location of the GitHub repository this will start usually with https://raw.githubusercontent.com/ and end with /master/ if omitted, the files will be copied from the current directory (not GitHub) @@ -17529,72 +17720,35 @@ def _install(files, url=None): Otherwise, an __init__/py file will be generated. In thet case, if a __version__ = statement is found in the source file, the __version__ will be included in that __init__.py file. - Version history - --------------- - version 1.0.5 2020-06-24 - Bug with removing the dist-info of packages starting with the same name fixed. - - version 1.0.4 2020-03-29 - Linux and ios versions now search in sys.path for site-packages, - whereas other platforms now use site.getsitepackages(). - This is to avoid installation in a roaming directory on Windows. - - version 1.0.2 2020-03-07 - modified several open calls to be compatible with Python < 3.6 - multipe installation for Pythonista removed. Now installs only in site-packages - - version 1.0.1 2020-03-06 - now uses urllib instead of requests to avoid non standard libraries - installation for Pythonista improved - - version 1.0.0 2020-03-04 - initial version - - (c)2020 Ruud van der Ham - www.salabim.org """ - class Info: - version = "?" - package = "?" - path = "?" - files_copied = [] + class ReturnInfo: + src = "" + package = "" + new_files = "" + path = "" + version = "" - info = Info() - Pythonista = sys.platform == "ios" - if not files: - raise ValueError("no files specified") - if files[0][0] == "!": - raise ValueError("first item in files (sourcefile) may not be optional") - package = Path(files[0]).stem - sourcefile = files[0] - - file_contents = {} - for file in files: - optional = file[0] == "!" - if optional: - file = file[1:] - - if url: - try: - with urllib.request.urlopen(url + file) as response: - page = response.read() - - file_contents[file] = page - exists = True - except urllib.error.URLError: - exists = False + info = ReturnInfo() + info.src = files[0] + info.package = path_stem(files[0]) + page_contents = {} + for f in files: + is_file_optional = f[0] == "!" + if (is_file_optional): + f = f[1:] + if (os.path.exists(f)): + with urllib.request.urlopen(github_url + f) as resp: + page = resp.read() + page_contents[f] = page else: - exists = Path(file).is_file() - if exists: - with open(file, "rb") as f: - file_contents[file] = f.read() + with urllib.request.urlopen(github_url + f) as resp: + page = resp.read() + page_contents[f] = page - if (not exists) and (not optional): - raise FileNotFoundError(file + " not found. Nothing installed.") - - version = "unknown" - for line in file_contents[sourcefile].decode("utf-8").split("\n"): + version = "?" + for line in page_contents[info.src].decode("utf-8").split("\n"): line_split = line.split("__version__ =") if len(line_split) > 1: raw_version = line_split[-1].strip(" '\"") @@ -17605,83 +17759,80 @@ def _install(files, url=None): else: break break - - info.files_copied = list(file_contents.keys()) - info.package = package info.version = version - - file = "__init__.py" - if file not in file_contents: - file_contents[file] = ("from ." + package + " import *\n").encode() + info.new_files = info.files_copied = list(page_contents.keys()) + sitepackages_path = "" + if "__init__.py" not in page_contents: + page_contents["__init__.py"] = ("from ." + info.package + " import *\n").encode() if version != "unknown": - file_contents[file] += ("from ." + package + " import __version__\n").encode() + page_contents["__init__.py"] += ("from ." + info.package + " import __version__\n").encode() if sys.platform.startswith("linux") or (sys.platform == "ios"): - search_in = sys.path + dir_search = sys.path else: - search_in = site.getsitepackages() + dir_search = site.getsitepackages() - for f in search_in: - sitepackages_path = Path(f) - if sitepackages_path.name == "site-packages" and sitepackages_path.is_dir(): + for f in dir_search: + if ((os.path.isdir(f)) and (str("site-packages") in str(f))): + sitepackages_path = f break else: - raise ModuleNotFoundError("can't find the site-packages folder") + raise ModuleNotFoundError("Unable to find site-packages folder!") - path = sitepackages_path / package + path = str(sitepackages_path) + "\\" + str(info.package) info.path = str(path) - if path.is_file(): - path.unlink() + if (os.path.isfile(path)): + os.unlink(path) - if not path.is_dir(): - path.mkdir() + if not os.path.isdir(path): + os.mkdir(path) - for file, contents in file_contents.items(): - with (path / file).open("wb") as f: + for file, contents in page_contents.items(): + with open(str(path) + "/" + str(file), "wb") as f: f.write(contents) - if Pythonista: - pypi_packages = sitepackages_path / ".pypi_packages" + if (sys.platform == "ios"): + pypi_packages = str(sitepackages_path) + "/.pypi_packages" config = configparser.ConfigParser() config.read(pypi_packages) - config[package] = {} - config[package]["url"] = "github" - config[package]["version"] = version - config[package]["summary"] = "" - config[package]["files"] = path.as_posix() - config[package]["dependency"] = "" - with pypi_packages.open("w") as f: + config[info.package] = {} + config[info.package]["github_url"] = "github" + config[info.package]["version"] = version + config[info.package]["summary"] = "" + config[info.package]["files"] = path.as_posix() + config[info.package]["dependency"] = "" + with open(pypi_packages, "w") as f: config.write(f) else: - for entry in sitepackages_path.glob("*"): - if entry.is_dir(): - if entry.stem.startswith(package + "-") and entry.suffix == ".dist-info": + for entry in glob.glob(sitepackages_path + "/*"): + if os.path.isdir(entry): + if path_stem(entry).startswith(info.package + "-") and ".dist-info" in entry: shutil.rmtree(entry) - path_distinfo = Path(str(path) + "-" + version + ".dist-info") - if not path_distinfo.is_dir(): - path_distinfo.mkdir() - with (path_distinfo / "METADATA").open("w") as f: # make a dummy METADATA file - f.write("Name: " + package + "\n") + path_distinfo = str(path) + "-" + str(version) + ".dist-info" + if not os.path.isdir(path_distinfo): + os.mkdir(path_distinfo) + with open(path_distinfo + "/METADATA", "w") as f: + f.write("Name: " + info.package + "\n") f.write("Version: " + version + "\n") - with (path_distinfo / "INSTALLER").open("w") as f: # make a dummy METADATA file + with open(path_distinfo + "/INSTALLER", "w") as f: f.write("github\n") - with (path_distinfo / "RECORD").open("w") as f: - pass # just to create the file to be recorded + with open(path_distinfo + "/RECORD", "w") as f: + pass - with (path_distinfo / "RECORD").open("w") as record_file: + with open(str(path_distinfo) + "/RECORD", "w") as record_file: for p in (path, path_distinfo): - for file in p.glob("**/*"): + for file in glob.glob(str(p) + "**/*"): - if file.is_file(): - name = file.relative_to(sitepackages_path).as_posix() # make sure we have slashes + if os.path.isfile(file): + name = os.path.join(sitepackages_path, file) # make sure we have slashes record_file.write(name + ",") - if (file.stem == "RECORD" and p == path_distinfo) or ("__pycache__" in name.lower()): + if (path_stem(file) == "RECORD" and p == path_distinfo) or ("__pycache__" in name.lower()): record_file.write(",") else: - with file.open("rb") as f: + with open(file, "rb") as f: file_contents = f.read() hash = "sha256=" + base64.urlsafe_b64encode( hashlib.sha256(file_contents).digest() @@ -17695,10 +17846,9 @@ def _install(files, url=None): return info - def _upgrade_from_github(): - info = _install( - files="PySimpleGUI.py !init.py".split(), url="https://raw.githubusercontent.com/PySimpleGUI/PySimpleGUI/master/" + info = _copy_files_from_github( + files="PySimpleGUI.py !init.py".split(), github_url="https://raw.githubusercontent.com/PySimpleGUI/PySimpleGUI/master/" ) # print(info.package + " " + info.version + " successfully installed in " + info.path) # print("files copied: ", ", ".join(info.files_copied)) @@ -17734,11 +17884,11 @@ def main_get_debug_data(suppress_popup=False): :rtype: (str) """ message = \ -"""Python version: {} -port: tkinter -tkinter version: {} -PySimpleGUI version: {} -PySimpleGUI filename: {}""".format(sys.version, tclversion_detailed, ver, __file__) + """Python version: {} + port: tkinter + tkinter version: {} + PySimpleGUI version: {} + PySimpleGUI filename: {}""".format(sys.version, tclversion_detailed, ver, __file__) # create a temp window so that the clipboard can be set root = tk.Tk() @@ -17750,7 +17900,7 @@ PySimpleGUI filename: {}""".format(sys.version, tclversion_detailed, ver, __file if not suppress_popup: popup_scrolled('*** With this window still open, paste clipboard into your GitHub Issue***\n', - message, title='Select and copy this info to your GitHub Issue', keep_on_top=True, size=(100,10)) + message, title='Select and copy this info to your GitHub Issue', keep_on_top=True, size=(100,10)) return message @@ -17784,10 +17934,10 @@ def main_sdk_help(): def _main_switch_theme(): layout = [ - [Text('Click a look and feel color to see demo window')], - [Listbox(values=theme_list(), - size=(20, 20), key='-LIST-')], - [Button('Choose'), Button('Cancel')]] + [Text('Click a look and feel color to see demo window')], + [Listbox(values=theme_list(), + size=(20, 20), key='-LIST-')], + [Button('Choose'), Button('Cancel')]] window = Window('Change Themes', layout) @@ -17917,11 +18067,11 @@ I hope you are enjoying using PySimpleGUI whether you sponsor the product or not Image(data=DEFAULT_BASE64_LOADING_GIF, enable_events=True, key='_IMAGE_'), Text('PySimpleGUI Test Harness\nYou are running PySimpleGUI.py file instead of importing', font='ANY 15', tooltip='My tooltip', key='_TEXT1_')], - VerLine(ver, 'PySimpleGUI Version'), - VerLine('{}/{}'.format(tkversion,tclversion),'TK/TCL Versions'), - VerLine(tclversion_detailed, 'detailed tkinter version'), - VerLine(os.path.dirname(os.path.abspath(__file__)), 'PySimpleGUI Location', size=(40,2)), - VerLine(sys.version, 'Python Version', size=(40, 2)), + VerLine(ver, 'PySimpleGUI Version'), + VerLine('{}/{}'.format(tkversion,tclversion),'TK/TCL Versions'), + VerLine(tclversion_detailed, 'detailed tkinter version'), + VerLine(os.path.dirname(os.path.abspath(__file__)), 'PySimpleGUI Location', size=(40,2)), + VerLine(sys.version, 'Python Version', size=(40, 2)), [B(SYMBOL_DOWN, pad=(0,0), k='-HIDE TABS-'),pin(Col([[TabGroup([[tab1, tab2, tab3, tab6, tab4, tab5, tab7]], key='_TAB_GROUP_')]],k='-TAB GROUP-'))], [Button('Button', highlight_colors=('yellow','red')), B('Hide Stuff', metadata='my metadata'), @@ -18089,7 +18239,10 @@ test = main #------------------------ Set the "Official PySimpleGUI Theme Colors" ------------------------ theme(CURRENT_LOOK_AND_FEEL) -tclversion_detailed = tkinter.Tcl().eval('info patchlevel') +# See if running on Trinket. If Trinket, then use custom titlebars since Trinket doesn't supply any +if len(os.environ) == 1: + USE_CUSTOM_TITLEBAR = True + if tclversion_detailed.startswith('8.5'): warnings.warn('You are running a VERY old version of tkinter {}'.format(tclversion_detailed), UserWarning) # -------------------------------- ENTRY POINT IF RUN STANDALONE -------------------------------- #