3 § f’0ã@sìdZddlZddlZddlmZmZddlmZmZm Z m Z m Z ddl m Z mZmZmZddlmZddlmZGdd „d eƒZGd d „d eƒZGd d „d eƒZGdd„deƒZedkrèddlmZedddd�ddlmZeeeƒdS)a» Dialogs that query users and verify the answer before accepting. Use ttk widgets, limiting use to tcl/tk 8.5+, as in IDLE 3.6+. Query is the generic base class for a popup dialog. The user must either enter a valid answer or close the dialog. Entries are validated when is entered or [Ok] is clicked. Entries are ignored when [Cancel] or [X] are clicked. The 'return value' is .result set to either a valid answer or None. Subclass SectionName gets a name for a new config file section. Configdialog uses it for new highlight theme and keybinding set names. Subclass ModuleName gets a name for File => Open Module. Subclass HelpSource gets menu item and path for additions to Help menu. éN)Ú executableÚplatform)ÚToplevelÚ StringVarÚWÚEÚS)ÚFrameÚButtonÚEntryÚLabel)Ú filedialog)ÚFontcsbeZdZdZdidddœdd„Zdd„Zdd d „Zd d „Zddd„Zddd„Z ‡fdd„Z ‡Z S)ÚQueryzoBase class for getting verified answer from a user. For this base class, accept any non-blank string. ÚF)Útext0Ú used_namesÚ_htestÚ_utestc CsXtj||ƒ|jƒ||_|j|ƒ||_||_||_|j|ƒ|j ƒ|j j ddƒ}|dkr”y|j j dd|j ddƒWn YnX|j d|jƒ|j d |jƒ|jd |jƒ|j d |jƒ|j d |jƒ|jd d d�|jƒ|jƒ|jd|jƒ|jƒd|jƒd|jƒ|�s2|jƒd|jƒdndfƒ|�sT|jƒ|jƒdS)aöCreate popup, do not return until tk widget destroyed. Additional subclass init must be done before calling this unless _utest=True is passed to suppress wait_window(). title - string, title of popup dialog message - string, informational message to display text0 - initial value for entry used_names - names already in use _htest - bool, change box location when running htest _utest - bool, leave window hidden and not modal ÚtkÚwindowingsystemZaquaz!::tk::unsupported::MacWindowStyleZstyleZ moveableModalrz z ZWM_DELETE_WINDOWz z F)ZheightÚwidthz+%d+%déé–N)rÚ__init__ZwithdrawÚparentÚtitleÚmessagerrZ transientZgrab_setrZcallZ_wZbindÚcancelZprotocolÚokZ resizableÚcreate_widgetsZupdate_idletasksZgeometryZ winfo_rootxZ winfo_widthZwinfo_reqwidthZ winfo_rootyZ winfo_heightZwinfo_reqheightZ deiconifyZ wait_window) Úselfrrrrrrrr©r"ú2/opt/alt/python36/lib64/python3.6/idlelib/query.pyr%sB    *zQuery.__init__cCs.t|dd�|_}|jdddd�|jddd�t|dd |jd �}t||jƒ|_t |d |jd �|_ |j j ƒt d d|j d�|_t|dd|jd�|_t|dd|jd�|_t|d|jd�|_|jddddtd�|j jddddttddgd�|jjddddttd�|jjdddd�|jjdddd�dS)Né )ZpaddingrZnews)ÚcolumnÚrowÚstickyé)ZweightÚwÚleft)ÚanchorÚjustifyÚtexté)rÚ textvariableZ TkCaptionFontT)ÚnameÚexistsÚrootú Úred)r-Ú foregroundÚfontZOKZactive)r-ÚdefaultÚcommandZCancel)r-r8éé)r%r&Ú columnspanÚpadxr')r%r&r;r<r'Úpadyréc)r%r&r<)r ÚframeÚgridZgrid_columnconfigurer rrrZentryvarr ÚentryÚ focus_setrrÚ error_fontÚ entry_errorr rZ button_okrZ button_cancelrr)r!r?Z entrylabelr"r"r#r Ws.     zQuery.create_widgetsNcCsd||p|jd<dS)NzERROR: r-)rD)r!rZwidgetr"r"r#Ú showerrorsszQuery.showerrorcCs.d|jd<|jjƒjƒ}|s*|jdƒdS|S)zReturn non-blank entry or None.rr-z blank line.N)rDrAÚgetÚstriprE)r!rAr"r"r#Úentry_okws   zQuery.entry_okcCs.|jƒ}|dk r ||_|jƒn |jjƒdS)z�If entry is valid, bind it to 'result' and destroy tk widget. Otherwise leave dialog open for user to correct entry or cancel. N)rHÚresultÚdestroyrArB)r!ÚeventrAr"r"r#r€s  zQuery.okcCsd|_|jƒdS)z0Set dialog result to None and destroy tk widget.N)rIrJ)r!rKr"r"r#r�sz Query.cancelcs|jƒtƒjƒdS)N)Z grab_releaseÚsuperrJ)r!)Ú __class__r"r#rJ’sz Query.destroy)N)N)N) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr rErHrrrJÚ __classcell__r"r")rMr#r s1  rcs0eZdZdZdddœ‡fdd„ Zdd„Z‡ZS)Ú SectionNamez*Get a name for a config file section name.F)rrcstƒj||||||d�dS)N)rrr)rLr)r!rrrrrr)rMr"r#r›szSectionName.__init__cCs`d|jd<|jjƒjƒ}|s*|jdƒdSt|ƒdkrD|jdƒdS||jkr\|jdƒdS|S)z2Return sensible ConfigParser section name or None.rr-zno name specified.Nr.z"name is longer than 30 characters.zname is already in use.)rDrArFrGrEÚlenr)r!r0r"r"r#rH s      zSectionName.entry_ok)rNrOrPrQrrHrRr"r")rMr#rS—srScs0eZdZdZdddœ‡fdd„ Zdd„Z‡ZS)Ú ModuleNamez-Get a module name for Open Module menu entry.F)rrcstƒj||||||d�dS)N)rrr)rLr)r!rrrrrr)rMr"r#r´szModuleName.__init__cCsÚd|jd<|jjƒjƒ}|s*|jdƒdSytjj|ƒ}Wn2tt fk rl}z|jt |ƒƒdSd}~XnX|dkr„|jdƒdSt |j tj jƒs¢|jdƒdSy|j j|ƒ}Wn"tk rÔ|jd|d�dSX|S) z0Return entered module name as file path or None.rr-zno name specified.Nzmodule not foundznot a source-based modulez$loader does not support get_filename)r)rDrArFrGrEÚ importlibÚutilÚ find_specÚ ValueErrorÚ ImportErrorÚstrÚ isinstanceÚloaderÚabcÚ SourceLoaderÚ get_filenameÚAttributeError)r!r0ÚspecÚmsgZ file_pathr"r"r#rH¹s.    zModuleName.entry_ok)rNrOrPrQrrHrRr"r")rMr#rU°srUcs`eZdZdZddidddœ‡fdd„ Z‡fdd„Zd d „Zd d „Zej Z d d„Z dd„Z ‡Z S)Ú HelpSourcez,Get menu name and help source for Help menu.rF)ÚmenuitemÚfilepathrrrc s(||_d}tƒj|||||||d�dS)z·Get menu entry and url/local file for Additional Help. User enters a name for the Help resource and a web url or file name. The user can browse for the file. zName for item on Help menu:)rrrrN)rfrLr) r!rrrerfrrrr)rMr"r#rÙs zHelpSource.__init__csÔtƒjƒ|j}t|dddd�}t||jƒ|_t||jdd�|_t |dd|j d �}t|d d |j d �|_ |j d ddddd gtd�|jj d dddttdd gd�|j dddttd�|j j d dddttd�dS)Nr)r*z,Help File Path: Enter URL or browse for file)r+r,r-é()r/rZBrowseé)r-rr8r3r4)r-r5r6rr$r9r:)r%r&r;r<r=r'é r)r%r&r;r<r'r=)r%r&r<r'é )r%r&r;r<r')rLr r?r rrfÚpathvarr Úpathr Ú browse_filerCÚ path_errorr@rrr)r!r?Z pathlabelZbrowse)rMr"r#r æs"    zHelpSource.create_widgetscCstj||d�j||d�S)N)rÚ filetypes)Z initialdirZ initialfile)r ZOpenZshow)r!roZinitdirZinitfiler"r"r#Ú askfilenameúszHelpSource.askfilenamecCs˜dddddg}|jjƒ}|r.tjj|ƒ\}}nHd}tdd …d krntjjtjjtƒdƒ}tjj |ƒsvtj ƒ}ntj ƒ}|j |||ƒ}|r”|jj |ƒdS)Nú HTML Filesú *.htm *.htmlÚTEXTú PDF Filesú*.pdfúWindows Help Filesú*.chmú Text Filesú*.txtú All FilesÚ*r9ÚwinZDoc)rqrrrs)rtrurs)rvrw)rxryrs)rzr{) rkrFÚosrlÚsplitrÚjoinÚdirnamerÚisdirÚgetcwdrpÚset)r!rorlÚdirÚbaseÚfiler"r"r#rms"   zHelpSource.browse_filecCs||jjƒjƒ}|s$|jd|jƒdS|jd ƒsx|dd…dkrJ|dd…}tjj|ƒsh|jd|jƒdStdkrxd |}|S) z(Simple validity check for menu file pathzno help file path specified.Núwww.Úhttpr:zfile:zhelp file path does not exist.Údarwinzfile://)r‡rˆ) rlrFrGrErnÚ startswithr}r1r)r!rlr"r"r#Úpath_oks   zHelpSource.path_okcCs@d|jd<d|jd<|jƒ}|jƒ}|dks4|dkr8dS||fS)z,Return apparently valid (name, path) or Nonerr-N)rDrnÚitem_okr‹)r!r0rlr"r"r#rH*s   zHelpSource.entry_ok) rNrOrPrQrr rprmrSrHrŒr‹rRr"r")rMr#rdÕs rdÚ__main__)Úmainzidlelib.idle_test.test_queryrF)Ú verbosityÚexit)Úrun)rQrVr}ÚsysrrZtkinterrrrrrZ tkinter.ttkr r r r r Z tkinter.fontrrrSrUrdrNZunittestrŽZidlelib.idle_test.htestr‘r"r"r"r#Ús   w%^