B äZ Îuä ã@s dZddlZddlZddlZddlmZmZddlmZm Z m Z m Z m Z m Z ddlmZmZmZmZmZddlmZddlmZGdd „d eƒZGd d „d eƒZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZedkrddlmZeddddddl m!Z!e!eeeƒdS)a| Dialogs that query users and verify the answer before accepting. 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Ú BooleanVarÚWÚEÚS)ÚFrameÚButtonÚEntryÚLabelÚ Checkbutton)Ú filedialog)ÚFontcsleZdZdZdidddœdd„Zddd „Zd d „Zdd d„Zdd„Zddd„Z ddd„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 CsX||_||_||_||_t ||¡| ¡| |¡| |¡|  ¡|j   dd¡}|dkr”y|j   dd|j dd¡Wn YnX|  d|j¡|  d |j¡| d |j¡|  d |j¡|  d |j¡| ¡| ¡| d | ¡| ¡d| ¡d| ¡|s$| ¡d| ¡dndf¡|jddd|sT| ¡| ¡dS)aáCreate modal popup, return when destroyed. Additional subclass init must be done before 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 z+%d+%déé–F)ZheightÚwidthN)ÚparentÚmessagerrrÚ__init__ZwithdrawÚtitleZ transientZgrab_setrZcallZ_wZbindÚcancelZprotocolÚokÚcreate_widgetsZupdate_idletasksZgeometryZ winfo_rootxZ winfo_widthZwinfo_reqwidthZ winfo_rootyZ winfo_heightZwinfo_reqheightZ resizableZ deiconifyZ wait_window) Úselfrrrrrrrr©r$ú2/opt/alt/python37/lib64/python3.7/idlelib/query.pyr%sB    *zQuery.__init__ÚOKcCs6t|dd|_}|jdddd|jdddt|dd |jd }t||jƒ|_t |d |jd |_ |j   ¡t d d|j d|_t|dd|jd|_|jddddtd|j jddddttddgd|jjddddttd| ¡t||d|jd|_t|d|jd|_|jjdddd|jjdddddS)zˆCreate entry (rows, extras, buttons. Entry stuff on rows 0-2, spanning cols 0-2. Buttons on row 99, cols 1, 2. é )ZpaddingrZnews)ÚcolumnÚrowÚstickyé)ZweightÚwÚleft)ÚanchorÚjustifyÚtexté)rÚ textvariableZ TkCaptionFontT)ÚnameÚexistsÚrootú Úred)r0Ú foregroundÚfontéé)r(r)Ú columnspanÚpadxr*)r(r)r<r=r*ÚpadyrZactive)r0ÚdefaultÚcommandZCancel)r0r@éc)r(r)r=N)r ÚframeÚgridZgrid_columnconfigurer rrrZentryvarr ÚentryÚ focus_setrrÚ error_fontÚ entry_errorrrÚ create_extrar r!Z button_okr Z button_cancel)r#Zok_textrBZ entrylabelr$r$r%r"[s0     zQuery.create_widgetscCsdS)Nr$)r#r$r$r%rH€ózQuery.create_extraNcCsd||p|jd<dS)NzERROR: r0)rG)r#rZwidgetr$r$r%Ú showerror‚szQuery.showerrorcCs$|j ¡ ¡}|s | d¡dS|S)zReturn non-blank entry or None.z blank line.N)rDÚgetÚstriprJ)r#rDr$r$r%Úentry_ok†s  zQuery.entry_okcCs8d|jd<| ¡}|dk r*||_| ¡n |j ¡dS)zIf entry is valid, bind it to 'result' and destroy tk widget. Otherwise leave dialog open for user to correct entry or cancel. rr0N)rGrMÚresultÚdestroyrDrE)r#ÚeventrDr$r$r%r!Žs   zQuery.okcCsd|_| ¡dS)z0Set dialog result to None and destroy tk widget.N)rNrO)r#rPr$r$r%r œsz Query.cancelcs| ¡tƒ ¡dS)N)Z grab_releaseÚsuperrO)r#)Ú __class__r$r%rO¡sz Query.destroy)r&)N)N)N) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr"rHrJrMr!r rOÚ __classcell__r$r$)rRr%r s5 %   rcs0eZdZdZdddœ‡fdd„ Zdd„Z‡ZS)Ú SectionNamez*Get a name for a config file section name.F)rrcstƒj||||||ddS)N)rrr)rQr)r#rrrrrr)rRr$r%rªszSectionName.__init__cCsV|j ¡ ¡}|s | d¡dSt|ƒdkr:| d¡dS||jkrR| d¡dS|S)z2Return sensible ConfigParser section name or None.zno name specified.Nr1z"name is longer than 30 characters.zname is already in use.)rDrKrLrJÚlenr)r#r3r$r$r%rM¯s     zSectionName.entry_ok)rSrTrUrVrrMrWr$r$)rRr%rX¦srXcs0eZdZdZdddœ‡fdd„ Zdd„Z‡ZS)Ú ModuleNamez-Get a module name for Open Module menu entry.F)rrcstƒj||||||ddS)N)rrr)rQr)r#rrrrrr)rRr$r%rÂszModuleName.__init__c CsÒ|j ¡ ¡}|s | d¡dSytj |¡}Wn4ttfk rd}z| t |ƒ¡dSd}~XYnX|dkr|| d¡dSt |j tj j ƒsš| d¡dSy|j  |¡}Wn"tk rÌ|jd|ddSX|S)z0Return entered module name as file path or None.zno name specified.Nzmodule not foundznot a source-based modulez$loader does not support get_filename)r)rDrKrLrJÚ importlibÚutilÚ find_specÚ ValueErrorÚ ImportErrorÚstrÚ isinstanceÚloaderÚabcÚ SourceLoaderÚ get_filenameÚAttributeError)r#r3ÚspecÚmsgZ file_pathr$r$r%rMÇs,   zModuleName.entry_ok)rSrTrUrVrrMrWr$r$)rRr%rZ¾srZc@seZdZdZdd„ZdS)ÚGotoz1Get a positive line number for editor Go To Line.cCsLyt|j ¡ƒ}Wntk r0| d¡dSX|dkrH| d¡dS|S)Nznot a base 10 integer.rznot a positive integer.)ÚintrDrKr^rJ)r#Úlinenor$r$r%rMæs  z Goto.entry_okN)rSrTrUrVrMr$r$r$r%riâsrics\eZdZdZddidddœ‡fdd„ Zdd„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|||||||ddS)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)rnrQr) r#rrrmrnrrrr)rRr$r%rös zHelpSource.__init__cCsÊ|j}t|dddd}t||jƒ|_t||jdd|_t|dd|jd }t|d d |j d |_ |j d ddddd gt d|jj d dddt t dd gd|j dddt td|j j d dddt t ddS)zAdd path widjets to rows 10-12.r,r-z,Help File Path: Enter URL or browse for file)r.r/r0é()r2rZBrowseé)r0rr@r6r7)r0r8r9rr'r:r;)r(r)r<r=r>r*é r)r(r)r<r=r*r>)r(r)r=r*é )r(r)r<r=r*N)rBr rrnÚpathvarr Úpathr Ú browse_filerFÚ path_errorrCrrr )r#rBZ pathlabelZbrowser$r$r%rHs    zHelpSource.create_extracCstj||dj||dS)N)rÚ filetypes)Z initialdirZ initialfile)rZOpenZshow)r#rwZinitdirZinitfiler$r$r%Ú askfilenameszHelpSource.askfilenamecCs˜dddddg}|j ¡}|r.tj |¡\}}nHd}tdd…dkrntj tj t¡d¡}tj  |¡svt  ¡}nt  ¡}|  |||¡}|r”|j  |¡dS) N)z HTML Filesz *.htm *.htmlÚTEXT)z PDF Filesz*.pdfry)zWindows Help Filesz*.chm)z Text Filesz*.txtry)z All FilesÚ*r:ÚwinZDoc) rsrKÚosrtÚsplitrÚjoinÚdirnamerÚisdirÚgetcwdrxÚset)r#rwrtÚdirÚbaseÚfiler$r$r%rus"   zHelpSource.browse_filecCs||j ¡ ¡}|s$| d|j¡dS| d¡sx|dd…dkrJ|dd…}tj |¡sh| d|j¡dStdkrxd|}|S) z(Simple validity check for menu file pathzno help file path specified.N)zwww.Zhttpr;zfile:zhelp file path does not exist.Údarwinzfile://) rtrKrLrJrvÚ startswithr|r4r)r#rtr$r$r%Úpath_ok6s   zHelpSource.path_okcCs6d|jd<| ¡}| ¡}|dks*|dkr.dS||fS)z,Return apparently valid (name, path) or Nonerr0N)rvÚitem_okrˆ)r#r3rtr$r$r%rMGs zHelpSource.entry_ok) rSrTrUrVrrHrxrurXrMr‰rˆrWr$r$)rRr%rlòs rlcsBeZdZdZgdddœ‡fdd„ Zdd„Zdd „Zd d „Z‡ZS) Ú CustomRunz†Get settings for custom run of module. 1. Command line arguments to extend sys.argv. 2. Whether to restart Shell or not. F)Úcli_argsrrcs d}tƒj||||||ddS)z¢cli_args is a list of strings. The list is assigned to the default Entry StringVar. The strings are displayed joined by ' ' for display. z$Command Line Arguments for sys.argv:)rrrN)rQr)r#rrr‹rrr)rRr$r%rVszCustomRun.__init__cCsj|j}t|dd|_t||jdddd}t|dd|jd|_|jd d d d d d|jjd dd d dddS)zAdd run mode on rows 10-12.T)ÚvalueFz Restart shell)ZvariableZonvalueZoffvaluer0r6r7)r0r8r9rr'r:r;r,)r(r)r<r=r*rrZweN)rBrÚ restartvarrr rFZ args_errorrC)r#rBÚrestartr$r$r%rHbs   zCustomRun.create_extrac CsV|j ¡ ¡}ytj|dd}Wn0tk rP}z| t|ƒ¡dSd}~XYnX|S)z6Validity check and parsing for command line arguments.T)ÚposixN)rDrKrLÚshlexr}r^rJr`)r#Z cli_stringr‹Úerrr$r$r%Ú cli_args_okoszCustomRun.cli_args_okcCs&| ¡}|j ¡}|dkrdS||fS)z3Return apparently valid (cli_args, restart) or NoneN)r’rrK)r#r‹rŽr$r$r%rMys zCustomRun.entry_ok) rSrTrUrVrrHr’rMrWr$r$)rRr%rŠNs    rŠÚ__main__)Úmainzidlelib.idle_test.test_queryrF)Ú verbosityÚexit)Úrun)"rVr[r|rÚsysrrZtkinterrrrrrr Z tkinter.ttkr r r r rrZ tkinter.fontrrrXrZrirlrŠrSZunittestr”Zidlelib.idle_test.htestr—r$r$r$r%Ús(   $\2