././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.403137 thonny-4.1.7/0000755000076600000240000000000014730055627013416 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734366811.0 thonny-4.1.7/CHANGELOG.rst0000644000076600000240000023524614730053133015441 0ustar00aivarannamaastaff=============== Version history =============== 4.1.7 (2024-12-16) ================== * Fix PyPI package search, #3401 * Allow selecting ESP32-C6 family in esptool dialog, #3363 * Update org.thonny.Thonny.appdata.xml * Update bundled esptool * Fix missing dbus-next dependency in Linux 4.1.6 (2024-09-11) ================== * Make macOS installer work in Sequoia * Add more entitlements for macOS app bundle (may fix problems with programs using camera or microphone) * New and updated languages thanks to the translators at POEditor 4.1.5 (2024-09-10) ================== * Fix handling nulls in PyPI metadata (fixes installing some PyPI packages) * Work around dialogs getting stuck after minimizing windows, #3068 * Fix too eager instrumentation of MicroPython code, #3043 * Fix installing package from local file 4.1.4 (2023-11-19) ================== * Fix regression in MicroPython package installation, #2979 * Add better error message for externally managed environments, #3009 * Fix package installation in remote virtual environments * Update Raspberry Pi detection * Silence "bad-option-value"-s given by Pylint 3 4.1.3 (2023-09-28) ================== * Fix first run crash on macOS (#2860) * Fix package upgrade and uninstall in portable variant (#2902) * Fix esptool flasher proposing wrong starting address for ESP32-S2 devices, #2920 * Fix cursor jumping to Shell when program waits for input and the user types opening parenthesis in the editor, #2834 * Add Catalan translation (by Pere) * Update German, French, Portuguese and Romanian translations. (See POEditor for contributions) 4.1.2 (2023-08-12) ================== * Avoid repetitive attempts to restart backend after connection gets lost during a Run (#2836) * Automatically hide tooltips if window loses focus, #2607 * Import optional deps with augmented sys.path, fixes problems with importing plug-ins (#2816) * Don't leak main site-packages to virtual environment's sys.path, #2867 * Fix Assistant error with relative imports, #2873 * Don't attempt to save unchanged editor at run, #2804 * Fix MicroPython upload errors by more conservative back-end isolation, #2016, #2851, #2864 * Fix MicroPython code completions by fixing packaging of base MicroPython stubs, #2895 * Fix various completion failures by reverting a jedi hack (67f2c120) * Avoid duplicate MicroPython completions when a module is already imported (852308fd) * Update Persian, Italian, Japanese, Brazilian Portuguese and Chinese translations (see POEditor for contributions) 4.1.1 (2023-06-11) ================== * Fix warning for the cases where Thonny avoids user module shadowing a library module (#384) * Fix installing from local file in ESP flashing dialog (#2811) * Use a tilde to separate pre-release versions in the AppData (#2807), by @jwillikers * Use bigger initial width in simple mode * Big progress with Italian translation, by mapi68, Ribezzz and sailslack * Updated Chinese (TW) and English (UK) translations 4.1.0 (2023-06-03) ================== * Fix MicroPython config page regression introduced in 4.1.0b1 (#2724, #2763) * Fix remote Python 3 (SSH) connection error (regression introduced in 4.1.0b1) * Fix code completion shortcut displayed in macOS menu * Add command "Show esptool version" for ESP flasher * Don't disconnect for ESP flasher commands which don't touch the device * Close tab on middle click (#2767) by @mrexodia * Make package manager support new micropython-lib index (#2777) * Report macOS version instead of Darwin version in the About box * Implement more flexible Raspberry Pi detection * Enable thonny to open and save files with zenity 3.91+ (#2786) by @befeleme * Make dbus_next dependency optional (#2771) * Recognize ESP32 as possible CircuitPython device * Add menu indicator for back-end switcher * Allow WebREPL for RP2040 backend (experimental) * Use correct MicroPython start address (0x0 instead of 0x1000) when flashing ESP32-S3 * Recognize ESP32 devices by VID 0x303A * Don't show irrelevant ports in port selector (e.g. /dev/cu.Bluetooth-Incoming-Port) * Allow setting --flash-size in ESP flasher, #2801 * Rename "Raspberry Pi" initial settings to "Raspberry Pi (simple)" * Update several translations * Add en_GB translation * Attempt to overcome "window was deleted before its visibility changed" error * Fix pipkin directory creation in paste mode (e.g. package installation via WebREPL) * Upgrade bundled websockets, paramiko, docutils, mypy, Send2Trash, esptool to latest versions 4.1.0b1 (2023-04-23) ==================== New --- * Enhance esptool GUI (propose known MicroPython and CircuitPython downloads; allow setting baud rate and start address; allow querying device info), #2707, #1600, #2536, #1171, #2657 * Ensure Thonny's backends don't get confused by other installations, #2616 * Detect and warn if user module is shadowing a library module, #384 * Make serial port description in interpreter selection menu more descriptive * Added pt_BR translation for all help pages, #2673, by @mgmalheiros * Add Pololu MicroPython downloads to UF2 flasher * Use UDisks to find mounted filesystems on Linux, #2683 by jwillikers Dependency changes ------------------ * Upgrade bundled Python from 3.10.9 to 3.10.11 * Upgrade bundled Tk from 8.6.12 to 8.6.13 * Upgrade bundled Pylint from 2.15 to 2.17 * Upgrade bundled MyPy from 0.991 to 1.2 Fixes ----- * Fix a potential autocompletion error, #2162 * Experiment with better MicroPython raw paste fallback, #2624 * Fix sys.sdtout.write return value, #2629 * Remove unnecessary shebangs, #2645 * Add option for saving unnamed editors before Run/Debug, #2619 * Fix blank editors in macOS, again, #2425 * Fix todo view, #2681, by @kr-g * Minor corrections for English help pages, #2674, by @mgmalheiros * Upgrade bundled esptool from 4.4 to 4.5 * Allow Linux installer to use existing Python 3.11 and 3.12, #2676 * Require saving before using fast debugger, #2699, by @michaellass * Add missing translation sites in editors.py, #2705 by @nicolasdespres * Restore MicroPython completions in the shell, #2467, #2419 * Don't use deprecated FLASK_ENV environment variable. * Add better shortcut for increasing font size in macOS, #2725 * Avoid falling back to Python menu in simple mode on macOS, #2729 * Various improvements to "Kind of Aqua" UI theme, #2760 * Fix double paste with Command-V when CapsLock on, #2753 * Fix Cut with Command-X when CapsLock on, #2753 4.0.2 (2023-01-14) ================== * Fix Mypy logging error in the Assistant, #2491 by @kr-g and @solsword * Fix AttributeError on save, #2454 * Add Thonny version as environment value for user programs, #2494 by @kr-g * Make `__file__` contain absolute path, #2497 * Start SSH preparation command with space to avoid adding it to shell history, #2563 by @isaacl * Bump pipkin version to 1.0b8 and fix various bugs with MicroPython package installation, including not being able to update a package (#2555) * Restore Find/Replace dialog close button and non-dialog behavior, #2461, #2550 * Make Find/Replace dialog non-modal again, #2550 * Fix Find/Replace seeding, #2356, #2550 * Restore focus after using file dialogs, #2501 * Don't remove stacktrace links after closing the process, #2471 * Never clear shell when Stop/Restart is used for stopping a process, #2456 * Treat .toml, .gitignore and .env as text files * Fix expression box glitch (lower frame box remaining visible) when debugging on macOS * Ignore disk flushing errors in the end of UF2 installation * Make port finding in the end of UF2 installation process more robust * Don't enable variant and version selection in UF2 dialog before variants get downloaded * Add Vietnamese translation, by Bui Huy Quang * Update several translations * Fix the name for Slowenian, #2611 * Update several deps in Thonny + Python bundles (asttokens, mypy, pylint, esptool, paramiko) 4.0.1 (2022-09-11) ================== * Fix error when running script with closed Shell, #2412 * Fix error with programs calling `exit` (more robust handing of closing the back-end process), #1786, #2433, #2423 * Fix blank editor after switching tabs on macOS, #2425 * Instruct saving the program before debugging, #2415 * Fix find not highlighting selected result in block comments, #2407 * Fix new file creation error, #2406 * Fix Choice Dialog closing with ESC, #2406 * Fix the error when invoking Python's `help` function, #2435 * Fall back to killing current process when running and interrupt doesn't work, #2420 * Don't close the backend process when interrupting at idle prompt, #2422 * Fix Windows 11 version in About dialog, #2406 * Fix outdated test, #2413 * Make the Mac installer more compatible with Arm, #2409 * Allow downloading latest unstable MicroPython builds, #2408 * Allow new file command for remote file browser * Update Estonian, German and Chinese (TW) translations 4.0.0 (2022-08-22) ================== * Fix error when pressing Ctrl-D with unsubmitted input, #2388 * Fix the error when clicking info line in TODO view (by @kr-g), #2389 * Show previous location when re-loading externally modified file, #1589, #1455, #1968 * Don't propose completions automatically in comments, #2393 * Fix a_box_is_appearing completion error, #2256 * INTERNAL: Simplify jedi_utils, drop support for versions below 0.18.1 * Upgrade deps in XXL bundle * Fix "Seed find/replace with currently-selected text" for Linux, #2356 * Update German translations (by the contributors in POEditor) 4.0.0b4 (2022-08-14) ==================== * CHANGED: Require single click for toggling a breakpoint, #2293 * Refactor MicroPython/CircuitPython flashing dialog, #2344 * Add TODO view (by @kr-g), #2067 * Add possibility to activate a virtual environment via Files view (by @kr-g), #2381 * Add separate "Install ..." items to the back-end switcher menu if a device in UF2 bootloader mode is detected, #2387 * Automatically reload saved files after external modification (with help from @kr-g), #1589, #1455, #1968 * Add EV3 default password information to config page, #2284 * Don't choke on relative interpreter paths, #2335 * Don't crash when Windows network locations can't be found, #2285 * Don't show package extra deps even when the extra is combined with another condition * Make paddings larger for hi-res displays * Take OSC commands into account when looking for prompts (relevant for CircuitPython 8), #2349 * Support OSC sequences for setting terminal title, #2369 * Toggle hidden files also via file-browser's context menu, #1039 * Use "Install MicroPython" instead of "Install firmware", #2364 * Rename "Python 3" back-end to "Local Python 3" * Seed find/replace with currently-selected text, #2356 * Work around Pylint error (make Pylint work again), #2359 * Add coloring for `match` and `case` soft keywords, #2358 * Add Slovenian translation (by cspaier) * Update several translations * Fix translations with bad placeholders (by @abrarwali), #2253 4.0.0b3 (2022-05-15) ==================== * BREAKING: Don't SetProcessDpiAwareness for user programs anymore. This means for example, that Tkinter and Pygame programs on Windows run as if they were executed with plain Python (ie they may become blurry on modern displays). For clear picture, start your program with ``import ctypes; ctypes.OleDLL("shcore").SetProcessDpiAwareness(1)``, #2159 * Add "Assistant" help page explaining the possibility to omit selected Pylint checks, #1978 * Add command "Run => Visualize current script at Python Tutor", #2242 * Fix debugger error when importing user modules (regression introduced in 4.0.0b1), #2246 * Add options for automatically making uploaded or saved shebang scripts executable (includes changing Windows line breaks to Unix ones). See "Editor" and SSH-backends' config pages. * Don't propose pythonw.exe as initial backend, #2236 * Fix error when trying to open a file from file browser with ENTER, #1785 * Fix support for remote Python 3 over SSH (regression introduced in one of the 4.0.0 betas), #2249 * Support CircuitPython with micro:bit, #2251 * Avoid wobbling of AutomaticScrollbar, helpful report by @TooLazy0x00, #2258 * Fix problem uninstalling MicroPython packages * Install packages without --user in portable mode, #1606 * Allow back-end plugins to modify sys.path, #2281 * Use %run instead of %Run when skipping interpreter restart, #1565 * Updated Estonian, Thai and Brazilian Portuguese translations * EXPERIMENTAL: Add LEGO® EV3 back-end: "Run => Select interpreter => MicroPython (EV3)" 4.0.0b2 (2022-04-09) ==================== * Fix the problem with scripts having declared encoding something else than UTF-8, #1650 * Don't clear shell after automatic restart * Fixes certain problems with running Flask and multiprocessing programs, #2062 * Fix KeyError: 'ESP32.url' when connecting to WebREPL, #2082 (regression introduced in b1) * Fix parameter completions where name of local variable was proposed with trailing '=' * Fix error with printing (regression introduced in b1), #2233 * Fix Find & replace dialog not appearing, #2208 * Fix display of debugger frames (regression introduced in 4.0.0b1), #2216 * Warn when environment value is provided with quotes, #2184 * Let macOS installer know the bundle is able to run in arm64 mode, #2201 * Update completion stubs for MicroPython and CircuitPython (from @hlovatt and @adafruit) * Add compatibility with Python 3.8 via Windows launcher, #2206 * Disable "Run" command when MicroPython device is disconnected * Make Shell read-only when device is disconnected * Fix various problems with managing files on CircuitPython devices * Don't assume all CircuitPython boards have RTC, #1760 * Fix error with evaluating ``globals()`` on MicroPython device, #1938 * Add MicrobitImage inspector for Object inspector * Add Tamil translation, by Kamala Kannan K and அனிச்பிரபு தி, #2211 * Add Thai translation, by Tomzt Pimai and Game of * Update translations for German, Spanish, Japanese, Slovak, Korean, Brazilian Portuguese, Albanian 4.0.0b1 (2022-03-21) ==================== New & changed -------------- Distribution ~~~~~~~~~~~~ * Upgrade bundled Python to 3.10 * Drop support for Python 3.5, 3.6 and 3.7 * The main Windows bundle is now 64-bit. For fallback publish 32-bit bundle with Python 3.8 for 32-bit Windows 10 and 8.1 and all variants of Windows 7 and 8. * Mac bundle now comes with the universal2 build of Python * Stop publishing 32-bit Linux bundles. * Enhance Linux installer script (the .bash-file) to create a venv and pip-install Thonny if run on a platform for which there is no binary bundle available. This means you can now use Linux installer also on Raspberry Pi, #1736 Code completion and analysis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Add the option for automatically getting completions while typing (Tools => Options => Editor) * Selecting a completion with Tab now replaces the name suffix right of the cursor, #1998 * Turn off requesting completions with Tab in editors by default, #2069 * Show documentation for the selected completion with another Ctrl-Space or automatically (Tools => Options => Editor) * Add "call-tips" -- a box describing the formal parameters of current method call. Invoke manually with Ctrl-Shift-Space or automatically after typing open parentheses (Tools => Options => Editor) * Enhance Go-to-definition (Ctrl-click). The name is now underlined while ctrl-hovering over it. MicroPython ~~~~~~~~~~~ * Use [pipkin](https://pypi.org/project/pipkin/) for managing packages on MicroPython and CircuitPython devices. This enables proper listing of packages together with version info and proper uninstallation. * Use `.local_rtc` config parameters instead of (oppositely worded) `.utc_clock` in MicroPython back-ends, 116aecd714d5e94a8ad6e244deac44aece5065eb * Present MicroPython time options (whether to sync time and whether to use local time) in back-end configuration page, #1638 * Automatically interrupt current process when connecting to bare-metal MicroPython or CircuitPython device. This can be turned off at device's settings page, #2059 * Don't hide the output when Stop/Restarting MicroPython, #1805 * Make internal MicroPython errors less intimidating. In several cases the errors are caused by bugs in MicroPython or USB driver and there is no use of showing the stacktrace. User is now directed to restart the device and stacktrace can be checked from the backend.log, #1799 * Make MicroPython back-end advise Ctrl+C also if only whitespace characters get printed, #1755 * Allow running MicroPython scripts without soft-rebooting first, #1565, #1716 * Add generic "MicroPython (RP2040)" back-end in addition to the more specific "MicroPython (Raspberry Pi Pico)", #2151 * Mention the possibility to reconfigure file types when denying opening remote files in a system app, #2148 Various ~~~~~~~ * Add new toolbar button which opens the wiki page describing ways to help Ukraine survive the attack from Russia. * Allow running content of untitled editors without saving, #778 * Clear Shell before starting new process (Run, Debug, Stop/Restart, ...) by default. Can be turned off in Tools => Options => Shell, #1681 * Make stacktrace links to ```` and ```` pseudo-files go to the editor containing corresponding source, #778 * Ask confirmation for adding .py extension when the user saves the file without any extension to MicroPython/CircuitPython device, #2077 * Don't add the .py extension when the user saves a local file and selects "All files" filter. * Add Cut/Copy/Paste to the file browser, #2001 by @kr-g * Make editor remember current line when reloading external changes, #2001 by @kr-g * Add "Edit => Go to line..." command (Ctrl-G), #2001 by @kr-g * Add "Rename" command for the local file browser, #2001 by @kr-g * Add nicer Stop-button for higher resolutions, #1445 by @speedy-10 * Improve icon scaling -- use larger icons when Treeview row height is larger than ``general.large_icon_rowheight_threshold`` * Use default font in Treeviews (including Files and Variables view). Therefore Treeview's font size is now affected by the scaling factor and is not affected by editor font size. * Use isolated mode for launching Thonny. This includes hiding user-site packages from Thonny's GUI process (not from user programs). Plug-ins now get installed under Thonny's data folder, #2038, #1651 * Allow installing packages for remote CPython backend, #1319 * Flatten the list of interpreters in the backend-switcher menu (lower-right corner of the main window) * Removed previously deprecated "A special virtual environment". Use regular virtual environments instead. * Merge "The same interpreter which runs Thonny" and "Alternative Python 3 interpreter or virtual environment" back-ends into "Local Python 3" * Back-end switcher now remembers several configurations for remote CPython and MicroPython. * Make package manager work for remote Python 3 (SSH) Fixed ----- * Fix issues with printouts containing more than 999 lines, #2118, #1646 * Fall back to default theme when used 3rd party theme gets uninstalled, #2117 * Fix problem with Files hamburger menu when nothing is selected, #2101 * Fix Windows version detection in "Tools => Open system shell", #1961 * Make sure Thonny's dialogs are treated as dialogs in macOS and Linux, #1790 * Don't issue two Ctrl+C-s too quickly in row when interrupting MicroPython process, in order to give time for finally-blocks to clean up, #1757 * Fix asm_pio error when working in with RP-pico in shell mode, #1718 * Fix the crash when scripts longer than 4KB are sent to Python 3 SSH back-end, #1680 * Properly interrupt MicroPython code before submitting new code when using F5 while code is running, #1668 * Use "vista" Tk-theme instead of "xpnative" in Windows. Gives nicer combobox, #1663 * Fix problems with full screen and split screen views in macOS, #1293, #1012 * Fix the crash when pasting certain Unicode chars to editor in macOS, #32 * Fix the crash caused by Cmd-backtick and others with Spanish keyboard in macOS, #886 * Fix focus issues in dialogs, #2153 * Fix automatic horizontal scrollbar not always appearing, #2169 and #659 by @jharris1993 and @lurch * Forward SSH password to the back-end process via stdin instead of command line. 3.3.14 (2021-08-01) =================== * Fix problems in org.thonny.Thonny.appdata.xml * Allow assigning Python coloring for Python-like files, #1927 * Increase the initial top coordinate of Thonny's main window. Fixes problem of Thonny's title bar being hidden by the system menubar, #1925 3.3.13 (2021-07-25) =================== * Update org.thonny.Thonny.appdata.xml 3.3.12 (2021-07-25) =================== * Restore syncing to localtime for RPi Pico (fixed regression introduced in 3.3.11), #1886 * Fix installing from requirements.txt in MicroPython, #1879 * Allow specifying different colors for method and function calls, by Jonathan Campbell, #1884 * Extend editor API for plug-ins (close event and content load/save hooks), by Nicolas Despres, #1891 * Fix technical errors in some translations, by Karolina Surma, #1895 * Warn when inputting non-ascii chars in MicroPython, #1911 * Fix installing for all users in Windows installer, #1119 and #1909 * Prepare Thonny for Flatpak, by Jordan Williams, #1900 and #1912 * Update Polish translation 3.3.11 (2021-06-25) =================== * Fix MicroPython management errors when user code shadows built-in names, #1856 * Fix package manager getting frozen when installing packages, #1871 * Fix problem of MicroPython package manager taking module names for distribution names, #1833 * Fix ugly error in ESP flasher dialog when esptool is not found, #1837 * Fix Tkinter error when using venv created from bundled Python, #1835 * Use 0..6 for weekday when synchronizing RTC via machine, #1868 * Make esptool auto-detect chip type, #1838 * Fix Unix MicroPython time validation (misdiagnosed time offset) * Update dependencies in Thonny+Python bundles * Update Spanish, Polish, Chinese (TW) translations 3.3.10 (2021-05-18) =================== * Restore Python 3.6 compatibility of minipip, #1541 * Fix missing libffi6 error in Linux builds, #767 3.3.9 (2021-05-18) ================== * Don't copy egg-info directories to target location when installing pip-compatible packages for MicroPython, #1541 3.3.8 (2021-05-18) ================== * Support installing regular pip-compatible packages to MicroPython or CircuitPython (so far only upip-compatible packages were supported), #1541 * Fix "error 403" problems when installing MicroPython packages from PyPI, #1822 * Fix error when Object inspector is open and a MicroPython object can't be found by id, #1796 * Reduce memory usage by Thonny's MicroPython helper (store last REPL value in global _ instead of storing N last values in a list), #1797, #1798 * Upgraded several dependencies in binary bundles 3.3.7 (2021-04-30) ================== * Make confugration dialog larger to fit French strings, by sourceperl, #1694 * Fix "_prepare_after_soft_reboot" error in Unix MicroPython mode, #1715 * Support interactive programs with Unix MicroPython, #1725 * Fix read-only filesystem error for CircuitPython in non-English variants of CircuitPython, #1662 * Fix error on right clicking in local file explorer with Italian translation, #1713 * Fix back-end switcher menu position and theme, #1719, #1720 * Fix "pop from empty list" error when MicroPython is having problems, #1586 * Fix MYPYPATH / MyPy not working, #1124 * Highlight unclosed strings even inside unclosed parens, #1770 * Fix problem running code via WebREPL, #1762 * Make Outline show also async, defs #1787 * Don't show full error info when ManagementError doesn't seem to be Thonny's fault, #1788 * Don't show error dialog when querying globals fails (error is shown on the variables table instead), #1789 * Recover from corrupted rpc.sock ("invalid literal for int() with base 10" error), #1745 * Add 3 translated Help files for Spanish, by José Carlos García, #1759 * Add Korean translations of Help files, by Hyungseok Choi, #1758 * Add first version of Finnish translation by Lrasinen * Update translations for Albanian, French, Korean 3.3.6 (2021-03-03) ================== * Fix crash in Shell when negative int-s are evaluated in MicroPython (regression introduced in 3.3.4), #1670 * Fix problems with wm_overrideredirect on macOS with Tk 8.6.11, #1659 * Fix crash in Plotter when more than 10 numbers are plotted, #1648 * Hide unsuitable PYTHONPATH environment variable in macOS, #1651 3.3.5 (2021-02-22) ================== * Fix too short reprs at MicroPython REPL (regression introduced in 3.3.4), #1627 * Fix incorrect presentation of long output lines, #1628 * Fix error in nicer debugger when stepping in generators, #1631 * Fix infinite recursion error when evaluating `globals()` in MicroPython REPL while object inspector is open, #1641 * Update Greek translation 3.3.4 (2021-02-17) ================== * CHANGED: MicroPython time synchronization now sets RTC to local time instead of UTC. This can be changed via a hidden configuration option (https://github.com/thonny/thonny/wiki/MicroPython#advanced-configuration), #1603 * Add time synchronization for RaspberryPi Pico, #1563, #1592 * Skip loading obsolete thonny-pico plug-in, which is now built in, #1575 * Get rid of misleading SSL warning in micropip.py and show a warning about non-MicroPython packages, #1621 * Fix WebREPL connection for MicroPython 1.14 by using regular paste mode instead of the new raw-paste mode, #1613 * Delay importing jedi and asttokens for improved performance, #1556 * Don't assume "dialout" group is required when MicroPython connection fails with permission error, #1286 * Reduce the memory usage of showing global variables by capping object representations to 50 first characters in MicroPython, #1582 * Add Hungarian translation (by Laszlo Kocsis) * Updated translations for German, Korean, Italian, Dutch (by various authors) 3.3.3 (2021-01-21) ================== * Add MicroPython support for Raspberry Pi Pico (https://www.raspberrypi.org/blog/raspberry-pi-silicon-pico-now-on-sale/) * Better support for MicroPython daily builds, #1545, #1553 * Automatically prepend relevant Anaconda directories to PATH. Fixes problem with importing Anaconda's numpy, #1522 * Make custom Python chooser see more interpreters, #1522 * Fix several spelling mistakes, by freddii, #1534 * Update toolbar buttons, when another editor gets selected, fixes wrong button states, #1536 * Catch errors when opening file in system app, #1526 * Fix internal error while using Outline View, #1543 * Fix truncated System Shell environment on macOS, #1529 * Add /usr/local/bin to the PATH of the back-end process if missing, #1131 * Fix error while parsing Pygame Zero error, #1535 * Fix MicroPython completion errors with jedi 0.18, #1560 * Add incomplete Korean language by Augene J. Pak, Fabianus.c, Suk-Hyung Hwang, YEON, $1531 * Add incomplete Albanian translation by Algent Albrahimi * [Technical] Allow older Send2Trash (Fedora doesn't have version 1.5 of this) * [Technical] Remove erroneous executable flags from some files 3.3.2 (2021-01-06) ================== * Fix the problem of missing docstrings, #1481 * Fix MicroPython management error after executing machine.reset(), #1492 * Add support for MicroPython raw paste mode (usable in MicroPython 1.14+), #1498 * Restore MicroPython raw mode as fallback, should fix problems with M5Stick and W600, #1516 * Add syntax highlighting for non-decimal number literals and support underscores, #1482 by Stefan Rothe * Make sure all output from the program gets presented, #1504 * Interrupt current program when running a MicroPython script, #1512 * Add support for Jedi 0.18, #1497 * Fix arguments completions for jedi 0.16+, #1511 * Make micro:bit support a bit more robust, #1515 * Add Persian (Farsi) translation by Farshid Meidani * Add Slovak translation by jose1711 * Add Armenian translation by Avag. sayan * Update Italian and Chinese (TW) translations 3.3.1 (2020-12-06) ================== * Allow installing MicroPython to micro:bit v2 * Fix problem with MicroPython programs creating lot of output very quickly, #1419 * Fix wrong message when saving to MP and device is busy, #1437 * Bump Pyserial version from 3.5b1 to 3.5, fix problem with some ESP devices, #1443 * Fix error when trying to download file from microbit, #1440 * Don't assume anything about conf files in Pi theme, #1436 * Fix error on reseting MicroPython device, #1442 * Fix unwanted output from expession statements in MicroPython, #1441 * Treat double-click in the remote file dialog differently from double-click in the Files view, #1432 * Fix error when closing MP file dialog without name, #1431 * Refactor "File => Rename" command (new label "Move / rename" and you can't "rename" a file on MP device to a file on local disc and vice versa), #1446 * Fix broken links in help pages, #1447 * Use THONNY_USER_DIR/temp for temp files. Fixes printing when default browser is Snap Chrome, #1435 * Fix error when clicking on "Attributes" tab on Object Inspector when no object is selected (MP) #1450 * Updated translations (Spanish an Brasilian Portuguese) * Allow specifying DTR/RTS for serial connection (to avoid restarting ESP on connect), #1462 * Open log window automatically if work dialog encounters error, #1466 * Don't close work dialog automatically if log window is opened, #1465 * Fix dummy MicroPython packages giving ugly errors, #1464 * Fix crashes in Assistant view with Dracula theme, #1463 * Work around Caps lock problem when binding command shortcuts, #1347 3.3.0 (2020-11-15) ================== New & changed ------------- * Removed automatic tabs => spaces conversion and its confirmation dialog, #599 * Added command for replacing tabs with spaces, #1411 * Added option for highlighting tabs (Tools => Options => Editor), #1409 * Added option for indenting with tabs (Tools => Options => Editor), #599 * Add an option to use Tk file dialogs instead of Zenity in Linux, #1404 * Reduce max repr length for MicroPython (1000 instead of 5000) * Forward https_proxy or http_proxy variable to pip, #535 * Allow specifying environment variables for the UI process, #1421 * Remove special support for Friendly-traceback, #1416 * Use exclusive access when connecting to a MP device over a serial port, #1418 Fixes ----- * Make sure expression box for while/for test is located properly, #1134 * In MicroPython backends only warn about failed epoch dectection if sync or validation is required * Don't show ugly traceback in debug mode * Internal error while debugging exceptions, #1403 * Automatically create Thonny user dir in remote machine, #1365 * Fix MicroPython uploading/downloading when started from an expanded dir, #1398 * Fix unrensponsive UI when MicroPython is printing in infinite loop, #1419 * Fix ugly stacktrace, when MicroPython device is disconnected during processing a command, #1420 New and updated translations ---------------------------- * Czech by Petr. moses and Radim * Romanian by Pop Vasile Alexandru * Norwegian (Bokmål and Nynorsk) by Gabriel Slørdahl * Updated Portuguese (BR) by Marcelo de Gomensoro Malheiros * Updated French, Polish, Greek, Spanish, Italian 3.3.0b7 (2020-11-01) ==================== * Add default black fg color to tooltips, #1381, by adzierzanowski * Use paste-mode instead of raw repl for executing code on MP devices, #1386 * Use WebREPL file protocol for uploading files, #1387 * Hide underscored names from autocomplete suggestions unless user already typed '_', #1382, by adzierzanowski * Add command to filebrowser menu for toggling hidden files, #1292 * Fix Unconnected network drive shorcuts make Files explorer broken #1333 * Don't allow save as a file which is already opened, #1310 * Color self and cls like builtins, #1080 * Soft-reboot MicroPython before "Run current script", #1393 * Fix error in clearing squeezed boxes, #1091 * Enhance upload/download dialogs, #1395 * Make "Open System shell" open ssh with remote back-ends * Make "Open System shell" open miniterm with MicroPython back-ends, #1287 * Better interrupt for download, #1320 3.3.0b6 (2020-10-19) ==================== * Clean up backend-switcher menu. 3.3.0b5 (2020-10-19) ==================== * Fixed a regression introduced in b4 -- Thonny crashed on launch when data directory didn't exist yet. 3.3.0b4 (2020-10-18) ==================== New --- * Statusbar with backend switcher, #1356 * Firmware flasher for CircuitPython, #1375, #1351 * Updated firmware flasher for micro:bit, #1351 Changed ------- * Refactor alternative interpreter configuration page, #1079 Fixed ----- * Don't choke when MP management output is wrapped between user input, #1346 * Include ampersand in URL regex in the Shell, #1323 * Dialogs may end up behind the main window, #1158, #1133 * Augment LD_LIBRARY_PATH instead of replacing it, #1008 * Fix "Install from requirements.txt" error, #1344 * File dialog should scroll to top when new folder gets selected, #1345 * Improve MicroPython file write reliability, #1355 * Fix CircuitPython directory creation * Allow selecting venv 'activate' instead of interpreter symlink in the interpreter configuration page, #1079 Technical --------- Improve diagnostic logging, #569 3.3.0b3 (2020-09-07) ==================== * Stop/Restart command now soft-reboots MicroPython device after reaching the prompt * Fixed problem with saving SSH password 3.3.0b2 (2020-09-03) ==================== * Fixed problem with circular imports affecting Python 3.7 * Restored Python 3.5 compatibility 3.3.0b1 (2020-09-03) ==================== New --- * Back-end for remote Python over SSH (try editing and running remote and local scripts and upload/download in the file browser; package manager, system shell, and debuggers don't work yet) * Back-end for remote Unix MicroPython over SSH * Back-end for local Unix MicroPython * Package manager for MicroPython (using micropip.py by Peter Hinch), #1299, see https://forum.micropython.org/viewtopic.php?f=15&t=8787&start=14 * Support Object inspector with MicroPython back-ends, #1309 * Thonny now synchronizes real-time clock of MicroPython devices on connect and before each file operation, #1004 * Allow editing any file as plain text, #1305 * File browser now allows setting default action by extension (open in system default app or in Thonny's editor), #1305 * ESP flash dialog now allows selecting flash mode, #1056 by Rune Langøy * "Save all" command, #1053 by Syed Nasim * Clicking on a value in the Shell selects it and opens in the Object inspector. * By default, after evaluating an expression in the Shell the value will be automatically shown in the Object inspector (if open). See Options => Shell to turn it off. * Object inspector now display more information about numbers (try 1024 or 0.1), #1230 * Support evaluating several expressions at once in the Shell (just like official Python REPL), #795 * Include esptool in binary bundles Changed ------- * Package manager now searches PyPI instead of requiring exact package name, #1300 * File browser now shows remote files below local files. This way local pane won't jump around when switching between local and remote back-ends. * TECHNICAL: Versions of serveral dependencies were updated Fixed ----- * Several intermittent bugs related to fragility of the communication with MicroPython REPL, #1103, #1147 * #1138: Allow semicolon in Shell input with Python 3.8 * #1129: Support terminator as system shell * #772: Allow invoking interrupt command from the menu when the editor has text selected (Ctrl+C would copy then) * #1146, #1159: "No module named pwd" error * #1283: Disable save button after save * Make Replayer work with timestamps without fractional part, #1116 * Don't raise exception when hitting end of undo/redo stack, #1211 by Andrew Scheller * Fix a typo in the code to display dialog. (#1260 by Ankith) Enhanced -------- * Convert keypad movement events to equivalent non-keypad ones, #1107 by Eliot Blennerhassett * Start file-open-dialog in same dir as current file, #1209 by Andrew Scheller * Bash install - do everything inside a new directory (#1203 by Andrew Scheller) * #1145: Provide understandable error message, when Linux installer downloader is run on a non-supported platform (by Andrew Scheller) 3.2.7 (2020-01-22) ================== * TECHNICAL: Skip name hilighter tests for recent Jedi versions 3.2.6 (2020-01-01) ================== * FIXED #1035: Make highlight names work with recent Jedi versions * FIXED #1043: Can't load files from MicroPython device (regression introduced in 3.2.5) * FIXED: Missing "Local files" label on save target selection dialog 3.2.5 (2019-12-25) ================== * CHANGED: Python version in binary bundles upgraded from 3.7.5 to 3.7.6 * CHANGED: MyPy checks are now enabled by default (Tools => Options => Assistant) * CHANGED: New Pylint checks are enabled * UPDATED #32: Thonny can now display/copy/paste Unicode emojis with Python 3.7.6+ / 3.8.1+ in Windows and Linux. Selection can be still wonky, though and emojis can freeze Thonny on macOS. Fixed by https://github.com/python/cpython/pull/16545 * FIXED #815: "Open System Shell" fails when no script is open * FIXED #973: Scrollbar in Help and Assistant acts funny * FIXED #1019: Crash on startup when Shell gets text inserted too soon * FIXED #1023: Accept code completions without parent and full_name * FIXED #1025: Extra imports by Thonny's back-end make stdlib name shadowing more troublesome * FIXED #1026: Allow '+' in image data URI chars in Shell * FIXED #1028: Thonny now has preliminary support for `Friendly Traceback `_. * FIXED: Allow larger images in shell (don't squeeze image URI-s), #401 * FIXED: Fallback to English, when configured language can't be loaded * FIXED: Problem using esptool on PATH 3.2.4 (2019-12-07) ================== * NEW: Turkish translation by M. Burak Kalkan * NEW: Polish translation by Jarek Miszczak * NEW: Partial Italian translation by sailslack * UPDATED: Greek and Spanish translations * CHANGED: XXL bundle now includes also pandas * CHANGED: Make faster tracer show exceptions only with step_over and step_into * CHANGE #1018: Use traditional stack view by default in Simple mode * ENHANCEMENT: Improved performance for Faster debugger (proposed and supported by Raspberry Pi) * FIXED #975: Fix stepping through lambdas with faster debugger * FIXED #977: Don't report certain exceptions in faster debugger * FIXED #983: Propose replacing tabs with spaces only in the editor (not in debugger frames) * FIXED #986: Nicer debugger fails when run with breakpoints only in secondary files * FIXED #987: MicroPython autocomplete problems by adzierzanowski * FIXED #1003: Wrong interpretation of MicroPython file timestamps * FIXED #1005: Avoid testing included MicroPython stubs * FIXED #1015: Indicate disabled toolbar buttons on macOS 3.2.3 (2019-11-03) ================== * NEW: Greek translation by Nikos * UPDATE: Updated several translations (by Vytenis, rnLIKEm, Dleta, Alex ANDRÉ, NathanBnm, LionelVaux, Paul, Eric W, Frank Stengel, ...) * UPDATE: Propose opening files via dialog in case of macOS Catalina permission error (#813). 3.2.2 (2019-11-01) ================== * NEW: ESP plug-in has been merged into main Thonny package * FIXED #219: Implement sending EOF / restart for CPython * FIXED #873: More robust color preference loading in Pi theme * FIXED #876: Don't step into comprehension calls * FIXED #897: Redo shortcut not working in Linux and Mac * FIXED #899: Can't set THONNY_USER_DIR in customize.py * FIXED #904: Don't show remote MicroPython dialogs when device is busy * FIXED #905: Problems with Thonny menu on Mac after closing a dialog * FIXED #911: Allow restoring default scaling factor * FIXED #921: Make MicroPython backend play nicer with device resets * FIXED #923: CircuitPython on Trinket m0 gives small int overflow when listing files * FIXED #925: Save or open problem with network paths * FIXED #927: Visual glitch / ghosting in Expression Box in macOS * FIXED #928: Tooltips stay on top in macOS * FIXED #929: Indicate dirty state in macOS close button * FIXED #933: Scaling doesn't work right for Treeviews (Files, Variables) * FIXED #934: Pad button captions for certain languages * FIXED #936: Problem uploading files to some STM boards * FIXED #939: More robust handling of different line endings * FIXED #943: Wrong syntax highlighting with triple quoted string * FIXED #946: Handle broken UTF-8 codepoints in MicroPython output * FIXED #951: Use standard tabstops for program output * FIXED #953: Allow running system commands with MP back-end * FIXED #957: Wrong encoding in multiprocessing output * FIXED #960: File browser is not working in replayer * FIXED #966: Thonny encounters "internal error" in programs calling exit() * FIXED #969: Provide nicer message, when MicroPython backend can't get to the REPL * FIXED: Don't apply theming to menu in macOS (menu items were dull with dark themes) 3.2.1 (2019-09-06) ================== * NEW: Add European Portuguese translation (by Emanuel Angelo) * NEW: Add Lithuanian translation (by Vytenis) * NEW: Add Ukrainian translation (by borpol) * FIXED #802: Avoid scary traceback on MicroPython disconnect * FIXED #840: Problems with file dialogs in macOS 10.15 * FIXED #843: Make right-click select items in Files view in macOS * FIXED #845: Crash with older ESP plug-in * FIXED #851: Ignore warnings when exporting variables * FIXED #854: Make single instance mode work in multi-user systems * FIXED #855: Wrong coloring with paren matching * FIXED #859: Support relative paths when opening files with Thonny from command line * FIXED #874: Multiline strings break stepping focus background * FIXED: Dutch translation was inproperly set up * FIXED: Internal error in Object Inspector (by Emanuel Angelo) * FIXED: Problem with compacting user event logs * TECHNICAL: Make tests run with Python 3.8 3.2.0 (2019-08-12) ================== * FIXED #849: Uploading single file to MicroPython doesn't work * UPDATE: Updated translations 3.2.0rc1 (2019-08-09) ===================== * NEW: Several new commands for Files view (New directory, Move to Trash, Delete, Upload (to MicroPython device), Download (from MicroPython device), ...) * CHANGED: MicroPython files are now displayed in the upper pane of Files view * CHANGED: Saving or loading editor content to/from MicroPython device displays progress bar * TECHNICAL: New dependency: Send2Trash 3.2.0b7 (2019-07-19) ==================== * FIXED: Problem with translation markers disturbing import 3.2.0b6 (2019-07-19) ==================== * NEW: BBC micro:bit plug-in has been merged into main Thonny package * CHANGED: micro:bit flasher now downloads latest MicroPython from GitHub * FIXED: Problems with micro:bit file browser * FIXED #808: multiprocessing doesn't work in Windows * FIXED #814: Ctrl+V inserts text twice in Windows (regression introduced in previous betas) 3.2.0b5 (2019-07-16) ==================== * FIXED #810: Use regular spacing in simple mode toolbar 3.2.0b4 (2019-07-14) ==================== * FIXED #809: Advertise indent/dedent in Edit menu * FIXED: Marked more terms for translation * FIXED: Updated Estonian translation 3.2.0b3 (2019-07-13) ==================== * FIXED #803: %cd gives error on MP/CP backend * FIXED #804: Changing directories does not show in FilesView for MP/CP * FIXED #805: Thonny user dir was not created at startup 3.2.0b2 (2019-07-13) ==================== * NEW: Former thonny-pi plug-in (containing Raspberry Pi theme) is now part of main Thonny package * NEW: Former thonny-circuitpython plug-in (containing CircuitPython back-end) is now part of main Thonny package * NEW: pip GUI now allows installing from requirements.txt file * NEW: Portable/thumbdrive bundles for Windows, macOS and Linux (https://github.com/thonny/thonny/wiki/DeploymentOptions#portable-version) * FIXED #188: Tkinter windows won't close on macOS * FIXED #361: Include Python development files in binary bundles * FIXED #488: Modal dialogs may get stuck * FIXED #639: Unset misleading environment variables in Windows launcher * FIXED #676: Can't close matplotlib window when MacOSX backend is used * FIXED #706: In Linux Thonny hangs on close sometimes * FIXED #800: Can't load large files * FIXED: Plotter now listens for theme changes (ie. changes background without restart) * CHANGED: Welcome dialog is not show on Raspberry Pi * CHANGED: Usage event logging is now disabled by default and can be enabled in Tools => Options => General * CHANGED: MicroPython back-ends don't interrupt running process on connecting * TECHNICAL: MicroPython back-end got a big refactoring 3.2.0b1 (2019-06-17) ==================== * NEW: [Work in progress] UI and help content can be translated to other languages (big thanks to cspaier, Georges Khaznadar and translators). See docs/translate.md for contrubution instructions. * NEW: Shell supports ANSI color codes and line overwriting with ``\b`` and ``\r``. See "Help => Shell" for more info. * NEW: Shell now has extension called "Plotter", which visualizes series of numbers printed to the standard output. See "Help => Plotter" for more info. * NEW: Shell presents PNG data URL-s printed to stdout as images. Try print("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==") * NEW: Automatic change of working directory is now optional (Tools => Options => Run & Debug) * NEW: Files view now allows setting working directory (double-click on folder name) * NEW: Files view allows browsing device's filesystem with MicroPython back-ends * NEW: Files from MicroPython devices can be opened in the editor and edited directly * NEW: You can now choose which debugger is invoked when clicking on the "Debug" toolbar button (Tools => Options => Run & Debug) * NEW: On first run Thonny presents a dialog for selecting UI language and initial settings ("standard" or "Raspberry Pi"). With Raspberry Pi settings Thonny will start in simple mode, preferred debugger set to "faster" and UI theme set to "Raspberry Pi". * NEW: Shell IO font can be configured (Tools => Options => Fonts & Themes). By André Roberge * NEW: Support for running Flask programs with F5. Also fixed several issues which prevented running and debugging Flask programs. See "Help => Web development with Flask" for more info. * NEW: "File => Save copy" allows saving current editor content to a different location without changing editor file name. * FIXED #630: Pressing up then down in shell doesn't leave shell in previous state. Fixed by Chad Purdy * FIXED #691: No Show shell on run with no input() prompt. Fixed by Chad Purdy * FIXED #692: Cancelling Save As dialog causes error. Fixed by Chad Purdy * FIXED #700: Allow viewing all files in file dialogs in Linux * FIXED #703: Exception view was not legible with dark theme * FIXED #704: Suggest current filename with Save As. Fixed by Илья Кругликов * FIXED #708: Error when stacktrace includes Cython frames. * FIXED #711: Thonny can now handle UNC paths * FIXED #719: Buttons are too narrow in Search/Replace dialog * FIXED #725: When saving a file, respect the original fileformat. By badukaire * FIXED #727: Respect fileformat for unix files too. By badukaire * FIXED #731: Right click menu disappears immediately and executes unwanted Undo action * FIXED #738: Window appears lower on each start * FIXED #749: "Focus shell" should bring you to a new prompt. By Ivoz * CHANGED: In order to work around ``tkinter.Text`` performance problems, Shell squeezes very long lines into a button. The button opens a dialog for expanding, viewing or copying those lines. Shell also deletes old output to remain responsive. * CHANGED: Various changes in simple mode (Zoom and Quit buttons, merging Run and Resume buttons, automatic display of Variables view). * CHANGED: Disabled Tk clipboard management workaround in Linux (occasionally caused UI freezes). This means clipboard becomes emptied after closing Thonny. * CHANGED: MicroPython commands from "Device" menu have been redesigned (use Files view instead) or moved to other menus (Run and Tools). The goal is to get rid of Device menu and keep only magic commands which make sense from the back-end perspective. Several of these features were proposed and supported by Raspberry Pi Foundation. 3.1.2 (2019-02-13) ================== * FIXED: Make Terminal features work in Windows again * FIXED #685: Print cuts lines * FIXED #686: Stepping over user modules can be too slow * ENHANCEMENT: Include pip in binary bundles 3.1.1 (2019-02-09) ================== * FIXED #674: Print doesn't work on Mac * FIXED #675: Make focus editor / shell shortcuts usable on Mac * FIXED #677: Debugging fails with extended slice syntax 3.1.0 (2019-01-28) ================== * NEW: "Run => Pygame Zero mode" allows running Pygame Zero programs with F5 * NEW: Support for Birdseye debugger (Run => Debug current script (Birdseye)) by Alex Hall * NEW: Notes view for writing down code snippets, task descriptions, etc. * NEW: Allow running current script in system terminal * NEW: "File => Print..." allows printing current script (via default web browser) * NEW: Shell's context menu now has editing commands * ENHANCEMENT: Open the Shell window on Run if it is not open * ENHANCEMENT: More robust support for running system commands in Thonny Shell (with ! prefix) * ENHANCEMENT: Allow switching off Pylint and/or MyPy checks * ENHANCEMENT: Make it clear how to exit Heap mode (with notification box in the upper-right corner of the main window) * FIXED #621: Holding Enter in the Shell causes a crash * FIXED #623: Parameters code completion error * FIXED #627: Debugging stops after raise statement * FIXED #628: Wrong line highlighted when stepping in for-loop * FIXED #629: Interrupting system command (!) shows ugly traceback * FIXED #633: pasting can't affect read-only text anymore * FIXED #641: Better font scaling in Linux (see Tools => Options => General for more control) * FIXED #646: Simple open file to edit from command line failing * FIXED #655: Invalid f-string crashes Assistant * FIXED #666: Make stdin iterable * FIXED: Solved several problems related to stepping through raising an exception * FIXED: Issues with automatic indentation (Thanks to Alex Hall!) * CHANGED: Use Konsole as terminal in KDE * CHANGED: "Tools => Open system shell" now shows relevant commands differently * CHANGED: Make Assistant's MyPy checks disabled by default * CHANGED: Source code now lives at GitHub (https://github.com/thonny/thonny) 3.0.8 (2018-11-15) ================== * FIXED #424: Font scaling problems in Linux * FIXED #584: Guard against bad repr calls * TECHNICAL: Reduced required pyserial version (Fedora only has 3.1) 3.0.8 (2018-11-15) ================== * FIXED #597: The directory with Python scripts may not be in path for executing system commands from shell * FIXED: Make executing shell commands compatible with Python 3.5 * FIXED: Make MyPy support compatible with older MyPy versions * FIXED: Make turtle.pyi compatible with Python 3.5 and remove Windows linebreaks * FIXED: MyPy error col offset 3.0.7 (2018-11-14) ================== * FIXED #592: MyPy doesn't work when cwd == sys.prefix * FIXED #593: No-message exceptions crash the Assistant * FIXED #595: Running system commands causes an error * FIXED #596: Arguments are ignored when running system commands from shell in Posix 3.0.6 (2018-11-13) ================== * FIXED #538: Turtle programs may give false warnings (Typeshed stubs were not packaged) * FIXED #586: Import interception mechanism fails for some modules * FIXED #591: Assistant fails when filename is missing from error info 3.0.5 (2018-10-26) ================== * FIXED #573: "Highlight matching names" and "Highlight local variables" makes editor very slow * FIXED #574: Error in outline * FIXED #578: resizing local variable pane in debugger causes error 3.0.4 (2018-10-22) ================== * FIXED #564: In Windows "Highlight local variables" and "Higlight matching names" cause Thonny to load Jedi files 3.0.3 (2018-10-21) ================== * FIXED: Regression from 3.0.2 (incomplete code refactoring) 3.0.2 (2018-10-21) ================== * FIXED #563: Problems with HeapView and EventsView * FIXED #565: Don't replace tabs in shell 3.0.1 (2018-10-17) ================== * FIXED: Problems with executing "Run" and "Debug" commands together with "cd" command * FIXED: Editor file name issues * FIXED: MicroPython %cat command failed over serial 3.0.0 (2018-10-16) ================== * CHANGED: Line numbers are now visible by default * CHANGED: Stack and Assistant views are now in the bottom-right corner * CHANGED: Shell doesn't show full path of bundled interpreters anymore * ENHANCEMENT #555: Internal errors are now shown with more suitable dialog * FIXED #170: Command+k for clearing shell in Mac * FIXED #547: Recommend "..." button when plug-ins latest stable isn't suitable for this Thonny version * FIXED #548: Prevent inconsistent use of tabs and spaces error (when pasting or opening text containing tabs, Thonny proposes to replace them with spaces) * FIXED #557: Default window size too small for simple mode * FIXED #559: Make text copied to clipboard available even after closing Thonny * FIXED: Implemented workaround for https://bugs.python.org/issue34927 * TECHNICAL: MicroPython backend now shows the source of failing internal commands 3.0.0rc1 (2018-10-08) ===================== * ENHANCEMENT: Documented several features (see Help => Help contents) * FIXED #523: Open system shell doesn't work with pip 10 * FIXED #534: Add shortcut for step-back * FIXED #538: Turtle programs give false warnings 3.0.0b6 (2018-09-30) ==================== * CHANGED: In order to avoid pollution of user home directory, the configuration file and logs are now stored in directories recommended by platform style guides (%APPDATA%/Thonny on Windows, ~/Library/Thonny on Mac and ~/.config/Thonny on Linux). Old configuration and user logs will be imported on first run. * CHANGED: "Back end" configuration page was renamed to "Interpreter" (as it was in Thonny 2.1) * CHANGED: Python version in Thonny+Python bundles upgraded to 3.7.1rc1 * NEW: File menu received a submenu for easy opening of recent files. * ENHANCEMENT: Add shortcut for clearing shell (Ctrl+L) * ENHANCEMENT: Warn when script is saved with a common library module name (eg. turtle.py) * ENHANCEMENT: Allow switching between regular and simple mode (Tools => Options => General) * FIXED #72: "View => Full screen" (in Expert mode) is now also available on Mac * FIXED #262: Add ability to select an autocomplete suggestion with TAB * FIXED #316: Nice debugger doesn't handle named arguments properly * FIXED #339: Allow disabling sound Tools => Options => General * FIXED #389: AST marker fails with dict merge * FIXED #478: Add option to reopen all files on start-up * FIXED #479: Make Thonny save configuration when "Quit"-ed on Mac * FIXED #480: Thonny now properly remembers opened files * FIXED #498: Open System Shell doesn't work on Raspberry * FIXED #501: Assistant feedback preview link doesn't work on mac * FIXED #510: Error when listing available interpreters in config page * FIXED #518: add menu item: "device" / "Upload current script" for MicroPython (by Jens Diemer) * FIXED: Object inspector can show images (again) * FIXED: Pylint and MyPy processes don't hang anymore with large output. 3.0.0b5 (2018-09-01) ==================== * FIXED: requirements.txt was missing mypy 3.0.0b4 (2018-08-31) ==================== * NEW: When program has syntax error or crashes with an exception, Assistant pane opens and tries to help diagnose the problem. Uses Pylint, MyPy and custom dynamic analysis under the hood. (Big "Thank you!" to Raspberry Pi Foundation for the support!) * ENHANCEMENT: Resizing the main window doesn't mess up views' layout anymore. * ENHANCEMENT: Better support for debugging f-strings. * ENHANCEMENT: Nice debugger now recovers better when it is not able to understand a program. * FIXED #496: Regression which caused Variables view to skip variables updates during "nicer debugging". * FIXED #440: Copy&paste over a selection will now delete the text selection first (was problem for some Linuxes) * FIXED: Removed a nasty debugging statement left into b3, which may cause a crash in the end of debugging. 3.0.0b3 (2018-08-11) ==================== * FIXED: Various problems with pip GUI * FIXED: Variables view misses events * FIXED: Error when last back-end was not available anymore * TECHNICAL: Implemented ChoiceDialog 3.0.0b2 (2018-08-11) ==================== * FIXED: problems with pip GUI in virtualenv 3.0.0b1 (2018-08-11) ==================== Note: This version is successor of 2.2.0b4 and 2.1.21. Stable release of 2.2.0 was skipped. (Incrementing the major version felt more appropriate considering the amount of new and changed features.) * NEW: Thonny now has two debug modes: beside original AST based debug mode (the "nicer" one, Ctrl+F5) there is now also line-based mode (the "faster" one, Shift+F5), which is not so intuitive but much more efficient. * NEW: Both debug modes now support breakpoints (switch on line numbers and double-click on the margin). Big thanks to Raspberry Pi Foundation for the support! * NEW: Alternative presentation for call stack (in single window, just like in most debuggers; see Tools => Options => Debugger) * NEW: Clicking on the links in stacktrace now shows the variables of those frames. * NEW: You can re-run your changed program without closing it first (relevant for graphical programs). * NEW: Checking "Run => Dock user windows" makes your Tkinter windows stay on top and appear always on the same location. This allows tweaking your turtle programs while looking at current output. * NEW: "View => Program arguments" opens a box where you can write the argument string for your program * NEW: "Tools => Options => Backend => Custom Python interpreter" now allows creating virtual environments * NEW: "Tools => Manage packages" now allows installing new packages with all CPython backends, not only virtual environments. If the backend is not a virtual environment it installs to user site packages (with `pip install --user`) * NEW: Thonny now includes basic support for MicroPython (former `thonny_microbit` plug-in). See https://bitbucket.org/plas/thonny/wiki/MicroPython for more info. * CHANGED: Upgraded Python to version 3.7.0 in Thonny+Python bundles * CHANGED: Dropped support for Python 3.4 (both for front-end and back-end) * CHANGED: Dropped support for Tk 8.5. All bundles (including Mac's) now come with Tk 8.6.8 * CHANGED: Default back-end is now "Same as front-end" (was "A special virtual environment"). This makes deployment easier in classroom setting and it is simpler scheme in general. "Special virtual environment" backend may be removed in future versions. * CHANGED: Plug-ins will be now installed to regular user site packages directory (was ~/.thonny/plugins) * CHANGED: If Thonny (front-end) is run from a virtual environment, user directory (with configuration.ini and logs) will be .thonny under virtual environment's root directory (instead of usual ~/.thonny). * ENHANCEMENT: Better Windows installer (run as administrator for all-users install) * ENHANCEMENT: thonny.exe is now digitally signed * ENHANCEMENT: On Linux Thonny now uses native file dialogs (via zenity) * ENHANCEMENT: Nicer debugger can now step into your functions defined in other modules * ENHANCEMENT: Nicer debugger can now stop before the assignement of loop variable in for-loops * ENHANCEMENT: "Run to cursor" can be called by right-clicking desired line in the editor and selecting the command from context menu * ENHANCEMENT: Great time and memory optimizations in nicer debug mode. The ability to step back in time is not so expensive anymore. * ENHANCEMENT: Thonny now detects external file modifications and proposes to reload * ENHANCEMENT: New Windows installer (run as administrator for all-users install) * FIXED #163: Uninstaller now correctly removes "Open with Thonny" context menu entry * FIXED #340: Validate geometry before loading * FIXED #358: sys.exit() in user programs doesn't show stacktrace anymore * FIXED #363: subprocess.run causes Thonny backend to hang * FIXED #375: Files are now saved with linebreaks suitable for current platform * FIXED #419: logging doesn't work in user programs * FIXED #422: Make Ctrl+C, Ctrl+V etc. work on Greek keyboard * FIXED #440: In Linux paste over selection doesn't remove the selection * FIXED #450: Locals marker doesn't work with jedi 0.12 * FIXED #468: Problem with changing backend interpreter * FIXED #471: Problem when Thonny uses jedi 0.11 or newer * FIXED #475: Heap view misbehaving on startup * FIXED: "Run => Run to cursor" works again * FIXED: Thonny now honors PEP 263 style encoding markers when saving files. (UTF-8 is still the default) * FIXED: Problem when jedi 0.10 and parso are both installed * TECHNICAL: Plug-in writers can now control each import in user programs (thonny.backend.VM.add_import_handler) * TECHNICAL: Communication messages between back-end and front-end were changed * TECHNICAL: Thonny doesn't tweak PYTHONUSERBASE anymore to put plugins under ~/.thonny. Regular user site packages is used instead * TECHNICAL: Dependency to "packaging" introduced in 2.2 betas is now replaced with "setuptools" 2.2.0b4 (2018-06-05) ==================== * FIXED: Couldn't open menus with None backend 2.2.0b3 (2018-06-05) ==================== * FIXED #425: Too big automatic scaling * FIXED #427: Can't run files with spaces in filename * FIXED: Fixed a bug when debugging and encountering an exception (by Alar Leemet) * ENHANCEMENT: Show indicator about stepping in the past in the text of editor tabs * ENHANCEMENT: Added Thonny version guards for installing plug-ins * EXPERIMENTAL: Preliminary support for running system commands in Thonny shell (eg. `!ls` or `!dir`) * TECHNICAL: thonny.exe in Windows bundle is now signed * TECHNICAL: Delay starting of Runner until UI is shown * TECHNICAL: Various enhancements to support MicroPython plug-ins 2.2.0b2 (2018-05-04) ==================== * FIXED: Options dialog crashes when Variables view hasn't been created yet 2.2.0b1 (2018-05-04) ==================== * NEW: Added support for stepping back in time during debugging (Run => Step back) by Alar Leemet. If you accidentally stepped over an interesting part of code, then now you can step back and step into. * NEW: Added support for UI and syntax theming (https://bitbucket.org/plas/thonny/wiki/Theming) * NEW: Added several built-in dark themes * NEW: Added support for display scaling / high-DPI screens (Tools => Options => General) * NEW: Added closing buttons to the tabs of all views * NEW: Added support for (CPython) back-end plug-ins (https://bitbucket.org/plas/thonny/wiki/Plugins) * NEW: Current editor line can be highlighted (Tools => Options => Editor) * NEW: Thonny can be started in simple mode (https://bitbucket.org/plas/thonny/wiki/Modes) * NEW: Variables view now allows viewing variables from other modules beside __main__ (Tools => Options => General) * CHANGED: Dropped support for Python 3.4 (both for front-end and back-end) * CHANGED: Reorganized back-end configuration ("Tools => Options => Back-end" instead of "Tools => Options => Interpreter") * CHANGED: The roles of Interrupt and Stop commands are now more clear: Stop always restarts the backend and Interrupt only tries to interrupt * CHANGED: Editing the running program doesn't interrupt it anymore. * CHANGED: Object inspector now shows attributes and object overview on different tabs * CHANGED: Can't set thonny.THONNY_USER_DIR directly in customize.py anymore (https://bitbucket.org/plas/thonny/wiki/DeploymentOptions) * CHANGED: For plug-in writers: Unified early and late plug-ins (load_early_plugin should be renamed to load_plugin) * CHANGED: For plug-in writers: get_workbench and get_runner moved from thonny.globals to thonny * FIXED #358: Hide the stacktrace of SystemExit * FIXED #368: "Open system shell" doesn't work in Xfce (fix by Miro Hrončok) * FIXED #370: Made zooming with Ctrl++ / Ctrl+- work on the numpad on Linux * FIXED #372: Now it's possible to specify a link as backend interpreter (fix by Miro Hrončok) * FIXED #396: exec causes range marker to crash * FIXED #403: Window width may become negative * TECHNICAL: Changed the location and sharing of backend.py, common.py, ast_utils.py * TECHNICAL: Cleaner approach for sharing jedi with the back-end * TECHNICAL: Package manager now uses pypi.org instead of pypi.python.org * TECHNICAL: Several changes in Runner and BackendProxy interface * TECHNICAL: Saving an editor now forces writing to disk (see https://learn.adafruit.com/adafruit-circuit-playground-express/creating-and-editing-code#1-use-an-editor-that-writes-out-the-file-completely-when-you-save-it) 2.1.22 (2018-08-20) =================== Happy re-independence day to Estonia! * ENHANCEMENT: Less intrusive logging for AST marking problems * FIXED #340: Validate geometry before loading * FIXED #363: subprocess.run causes Thonny backend to hang * FIXED #419: logging doesn't work in user programs * FIXED #440: In Linux paste over selection doesn't remove the selection * FIXED #487: Use PyPI.org and turn off pip warnings in package manager * FIXED #490: Debugger gets confused with f-strings * FIXED: In case of back-end problems, kill backend instead of resetting * FIXED: Colorize f-string prefixes 2.1.21 (2018-07-17) =================== * FIXED #471: Another problem when Thonny uses jedi 0.11 or newer 2.1.20 (2018-07-16) =================== * FIXED: Problem when jedi 0.10 and parso are both installed 2.1.19 (2018-07-16) =================== Updates in this version are relevant only on Windows * FIXED #467: Error when running Thonny with pythonw on Windows (regression from 2.1.18) * ENHANCEMENT: New Windows installer (run as administrator for all-users install) * ENHANCEMENT: Upgraded Python to version 3.6.6 in Thonny+Python bundles 2.1.18 (2018-06-22) =================== * FIXED #450: Locals marker doesn't work with jedi 0.12 2.1.17 (2018-03-21) =================== * FIXED #409: Package manager crashed after release of pip 9.0.2 2.1.16 (2017-11-10) =================== * Tests moved under thonny package * Tests included in the source distribution * More icons included in the source distribution 2.1.15 (2017-11-07) =================== * Removed StartupNotify from Linux .desktop file (StartupNotify=true leaves cursor spinning in Debian) 2.1.14 (2017-11-02) =================== * Added some Linux-specific files to source distribution. No new features or fixes. 2.1.13 (2017-10-29) =================== * Temporary workaround for #351: Locals and name highlighter occasionally make Thonny freeze * Include only required licenses in source dist 2.1.12 (2017-10-13) =================== * FIXED #303: Allow specifying same interpreter for backend as frontend uses * FIXED #304: Allow specifying backend interpreter by relative path * FIXED #312: Closing unsaved tab causes error * FIXED #319: Linux install script needs quoting around the path(s) * FIXED #320: Install gets recursive if trying to install within extracted tarball * FIXED #321: Linux installer fails if invoked with relative, local user path * FIXED #334: init.tcl not found (Better control over back-end environment variables) * FIXED #343: Thonny now also works with jedi 0.11 2.1.11 (2017-07-22) =================== * FIXED #31: Infinite print loop freezes Thonny * FIXED #285: Previous used interpreters are not shown in options dialog * FIXED #296: Make it more explicit that pip GUI search box needs exact package name * FIXED #298: Python crashes keep backend hanging * FIXED #305: Variables table doesn't get updated, if it's blocked by another view 2.1.10 (2017-06-09) =================== * NEW: More flexibility for classroom setups (see https://bitbucket.org/plas/thonny/wiki/ClassroomSetup) * FIXED #276: Copy with Ctrl+C causes bell * FIXED #277: Triple-quoted strings keep keyword coloring * FIXED #278: Paste in shell causes bell * FIXED #281: Wrong unindentation with SHIFT+TAB when last line does not end with linebreak * FIXED #283: backend.log path doesn't take THONNY_USER_DIR into account * FIXED #284: Internal error when saving to a read-only folder/file (now proposes to choose another name) 2.1.9 (2017-06-01) ================== * FIXED #273: Memory leak in editor margin because of undo log * FIXED #275: Updating line numbers is very inefficient * FIXED: Pasted text occasionally was hidden below bottom edge of the editor * FIXED: sys.exit() didn't really close the backend 2.1.8 (2017-05-28) ================== * ENHANCEMENT: Code completion with Tab-key is now optional (see Tools => Options => Editor) * ENHANCEMENT: Clicking on the editor now closes code completion box * CHANGED: Code completion box doesn't offer names starting with double underscore anymore. * FIXED: Error caused by too fast typing with open code completions box * ENHANCEMENT: Find/Replace dialog can now be operated with F3 * ENHANCEMENT: Find/Replace pre-selects previously used search string * ENHANCEMENT: Find/Replace dialog doesn't block main window anymore * FIXED: Find/Replace doesn't ignore spaces in search string anymore * FIXED: Closed views reappeared after restart if they were only views in that notebook * FIXED #264: Debugger fails with with conditional list comprehension * FIXED #265: Error when using two word search string in pip GUI * FIXED #266: Occasional incorrect line numbering * FIXED #267: Kivy application main window didn't show in Windows * TECHNICAL: Better diagnostic logging 2.1.7 (2017-05-13) ================== * CHANGED: pip GUI now works in read-only mode unless backend is a virtual environment * FIXED: Error when non-default backend was used without previously generated Thonny-private virtual environment 2.1.6 (2017-05-12) ================== * FIXED #260: Strange behaviour when indenting with TAB * FIXED #261: Editing a triple-quoted string breaks coloring in following lines * FIXED: Made outdated pip detection more general 2.1.5 (2017-05-09) ================== * FIXED: Jedi version checking problem 2.1.4 (2017-05-09) ================== (This release is meant for making Thonny work better with system Python 3.4 in Debian Jessie) * FIXED #254: "Manage plug-ins" now gives instructions for installing pip if system is missing it or it's too old * FIXED #255: Name highlighter and locals marker are now quietly disabled when system has too old jedi * FIXED: Virtual env dialog now closes properly * TECHNICAL: SubprocessDialog now has more robust returncode checking in Linux 2.1.3 (2017-05-09) ================== * FIXED #250: Debugger focus was off by one line in function frames * FIXED #251: Debugger timing issue (wrong command type in the backend) * FIXED #252: Debugger timing issue (get_globals and debugger commands interfere) * FIXED #253: Creating default virtual env does not work when using Debian python3 without ensurepip 2.1.2 (2017-05-08) ================== * FIXED #220 and #237: Icon problems in Linux tasbar. * FIXED #245: Tooltips not working in Mac * FIXED #246: Current script did not get executed if cursor was not in the end of the shell * FIXED #249: Reset, Run and Debug caused double prompt 2.1.1 (2017-05-03) ================== * FIXED #241: Some menu items gave errors with micro:bit backend. * FIXED #242: Focus got stuck on first run (no entry was possible neither in shell nor editor when initialization dialog closed) 2.1.0 (2017-05-02) ================== * TECHNICAL: Changes in diagnostic logging 2.1.0b11 (2017-04-29) ===================== * TECHNICAL: Implemented more robust approach for installing Thonny plugins 2.1.0b10 (2017-04-29) ===================== * CHANGED: Installed plugins now end up under ~/.thonny/plugins * TECHNICAL: Backend preparation now occurs when main window has been opened 2.1.0b9 (2017-04-28) ==================== * FIXED: Backend related regression introduced in b8 2.1.0b8 (2017-04-27) ==================== * CHANGED: (FIXED #231) Stop/Reset button is now Interrupt/Reset button (tries to interrupt a running command instead of reseting. Resets if pressed in idle state) * FIXED #232: Ubuntu showed pip GUI captions with too big font * FIXED #233: Thonny now remembers which view was on top in a panel. * FIXED #234: Multiline support problems in shell (trailing whitespace was causing trouble) * FIXED: pip GUI shows latest version number when there is no stable version. * FIXED: pip GUI now can handle also packages without PyPI presence * TECHNICAL: Backends are not sent Reset command for initialization anymore. 2.1.0b7 (2017-04-25) ================== * FIXED: Removed some circular import to support Python 3.4 * FIXED: pip GUI now also lists installed pre-releases * EXPERIMENTAL: GUI for installing Thonny plug-ins (Tools => Manage plug-ins...) * TECHNICAL: Thonny+Python bundles again include pip (needed for installing plug-ins) * TECHNICAL: Refactored creation of several widgets to support theming * TECHNICAL: THONNY_USER_DIR environment variable can now specify where Thonny stores user data (conf files, default virtual env, ...) 2.1.0b6 (2017-04-19) ================== * ENHANCEMENT: Shell now shows location of external interpreter as welcome text * FIXED #224: Tab-indentation didn't work if tail of the text was selected and text didn't end with empty line * FIXED: Tab with selected text occasionally invoked code-completion * TECHNICAL: Tweaks in Windows console allocation * TECHNICAL: Thonny+Python bundles don't include pip anymore (venv gets pip via ensurepip) 2.1.0b5 (2017-04-18) ================== * FIXED: Typo in pipGUI (regression introduced in b4) 2.1.0b4 (2017-04-18) ==================== * CHANGED: If you want to use Thonny with external Python interpreter, then now you should select python.exe instead of pythonw.exe. * FIXED #223: Can't interrupt subprocess when Thonny is run via thonny.exe * FIXED: Private venv didn't find Tcl/Tk in ubuntu (commit 33eabff) * FIXED: Right-click on editor tabs now also works on macOS. 2.1.0b3 (2017-04-17) ==================== * NEW: Dialog for managing 3rd party packages / a simple pip GUI. Check it out: "Tools => Manage packages" * NEW: Shell now supports multiline commands * ENHANCEMENT: Window title now shows full path and cursor location of current file. * ENHANCEMENT: Editor lines can be selected by clicking and/or dragging on line-number margin (thanks to Sven). * ENHANCEMENT: Most programs can now be interrupted by Ctrl+C without restarting the process. * ENHANCEMENT: You can start editing the code that is still running (the process gets interrupted automatically). This is handy when developing tkinter applications. * ENHANCEMENT: Tab can be used as alternative code-completion shortcut. * ENHANCEMENT: Recommended pip-command now appears faster in System Shell. * ENHANCEMENT: Alternative interpreter doesn't need to have jedi installed in order to provide code-completions (see #171: Code auto-complete error) * ENHANCEMENT: Double-click on autocomplete list inserts the completion * EXPERIMENTAL: Ctrl-click on a name in code tries to locate its definition. NB! Not finished yet! * CHANGED: Bundled Python version has been upgraded to 3.6.1 * CHANGED: Bundled Python in Mac and Linux now uses SSL certs from certifi project (https://pypi.python.org/pypi/certifi). * REMOVED: Moved incomplete Exercise system to a separate plugin (https://bitbucket.org/plas/thonny-exersys). With this got rid of tkinterhtml, requests and beautifulsoup4 dependencies. * FIXED #16: Run doesn't clear variables (again?) * FIXED #98: Nested functions crashed the debugger. * FIXED #114: Crash when trying to change interpreter in macOS. * FIXED #142: "Open system shell" failed when Thonny path had spaces in it. Paths are now properly quoted. * FIXED #154: Problems with Notebook tabs' context menus * FIXED #159: Debugging list or set comprehension caused crash * FIXED #166: Can't delete one of two spaces with backspace * FIXED #180: Right-click doesn't focus editor * FIXED #187: Main modules launched by Thonny were missing ``__spec__`` attribute. * FIXED #195: Debugger crashes when using generators. * FIXED #201: "Tools => Open Thonny data folder" now works also in macOS. * FIXED #211: Linux installer was failing when using ``xdg-user-dir`` (thanks to Ryan McQuen) * FIXED #213: In single instance mode new Window doesn't get focus * FIXED #217: Debugger on Python 3.5 and later can't handle splat operator * FIXED #221: Context menus in Linux can now be closed by clicking elsewhere * FIXED: Event logger did not save filenames (eb34c5d). * FIXED: Problem in replayer (db78855). * TECHNICAL: Bundled Jedi version has been upgraded to 0.10.2. * TECHNICAL: 3rd party Thonny plugins must now be under ``thonnycontrib`` namespace package. * TECHNICAL: Introduced the concept of "eary plugins" (plugins, which get loaded before initializing the runner). * TECHNICAL: Refactored the interface between GUI and backend to allow different backend implementations * TECHNICAL: Previously, with bundled Python, Thonny was using nasty tricks to force pip install packages install under ~/.thonny. Now it creates a proper virtual environment under ~/.thonny and uses this as the backend by default (instead of using interpreter running the GUI directly). * TECHNICAL: Automatic tkinter updates on the backend are now less invasive 2.0.7 (2017-01-06) ================== * FIXED: Making font size too small would crash Thonny. * FIXED: Another take on configuration file corruption. * FIXED: Shift-Tab wasn’t working in some cases. * FIXED #165: "Open system shell" did not add Scripts dir to PATH in Windows. * FIXED #183: ``from __future__ import`` crashed the debugger. 2.0.6 (2017-01-06) ================== * FIXED: a bug in Linux installer (configuration file wasn’t created in new installations) 2.0.5 (2016-11-30) ================== * FIXED: Corrected shift key detection (a82bd4d) 2.0.4 (2016-10-26) ================== * FIXED: Configuration file was occasionally getting corrupted (for mysterious reasons, maybe a bug in Python’s configparser) * FIXED #104: Negative font size crashed Thonny * FIXED #143: Linux installer fails if desktop isn't named "Desktop". (Later turned out this wasn't fixed for all cases). * FIXED #134: "Open system shell" doesn't work in Centos 7 KDE 2.0.3 (2016-09-30) ================== * FIXED: Quoting in "Open system shell" in Mac. Again. 2.0.2 (2016-09-30) ================== * FIXED: Quoting in "Open system shell" in Mac. 2.0.1 (2016-09-30) ================== * FIXED #106: Don't let user logs grow too big 2.0.0 (2016-09-29) ================== * NEW: Added code completion (powered by Jedi: https://github.com/davidhalter/jedi) * NEW: Added new command "Tools => Open system shell" which opens terminal where current Python is in PATH. * CHANGED: Single instance mode is now optional (Tools => Options => General) * FIXED: Many bugs 1.2.0b2 (2016-02-10) ==================== * NEW: Thonny now runs in single instance mode. Previously, when you opened a py file with Thonny, a new Thonny instance (window) was created even if an instance existed already. This became nuisance if you opened several files. Now Thonny works as single instance program, meaning only one instance of Thonny runs at the time. When you open another file, it is opened in existing window. * NEW: Editor enhancements. Added option to show line numbers and right margin in the editor. In order to keep first impression cleaner, they are disabled by default. See Tools => Options => Editor. Don't forget that you don't need line numbers for locating lines mentioned in error messages -- you can click them and Thonny shows you the line. * FIXED: Some bugs where Thonny couldn't prepare some programs for debugging. Older versions ============== See https://github.com/thonny/thonny/issues and https://github.com/thonny/thonny/commits ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/CREDITS.rst0000644000076600000240000001175514730022736015251 0ustar00aivarannamaastaff======= Credits ======= Thonny is thankful to: Its home -------- Thonny grew up in University of Tartu (https://www.ut.ee), Institute of Computer Science (https://www.cs.ut.ee). Supporters ---------- * Development of several features in Thonny 3.0 and 3.3 was proposed and supported by Raspberry Pi Foundation (https://www.raspberrypi.org). * Since September 2018, development of Thonny is partially supported by Cybernetica AS (https://cyber.ee). Several companies and organizations have provided us with free hardware for testing Thonny (and for having fun): * Phidgets Education (https://www.phidgets.com/education/) * Adafruit (https://www.adafruit.com/) * Raspberry Pi Foundation (https://www.raspberrypi.org) * M5Stack (https://m5stack.com/) * Micro:bit educational foundation (https://microbit.org/) * Calliope (https://calliope.cc/en) * @bwshockley (https://minifigboards.com/) Python ------ It's a really nice language for teaching programming. It also has some nice technical properties, that made Thonny's program animation features pleasure to implement. Libraries, resources and tools ------------------------------ * asttokens (https://github.com/gristlabs/asttokens) provides source locations to AST nodes. * jedi (http://jedi.readthedocs.io) is used for code completion, go to definition, etc. * pylint (https://www.pylint.org/) is used as one of the engines behind warnings presented by the Assistant. * mypy (http://mypy-lang.org/) is used, just like pylint, as a warning engine in the Assistant. * pyserial (https://github.com/pyserial/pyserial) is used for communicating with MicroPython devices. * docutils (http://docutils.sourceforge.net/) is used for parsing help content written in reStructuredText. * send2trash (https://github.com/hsoft/send2trash) is used by the Files view. * certifi (https://pypi.python.org/pypi/certifi) provides SSL certs for bundled Python in Linux and Mac. * distro (https://pypi.python.org/pypi/distro) is optionally used for detecting Linux version in About dialog. * paramiko (https://pypi.org/project/paramiko) is optionally used for writing and running code on remote machines. * websockets (https://pypi.org/project/websockets) is optionally used for communicating with MicroPython devices over WebREPL. * Most icons are taken from Eclipse project (https://www.eclipse.org/, https://github.com/eclipse/eclipse.platform.debug/tree/master/org.eclipse.debug.ui/icons/full/, https://github.com/eclipse/eclipse.platform.ui/tree/master/bundles/org.eclipse.ui/icons/full/, https://github.com/eclipse/eclipse.jdt.ui/tree/master/org.eclipse.jdt.ui/icons/full/), on Linux, some are overridden by Tango icons (http://tango.freedesktop.org/) * POEditor (https://poeditor.com/) is used for managing translations of UI strings. * https://github.com/hlovatt/PyBoardTypeshed Source contributors, sponsors, advisors, translators and frequent bug-reporters ------------------------------------------------------------------------------- * adzierzanowski * Aivar Annamaa * Albin * Alar Leemet * Aleks ANDRÉ * Alex Hall * Alexandre Barrozo do Amaral Villares * Algent Albrahimi * Anatoly Techtonik * Anders Pamdal * Andrea Ferrari * Andrew Scheller * André Roberge * Andy Piper * Ankith * Antonio Carlos * atesin * Augene J. Pak * Austin Bart * Avag. sayan * badukaire * Bui Huy Quang * borpol * CADTEC GmbH (cadtec.ch) * cefn * Celso Isayah Dias * Chad Purdy * codemee * Collision Detection * cspaier * cubimon * Curtis Wang * Dominic Twyman * Dominik George * Donald Butt * Duncan Ogilvie (@mrexodia) * Eliot Blennerhassett * Emanuel Angelo * Fabianus.c * Farshid Meidani * Filip Schouwenaars * Fizban * Florentina (@emryswaves) * freddii * fstengel * Gabriel Slørdahl * Gagan Saksena * Georges Khaznadar * Helmut Ascheid * Hyungseok Choi * IhorNehrutsa * Ingo Blechschmidt * Isaac Levy (@isaacl) * Ivanhercaz * Ivan.schamann * Илья Кругликов * Jarek Miszczak * Jens Diemer * jharris1993 * Juan Falgueras * Juhan Oskar Hennoste (@FeldrinH) * Jonathan Campbell * Jordan Williams * jose1711 * José Carlos García * Karolina Surma (@befeleme) * Kaspar Papli * Kauri Raba * kr-g * Laszlo Kocsis * Lrasinen * M Burak Kalkan * Marcelo de Gomensoro Malheiros * Marian-Silviu Iuga * Marie Roald * Marko Ristin * Martin Rommel * Matt Iversen * Miro Hrončok * NathanBnm * Nicolas Despres * Pavel Minaev * Peter Marshall * Peter Mawhorter (@solsword) * Petr. moses * Phil Duby * phr0gger * Pop Vasile Alexandru * Radim * Rene Lehtma * Rune Langøy * Saishen, Inc. * Sam Warmuth * Sami Almuhammady * sailslack * Scott Blackledge * segalion * Simon Gijsen * Simon Long * sourceperl * speedy-10 * Stefan Rothe * Stewart Russell (@scruss) * Suk-Hyung Hwang * Sven Duzont * Syed Nasim * Taavi Ilp * tabreturn * TANAKA Masayuki * Thomas Helmuth * TooLazy0x00 * Toomas Mölder * Tristan Bunn * Tusamten * Vytenis (svajoklis-1) * Xin Rong * YEON * 丁向阳 (Ding-XiangYang) * 涂紳騰 (Shen-Teng Tu) * 張文宏 (Wen-Hung, Chang) Please let us know if we have forgotten to add your name to this list! Also, let us know if you want to remove your name. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1725998844.0 thonny-4.1.7/LICENSE.txt0000644000076600000240000000207114670123374015237 0ustar00aivarannamaastaffThe MIT License (MIT) Copyright (c) 2024 Aivar Annamaa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/MANIFEST.in0000644000076600000240000000047514417536743015167 0ustar00aivarannamaastaffinclude CHANGELOG.rst include CREDITS.rst include LICENSE.txt include README.rst include requirements.txt include licenses/ECLIPSE-ICONS-LICENSE.txt include packaging/linux/thonny.1 include packaging/icons/*.png include packaging/linux/org.thonny.Thonny.appdata.xml include packaging/linux/org.thonny.Thonny.desktop ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.402556 thonny-4.1.7/PKG-INFO0000644000076600000240000000372614730055627014523 0ustar00aivarannamaastaffMetadata-Version: 2.1 Name: thonny Version: 4.1.7 Summary: Python IDE for beginners Home-page: https://thonny.org Author: Aivar Annamaa and others Author-email: thonny@googlegroups.com License: MIT Project-URL: Source code, https://github.com/thonny/thonny Project-URL: Bug tracker, https://github.com/thonny/thonny/issues Keywords: IDE education debugger Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: MacOS X Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: License :: Freeware Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Education Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Text Editors Requires-Python: >=3.8 License-File: LICENSE.txt Requires-Dist: jedi>=0.18.1 Requires-Dist: setuptools>=45.2 Requires-Dist: pyserial>=3.4 Requires-Dist: pylint>=2.4 Requires-Dist: docutils>=0.16 Requires-Dist: mypy>=0.761 Requires-Dist: asttokens>=2.0 Requires-Dist: Send2Trash>=1.5 Requires-Dist: wheel Thonny is a simple Python IDE with features useful for learning programming. See https://thonny.org for more info. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/README.rst0000644000076600000240000000134614417536743015116 0ustar00aivarannamaastaff.. image:: https://github.com/thonny/thonny/blob/master/thonny/res/Ukraine.png `Support Ukraine! `_ ====== Thonny ====== Thonny is a Python `IDE `_ meant for learning programming. End users --------- See https://thonny.org and `wiki `_ for more info. Contributors ------------ Contributions are welcome! See `CONTRIBUTING.rst `_ for more info. Sponsors ---------- You can sponsor development of Thonny by sending a donation to Thonny's main author Aivar Annamaa: https://github.com/thonny/thonny/wiki/Sponsors ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9305542 thonny-4.1.7/exa/0000755000076600000240000000000014730055627014173 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0561812 thonny-4.1.7/licenses/0000755000076600000240000000000014730055627015223 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/licenses/ECLIPSE-ICONS-LICENSE.txt0000644000076600000240000002612314417536743021012 0ustar00aivarannamaastaff# Several Thonny icons are taken from http://eclipse-icons.i24.cc ------------------------------ Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9494853 thonny-4.1.7/packaging/0000755000076600000240000000000014730055627015342 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.063204 thonny-4.1.7/packaging/icons/0000755000076600000240000000000014730055627016455 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-128x128.png0000644000076600000240000000306714417536743021450 0ustar00aivarannamaastaffPNG  IHDRi7@bKGD̿ pHYs  tIME 6%IDATx_TU?Y+"kIX| &FaJQC KCж&Bpgfϝ{g9zgGs<}s~;      sfe0&I /nZ SR~ҌVf_[Zyʹf0"'y&_ Nw||ɰ^;h4/6fd\ Nt)-K/k23㬺gztі|dձ[8o6Ǩx݁Koy&~'E>Å):E+928D[gOC&:,)q++e8mn\"zyeЄ1q5ԡK|ŕ=hs wMZsoDNPr|!ew&ieW ٸHg 5i@.@j:&3lleDf\ zyZzJ{ 0V-gXS䛞iGk] 8╴(;xً^YGb&A6Ag=Xֳ0x77 *f6 A4$F706}4: uHMBE*SY_5-xhJS$ yL>Oՙ`"{RaICsh׆N}a0QgѮJ[eRLm"gD}1\~; fu @|>zZ~кeǰ+|گzS) B6wGcP=N~@KzhvG1|gBe2hӥԳQQߡ\J3 e'۾CAo`wle3%Z }&      ? M7BIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-16x16.png0000644000076600000240000000032614417536743021273 0ustar00aivarannamaastaffPNG  IHDR7bKGD̿ pHYs  tIME agIDAT(ϭ (CMRD"Ag|}|ۖ@n uYjPHӐ6ɚĆn:hVZȺGNOBTt#5IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-192x192.png0000644000076600000240000000600514417536743021445 0ustar00aivarannamaastaffPNG  IHDRդbKGD̿ pHYs  tIME;b IDATx]]lG]lݫ}zPiTTTP U%MRʛ[ו* D$JJ*ED2%ED}hԊЫ#vn;3;37{í/sf@ @ @ ]&Y+(1CC%\>f1wg(`$ ]|Gg=O"D 4 `1崙نkx'ZC@x}~X tI %uu ig@2+R n Y_a/1hۃxKgǏ)*F,߼r:L0W}㒯w:"!Cf5<]=-sfo{+ G~U/4i89\As bGCT< *oܱp>S*&ƽAp+yC*(^5#KkijF ÝDS`ۼcjMp<$Yu8gFDǒ;Ic.(o?:'`:~+md`2Jjw6Zߤ @N'Z7x j:zCP0ַM(# oizz=؅&MT)g: OM O&9T?cf$}{O  SAsZ/6R0K.){9i^Zu۽)WAt820~'13f瘛5cŠrAG=J+W.x@/:Cdg՝Muc.S7q6 G1mՙIajGTa\9JtqZczb7<lh̅|'tzR K K:zbۀZ*pBE)Z*tBG8`16S =q̽KZ$|D= wD8϶ cns)y$- )E&($ô{iBR「T/e0I}Bb.)#@( \I@6 63Ovsb;` ݜZ 8a8'4,§GkYpQ }%mh+ro惠6^< J<>3m]Tix ~D`dsPd3V=p*rͲHJW_dE_E|n0S_U|hd#_,]%e%E;֬A/aÜ염Z%y.a+X-9%[񌬙,OW#bSfT03tl:vBuRpm@#3%@~b} UUHV -C[-5mhy bnXǒcŘI.񿖛ҒhQѤAOAq rJ[ [g:%Ѹ1ꤚ(@$Tn(Ds 7&T9Pf3%TABLI 7$@h=G%p7=AQ U+SAs')cS"YVCrdc[>wkG9R0iqeFprO:-uaީCW=!XYQ@r$T]pi.x 9u*h! $:JQGNi(ZGff^U vd Ҿ~zLl܀L * %~  ;fVpx#Zwk= PQhZ,>Sp+S6_+g:fxPJ%L׺ wH^yVEߜi2FTf4C~IWT+x)55) knĬh[of4A|Mse&֡hs5kqQ#6ak3QAkbЄ`yIWmZ)9U 3Ka`g`S+j}swk:ChU.mSNY{ZHue[0nZ7$yrj%@kuެ[0nV=&lj%4Y59HJV[xdg.3⮧Qʒn$ R+^6yhPCSaʻl{"DS3@^ *RRtw`<+ӟq G < "O˚-=KULƖYݸV_Οo 1A~l/ӎI@Hp-k$ ڀJz\fawVՏ w'l"@lَ3mV#C7my.HF>lYH8Aek' {ɼ'!i A#tG JB+RGj#6`HiI,3PN4_ ,0r6|l(񽹲mTg?džo,6#0H1^͠\l/6/QQ}[Ҙsb*caWn#MHNPªl ZGUʪc"m:r`TmVo#HZS-hf#ib k*,gk#HFR֑2mLq܇>KsI~@ @ @ DY~j$OIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-2.png0000644000076600000240000000050414417536743020645 0ustar00aivarannamaastaffPNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿tIME \MLIDAT(ϭO90Mo2PPm,^U$ܲ!&T'5v91'IJ:%tEXtdate:create2017-11-09T04:26:24-05:00xG%tEXtdate:modify2017-11-09T04:26:24-05:00%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-22x22.png0000644000076600000240000000103614417536743021264 0ustar00aivarannamaastaffPNG  IHDRnbKGD̿ pHYs  tIME 5.~\IDAT(ϕ=kA3r7#FP0`΀_"E"`(Qbr{Oݽܞoy? uʊELz2eXH$ʔQ4Pwjl]C0N9KX$Q;zvFzhem#z8$DDH )ښl r8Gb{K`ϹKg2,F\Xǝ .H6! kmH ,j +Q򐔀}aaRe!0{,˰0} Ժz~?PNNɻ? =|9rj nH2yGFX^!) ?*W_.[M|7E0 ͼ3=X%zguc i~+kKIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-256x256.png0000644000076600000240000000735714417536743021462 0ustar00aivarannamaastaffPNG  IHDR{`gAMA a cHRMz&u0`:pQ<bKGD̿tIME \M IDATx_]EǿK[!Զ0& b "ARu'%(AM|4@"_[S&F16h`?»P] 53,:7??o؁&6y|B?(FAFn6Cs6[a|;df]F<:){/RMĥ86E.b;~Z)r-ފTMX+PR4#cfq3as?թ#Q\ʠޭ7,~يp--x ٟJ55?k)H8/M\Id]kx zڸfOxw r>"޽?IY]m w('I\UVDpM?C@1._[1oCK1Nh$#}/Ÿ0`.L"8t[E<ݘmyQHK#phh xO 5`mt꾾dOr i6_2U'U7 UFA|S|?`K,(f;zV)d6#IsG;CF$U^Wp-u:1%vGs$[>v? [, Tw\yaYEcUAR]׉CXU-hFqm[Uɱ [ jw\تYH||SJ{ ߱lt<2M|9BԗI46.x'8T`d `wch~P ھTC I/X[/O!Hz錍t~.m Dnlh/$ y;MKf $ !Ljht[8'l @U<#+{$>(ظN*03@nHb. ZN*o ~iV?E+H@|Db?@ a,o熏C&Y@}%,q9>&ĜdȲrb2`qͰʃAWȄz^N/B(,?2!6}bNrI>4#9 f:_'p-nB?a1JNBtdV܃pI)_c|o ~Iwf+# ԑn?X2(*:ȾZ)c]و'0:QlflM܆?︹d25,đN/ 1Z. ( Fy=}!N%* ,Up ;_9&",ݖǕhҨȖ@23RӑfU?-G <]eq,Y 9eMY.B*rOѾAJ)55WH脖J5BiYaI.D04MJ4fݚz;m՜<$>)7KRޅMIL\fMp\aW15;-\ ,[ΪezZH .-L@gJm-pRn 0 8nR`rUZ\,FSPTLe3t A@ި)ϕRh53E*I_E3˚j #]L9EU[w8N+ %ۡ]hm7Fa$>G˸fpZΌ!Khiճ ~wp<}@lE& |&]T u)r`:GvQY^->A3fD9r#krX5V|T͖D|x|vv3QqH@_kgcYYmEݜ6$MkIpV $$*[ Ê+z&&)5QH{k5~C#d2}Ms2oM457]Llq2/~ogFLx''ӡo2/wnNvL 5 'SlU{7<6@8lJujm(B꫼ |j )Ժ:uP8' !SmZW':eՑR4c{G:n\zDgdӰH}O4wF%kg0e ^jD4w-Vөrix8(U)Kw,usq9@#P>ww~ r Qʒrn544 q2(H9K44nʟM\QY4MM/IR{OĘ-jDϲ;CݢL븭Y.Ty^Gn%B%2ӏc~'"!u+ #S>=N@40b\+Ihj"ie~q1|Roi~]GA#3Df& )՚ 2(ɸdd6~Q}3g}LLr?GCQIwPUJ)u{W'Q&Mͤ`Psp\u/ns5|RgiYqCds^?!9k$6$_BHr)\ uf?!$c8W6L%dRz3ɏ{&`'@pnU` 7E!B!B!B!B!B!B!B!B!B!B!B!B!A4Y~O%tEXtdate:create2017-11-09T04:26:24-05:00xG%tEXtdate:modify2017-11-09T04:26:24-05:00%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-32x32.png0000644000076600000240000000116014417536743021264 0ustar00aivarannamaastaffPNG  IHDR sbKGD̿ pHYs  tIME 16 \ؽIDATH;kAg/1 !,DC *BDڊ` L#bc!h!hBBl e^Zb9gμ3{3k U<6e, c.$ŕYڧG.J`ܓB3\tsưѪX ?C ^_{Y5c& #x'퇼Fa-/|}ʦB 4VxU$ _cQ0)ҴN(M;1LIxN~5 0V 6CJK+6@uB\̜;rB !Sa *WBlu;)Vc_bNo1f]D2Ge&9郉UWHW*)tcd\Й=Pi%VsPŒ9XXc϶'AV6@ד9TX KQ'KURxVqc_2BlnRfmhw)v)6V'n2?@/濰W\gcIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-48x48.png0000644000076600000240000000162214417536743021305 0ustar00aivarannamaastaffPNG  IHDR00 1 bKGD̿ pHYs  tIME "6|*#IDATXkw?3of7$nҒڭ/$65 (xH< "|AD)-4BPH%P(%bj1m63;_YήH/wo} ; apy Iմ,]<3RHis_$pby0%7fyH]a! asw@]w໮0pĬܠ+(@ťQI1O!,b{X)C Nx:\&2ٿ`3IdN`)Kh94NひoF+8}oJ3&`qybcZs{6q6z-sCy.Zh:+ TW#*+z)jIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/icons/thonny-64x64.png0000644000076600000240000000164514417536743021306 0ustar00aivarannamaastaffPNG  IHDR@@`UbKGD̿ pHYs  tIME "AA6IDAThIhAN& ACxIP! x0FAE o^rxA=(j<\&f!HQb .A4.=T86m' O!@|أPlC {(Si!,f"f!{Ix!rTAGE;/i+bT;lS?;*vތܗq@7XXW:{91 "K7SBC7_xG/_1LSjYfSٔծT!bWӕI6h S;G\EgEcJ$"Vi&0L`[z(DYZ]s󰌃J hN $QsI{Kb d<d#IRP?{?i&3)"O rWN@)LE?UjL.K Kb-'D_ڞE $ nGtDUgNHMQnWO$IB|F[m B,~^$]t `\!6>) nrv1N"+I:,;II8BT&:JI~r',%[ VI~($ ,3FoB@KQ|t%jHLC5blWM@&aO2(%qsȯ @`5ם^8]X°ܨ^p!uqǓSLVxg5|J^w7 CʈSX8{֪]u7Ѱyc_CݰK_O2=IeIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.065438 thonny-4.1.7/packaging/linux/0000755000076600000240000000000014730055627016501 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734366811.0 thonny-4.1.7/packaging/linux/org.thonny.Thonny.appdata.xml0000644000076600000240000001041614730053133024207 0ustar00aivarannamaastaff org.thonny.Thonny.desktop MIT MIT Thonny Python IDE for beginners

Thonny is a simple Python IDE with features useful for learning programming. It comes with a debugger which is able to visualize all the conceptual steps taken to run a Python program (executing statements, evaluating expressions, maintaining the call stack). There is a GUI for installing 3rd party packages and special mode for learning about references.

See the homepage for more information, screenshots and a walk-through video.

Development Education Debugger IDE ComputerScience org.thonny.Thonny.desktop https://thonny.org https://github.com/thonny/thonny/issues https://github.com/thonny/thonny/wiki https://thonny.org/img/screenshot.png Thonny stepping through a recursive function thonny

Bug-fix release.

Bug-fix release.

Bug-fix release.

Bug-fix release.

Bug-fix release.

Bug-fix release.

Feature and bug-fix release.

Feature pre-release.

Bug-fix release.

Feature release.

This release fixes some minor bugs.

This is minor technical update over 3.3.12.

This is a bug-fix release.

This is a bug-fix release.

This is mainly a bug-fix release with one new feature -- the ability to install pip-compatible packages for MicroPython.

This is mainly a bug-fix release.

././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/packaging/linux/org.thonny.Thonny.desktop0000644000076600000240000000052314730022736023452 0ustar00aivarannamaastaff[Desktop Entry] Type=Application Name=Thonny GenericName=Python IDE Exec=/usr/bin/thonny %F Comment=Python IDE for beginners Icon=thonny StartupWMClass=Thonny Terminal=false Categories=Development;IDE Keywords=programming;education MimeType=text/x-python; Actions=Edit; [Desktop Action Edit] Exec=/usr/bin/thonny %F Name=Edit with Thonny ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/packaging/linux/thonny.10000644000076600000240000000172014417536743020107 0ustar00aivarannamaastaff.TH THONNY 1 .SH NAME thonny \- Python IDE for beginners .SH SYNOPSIS .B thonny [\fIFILE...\fR] .SH DESCRIPTION Thonny is a Python IDE for learning and teaching programming. .SH BASIC USAGE On the first run you see a code editor and the Python shell. .PP Enter some Python code (eg. .B print("Hello world") ) into the editor and save the file with Ctrl+S. .PP Now run the code by pressing F5. You should see the output of the program in the Python shell. .PP You can also enter Python code directly into the shell. .SH USING THE DEBUGGER You can see the steps Python takes to run your code. For this you need to press Ctrl+F5 to run the program in debug mode. In this mode you can advance the program either with big steps (F6) or small steps (F7). If you want to see how the steps affect program variables, then open global variables pane (View => Variables). .SH MORE INFORMATION You can find more information, screenshots and a walk-through video at https://thonny.org. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726304015.0 thonny-4.1.7/pyproject.toml0000644000076600000240000000046114671247417016337 0ustar00aivarannamaastaff[tool.black] line-length = 100 target_version = ['py38', 'py39', 'py310'] exclude = ".*api_stubs|vendored_libs" [tool.isort] profile = "black" src_paths = ["thonny"] line_length = 100 skip = ["api_stubs", "esp32_api_stubs", "esp_common_api_stubs", "base_api_stubs", "generic_api_stubs", "vendored_libs"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/requirements.txt0000644000076600000240000000026414730022736016677 0ustar00aivarannamaastaffjedi>=0.18.1 setuptools>=45.2 pyserial>=3.4 pylint>=2.4 docutils>=0.16 mypy>=0.761 asttokens>=2.0 Send2Trash>=1.5 # wheel is required by pipkin, which is currently vendored wheel ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.4033444 thonny-4.1.7/setup.cfg0000644000076600000240000000004614730055627015237 0ustar00aivarannamaastaff[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/setup.py0000644000076600000240000000663414730022736015134 0ustar00aivarannamaastaffimport os.path import sys from setuptools import find_packages, setup def recursive_files(directory): paths = [] for (path, _, filenames) in os.walk(directory): for filename in filenames: if not filename.endswith(".pyc") and filename != "registered.json": paths.append(os.path.join('..', path, filename)) return paths if sys.version_info < (3, 8): raise RuntimeError("Thonny requires Python 3.8 or later") setupdir = os.path.dirname(__file__) with open(os.path.join(setupdir, "thonny", "VERSION"), encoding="ASCII") as f: version = f.read().strip() requirements = [] for line in open(os.path.join(setupdir, "requirements.txt"), encoding="ASCII"): if line.strip() and not line.startswith("#"): requirements.append(line) setup( name="thonny", version=version, description="Python IDE for beginners", long_description="Thonny is a simple Python IDE with features useful for learning programming. See https://thonny.org for more info.", url="https://thonny.org", author="Aivar Annamaa and others", author_email="thonny@googlegroups.com", license="MIT", classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: End Users/Desktop", "License :: Freeware", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Education", "Topic :: Software Development", "Topic :: Software Development :: Debuggers", "Topic :: Text Editors", ], keywords="IDE education debugger", project_urls={ "Source code": "https://github.com/thonny/thonny", "Bug tracker": "https://github.com/thonny/thonny/issues", }, platforms=["Windows", "macOS", "Linux"], install_requires=requirements, python_requires=">=3.8", packages=find_packages(), package_data={ "": ["VERSION", "defaults.ini", "res/*", "dbus/*"] + recursive_files("thonny/locale") + recursive_files("thonny/vendored_libs"), "thonny.plugins.help": ["*.rst"], "thonny.plugins.pi": ["res/**"], "thonny.plugins.printing": ["*.html"], "thonny.plugins.micropython": ["*api_stubs/**"], "thonny.plugins.circuitpython": ["*api_stubs/**"], "thonny.plugins.microbit": ["*api_stubs/**"], "thonny.plugins.rp2040": ["*api_stubs/**"], "thonny.plugins.ev3": ["*api_stubs/**"], "thonny.plugins.prime_inventor": ["*api_stubs/**"], "thonny.plugins.esp": ["*api_stubs/**"], "thonny.plugins.mypy": ["typeshed_extras/*.pyi"], }, entry_points={"gui_scripts": ["thonny = thonny:launch"]}, ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0776608 thonny-4.1.7/thonny/0000755000076600000240000000000014730055627014735 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734366811.0 thonny-4.1.7/thonny/VERSION0000644000076600000240000000000514730053133015766 0ustar00aivarannamaastaff4.1.7././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/__init__.py0000644000076600000240000004141714730022736017050 0ustar00aivarannamaastaffimport logging import os.path import sys import time from logging import getLogger from typing import TYPE_CHECKING, List, Optional, cast from thonny.common import is_private_python, is_virtual_executable _last_module_count = 0 _last_modules = set() _last_time = time.time() logger = getLogger(__name__) def report_time(label: str) -> None: """ Method for finding unwarranted imports and delays. """ # return global _last_time, _last_module_count, _last_modules log_modules = True t = time.time() mod_count = len(sys.modules) mod_delta = mod_count - _last_module_count if mod_delta > 0: mod_info = f"(+{mod_count - _last_module_count} modules)" else: mod_info = "" logger.info("TIME/MODS %s %s %s", f"{t - _last_time:.3f}", label, mod_info) if log_modules and mod_delta > 0: current_modules = set(sys.modules.keys()) logger.info("NEW MODS %s", list(sorted(current_modules - _last_modules))) _last_modules = current_modules _last_time = t _last_module_count = mod_count report_time("After defining report_time") SINGLE_INSTANCE_DEFAULT = True BACKEND_LOG_MARKER = "Thonny's backend.log" def _get_known_folder(ID): # http://stackoverflow.com/a/3859336/261181 # http://www.installmate.com/support/im9/using/symbols/functions/csidls.htm import ctypes.wintypes SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(0, ID, 0, SHGFP_TYPE_CURRENT, buf) assert buf.value return buf.value def _get_roaming_appdata_dir(): return _get_known_folder(26) def _get_local_appdata_dir(): return _get_known_folder(28) def _compute_thonny_user_dir(): if os.environ.get("THONNY_USER_DIR", ""): return os.path.expanduser(os.environ["THONNY_USER_DIR"]) elif is_portable(): if sys.platform == "win32": root_dir = os.path.dirname(sys.executable) elif sys.platform == "darwin": root_dir = os.path.join( os.path.dirname(sys.executable), "..", "..", "..", "..", "..", ".." ) else: root_dir = os.path.join(os.path.dirname(sys.executable), "..") return os.path.normpath(os.path.abspath(os.path.join(root_dir, "user_data"))) elif is_virtual_executable(sys.executable) and not is_private_python(sys.executable): return os.path.join(sys.prefix, ".thonny") elif sys.platform == "win32": return os.path.join(_get_roaming_appdata_dir(), "Thonny") elif sys.platform == "darwin": return os.path.expanduser("~/Library/Thonny") else: # https://specifications.freedesktop.org/basedir-spec/latest/ar01s02.html data_home = os.environ.get( "XDG_CONFIG_HOME", os.path.expanduser(os.path.join("~", ".config")) ) return os.path.join(data_home, "Thonny") def _read_configured_debug_mode(): if not os.path.exists(CONFIGURATION_FILE): return False try: with open(CONFIGURATION_FILE, encoding="utf-8") as fp: for line in fp: if "debug_mode" in line and "True" in line: return True return False except Exception: import traceback traceback.print_exc() return False def is_portable(): # it can be explicitly declared as portable or shared ... portable_marker_path = os.path.join(os.path.dirname(sys.executable), "portable_thonny.ini") shared_marker_path = os.path.join(os.path.dirname(sys.executable), "shared_thonny.ini") if os.path.exists(portable_marker_path) and not os.path.exists(shared_marker_path): return True elif not os.path.exists(portable_marker_path) and os.path.exists(shared_marker_path): return False # ... or it becomes implicitly portable if it's on a removable drive abs_location = os.path.abspath(__file__) if sys.platform == "win32": drive = os.path.splitdrive(abs_location)[0] if drive.endswith(":"): from ctypes import windll return windll.kernel32.GetDriveTypeW(drive) == 2 # @UndefinedVariable else: return False elif sys.platform == "darwin": # not exact heuristics return abs_location.startswith("/Volumes/") else: # not exact heuristics return abs_location.startswith("/media/") or abs_location.startswith("/mnt/") _THONNY_VERSION = None def get_version(): global _THONNY_VERSION if _THONNY_VERSION: return _THONNY_VERSION try: package_dir = os.path.dirname(sys.modules["thonny"].__file__) with open(os.path.join(package_dir, "VERSION"), encoding="ASCII") as fp: _THONNY_VERSION = fp.read().strip() return _THONNY_VERSION except Exception: return "0.0.0" THONNY_USER_DIR = _compute_thonny_user_dir() CONFIGURATION_FILE = os.path.join(THONNY_USER_DIR, "configuration.ini") _CONFIGURED_DEBUG = _read_configured_debug_mode() _IPC_FILE = None def get_ipc_file_path(): global _IPC_FILE if _IPC_FILE: return _IPC_FILE if sys.platform == "win32": base_dir = _get_local_appdata_dir() else: base_dir = os.environ.get("XDG_RUNTIME_DIR") if not base_dir or not os.path.exists(base_dir): base_dir = os.environ.get("TMPDIR") if not base_dir or not os.path.exists(base_dir): base_dir = THONNY_USER_DIR for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): if name in os.environ: username = os.environ.get(name) break else: username = os.path.basename(os.path.expanduser("~")) ipc_dir = os.path.join(base_dir, "thonny-%s" % username) os.makedirs(ipc_dir, exist_ok=True) if not sys.platform == "win32": os.chmod(ipc_dir, 0o700) _IPC_FILE = os.path.join(ipc_dir, "ipc.sock") return _IPC_FILE def _check_welcome(): from thonny import misc_utils if not os.path.exists(CONFIGURATION_FILE) and not misc_utils.running_on_rpi(): from thonny.config import ConfigurationManager from thonny.first_run import FirstRunWindow mgr = ConfigurationManager(CONFIGURATION_FILE) win = FirstRunWindow(mgr) win.mainloop() if win.ok and sys.platform == "darwin": macos_app_path = _get_macos_app_path() if macos_app_path: # Shouldn't proceed to the main window in the same process, as TkAqua will crash on opening a menu # or saving a file (https://github.com/thonny/thonny/issues/2860). # Let's restart. print("Restarting", macos_app_path) os.system(f"open -n '{macos_app_path}'") sys.exit(0) return win.ok else: return True def _get_macos_app_path() -> Optional[str]: if sys.platform != "darwin": return None orig_argv = _get_orig_argv() if not orig_argv: return None if orig_argv[0].endswith("Thonny.app/Contents/MacOS/thonny"): return orig_argv[0][: -len("/Contents/MacOS/thonny")] return None def launch(): import runpy if sys.executable.endswith("thonny.exe"): # otherwise some library may try to run its subprocess with thonny.exe # NB! Must be pythonw.exe not python.exe, otherwise Runner thinks console # is already allocated. sys.executable = sys.executable[: -len("thonny.exe")] + "pythonw.exe" set_dpi_aware() try: runpy.run_module("thonny.customize", run_name="__main__") except ImportError: pass prepare_thonny_user_dir() _configure_frontend_logging() if not _check_welcome(): return 0 if _should_delegate(): try: _delegate_to_existing_instance(sys.argv[1:]) print("Delegated to an existing Thonny instance. Exiting now.") return 0 except Exception: import traceback traceback.print_exc() # Did not or could not delegate try: from thonny import workbench bench = workbench.Workbench() bench.mainloop() return 0 except Exception: import tkinter as tk import traceback from logging import exception exception("Internal launch or mainloop error") from thonny import ui_utils dlg = ui_utils.LongTextDialog("Internal error", traceback.format_exc()) ui_utils.show_dialog(dlg, tk._default_root) return -1 finally: runner = get_runner() if runner is not None: runner.destroy_backend() return 0 def prepare_thonny_user_dir(): if not os.path.exists(THONNY_USER_DIR): os.makedirs(THONNY_USER_DIR, mode=0o700, exist_ok=True) # user_dir_template is a post-installation means for providing # alternative default user environment in multi-user setups template_dir = os.path.join(os.path.dirname(__file__), "user_dir_template") if os.path.isdir(template_dir): import shutil def copy_contents(src_dir, dest_dir): # I want the copy to have current user permissions for name in os.listdir(src_dir): src_item = os.path.join(src_dir, name) dest_item = os.path.join(dest_dir, name) if os.path.isdir(src_item): os.makedirs(dest_item, mode=0o700) copy_contents(src_item, dest_item) else: shutil.copyfile(src_item, dest_item) os.chmod(dest_item, 0o600) copy_contents(template_dir, THONNY_USER_DIR) def _should_delegate(): if not os.path.exists(get_ipc_file_path()): # no previous instance return False from thonny.config import try_load_configuration configuration_manager = try_load_configuration(CONFIGURATION_FILE) configuration_manager.set_default("general.single_instance", SINGLE_INSTANCE_DEFAULT) return configuration_manager.get_option("general.single_instance") def _delegate_to_existing_instance(args): import socket from thonny import workbench transformed_args = [] for arg in args: if not arg.startswith("-"): arg = os.path.abspath(arg) transformed_args.append(arg) try: sock, secret = _create_client_socket() except Exception: # Maybe the lock is abandoned or the content is corrupted try: os.remove(get_ipc_file_path()) except Exception: import traceback traceback.print_exc() raise data = repr((secret, transformed_args)).encode(encoding="utf_8") sock.settimeout(2.0) sock.sendall(data) sock.shutdown(socket.SHUT_WR) response = bytes([]) while len(response) < len(workbench.SERVER_SUCCESS): new_data = sock.recv(2) if len(new_data) == 0: break else: response += new_data if response.decode("UTF-8") != workbench.SERVER_SUCCESS: raise RuntimeError("Unsuccessful delegation") def _create_client_socket(): import socket timeout = 2.0 if sys.platform == "win32": with open(get_ipc_file_path(), "r") as fp: port = int(fp.readline().strip()) secret = fp.readline().strip() # "localhost" can be much slower than "127.0.0.1" client_socket = socket.create_connection(("127.0.0.1", port), timeout=timeout) else: client_socket = socket.socket(socket.AF_UNIX) # @UndefinedVariable client_socket.settimeout(timeout) client_socket.connect(get_ipc_file_path()) secret = "" return client_socket, secret def _configure_frontend_logging() -> None: _configure_logging(get_frontend_log_file(), _choose_logging_level()) def configure_backend_logging() -> None: _configure_logging(get_backend_log_file(), None) def get_backend_log_file(): return os.path.join(THONNY_USER_DIR, "backend.log") def get_frontend_log_file(): return os.path.join(THONNY_USER_DIR, "frontend.log") def _get_orig_argv() -> Optional[List[str]]: try: from sys import orig_argv # since 3.10 return sys.orig_argv except ImportError: # https://stackoverflow.com/a/57914236/261181 import ctypes argc = ctypes.c_int() argv = ctypes.POINTER(ctypes.c_wchar_p if sys.version_info >= (3,) else ctypes.c_char_p)() try: ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(argc), ctypes.byref(argv)) except AttributeError: # See https://github.com/thonny/thonny/issues/2206 # and https://bugs.python.org/issue40910 # This symbol is not available in thonny.exe built agains Python 3.8 return None # Ctypes are weird. They can't be used in list comprehensions, you can't use `in` with them, and you can't # use a for-each loop on them. We have to do an old-school for-i loop. arguments = list() for i in range(argc.value): arguments.append(argv[i]) return arguments def _configure_logging(log_file, console_level=None): logFormatter = logging.Formatter( "%(asctime)s.%(msecs)03d [%(threadName)s] %(levelname)-7s %(name)s: %(message)s", "%H:%M:%S" ) file_handler = logging.FileHandler(log_file, encoding="UTF-8", mode="w") file_handler.setFormatter(logFormatter) main_logger = logging.getLogger("thonny") contrib_logger = logging.getLogger("thonnycontrib") pipkin_logger = logging.getLogger("pipkin") # NB! Don't mess with the main root logger, because (CPython) backend runs user code for logger in [main_logger, contrib_logger, pipkin_logger]: logger.setLevel(_choose_logging_level()) logger.propagate = False # otherwise it will be also reported by IDE-s root logger logger.addHandler(file_handler) if console_level is not None: console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(logFormatter) console_handler.setLevel(console_level) for logger in [main_logger, contrib_logger]: logger.addHandler(console_handler) # Log most important info as soon as possible main_logger.info("Thonny version: %s", get_version()) main_logger.info("cwd: %s", os.getcwd()) main_logger.info("original argv: %s", _get_orig_argv()) main_logger.info("sys.executable: %s", sys.executable) main_logger.info("sys.argv: %s", sys.argv) main_logger.info("sys.path: %s", sys.path) main_logger.info("sys.flags: %s", sys.flags) import faulthandler fault_out = open(os.path.join(THONNY_USER_DIR, "frontend_faults.log"), mode="w") faulthandler.enable(fault_out) def get_user_base_directory_for_plugins() -> str: return os.path.join(THONNY_USER_DIR, "plugins") def get_sys_path_directory_containg_plugins() -> str: from thonny.misc_utils import get_user_site_packages_dir_for_base return get_user_site_packages_dir_for_base(get_user_base_directory_for_plugins()) def set_dpi_aware(): # https://stackoverflow.com/questions/36134072/setprocessdpiaware-seems-not-to-work-under-windows-10 # https://bugs.python.org/issue33656 # https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx # https://github.com/python/cpython/blob/master/Lib/idlelib/pyshell.py if sys.platform == "win32": try: import ctypes PROCESS_SYSTEM_DPI_AWARE = 1 ctypes.OleDLL("shcore").SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) except (ImportError, AttributeError, OSError): pass if TYPE_CHECKING: # Following imports are required for MyPy # http://mypy.readthedocs.io/en/stable/common_issues.html#import-cycles import thonny.workbench from thonny.running import Runner from thonny.shell import ShellView from thonny.workbench import Workbench _workbench = None # type: Optional[Workbench] def get_workbench() -> "Workbench": return cast("Workbench", _workbench) _runner = None # type: Optional[Runner] def set_logging_level(level=None): if level is None: level = _choose_logging_level() logging.getLogger("thonny").setLevel(level) def _choose_logging_level(): if in_debug_mode(): return logging.DEBUG else: return logging.INFO def in_debug_mode() -> bool: # Value may be something other than string when it is set in Python code return ( os.environ.get("THONNY_DEBUG", False) in [ "1", 1, "True", True, "true", ] or _CONFIGURED_DEBUG ) def get_runner() -> "Runner": return cast("Runner", _runner) def get_shell() -> "ShellView": return cast("ShellView", get_workbench().get_view("ShellView")) report_time("After loading thonny module") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/__main__.py0000644000076600000240000000011614730022736017020 0ustar00aivarannamaastafffrom thonny import launch, report_time report_time("Before launch") launch() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/assistance.py0000644000076600000240000010417714730022736017451 0ustar00aivarannamaastaffimport ast import datetime import os.path import subprocess import sys import textwrap import tkinter as tk from collections import namedtuple from logging import getLogger from tkinter import messagebox, ttk from typing import Dict # pylint disable=unused-import from typing import List # pylint disable=unused-import from typing import Optional # pylint disable=unused-import from typing import Tuple # pylint disable=unused-import from typing import Type # pylint disable=unused-import from typing import Union # pylint disable=unused-import from typing import Iterable import thonny from thonny import get_runner, get_workbench, rst_utils, tktextext, ui_utils from thonny.common import ( REPL_PSEUDO_FILENAME, STRING_PSEUDO_FILENAME, ToplevelResponse, read_source, ) from thonny.languages import tr from thonny.misc_utils import levenshtein_damerau_distance, running_on_mac_os from thonny.ui_utils import CommonDialog, get_hyperlink_cursor, scrollbar_style logger = getLogger(__name__) Suggestion = namedtuple("Suggestion", ["symbol", "title", "body", "relevance"]) _program_analyzer_classes = [] # type: List[Type[ProgramAnalyzer]] _last_feedback_timestamps = {} # type: Dict[str, str] _error_helper_classes = {} # type: Dict[str, List[Type[ErrorHelper]]] class AssistantView(tktextext.TextFrame): def __init__(self, master): tktextext.TextFrame.__init__( self, master, text_class=AssistantRstText, vertical_scrollbar_style=scrollbar_style("Vertical"), horizontal_scrollbar_style=scrollbar_style("Horizontal"), horizontal_scrollbar_class=ui_utils.AutoScrollbar, read_only=True, wrap="word", font="TkDefaultFont", # cursor="arrow", padx=10, pady=0, insertwidth=0, ) self._analyzer_instances = [] self._snapshots_per_main_file = {} self._current_snapshot = None self._accepted_warning_sets = [] self.text.tag_configure( "section_title", spacing3=5, font="BoldTkDefaultFont", # foreground=get_syntax_options_for_tag("stderr")["foreground"] ) self.text.tag_configure( "intro", # font="ItalicTkDefaultFont", spacing3=10, ) self.text.tag_configure("relevant_suggestion_title", font="BoldTkDefaultFont") self.text.tag_configure("suggestion_title", lmargin2=16, spacing1=5, spacing3=5) self.text.tag_configure("suggestion_body", lmargin1=16, lmargin2=16) self.text.tag_configure("body", font="ItalicTkDefaultFont") main_font = tk.font.nametofont("TkDefaultFont") # Underline on font looks better than underline on tag italic_underline_font = main_font.copy() italic_underline_font.configure(slant="italic", size=main_font.cget("size"), underline=True) self.text.tag_configure("feedback_link", justify="right", font=italic_underline_font) self.text.tag_bind("feedback_link", "", self._ask_feedback, True) self.text.tag_configure("python_errors_link", justify="right", font=italic_underline_font) self.text.tag_bind( "python_errors_link", "", lambda e: get_workbench().open_url("errors.rst"), True, ) get_workbench().bind("ToplevelResponse", self.handle_toplevel_response, True) add_error_helper("*", GenericErrorHelper) def handle_toplevel_response(self, msg: ToplevelResponse) -> None: # Can be called by event system or by Workbench # (if Assistant wasn't created yet but an error came) if not msg.get("user_exception") and msg.get("command_name") in [ "execute_system_command", "execute_source", ]: # Shell commands may be used to investigate the problem, don't clear assistance return self._clear() from thonny.plugins.cpython_frontend import LocalCPythonProxy if not isinstance(get_runner().get_backend_proxy(), LocalCPythonProxy): # TODO: add some support for MicroPython as well return # prepare for snapshot # TODO: should distinguish between and ? key = msg.get("filename", STRING_PSEUDO_FILENAME) self._current_snapshot = { "timestamp": datetime.datetime.now().isoformat()[:19], "main_file_path": key, } self._snapshots_per_main_file.setdefault(key, []) self._snapshots_per_main_file[key].append(self._current_snapshot) if msg.get("user_exception"): if not msg["user_exception"].get("message", None): msg["user_exception"]["message"] = "" self._exception_info = msg["user_exception"] self._explain_exception(msg["user_exception"]) if get_workbench().get_option("assistance.open_assistant_on_errors"): get_workbench().show_view("AssistantView", set_focus=False) else: self._exception_info = None if msg.get("filename") and os.path.exists(msg["filename"]): self.main_file_path = msg["filename"] source = read_source(msg["filename"]) self._start_program_analyses( msg["filename"], source, _get_imported_user_files(msg["filename"], source) ) else: self.main_file_path = None self._present_conclusion() def _explain_exception(self, error_info): rst = ( self._get_rst_prelude() + rst_utils.create_title( error_info["type_name"] + ": " + rst_utils.escape(error_info["message"]) ) + "\n" ) if ( error_info.get("lineno") is not None and error_info.get("filename") and os.path.exists(error_info["filename"]) ): rst += "`%s, line %d <%s>`__\n\n" % ( os.path.basename(error_info["filename"]), error_info["lineno"], self._format_file_url(error_info), ) helpers = [] for helper_class in ( _error_helper_classes.get(error_info["type_name"], []) + _error_helper_classes["*"] ): try: helpers.append(helper_class(error_info)) except HelperNotSupportedError: pass except Exception as e: logger.exception("Could not create helper %s", helper_class, exc_info=e) best_intro = helpers[0] for helper in helpers: if helper.intro_confidence > best_intro.intro_confidence: best_intro = helper # intro if best_intro.intro_text: rst += ( ".. note::\n" + " " + best_intro.intro_text.strip().replace("\n", "\n\n ") + "\n\n" ) suggestions = [ suggestion for helper in helpers for suggestion in helper.suggestions if suggestion is not None ] suggestions = sorted(suggestions, key=lambda s: s.relevance, reverse=True) if suggestions[0].relevance > 1 or best_intro.intro_confidence > 1: relevance_threshold = 2 else: # use relevance 1 only when there is nothing better relevance_threshold = 1 suggestions = [s for s in suggestions if s.relevance >= relevance_threshold] for i, suggestion in enumerate(suggestions): rst += self._format_suggestion( suggestion, i == len(suggestions) - 1, # TODO: is it good if first is preopened? # It looks cleaner if it is not. False, # i==0 ) self._current_snapshot["exception_suggestions"] = [ dict(sug._asdict()) for sug in suggestions ] self.text.append_rst(rst) self._append_text("\n") self._current_snapshot["exception_type_name"] = error_info["type_name"] self._current_snapshot["exception_message"] = error_info["message"] self._current_snapshot["exception_file_path"] = error_info["filename"] self._current_snapshot["exception_lineno"] = error_info["lineno"] self._current_snapshot["exception_rst"] = rst # for debugging purposes def _format_suggestion(self, suggestion, last, initially_open): return ( # assuming that title is already in rst format ".. topic:: " + suggestion.title + "\n" + " :class: toggle%s%s\n" % (", open" if initially_open else "", ", tight" if not last else "") + " \n" + textwrap.indent(suggestion.body, " ") + "\n\n" ) def _append_text(self, chars, tags=()): self.text.direct_insert("end", chars, tags=tags) def _clear(self): self._accepted_warning_sets.clear() for wp in self._analyzer_instances: wp.cancel_analysis() self._analyzer_instances = [] self.text.clear() def _start_program_analyses(self, main_file_path, main_file_source, imported_file_paths): for cls in _program_analyzer_classes: analyzer = cls(self._accept_warnings) if analyzer.is_enabled(): self._analyzer_instances.append(analyzer) if not self._analyzer_instances: return self._append_text("\nAnalyzing your code ...", ("em",)) # save snapshot of current source self._current_snapshot["main_file_path"] = main_file_path self._current_snapshot["main_file_source"] = main_file_source self._current_snapshot["imported_files"] = { name: read_source(name) for name in imported_file_paths } # start the analysis for analyzer in self._analyzer_instances: analyzer.start_analysis(main_file_path, imported_file_paths) def _accept_warnings(self, analyzer, warnings): if analyzer.cancelled: return self._accepted_warning_sets.append(warnings) if len(self._accepted_warning_sets) == len(self._analyzer_instances): self._present_warnings() self._present_conclusion() def _present_conclusion(self): if not self.text.get("1.0", "end").strip(): if self.main_file_path is not None and os.path.exists(self.main_file_path): self._append_text("\n") self.text.append_rst( "The code in `%s <%s>`__ looks good.\n\n" % ( os.path.basename(self.main_file_path), self._format_file_url({"filename": self.main_file_path}), ) ) self.text.append_rst( "If it is not working as it should, " + "then consider using some general " + "`debugging techniques `__.\n\n", ("em",), ) if self.text.get("1.0", "end").strip(): self._append_feedback_link() if self._exception_info: self._append_text( "General advice on dealing with errors.\n", ("a", "python_errors_link") ) def _present_warnings(self): warnings = [w for ws in self._accepted_warning_sets for w in ws] self.text.direct_delete("end-2l linestart", "end-1c lineend") if not warnings: return if self._exception_info is None: intro = "May be ignored if you are happy with your program." else: intro = "May help you find the cause of the error." rst = ( self._get_rst_prelude() + rst_utils.create_title("Warnings") + ":remark:`%s`\n\n" % intro ) by_file = {} for warning in warnings: if warning["filename"] not in by_file: by_file[warning["filename"]] = [] if warning not in by_file[warning["filename"]]: # Pylint may give double warnings (eg. when module imports itself) by_file[warning["filename"]].append(warning) for filename in by_file: rst += "`%s <%s>`__\n\n" % ( os.path.basename(filename), self._format_file_url(dict(filename=filename)), ) file_warnings = sorted( by_file[filename], key=lambda x: (x.get("lineno", 0), -x.get("relevance", 1)) ) for i, warning in enumerate(file_warnings): rst += self._format_warning(warning, i == len(file_warnings) - 1) + "\n" rst += "\n" self.text.append_rst(rst) # save snapshot self._current_snapshot["warnings_rst"] = rst self._current_snapshot["warnings"] = warnings if get_workbench().get_option("assistance.open_assistant_on_warnings"): get_workbench().show_view("AssistantView") def _format_warning(self, warning, last): title = rst_utils.escape(warning["msg"].splitlines()[0]) if warning.get("lineno") is not None: url = self._format_file_url(warning) if warning.get("lineno"): title = "`Line %d <%s>`__ : %s" % (warning["lineno"], url, title) if warning.get("explanation_rst"): explanation_rst = warning["explanation_rst"] elif warning.get("explanation"): explanation_rst = rst_utils.escape(warning["explanation"]) else: explanation_rst = "" if warning.get("more_info_url"): explanation_rst += "\n\n`More info online <%s>`__" % warning["more_info_url"] explanation_rst = explanation_rst.strip() topic_class = "toggle" if explanation_rst else "empty" if not explanation_rst: explanation_rst = "n/a" return ( ".. topic:: %s\n" % title + " :class: " + topic_class + ("" if last else ", tight") + "\n" + " \n" + textwrap.indent(explanation_rst, " ") + "\n\n" ) def _append_feedback_link(self): self._append_text("Was it helpful or confusing?\n", ("a", "feedback_link")) def _format_file_url(self, atts): return format_file_url(atts["filename"], atts.get("lineno"), atts.get("col_offset")) def _ask_feedback(self, event=None): all_snapshots = self._snapshots_per_main_file[self._current_snapshot["main_file_path"]] # TODO: select only snapshots which are not sent yet snapshots = all_snapshots ui_utils.show_dialog(FeedbackDialog(get_workbench(), self.main_file_path, snapshots)) def _get_rst_prelude(self): return ".. default-role:: code\n\n" + ".. role:: light\n\n" + ".. role:: remark\n\n" class AssistantRstText(rst_utils.RstText): def configure_tags(self): super().configure_tags() main_font = tk.font.nametofont("TkDefaultFont") italic_font = main_font.copy() italic_font.configure(slant="italic", size=main_font.cget("size")) h1_font = main_font.copy() h1_font.configure(weight="bold", size=main_font.cget("size")) self.tag_configure("h1", font=h1_font, spacing3=0, spacing1=10) self.tag_configure("topic_title", font="TkDefaultFont") self.tag_configure("topic_body", font=italic_font, spacing1=10, lmargin1=25, lmargin2=25) self.tag_raise("sel") class Helper: def get_intro(self) -> Tuple[str, int]: raise NotImplementedError() def get_suggestions(self) -> Iterable[Suggestion]: raise NotImplementedError() class ErrorHelper(Helper): def __init__(self, error_info): # TODO: don't repeat all this for all error helpers self.error_info = error_info self.last_frame = error_info["stack"][-1] self.last_frame_ast = None if self.last_frame.source: try: self.last_frame_ast = ast.parse(self.last_frame.source, self.last_frame.filename) except SyntaxError: pass self.last_frame_module_source = None self.last_frame_module_ast = None if self.last_frame.code_name == "": self.last_frame_module_source = self.last_frame.source self.last_frame_module_ast = self.last_frame_ast elif self.last_frame.filename is not None: try: self.last_frame_module_source = read_source(self.last_frame.filename) self.last_frame_module_ast = ast.parse(self.last_frame_module_source) except Exception: pass self.intro_confidence = 1 self.intro_text = "" self.suggestions = [] class GenericErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) self.intro_text = "No specific suggestions for this error (yet)." self.intro_confidence = 1 self.suggestions = [ Suggestion( "ask-for-specific-support", "Let Thonny developers know", "Click on the feedback link at the bottom of this panel to let Thonny developers know " + "about your problem. They may add support for " + "such cases in future Thonny versions.", 1, ) ] if error_info["message"].lower() != "invalid syntax": self.suggestions.append( Suggestion( "generic-search-the-web", "Search the web", "Try performing a web search for\n\n``Python %s: %s``" % ( self.error_info["type_name"], rst_utils.escape(self.error_info["message"].replace("\n", " ").strip()), ), 1, ) ) class ProgramAnalyzer: def __init__(self, on_completion): self.completion_handler = on_completion self.cancelled = False def is_enabled(self): return True def start_analysis(self, main_file_path, imported_file_paths): raise NotImplementedError() def cancel_analysis(self): pass class SubprocessProgramAnalyzer(ProgramAnalyzer): def __init__(self, on_completion): super().__init__(on_completion) self._proc = None def cancel_analysis(self): self.cancelled = True if self._proc is not None: self._proc.kill() class LibraryErrorHelper(ErrorHelper): """Explains exceptions, which doesn't happen in user code""" def get_intro(self): return "This error happened in library code. This may mean a bug in " def get_suggestions(self): return [] class FeedbackDialog(CommonDialog): def __init__(self, master, main_file_path, all_snapshots): super().__init__(master=master) main_frame = ttk.Frame(self) main_frame.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.main_file_path = main_file_path self.snapshots = self._select_unsent_snapshots(all_snapshots) self.title("Send feedback for Assistant") padx = 15 intro_label = ttk.Label( main_frame, text="Below are the messages Assistant gave you in response to " + ( "using the shell" if self._happened_in_shell() else "testing '" + os.path.basename(main_file_path) + "'" ) + " since " + self._get_since_str() + ".\n\n" + "In order to improve this feature, Thonny developers would love to know how " + "useful or confusing these messages were. We will only collect version " + "information and the data you enter or approve on this form.", wraplength=550, ) intro_label.grid(row=1, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 15)) tree_label = ttk.Label( main_frame, text="Which messages were helpful (H) or confusing (C)? Click on [ ] to mark!", ) tree_label.grid(row=2, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 0)) tree_frame = ui_utils.TreeFrame( main_frame, columns=["helpful", "confusing", "title", "group", "symbol"], displaycolumns=["helpful", "confusing", "title"], height=10, borderwidth=1, relief="groove", ) tree_frame.grid(row=3, column=0, columnspan=3, sticky="nsew", padx=padx) self.tree = tree_frame.tree self.tree.column("helpful", width=35, anchor=tk.CENTER, stretch=False) self.tree.column("confusing", width=35, anchor=tk.CENTER, stretch=False) self.tree.column("title", width=350, anchor=tk.W, stretch=True) self.tree.heading("helpful", text="H", anchor=tk.CENTER) self.tree.heading("confusing", text="C", anchor=tk.CENTER) self.tree.heading("title", text="Group / Message", anchor=tk.W) self.tree["show"] = ("headings",) self.tree.bind("<1>", self._on_tree_click, True) main_font = tk.font.nametofont("TkDefaultFont") bold_font = main_font.copy() bold_font.configure(weight="bold", size=main_font.cget("size")) self.tree.tag_configure("group", font=bold_font) self.include_thonny_id_var = tk.IntVar(value=1) include_thonny_id_check = ttk.Checkbutton( main_frame, variable=self.include_thonny_id_var, onvalue=1, offvalue=0, text="Include Thonny's installation time (allows us to group your submissions)", ) include_thonny_id_check.grid( row=4, column=0, columnspan=3, sticky="nw", padx=padx, pady=(5, 0) ) self.include_snapshots_var = tk.IntVar(value=1) include_snapshots_check = ttk.Checkbutton( main_frame, variable=self.include_snapshots_var, onvalue=1, offvalue=0, text="Include snapshots of the code and Assistant responses at each run", ) include_snapshots_check.grid( row=5, column=0, columnspan=3, sticky="nw", padx=padx, pady=(0, 0) ) comments_label = ttk.Label(main_frame, text="Any comments? Enhancement ideas?") comments_label.grid(row=6, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 0)) self.comments_text_frame = tktextext.TextFrame( main_frame, vertical_scrollbar_style=scrollbar_style("Vertical"), horizontal_scrollbar_style=scrollbar_style("Horizontal"), horizontal_scrollbar_class=ui_utils.AutoScrollbar, wrap="word", font="TkDefaultFont", # cursor="arrow", padx=5, pady=5, height=4, borderwidth=1, relief="groove", ) self.comments_text_frame.grid(row=7, column=0, columnspan=3, sticky="nsew", padx=padx) url_font = tk.font.nametofont("TkDefaultFont").copy() url_font.configure(underline=1, size=url_font.cget("size")) preview_link = ttk.Label( main_frame, text="(Preview the data to be sent)", style="Url.TLabel", cursor=get_hyperlink_cursor(), font=url_font, ) preview_link.bind("<1>", self._preview_submission_data, True) preview_link.grid(row=8, column=0, sticky="nw", padx=15, pady=15) submit_button = ttk.Button(main_frame, text="Submit", width=10, command=self._submit_data) submit_button.grid(row=8, column=0, sticky="ne", padx=0, pady=15) cancel_button = ttk.Button(main_frame, text="Cancel", width=7, command=self._close) cancel_button.grid(row=8, column=1, sticky="ne", padx=(10, 15), pady=15) self.protocol("WM_DELETE_WINDOW", self._close) self.bind("", self._close, True) main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(3, weight=3) main_frame.rowconfigure(6, weight=2) self._empty_box = "[ ]" self._checked_box = "[X]" self._populate_tree() def _happened_in_shell(self): return self.main_file_path is None or self.main_file_path == REPL_PSEUDO_FILENAME def _populate_tree(self): groups = {} for snap in self.snapshots: if snap.get("exception_message") and snap.get("exception_suggestions"): group = snap["exception_type_name"] groups.setdefault(group, set()) for sug in snap["exception_suggestions"]: groups[group].add((sug["symbol"], sug["title"])) # warnings group if snap.get("warnings"): group = "Warnings" groups.setdefault(group, set()) for w in snap["warnings"]: groups[group].add((w["symbol"], w["msg"])) for group in sorted(groups.keys(), key=lambda x: x.replace("Warnings", "z")): group_id = self.tree.insert("", "end", open=True, tags=("group",)) self.tree.set(group_id, "title", group) for symbol, title in sorted(groups[group], key=lambda m: m[1]): item_id = self.tree.insert("", "end") self.tree.set(item_id, "helpful", self._empty_box) self.tree.set(item_id, "confusing", self._empty_box) self.tree.set(item_id, "title", title) self.tree.set(item_id, "symbol", symbol) self.tree.set(item_id, "group", group) self.tree.see("") def _on_tree_click(self, event): item_id = self.tree.identify("item", event.x, event.y) column = self.tree.identify_column(event.x) if not item_id or not column: return value_index = int(column[1:]) - 1 values = list(self.tree.item(item_id, "values")) if values[value_index] == self._empty_box: values[value_index] = self._checked_box elif values[value_index] == self._checked_box: values[value_index] = self._empty_box else: return # update values self.tree.item(item_id, values=tuple(values)) def _preview_submission_data(self, event=None): import tempfile temp_path = os.path.join( tempfile.mkdtemp(dir=get_workbench().get_temp_dir()), "ThonnyAssistantFeedback_" + datetime.datetime.now().isoformat().replace(":", ".")[:19] + ".txt", ) data = self._collect_submission_data() with open(temp_path, "w", encoding="ascii") as fp: fp.write(data) if running_on_mac_os(): subprocess.Popen(["open", "-e", temp_path]) else: import webbrowser webbrowser.open(temp_path) def _collect_submission_data(self): import json tree_data = [] for iid in self.tree.get_children(): values = self.tree.item(iid, "values") tree_data.append( { "helpful": values[0] == self._checked_box, "confusing": values[1] == self._checked_box, "message": values[2], "group": values[3], "symbol": values[4], } ) submission = { "feedback_format_version": 1, "thonny_version": thonny.get_version(), "python_version": ".".join(map(str, sys.version_info[:3])), "message_feedback": tree_data, "comments": self.comments_text_frame.text.get("1.0", "end"), } try: import mypy.version submission["mypy_version"] = str(mypy.version.__version__) except ImportError: logger.exception("Could not get MyPy version") try: import pylint submission["pylint_version"] = str(pylint.__version__) except ImportError: logger.exception("Could not get Pylint version") if self.include_snapshots_var.get(): submission["snapshots"] = self.snapshots if self.include_thonny_id_var.get(): submission["thonny_timestamp"] = get_workbench().get_option( "general.configuration_creation_timestamp" ) return json.dumps(submission, indent=2) def _submit_data(self): import gzip import urllib.request json_data = self._collect_submission_data() compressed_data = gzip.compress(json_data.encode("ascii")) def do_work(): try: handle = urllib.request.urlopen( "https://thonny.org/store_assistant_feedback.php", data=compressed_data, timeout=10, ) return handle.read() except Exception as e: return str(e) result = ui_utils.run_with_waiting_dialog(self, do_work, description="Uploading") if result == b"OK": if self.snapshots: last_timestamp = self.snapshots[-1]["timestamp"] _last_feedback_timestamps[self.main_file_path] = last_timestamp messagebox.showinfo( "Done!", "Thank you for the feedback!\n\nLet us know again when Assistant\nhelps or confuses you!", master=self.master, ) self._close() else: messagebox.showerror( "Problem", "Something went wrong:\n%s\n\nIf you don't mind, then try again later!" % result[:1000], master=self, ) def _select_unsent_snapshots(self, all_snapshots): if self.main_file_path not in _last_feedback_timestamps: return all_snapshots else: return [ s for s in all_snapshots if s["timestamp"] > _last_feedback_timestamps[self.main_file_path] ] def _close(self, event=None): self.destroy() def _get_since_str(self): if not self.snapshots: assert self.main_file_path in _last_feedback_timestamps since = datetime.datetime.strptime( _last_feedback_timestamps[self.main_file_path], "%Y-%m-%dT%H:%M:%S" ) else: since = datetime.datetime.strptime(self.snapshots[0]["timestamp"], "%Y-%m-%dT%H:%M:%S") if since.date() == datetime.date.today() or ( datetime.datetime.now() - since ) <= datetime.timedelta(hours=5): since_str = since.strftime("%X") else: # date and time without yer since_str = since.strftime("%c").replace(str(datetime.date.today().year), "") # remove seconds if since_str.count(":") == 2: i = since_str.rfind(":") if ( i > 0 and len(since_str[i + 1 : i + 3]) == 2 and since_str[i + 1 : i + 3].isnumeric() ): since_str = since_str[:i] + since_str[i + 3 :] return since_str.strip() def name_similarity(a, b): # TODO: tweak the result values a = a.replace("_", "") b = b.replace("_", "") minlen = min(len(a), len(b)) if a.replace("0", "O").replace("1", "l") == b.replace("0", "O").replace("1", "l"): if minlen >= 4: return 7 else: return 6 a = a.lower() b = b.lower() if a == b: if minlen >= 4: return 7 else: return 6 if minlen <= 2: return 0 # if names differ at final isolated digits, # then they are probably different vars, even if their # distance is small (eg. location_1 and location_2) if a[-1].isdigit() and not a[-2].isdigit() and b[-1].isdigit() and not b[-2].isdigit(): return 0 # same thing with _ + single char suffixes # (eg. location_a and location_b) if a[-2] == "_" and b[-2] == "_": return 0 distance = levenshtein_damerau_distance(a, b, 5) if minlen <= 5: return max(8 - distance * 2, 0) elif minlen <= 10: return max(9 - distance * 2, 0) else: return max(10 - distance * 2, 0) def _get_imported_user_files(main_file, source=None): assert os.path.isabs(main_file) if source is None: source = read_source(main_file) try: root = ast.parse(source, main_file) except SyntaxError: return set() main_dir = os.path.dirname(main_file) module_names = set() # TODO: at the moment only considers non-package modules for node in ast.walk(root): if isinstance(node, ast.Import): for item in node.names: module_names.add(item.name) elif isinstance(node, ast.ImportFrom): module_names.add(node.module) imported_files = set() for file in { name + ext for ext in [".py", ".pyw"] for name in module_names if name is not None }: possible_path = os.path.join(main_dir, file) if os.path.exists(possible_path): imported_files.add(possible_path) return imported_files # TODO: add recursion def add_program_analyzer(cls): _program_analyzer_classes.append(cls) def add_error_helper(error_type_name, helper_class): _error_helper_classes.setdefault(error_type_name, []) _error_helper_classes[error_type_name].append(helper_class) def format_file_url(filename, lineno, col_offset): s = "thonny-editor://" + rst_utils.escape(filename).replace(" ", "%20") if lineno is not None: s += "#" + str(lineno) if col_offset is not None: s += ":" + str(col_offset) return s class HelperNotSupportedError(RuntimeError): pass def init(): get_workbench().set_default("assistance.open_assistant_on_errors", True) get_workbench().set_default("assistance.open_assistant_on_warnings", False) get_workbench().set_default("assistance.disabled_checks", []) get_workbench().add_view(AssistantView, tr("Assistant"), "se", visible_by_default=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/ast_utils.py0000644000076600000240000001407214730022736017315 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import ast from typing import Union def extract_text_range(source, text_range): if isinstance(source, bytes): # TODO: may be wrong encoding source = source.decode("utf-8") lines = source.splitlines(True) # get relevant lines lines = lines[text_range.lineno - 1 : text_range.end_lineno] # trim last and first lines lines[-1] = lines[-1][: text_range.end_col_offset] lines[0] = lines[0][text_range.col_offset :] return "".join(lines) def find_expression(start_node, text_range): for node in ast.walk(start_node): if ( isinstance(node, ast.expr) and node.lineno == text_range.lineno and node.col_offset == text_range.col_offset and node.end_lineno == text_range.end_lineno and node.end_col_offset == text_range.end_col_offset ): return node return None def parse_source(source: str, filename="", mode="exec", fallback_to_one_char=False): assert isinstance(source, str) root = ast.parse(source, filename, mode) mark_text_ranges(root, source, fallback_to_one_char) return root def get_last_child(node, skip_incorrect=True): """Returns last focusable child expression or child statement""" def ok_node(node): if node is None: return None assert isinstance(node, (ast.expr, ast.stmt)) if skip_incorrect and getattr(node, "incorrect_range", False): return None return node def last_ok(nodes): for i in range(len(nodes) - 1, -1, -1): if ok_node(nodes[i]): node = nodes[i] if isinstance(node, ast.Starred): if ok_node(node.value): return node.value else: return None else: return nodes[i] return None if isinstance(node, ast.Call): # TODO: take care of Python 3.5 updates (Starred etc.) if hasattr(node, "kwargs") and ok_node(node.kwargs): return node.kwargs elif hasattr(node, "starargs") and ok_node(node.starargs): return node.starargs else: kw_values = list(map(lambda x: x.value, node.keywords)) last_ok_kw = last_ok(kw_values) if last_ok_kw: return last_ok_kw elif last_ok(node.args): return last_ok(node.args) else: return ok_node(node.func) elif isinstance(node, ast.BoolOp): return last_ok(node.values) elif isinstance(node, ast.BinOp): if ok_node(node.right): return node.right else: return ok_node(node.left) elif isinstance(node, ast.Compare): return last_ok(node.comparators) elif isinstance(node, ast.UnaryOp): return ok_node(node.operand) elif isinstance(node, (ast.Tuple, ast.List, ast.Set)): return last_ok(node.elts) elif isinstance(node, ast.Dict): # TODO: actually should pairwise check last value, then last key, etc. return last_ok(node.values) elif isinstance( node, (ast.Index, ast.Return, ast.Assign, ast.AugAssign, ast.Yield, ast.YieldFrom) ): return ok_node(node.value) elif isinstance(node, ast.Delete): return last_ok(node.targets) elif isinstance(node, ast.Expr): return ok_node(node.value) elif isinstance(node, ast.Assert): if ok_node(node.msg): return node.msg else: return ok_node(node.test) elif isinstance(node, ast.Slice): # [:] if ok_node(node.step): return node.step elif ok_node(node.upper): return node.upper else: return ok_node(node.lower) elif isinstance(node, ast.ExtSlice): # [:,:] for dim in reversed(node.dims): result = get_last_child(dim, skip_incorrect) assert result is None or isinstance(result, ast.expr) if result is not None: return result return None elif isinstance(node, ast.Subscript): result = get_last_child(node.slice, skip_incorrect) if result is not None: return result else: return node.value elif isinstance(node, ast.Raise): if ok_node(node.cause): return node.cause elif ok_node(node.exc): return node.exc elif isinstance(node, (ast.For, ast.While, ast.If, ast.With)): return True # There is last child, but I don't know which it will be # TODO: pick more cases from here: """ (isinstance(node, (ast.IfExp, ast.ListComp, ast.SetComp, ast.DictComp, ast.GeneratorExp)) # or isinstance(node, ast.FunctionDef, ast.Lambda) and len(node.args.defaults) > 0 and (node.dest is not None or len(node.values) > 0)) #"TODO: Import ja ImportFrom" # TODO: what about ClassDef ??? """ return None def mark_text_ranges(node, source: Union[str, bytes], fallback_to_one_char=False): """ Node is an AST, source is corresponding source as string. Function adds recursively attributes end_lineno and end_col_offset to each node which has attributes lineno and col_offset. """ assert isinstance(source, (str, bytes)) from asttokens.asttokens import ASTTokens ASTTokens(source, tree=node) for child in ast.walk(node): if hasattr(child, "last_token"): child.end_lineno, child.end_col_offset = child.last_token.end if hasattr(child, "lineno"): # Fixes problems with some nodes like binop child.lineno, child.col_offset = child.first_token.start # some nodes stay without end info if ( hasattr(child, "lineno") and (not hasattr(child, "end_lineno") or not hasattr(child, "end_col_offset")) and fallback_to_one_char ): child.end_lineno = child.lineno child.end_col_offset = child.col_offset + 2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361746.0 thonny-4.1.7/thonny/backend.py0000644000076600000240000010150414730041222016661 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import _thread import io import os.path import pathlib import queue import stat import sys import threading import time import traceback import warnings from abc import ABC, abstractmethod from logging import getLogger from typing import Any, BinaryIO, Callable, Dict, Iterable, List, Optional, Tuple, Union import thonny from thonny import report_time from thonny.common import ( # TODO: try to get rid of this IGNORED_FILES_AND_DIRS, PROCESS_ACK, BackendEvent, CommandToBackend, EOFCommand, ImmediateCommand, InlineCommand, InlineResponse, InputSubmission, MessageFromBackend, ToplevelCommand, ToplevelResponse, UserError, execute_with_frontend_sys_path, is_local_path, parse_message, read_one_incoming_message_str, serialize_message, try_load_modules_with_frontend_sys_path, universal_dirname, ) NEW_DIR_MODE = 0o755 logger = getLogger(__name__) class BaseBackend(ABC): """Methods for both MainBackend and forwarding backend""" def __init__(self): self._current_command = None self._incoming_message_queue = queue.Queue() # populated by the reader thread self._interrupt_lock = threading.Lock() self._last_progress_reporting_time = 0 self._last_sent_output = "" self._init_command_reader() def _init_command_reader(self): # NB! This approach is used only in MicroPython and SshCPython backend. # MainCPython backend uses main thread for reading commands # https://github.com/thonny/thonny/issues/1363 threading.Thread(target=self._read_incoming_messages, daemon=True).start() def mainloop(self): report_time("Beginning of mainloop") try: while True: self._check_for_connection_error() try: msg = self._fetch_next_incoming_message(timeout=0.01) except KeyboardInterrupt: self._send_output( "\nKeyboardInterrupt", "stderr" ) # CPython idle REPL does this self.send_message(ToplevelResponse()) except queue.Empty: self._perform_idle_tasks() else: if isinstance(msg, InputSubmission): self._handle_user_input(msg) elif isinstance(msg, EOFCommand): self._handle_eof_command(msg) else: self._current_command = msg self._handle_normal_command(msg) except KeyboardInterrupt: self._send_output("\nKeyboardInterrupt", "stderr") sys.exit(0) except ConnectionError as e: self.handle_connection_error(e) except Exception: # Error in Thonny's code logger.exception("mainloop error") self._report_internal_exception("mainloop error") logger.info("After mainloop") sys.exit(17) def handle_connection_error(self, error=None): logger.info("Handling connection error") message = "Connection lost" if error: message += " -- " + str(error) self._send_output("\n" + message + "\n", "stderr") self._send_output("\n" + "Use Stop/Restart to reconnect." + "\n", "stderr") sys.exit(1) def _current_command_is_interrupted(self): return getattr(self._current_command, "interrupted", False) def _fetch_next_incoming_message(self, timeout=None): return self._incoming_message_queue.get(timeout=timeout) def _report_progress( self, cmd, description: Optional[str], value: float, maximum: float ) -> None: # Don't notify too often (unless it's the final notification) if value != maximum and time.time() - self._last_progress_reporting_time < 0.2: return self.send_message( BackendEvent( event_type="InlineProgress", command_id=cmd["id"], value=value, maximum=maximum, description=description, ) ) self._last_progress_reporting_time = time.time() def _report_current_action(self, cmd, description: str) -> None: self.send_message( BackendEvent( event_type="InlineProgress", command_id=cmd["id"], description=description, ) ) def _read_incoming_messages(self): # works in a separate thread while True: if not self._read_one_incoming_message(): break def _read_one_incoming_message(self): msg_str = read_one_incoming_message_str(self._read_incoming_msg_line) if not msg_str: return False msg = parse_message(msg_str) if isinstance(msg, ImmediateCommand): # This will be handled right away self._handle_immediate_command(msg) else: self._incoming_message_queue.put(msg) return True def _prepare_command_response( self, response: Union[MessageFromBackend, Dict, None], command: CommandToBackend ) -> MessageFromBackend: if response is None: response = {} if "id" in command and "command_id" not in response: response["command_id"] = command["id"] if isinstance(response, MessageFromBackend): if "command_name" not in response: response["command_name"] = command["name"] return response else: if isinstance(response, dict): args = response else: args = {} if isinstance(command, ToplevelCommand): return ToplevelResponse(command_name=command.name, **args) else: assert isinstance(command, InlineCommand) return InlineResponse(command_name=command.name, **args) def send_message(self, msg: MessageFromBackend) -> None: sys.stdout.write(serialize_message(msg) + "\n") sys.stdout.flush() def _send_output(self, data, stream_name): if not data: return data = self._transform_output(data, stream_name) msg = BackendEvent(event_type="ProgramOutput", stream_name=stream_name, data=data) self._last_sent_output = data self.send_message(msg) def _transform_output(self, data, stream_name): return data def _read_incoming_msg_line(self) -> str: return sys.stdin.readline() def _perform_idle_tasks(self): """Executed when there is no commands in queue""" pass def _report_internal_exception(self, msg: str) -> None: user_msg = "PROBLEM IN THONNY'S BACK-END: " + msg if sys.exc_info()[1]: err_msg = "\n".join( traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]) ).strip() user_msg += f" ({err_msg})" user_msg += ".\nSee " + thonny.BACKEND_LOG_MARKER + " for more info." print(user_msg, file=sys.stderr) def _report_internal_warning(self, msg: str) -> None: user_msg = f"Warning: {msg}.\nSee backend.log for more info." print(user_msg, file=sys.stderr) @abstractmethod def _check_for_connection_error(self) -> None: ... @abstractmethod def _handle_user_input(self, msg: InputSubmission) -> None: pass @abstractmethod def _handle_eof_command(self, msg: EOFCommand) -> None: pass @abstractmethod def _handle_normal_command(self, cmd: CommandToBackend) -> None: pass @abstractmethod def _handle_immediate_command(self, cmd: ImmediateCommand) -> None: """Command handler will be executed in command reading thread, right after receiving the command""" class MainBackend(BaseBackend, ABC): """Backend which does not forward to another backend""" def __init__(self): self._command_handlers = {} self._jedi_is_loaded = False BaseBackend.__init__(self) def add_command(self, command_name, handler): """Handler should be 1-argument function taking command object. Handler may return None (in this case no response is sent to frontend) or a BackendResponse """ self._command_handlers[command_name] = handler def send_message(self, msg: MessageFromBackend) -> None: super().send_message(msg) # take the time for pre-loading jedi after the first toplevel response if isinstance(msg, ToplevelResponse): self._check_load_jedi() def _handle_normal_command(self, cmd: CommandToBackend) -> None: assert isinstance(cmd, (ToplevelCommand, InlineCommand)) logger.debug("Command: %r", cmd) if cmd.name in self._command_handlers: handler = self._command_handlers[cmd.name] else: handler = getattr(self, "_cmd_" + cmd.name, None) if handler is None: if isinstance(cmd, ToplevelCommand): self._send_output(f"Unknown command '{cmd.name}'", "stderr") response = {"error": "Unknown command: " + cmd.name} else: try: response = handler(cmd) # Exceptions must be caused by Thonny or plugins code, because the ones # from user code are caught at execution places except UserError as e: logger.info("UserError while handling %r", cmd.name, exc_info=True) if isinstance(cmd, ToplevelCommand): print(str(e), file=sys.stderr) response = {} else: response = {"error": str(e)} except KeyboardInterrupt as e: if isinstance(cmd, ToplevelCommand): print(str(e), file=sys.stderr) response = {} else: response = {"error": "Interrupted", "interrupted": True} except Exception as e: logger.exception("Exception while handling %r", cmd.name) self._report_internal_exception("Exception while handling %r" % cmd.name) sys.exit(1) if response is False: # Command doesn't want to send any response return real_response = self._prepare_command_response(response, cmd) self.send_message(real_response) def _cmd_get_dirs_children_info(self, cmd): """Provides information about immediate children of paths opened in a file browser""" data = { path: self._get_filtered_dir_children_info(path, cmd["include_hidden"]) for path in cmd["paths"] } return {"node_id": cmd["node_id"], "dir_separator": self._get_sep(), "data": data} def _cmd_prepare_upload(self, cmd): """Returns info about items to be overwritten or merged by cmd.paths""" return {"existing_items": self._get_paths_info(cmd.target_paths, recurse=False)} def _cmd_prepare_download(self, cmd): assert "id" in cmd """Returns info about all items under and including cmd.paths""" return {"all_items": self._get_paths_info(cmd.source_paths, recurse=True)} def _cmd_shell_autocomplete(self, cmd): error = None try: from thonny import jedi_utils except ImportError: completions = [] error = "Could not import jedi" else: import __main__ with warnings.catch_warnings(): completions = jedi_utils.get_interpreter_completions( cmd.source, [__main__.__dict__], sys_path=self._get_sys_path_for_analysis() ) return dict( source=cmd.source, completions=completions, error=error, row=cmd.row, column=cmd.column, ) def _cmd_editor_autocomplete(self, cmd): logger.debug("Starting _cmd_editor_autocomplete") error = None try: from thonny import jedi_utils sys_path = self._get_sys_path_for_analysis() # add current dir for local files """ if cmd.filename and is_local_path(cmd.filename): sys_path.insert(0, os.getcwd()) logger.debug("editor autocomplete with %r", sys_path) """ with warnings.catch_warnings(): completions = jedi_utils.get_script_completions( cmd.source, cmd.row, cmd.column, cmd.filename, sys_path=sys_path, ) except ImportError: completions = [] error = "Could not import jedi" return dict( source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, completions=completions, error=error, ) def _cmd_get_completion_details(self, cmd): # it is assumed this gets called after requesting editor or shell completions from thonny import jedi_utils return InlineResponse( "get_completion_details", full_name=cmd.full_name, details=jedi_utils.get_completion_details(cmd.full_name), ) def _cmd_get_editor_calltip(self, cmd): from thonny import jedi_utils signatures = jedi_utils.get_script_signatures( cmd.source, cmd.row, cmd.column, cmd.filename, sys_path=self._get_sys_path_for_analysis(), ) return InlineResponse( "get_editor_calltip", source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, signatures=signatures, ) def _cmd_get_shell_calltip(self, cmd): import __main__ from thonny import jedi_utils signatures = jedi_utils.get_interpreter_signatures( cmd.source, [__main__.__dict__], sys_path=self._get_sys_path_for_analysis() ) return InlineResponse( "get_shell_calltip", source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, signatures=signatures, ) def _cmd_highlight_occurrences(self, cmd): from thonny import jedi_utils refs = jedi_utils.get_references( cmd.source, cmd.row, cmd.column, cmd.filename, scope="file", sys_path=self._get_sys_path_for_analysis(), ) return {"references": refs, "text_last_operation_time": cmd.text_last_operation_time} def _cmd_get_definitions(self, cmd): from thonny import jedi_utils defs = jedi_utils.get_definitions( cmd.source, cmd.row, cmd.column, filename=cmd.filename, sys_path=self._get_sys_path_for_analysis(), ) return {"definitions": defs} def _cmd_get_active_distributions(self, cmd): raise NotImplementedError() def _cmd_install_distributions(self, cmd): raise NotImplementedError() def _cmd_uninstall_distributions(self, cmd): raise NotImplementedError() def _get_sys_path_for_analysis(self) -> Optional[List[str]]: return None def _get_paths_info(self, paths: List[str], recurse: bool) -> Dict[str, Dict]: result = {} for path in paths: info = self._get_path_info(path) if info is not None: info["anchor"] = path result[path] = info if recurse and info is not None and info["kind"] == "dir": desc_infos = self._get_dir_descendants_info(path) for key in desc_infos: desc_infos[key]["anchor"] = path result.update(desc_infos) return result def _get_dir_descendants_info(self, path: str, include_hidden: bool = False) -> Dict[str, Dict]: """Assumes path is dir. Dict is keyed by full path""" result = {} children_info = self._get_filtered_dir_children_info(path, include_hidden) for child_name, child_info in children_info.items(): full_child_path = path + self._get_sep() + child_name result[full_child_path] = child_info if child_info["kind"] == "dir": result.update(self._get_dir_descendants_info(full_child_path)) return result def _get_filtered_dir_children_info( self, path: str, include_hidden: bool = False ) -> Optional[Dict[str, Dict]]: children = self._get_dir_children_info(path, include_hidden) if children is None: return None return {name: children[name] for name in children if name not in IGNORED_FILES_AND_DIRS} @abstractmethod def _get_path_info(self, path: str) -> Optional[Dict]: """Returns information about this path or None if it doesn't exist""" @abstractmethod def _get_dir_children_info( self, path: str, include_hidden: bool = False ) -> Optional[Dict[str, Dict]]: """For existing dirs returns Dict[child_short_name, Dict of its information]. Returns None if path doesn't exist or is not a dir. """ @abstractmethod def _get_sep(self) -> str: """Returns symbol for combining parent directory path and child name""" def _check_load_jedi(self) -> None: if self._jedi_is_loaded: return logger.info("Loading Jedi") report_time("Before loading Jedi") try_load_modules_with_frontend_sys_path(["jedi", "parso"]) self._jedi_is_loaded = True report_time("After loading Jedi") class UploadDownloadMixin(ABC): """Backend, which runs on a local process and talks to a nonlocal system, and therefore is able to upload/download""" def _cmd_download(self, cmd): errors = self._transfer_files_and_dirs( cmd.items, self._ensure_local_directory, self._download_file, cmd, pathlib.Path ) return {"errors": errors} def _cmd_upload(self, cmd): def upload_file_wrapper(source_path, target_path, callback): self._upload_file( source_path, target_path, callback, cmd["make_shebang_scripts_executable"] ) errors = self._transfer_files_and_dirs( cmd.items, self._ensure_remote_directory, upload_file_wrapper, cmd, pathlib.PurePosixPath, ) return {"errors": errors} def _cmd_read_file(self, cmd): def callback(completed, total): self._report_progress(cmd, cmd["path"], completed, total) with io.BytesIO() as fp: self._read_file(cmd["path"], fp, callback) fp.seek(0) content_bytes = fp.read() return {"content_bytes": content_bytes, "path": cmd["path"]} def _cmd_write_file(self, cmd): def callback(completed, total): self._report_progress(cmd, cmd["path"], completed, total) with io.BytesIO() as fp: fp.write(cmd["content_bytes"]) fp.seek(0) self._write_file( fp, cmd["path"], file_size=len(cmd["content_bytes"]), callback=callback, make_shebang_scripts_executable=cmd["make_shebang_scripts_executable"], ) return InlineResponse( command_name="write_file", path=cmd["path"], editor_id=cmd.get("editor_id") ) def _supports_directories(self) -> bool: return True def _transfer_files_and_dirs( self, items: Iterable[Dict], ensure_dir_fun: Callable[[str], None], transfer_file_fun: Callable, cmd, target_path_class, ) -> List[str]: total_cost = 0 for item in items: if item["kind"] == "file": total_cost += item["size"] + self._get_file_fixed_cost() else: total_cost += self._get_dir_transfer_cost() completed_cost = 0 errors = [] ensured_dirs = set() def ensure_dir(path): if path in ensured_dirs: return ensure_dir_fun(path) ensured_dirs.add(path) for item in sorted(items, key=lambda x: x["source_path"]): self._report_progress(cmd, "Starting", completed_cost, total_cost) def copy_bytes_notifier(completed_bytes, total_bytes): completed = completed_cost + completed_bytes desc = str(round(completed / total_cost * 100)) + "%" self._report_progress(cmd, desc, completed, total_cost) try: if item["kind"] == "dir": ensure_dir(item["target_path"]) completed_cost += self._get_dir_transfer_cost() else: if self._supports_directories(): ensure_dir(self._get_parent_directory(item["target_path"])) print("%s (%d bytes)" % (item["source_path"], item["size"])) transfer_file_fun(item["source_path"], item["target_path"], copy_bytes_notifier) completed_cost += self._get_file_fixed_cost() + item["size"] except OSError as e: errors.append( "Could not copy %s to %s: %s" % (item["source_path"], item["target_path"], str(e)) ) return errors def _download_file(self, source_path, target_path, callback): with open(target_path, "bw") as target_fp: self._read_file(source_path, target_fp, callback) def _upload_file( self, source_path, target_path, callback, make_shebang_scripts_executable: bool ): with open(source_path, "br") as source_fp: self._write_file( source_fp, target_path, os.path.getsize(source_path), callback, make_shebang_scripts_executable, ) def _get_dir_transfer_cost(self): # Validating and maybe creating a directory is taken to be equal to copying this number of bytes return 1000 def _get_file_fixed_cost(self): # Creating or overwriting a file is taken to be equal to copying this number of bytes return 100 def _get_parent_directory(self, path: str): return universal_dirname(path) def _ensure_local_directory(self, path: str) -> None: os.makedirs(path, NEW_DIR_MODE, exist_ok=True) def _ensure_remote_directory(self, path: str) -> None: # assuming remote system is Posix ensure_posix_directory(path, self._get_stat_mode_for_upload, self._mkdir_for_upload) @abstractmethod def _get_stat_mode_for_upload(self, path: str) -> Optional[int]: """returns None if path doesn't exist""" @abstractmethod def _mkdir_for_upload(self, path: str) -> None: raise NotImplementedError() @abstractmethod def _write_file( self, source_fp: BinaryIO, target_path: str, file_size: int, callback: Callable[[int, int], None], make_shebang_scripts_executable: bool, ) -> None: raise NotImplementedError() @abstractmethod def _read_file( self, source_path: str, target_fp: BinaryIO, callback: Callable[[int, int], None] ) -> None: raise NotImplementedError() @abstractmethod def _report_internal_exception(self): raise NotImplementedError() @abstractmethod def _report_progress( self, cmd, description: Optional[str], value: float, maximum: float ) -> None: raise NotImplementedError() class RemoteProcess: """Modelled after subprocess.Popen""" def __init__(self, client, channel, stdin, stdout, pid): self._client = client self._channel = channel self.stdin = stdin self.stdout = stdout self.pid = pid self.returncode = None def poll(self): if self._channel.exit_status_ready(): self.returncode = self._channel.recv_exit_status() return self.returncode else: return None def wait(self): self.returncode = self._channel.recv_exit_status() return self.returncode def kill(self): _, stdout, _ = self._client.exec_command("kill -9 %s" % self.pid) # wait until completion stdout.channel.recv_exit_status() class SshMixin(UploadDownloadMixin): def __init__(self, host, user, password, interpreter, cwd): # UploadDownloadMixin.__init__(self) execute_with_frontend_sys_path(self._try_load_paramiko) import paramiko from paramiko.client import AutoAddPolicy, SSHClient self._host = host self._user = user self._password = password self._target_interpreter = interpreter self._cwd = cwd self._proc = None # type: Optional[RemoteProcess] self._sftp = None # type: Optional[paramiko.SFTPClient] self._client = SSHClient() self._client.load_system_host_keys() self._client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) # TODO: does it get closed properly after process gets killed? self._connect() def _try_load_paramiko(self): try: import paramiko.client except ImportError: logger.info("Could not import paramiko") print( "\nThis back-end requires an extra package named 'paramiko'." " Install it from 'Tools => Manage plug-ins' or via your system package manager.", file=sys.stderr, ) sys.exit(1) def _connect(self): from paramiko import SSHException try: self._client.connect( hostname=self._host, username=self._user, password=self._password, passphrase=self._password, ) except (SSHException, OSError) as e: print( "\nCan't connect to '%s' with user '%s': %s" % (self._host, self._user, str(e)), file=sys.stderr, ) print("Re-check your host, authentication method, password or keys.", file=sys.stderr) delete_stored_ssh_password() sys.exit(1) def _create_remote_process(self, cmd_items: List[str], cwd: str, env: Dict) -> RemoteProcess: import shlex # Before running the main thing: # * print process id (so that we can kill it later) # http://redes-privadas-virtuales.blogspot.com/2013/03/getting-hold-of-remote-pid-through.html # * change to desired directory # # About -onlcr: https://stackoverflow.com/q/35887380/261181 cmd_line_str = ( "echo $$ ; stty -echo ; stty -onlcr ; " + (" cd %s 2> /dev/null ;" % shlex.quote(cwd) if cwd else "") + (" exec " + " ".join(map(shlex.quote, cmd_items))) ) stdin, stdout, _ = self._client.exec_command( cmd_line_str, bufsize=0, get_pty=True, environment=env ) # stderr gets directed to stdout because of pty pid = stdout.readline().strip() ack = stdout.readline().strip() if ack != PROCESS_ACK: raise RuntimeError(f"Got {ack!r} instead of expected {PROCESS_ACK!r}") channel = stdout.channel return RemoteProcess(self._client, channel, stdin, stdout, pid) def _handle_immediate_command(self, cmd: ImmediateCommand) -> None: if cmd.name == "kill": self._kill() elif cmd.name == "interrupt": self._interrupt() else: raise RuntimeError("Unknown immediateCommand %s" % cmd.name) def _kill(self): if self._proc is None or self._proc.poll() is not None: return self._proc.kill() def _interrupt(self): pass def _get_sftp(self, fresh: bool): if fresh and self._sftp is not None: self._sftp.close() self._sftp = None if self._sftp is None: import paramiko # TODO: does it get closed properly after process gets killed? self._sftp = paramiko.SFTPClient.from_transport(self._client.get_transport()) return self._sftp def _read_file( self, source_path: str, target_fp: BinaryIO, callback: Callable[[int, int], None] ) -> None: self._perform_sftp_operation_with_retry( lambda sftp: sftp.getfo(source_path, target_fp, callback) ) def _write_file( self, source_fp: BinaryIO, target_path: str, file_size: int, callback: Callable[[int, int], None], make_shebang_scripts_executable: bool, ) -> None: logger.info("Writing bytes to %r", target_path) if make_shebang_scripts_executable: source_fp, has_shebang = convert_newlines_if_has_shebang(source_fp) else: has_shebang = None self._perform_sftp_operation_with_retry( lambda sftp: sftp.putfo(source_fp, target_path, callback) ) logger.debug( "make_shebang_scripts_executable: %r, has_shebang: %r", make_shebang_scripts_executable, has_shebang, ) if make_shebang_scripts_executable and has_shebang: self._perform_sftp_operation_with_retry(lambda sftp: sftp.chmod(target_path, 0o755)) def _perform_sftp_operation_with_retry(self, operation) -> Any: try: return operation(self._get_sftp(fresh=False)) except OSError: # It looks like SFTPClient gets stale after a while. # Try again with fresh SFTPClient return operation(self._get_sftp(fresh=True)) def _get_stat_mode_for_upload(self, path: str) -> Optional[int]: try: return self._perform_sftp_operation_with_retry(lambda sftp: sftp.stat(path).st_mode) except OSError as e: return None def _mkdir_for_upload(self, path: str) -> None: self._perform_sftp_operation_with_retry(lambda sftp: sftp.mkdir(path, NEW_DIR_MODE)) def _longest_common_path_prefix(str_paths, path_class): assert str_paths if len(str_paths) == 1: return str_paths[0] list_of_parts = [] for str_path in str_paths: list_of_parts.append(path_class(str_path).parts) first = list_of_parts[0] rest = list_of_parts[1:] i = 0 while i < len(first): item_i = first[i] if not all([len(x) > i and x[i] == item_i for x in rest]): break else: i += 1 if i == 0: return "" result = path_class(first[0]) for j in range(1, i): result = result.joinpath(first[j]) return str(result) def ensure_posix_directory( path: str, stat_mode_fun: Callable[[str], Optional[int]], mkdir_fun: Callable[[str], None] ) -> None: assert path.startswith("/") if path == "/": return for step in list(reversed(list(map(str, pathlib.PurePosixPath(path).parents)))) + [path]: if step != "/": mode = stat_mode_fun(step) if mode is None: mkdir_fun(step) elif not stat.S_ISDIR(mode): raise AssertionError("'%s' is file, not a directory" % step) def interrupt_local_process() -> None: """Meant to be executed from a background thread""" import signal if hasattr(signal, "raise_signal"): # Python 3.8 and later signal.raise_signal(signal.SIGINT) elif sys.platform == "win32": # https://stackoverflow.com/a/51122690/261181 import ctypes ucrtbase = ctypes.CDLL("ucrtbase") c_raise = ucrtbase["raise"] c_raise(signal.SIGINT) else: # Does not give KeyboardInterrupt in Windows os.kill(os.getpid(), signal.SIGINT) def get_ssh_password_file_path(): from thonny import THONNY_USER_DIR return os.path.join(THONNY_USER_DIR, "ssh_password") def delete_stored_ssh_password(): if os.path.exists(get_ssh_password_file_path()): # invalidate stored password os.remove(get_ssh_password_file_path()) def convert_newlines_if_has_shebang(fp: BinaryIO) -> Tuple[BinaryIO, bool]: if fp.read(3) == b"#!/": fp.seek(0) new_fp = io.BytesIO() new_fp.write(fp.read().replace(b"\r\n", b"\n")) fp.close() new_fp.seek(0) return new_fp, True else: fp.seek(0) return fp, False if __name__ == "__main__": # print(_closest_common_directory(["C:\\kala\\pala", "C:\\kala", "D:\\kuku"], pathlib.PureWindowsPath)) print(_longest_common_path_prefix(["C:\\kala\\pala", "C:\\kala"], pathlib.PureWindowsPath)) print(_longest_common_path_prefix(["C:\\kala\\pala"], pathlib.PureWindowsPath)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/base_file_browser.py0000644000076600000240000015046114730022736020765 0ustar00aivarannamaastaffimport datetime import os.path import shutil import stat import subprocess import time import tkinter as tk from logging import getLogger from tkinter import messagebox, simpledialog, ttk from typing import Optional from thonny import get_runner, get_workbench, misc_utils, tktextext from thonny.common import InlineCommand, UserError, get_dirs_children_info from thonny.languages import tr from thonny.misc_utils import get_menu_char, running_on_mac_os, running_on_windows, sizeof_fmt from thonny.ui_utils import ( CommonDialog, ask_one_from_choices, ask_string, create_string_var, ems_to_pixels, get_hyperlink_cursor, lookup_style_option, open_with_default_app, scrollbar_style, show_dialog, ) _dummy_node_text = "..." _LOCAL_FILES_ROOT_TEXT = "" # needs to be initialized later ROOT_NODE_ID = "" HIDDEN_FILES_OPTION = "file.show_hidden_files" logger = getLogger(__name__) class BaseFileBrowser(ttk.Frame): def __init__(self, master, show_expand_buttons=True): self.show_expand_buttons = show_expand_buttons self._cached_child_data = {} self.path_to_highlight = None ttk.Frame.__init__(self, master, borderwidth=0, relief="flat") self.vert_scrollbar = ttk.Scrollbar( self, orient=tk.VERTICAL, style=scrollbar_style("Vertical") ) self.vert_scrollbar.grid(row=0, column=1, sticky=tk.NSEW, rowspan=3) tktextext.fixwordbreaks(tk._default_root) self.building_breadcrumbs = False self.init_header(row=0, column=0) spacer = ttk.Frame(self, height=1) spacer.grid(row=1, sticky="nsew") self.tree = ttk.Treeview( self, columns=["#0", "kind", "path", "name", "modified", "size"], displaycolumns=( # 4, # 5 ), yscrollcommand=self.vert_scrollbar.set, selectmode="extended", ) self.tree.grid(row=2, column=0, sticky=tk.NSEW) self.vert_scrollbar["command"] = self.tree.yview self.columnconfigure(0, weight=1) self.rowconfigure(2, weight=1) self.tree["show"] = "tree" self.tree.bind("<3>", self.on_secondary_click, True) if misc_utils.running_on_mac_os(): self.tree.bind("<2>", self.on_secondary_click, True) self.tree.bind("", self.on_secondary_click, True) self.tree.bind("", self.on_double_click, True) self.tree.bind("<>", self.on_open_node) self.copypaste = None wb = get_workbench() self.folder_icon = wb.get_image("folder") self.python_file_icon = wb.get_image("python-icon") self.text_file_icon = wb.get_image("text-file") self.generic_file_icon = wb.get_image("generic-file") self.hard_drive_icon = wb.get_image("hard-drive") self.tree.column("#0", width=200, anchor=tk.W) self.tree.heading("#0", text=tr("Name"), anchor=tk.W) self.tree.column("modified", width=60, anchor=tk.W) self.tree.heading("modified", text=tr("Modified"), anchor=tk.W) self.tree.column("size", width=40, anchor=tk.E) self.tree.heading("size", text=tr("Size (bytes)"), anchor=tk.E) self.tree.column("kind", width=30, anchor=tk.W) # self.tree.heading("kind", text="Kind") # self.tree.column("path", width=300, anchor=tk.W) # self.tree.heading("path", text="path") # self.tree.column("name", width=60, anchor=tk.W) # self.tree.heading("name", text="name") # set-up root node self.tree.set(ROOT_NODE_ID, "kind", "root") self.menu = tk.Menu(self.tree, tearoff=False) self.current_focus = None def init_header(self, row, column): header_frame = ttk.Frame(self, style="ViewToolbar.TFrame") header_frame.grid(row=row, column=column, sticky="nsew") header_frame.columnconfigure(0, weight=1) self.path_bar = tktextext.TweakableText( header_frame, borderwidth=0, relief="flat", height=1, font="TkDefaultFont", wrap="word", padx=ems_to_pixels(0.6), pady=ems_to_pixels(0.5), insertwidth=0, highlightthickness=0, background=lookup_style_option("ViewToolbar.TFrame", "background"), ) self.path_bar.grid(row=0, column=0, sticky="nsew") self.path_bar.set_read_only(True) self.path_bar.bind("", self.resize_path_bar, True) self.path_bar.tag_configure( "dir", foreground=lookup_style_option("Url.TLabel", "foreground") ) self.path_bar.tag_configure("underline", underline=True) def get_dir_range(event): mouse_index = self.path_bar.index("@%d,%d" % (event.x, event.y)) return self.path_bar.tag_prevrange("dir", mouse_index + "+1c") def dir_tag_motion(event): self.path_bar.tag_remove("underline", "1.0", "end") dir_range = get_dir_range(event) if dir_range: range_start, range_end = dir_range self.path_bar.tag_add("underline", range_start, range_end) def dir_tag_enter(event): self.path_bar.config(cursor=get_hyperlink_cursor()) def dir_tag_leave(event): self.path_bar.config(cursor="") self.path_bar.tag_remove("underline", "1.0", "end") def dir_tag_click(event): mouse_index = self.path_bar.index("@%d,%d" % (event.x, event.y)) lineno = int(float(mouse_index)) if lineno == 1: self.request_focus_into("") else: assert lineno == 2 dir_range = get_dir_range(event) if dir_range: _, end_index = dir_range path = self.path_bar.get("2.0", end_index) if path.endswith(":"): path += "\\" self.request_focus_into(path) self.path_bar.tag_bind("dir", "<1>", dir_tag_click) self.path_bar.tag_bind("dir", "", dir_tag_enter) self.path_bar.tag_bind("dir", "", dir_tag_leave) self.path_bar.tag_bind("dir", "", dir_tag_motion) # self.menu_button = ttk.Button(header_frame, text="≡ ", style="ViewToolbar.Toolbutton") self.menu_button = ttk.Button( header_frame, text=f" {get_menu_char()} ", style="ViewToolbar.Toolbutton", command=self.post_button_menu, ) # self.menu_button.grid(row=0, column=1, sticky="ne") self.menu_button.place(anchor="ne", rely=0, relx=1) def clear(self): self.clear_error() self.invalidate_cache() self.path_bar.direct_delete("1.0", "end") self.tree.set_children("") self.current_focus = None def path_exists(self, path: str) -> Optional[bool]: return None def request_focus_into(self, path): return self.focus_into(path) def focus_into(self, path): self.clear_error() self.invalidate_cache() # clear self.tree.set_children(ROOT_NODE_ID) self.tree.set(ROOT_NODE_ID, "path", path) self.building_breadcrumbs = True self.path_bar.direct_delete("1.0", "end") self.path_bar.direct_insert("1.0", self.get_root_text(), ("dir",)) if path and path != "/": self.path_bar.direct_insert("end", "\n") def create_spacer(): return ttk.Frame(self.path_bar, height=1, width=4, style="ViewToolbar.TFrame") parts = self.split_path(path) for i, part in enumerate(parts): if i > 0: if parts[i - 1] != "": self.path_bar.window_create("end", window=create_spacer()) self.path_bar.direct_insert("end", self.get_dir_separator()) self.path_bar.window_create("end", window=create_spacer()) self.path_bar.direct_insert("end", part, tags=("dir",)) self.building_breadcrumbs = False self.resize_path_bar() self.render_children_from_cache() self.scroll_to_top() self.current_focus = path def scroll_to_top(self): children = self.tree.get_children() if children: self.tree.see(children[0]) def split_path(self, path): return path.split(self.get_dir_separator()) def get_root_text(self): return get_local_files_root_text() def on_open_node(self, event): node_id = self.get_selected_node() if self.get_selected_kind() == "file": # can happen in Windows when pressing ENTER on file return "break" path = self.tree.set(node_id, "path") if path: # and path not in self._cached_child_data: self.render_children_from_cache(node_id) # self.request_dirs_child_data(node_id, [path]) # else: def resize_path_bar(self, event=None): if self.building_breadcrumbs: return height = self.tk.call((self.path_bar, "count", "-update", "-displaylines", "1.0", "end")) self.path_bar.configure(height=height) def _cleaned_selection(self): # In some cases (eg. Python 3.6.9 and Tk 8.6.8 in Ubuntu when selecting a range with shift), # nodes may contain collapsed children. # In most cases this does no harm, because the command would apply to children as well, # but dummy dir marker nodes may cause confusion nodes = self.tree.selection() return [node for node in nodes if self.tree.item(node, "text") != _dummy_node_text] def get_selected_node(self): """Returns single node (or nothing)""" nodes = self._cleaned_selection() if len(nodes) == 1: return nodes[0] elif len(nodes) > 1: return self.tree.focus() or None else: return None def get_selected_nodes(self, notify_if_empty=False): """Can return several nodes""" result = self._cleaned_selection() if not result and notify_if_empty: self.notify_missing_selection() return result def get_selection_info(self, notify_if_empty=False): nodes = self.get_selected_nodes(notify_if_empty) if not nodes: return None elif len(nodes) == 1: description = "'" + self.tree.set(nodes[0], "name") + "'" else: description = tr("%d items") % len(nodes) paths = [self.tree.set(node, "path") for node in nodes] kinds = [self.tree.set(node, "kind") for node in nodes] return {"description": description, "nodes": nodes, "paths": paths, "kinds": kinds} def get_selected_path(self): return self.get_selected_value("path") def get_selected_kind(self): return self.get_selected_value("kind") def get_selected_name(self): return self.get_selected_value("name") def get_extension_from_name(self, name): if name is None: return None if "." in name: return "." + name.split(".")[-1].lower() else: return name.lower() def get_selected_value(self, key): node_id = self.get_selected_node() if node_id: return self.tree.set(node_id, key) else: return None def get_active_directory(self): path = self.tree.set(ROOT_NODE_ID, "path") return path def request_dirs_child_data(self, node_id, paths): raise NotImplementedError() def show_fs_info(self): path = self.get_selected_path() if path is None: path = self.current_focus self.request_fs_info(path) def request_fs_info(self, path): raise NotImplementedError() def present_fs_info(self, info): total_str = "?" if info["total"] is None else sizeof_fmt(info["total"]) used_str = "?" if info["used"] is None else sizeof_fmt(info["used"]) free_str = "?" if info["free"] is None else sizeof_fmt(info["free"]) text = tr("Storage space on this drive or filesystem") + ":\n\n" " %s: %s\n" % ( tr("total space"), total_str, ) + " %s: %s\n" % (tr("used space"), used_str) + " %s: %s\n" % ( tr("free space"), free_str, ) if info.get("comment"): text += "\n" + info["comment"] messagebox.showinfo(tr("Storage info"), text, master=self) def cache_dirs_child_data(self, data): from copy import deepcopy data = deepcopy(data) for parent_path in data: children_data = data[parent_path] if isinstance(children_data, dict): for child_name in children_data: child_data = children_data[child_name] assert isinstance(child_data, dict) if "label" not in child_data: child_data["label"] = child_name if "isdir" not in child_data: child_data["isdir"] = child_data.get("size", 0) is None else: assert children_data is None self._cached_child_data.update(data) def file_exists_in_cache(self, path): for parent_path in self._cached_child_data: # hard to split because it may not be in this system format name = path[len(parent_path) :] if name[0:1] in ["/", "\\"]: name = name[1:] if name in self._cached_child_data[parent_path]: return True return False def select_path_if_visible(self, path, node_id=""): for child_id in self.tree.get_children(node_id): if self.tree.set(child_id, "path") == path: self.tree.selection_set(child_id) return if self._is_open_dir_node(child_id): self.select_path_if_visible(path, child_id) def _is_open_dir_node(self, node_id) -> bool: # In Windows a node may get open=True simply by pressing ENTER on it return self.tree.item(node_id, "open") and self.tree.set(node_id, "kind") != "file" def get_open_paths(self, node_id=ROOT_NODE_ID): if self.tree.set(node_id, "kind") == "file": return set() elif node_id == ROOT_NODE_ID or self._is_open_dir_node(node_id): result = {self.tree.set(node_id, "path")} for child_id in self.tree.get_children(node_id): result.update(self.get_open_paths(child_id)) return result else: return set() def invalidate_cache(self, paths=None): if paths is None: self._cached_child_data.clear() else: for path in paths: if path in self._cached_child_data: del self._cached_child_data[path] def render_children_from_cache(self, node_id=""): """This node is supposed to be a directory and its contents needs to be shown and/or refreshed""" path = self.tree.set(node_id, "path") kind = self.tree.set(node_id, "kind") if kind == "file": logger.warning("File %r is treated as dir", path) return logger.debug("Rendering %r from cache", path) if path not in self._cached_child_data: self.request_dirs_child_data(node_id, self.get_open_paths() | {path}) # leave it as is for now, it will be updated later return children_data = self._cached_child_data[path] if children_data in ["file", "missing"]: # path used to be a dir but is now a file or does not exist # if browser is focused into this path if node_id == "": self.show_error("Directory " + path + " does not exist anymore", node_id) elif children_data == "missing": self.tree.delete(node_id) else: assert children_data == "file" self.tree.set_children(node_id) # clear the list of children self.tree.item(node_id, open=False) elif children_data is None: raise RuntimeError("None data for %s" % path) else: fs_children_names = children_data.keys() tree_children_ids = self.tree.get_children(node_id) # recollect children children = {} # first the ones, which are present already in tree for child_id in tree_children_ids: name = self.tree.set(child_id, "name") if name in fs_children_names: children[name] = child_id self.update_node_data(child_id, name, children_data[name]) # add missing children for name in fs_children_names: if name not in children: child_id = self.tree.insert(node_id, "end") children[name] = child_id self.tree.set(children[name], "path", self.join(path, name)) self.update_node_data(child_id, name, children_data[name]) def file_order(name): # items in a folder should be ordered so that # folders come first and names are ordered case insensitively return ( not children_data[name]["isdir"], # prefer directories not ":" in name, # prefer drives name.upper(), name, ) # update tree ids_sorted_by_name = list( map(lambda key: children[key], sorted(children.keys(), key=file_order)) ) self.tree.set_children(node_id, *ids_sorted_by_name) # recursively update open children for child_id in ids_sorted_by_name: if self._is_open_dir_node(child_id): self.render_children_from_cache(child_id) def show_error(self, msg, node_id=""): if not node_id: # clear tree self.tree.set_children("") err_id = self.tree.insert(node_id, "end") self.tree.item(err_id, text=msg) self.tree.set_children(node_id, err_id) def clear_error(self): "TODO:" def update_node_data(self, node_id, name, data): assert node_id != "" path = self.tree.set(node_id, "path") if data.get("modified"): try: # modification time is Unix epoch time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(data["modified"]))) except Exception: time_str = "" else: time_str = "" self.tree.set(node_id, "modified", time_str) if data["isdir"]: self.tree.set(node_id, "kind", "dir") self.tree.set(node_id, "size", "") # Ensure that expand button is visible # unless we know it doesn't have children children_ids = self.tree.get_children(node_id) if ( self.show_expand_buttons and len(children_ids) == 0 and (path not in self._cached_child_data or self._cached_child_data[path]) ): self.tree.insert(node_id, "end", text=_dummy_node_text) if path.endswith(":") or path.endswith(":\\"): img = self.hard_drive_icon else: img = self.folder_icon else: self.tree.set(node_id, "kind", "file") self.tree.set(node_id, "size", data["size"]) # Make sure it doesn't have children self.tree.set_children(node_id) if ( path.lower().endswith(".py") or path.lower().endswith(".pyw") or path.lower().endswith(".pyi") ): img = self.python_file_icon elif self.should_open_name_in_thonny(name): img = self.text_file_icon else: img = self.generic_file_icon self.tree.set(node_id, "name", name) self.tree.item(node_id, text=" " + data["label"], image=img) def join(self, parent, child): if parent == "": if self.get_dir_separator() == "/": return "/" + child else: return child if parent.endswith(self.get_dir_separator()): return parent + child else: return parent + self.get_dir_separator() + child def get_dir_separator(self): return os.path.sep def on_double_click(self, event): # TODO: don't act when the click happens below last item path = self.get_selected_path() kind = self.get_selected_kind() name = self.get_selected_name() if kind == "file": if self.should_open_name_in_thonny(name): self.open_file(path) else: self.open_path_with_system_app(path) elif kind == "dir": self.request_focus_into(path) return "break" def open_file(self, path): pass def open_path_with_system_app(self, path): pass def on_secondary_click(self, event): node_id = self.tree.identify_row(event.y) if node_id: if node_id not in self.tree.selection(): # replace current selection self.tree.selection_set(node_id) self.tree.focus(node_id) else: self.tree.selection_set() self.path_bar.focus_set() self.tree.update() self.refresh_menu(context="item") self.menu.tk_popup(event.x_root, event.y_root) def post_button_menu(self): self.refresh_menu(context="button") self.menu.tk_popup( self.menu_button.winfo_rootx(), self.menu_button.winfo_rooty() + self.menu_button.winfo_height(), ) def refresh_menu(self, context): self.menu.delete(0, "end") self.add_first_menu_items(context) self.menu.add_separator() self.add_middle_menu_items(context) self.menu.add_separator() self.add_last_menu_items(context) def is_active_browser(self): return False def add_first_menu_items(self, context): if context == "item": selected_path = self.get_selected_path() selected_kind = self.get_selected_kind() else: selected_path = self.get_active_directory() selected_kind = "dir" if context == "button": self.menu.add_command(label=tr("Refresh"), command=self.cmd_refresh_tree) self.menu.add_command( label=tr("Open in system file manager"), command=lambda: self.open_path_with_system_app(selected_path), ) else: if selected_kind == "dir": self.menu.add_command( label=tr("Focus into"), command=lambda: self.request_focus_into(selected_path) ) else: self.menu.add_command( label=tr("Open in Thonny"), command=lambda: self.open_file(selected_path) ) if self.is_active_browser(): self.menu.add_command( label=tr("Open in default external app"), command=lambda: self.open_path_with_system_app(selected_path), ) if selected_kind == "file": ext = self.get_extension_from_name(self.get_selected_name()) self.menu.add_command( label=tr("Configure %s files") % ext + "...", command=lambda: self.open_extension_dialog(ext), ) hidden_files_label = ( tr("Hide hidden files") if show_hidden_files() else tr("Show hidden files") ) self.menu.add_command(label=hidden_files_label, command=self.toggle_hidden_files) def toggle_hidden_files(self): get_workbench().set_option( HIDDEN_FILES_OPTION, not get_workbench().get_option(HIDDEN_FILES_OPTION) ) self.refresh_tree() def cmd_refresh_tree(self): self.refresh_tree() def open_extension_dialog(self, extension: str) -> None: system_choice = tr("Open in system default app") thonny_choice = tr("Open in Thonny's text editor") current_index = ( 1 if get_workbench().get_option(get_file_handler_conf_key(extension)) == "thonny" else 0 ) choice = ask_one_from_choices( title=tr("Configure %s files") % extension, question=tr( "What to do with a %s file when you double-click it in Thonny's file browser?" ) % extension, choices=[system_choice, thonny_choice], initial_choice_index=current_index, master=self.winfo_toplevel(), ) if not choice: return get_workbench().set_option( get_file_handler_conf_key(extension), "system" if choice == system_choice else "thonny", ) # update icons self.refresh_tree() def add_middle_menu_items(self, context): if self.supports_new_file(): self.menu.add_command(label=tr("New file") + "...", command=self.create_new_file) if self.supports_directories(): self.menu.add_command(label=tr("New directory") + "...", command=self.mkdir) if self.supports_copypaste(): self.menu.add_command(label=tr("Cut"), command=self.cut_files) self.menu.add_command(label=tr("Copy"), command=self.copy_files) target = self.get_selected_file() self.menu.add_command(label=tr("Paste"), command=self.paste_files) if ( target is None or not self.copypaste.has_selection() or self.copypaste.conflicts(target) ): self.menu.entryconfig(tr("Paste"), state="disabled") if self.supports_rename(): self.menu.add_command(label=tr("Rename"), command=self.rename_file) if self.supports_trash(): trash_label = tr("Move to Trash") self.menu.add_command(label=trash_label, command=self.move_to_trash) else: self.menu.add_command(label=tr("Delete"), command=self.delete) def add_last_menu_items(self, context): self.menu.add_command(label=tr("Properties"), command=self.show_properties) if context == "button": self.menu.add_command(label=tr("Storage space"), command=self.show_fs_info) def show_properties(self): node_id = self.get_selected_node() if node_id is None: self.notify_missing_selection() return values = self.tree.set(node_id) text = tr("Path") + ":\n " + values["path"] + "\n\n" if values["kind"] == "dir": title = tr("Directory properties") else: title = tr("File properties") size_fmt_str = sizeof_fmt(int(values["size"])) bytes_str = str(values["size"]) + " " + tr("bytes") text += ( tr("Size") + ":\n " + ( bytes_str if size_fmt_str.endswith(" B") else size_fmt_str + " (" + bytes_str + ")" ) + "\n\n" ) if values["modified"].strip(): text += tr("Modified") + ":\n " + values["modified"] + "\n\n" messagebox.showinfo(title, text.strip(), master=self) def refresh_tree(self, paths_to_invalidate=None): self.invalidate_cache(paths_to_invalidate) if self.winfo_ismapped(): self.render_children_from_cache("") if self.path_to_highlight: self.select_path_if_visible(self.path_to_highlight) self.path_to_highlight = None def create_new_file(self): selected_node_id = self.get_selected_node() if selected_node_id: selected_path = self.tree.set(selected_node_id, "path") selected_kind = self.tree.set(selected_node_id, "kind") if selected_kind == "dir": parent_path = selected_path else: parent_id = self.tree.parent(selected_node_id) parent_path = self.tree.set(parent_id, "path") else: parent_path = self.current_focus name = ask_string( "File name", "Provide filename", initial_value="", master=self.winfo_toplevel() ) if not name: return None path = self.join(parent_path, name) if self.path_exists(path): messagebox.showerror("Error", "The file '" + path + "' already exists", master=self) return self.create_new_file() else: self.create_new_file_editor(path) return path def create_new_file_editor(self, path): raise NotImplementedError() def delete(self): selection = self.get_selection_info(True) if not selection: return confirmation = "Are you sure want to delete %s?" % selection["description"] confirmation += "\n\nNB! Trash bin won't be used (no way to undelete)!" if "dir" in selection["kinds"]: confirmation += "\n" + "Directories will be deleted with content." if not messagebox.askyesno("Are you sure?", confirmation, master=self): return self.perform_delete(selection["paths"], tr("Deleting %s") % selection["description"]) self.refresh_tree() def move_to_trash(self): assert self.supports_trash() selection = self.get_selection_info(True) if not selection: return if not messagebox.askokcancel( tr("Moving to Trash"), tr("Move %s to Trash?") % selection["description"], icon="info", master=self, ): return self.perform_move_to_trash( selection["paths"], tr("Moving %s to Trash") % (selection["description"]) ) self.refresh_tree() def supports_trash(self): return False def mkdir(self): parent = self.get_selected_path() if parent is None: parent = self.current_focus else: if self.get_selected_kind() == "file": # dirname does the right thing even if parent is Linux path and running on Windows parent = os.path.dirname(parent) name = ask_string( tr("New directory"), tr("Enter name for new directory under\n%s") % parent, master=self.winfo_toplevel(), ) if not name or not name.strip(): return self.perform_mkdir(parent, name.strip()) self.refresh_tree() def perform_delete(self, paths, description): raise NotImplementedError() def perform_move_to_trash(self, paths, description): raise NotImplementedError() def supports_directories(self): return True def perform_mkdir(self, parent_dir, name): raise NotImplementedError() def notify_missing_selection(self): messagebox.showerror( tr("Nothing selected"), tr("Select an item and try again!"), master=self ) def should_open_name_in_thonny(self, name): ext = self.get_extension_from_name(name) return get_workbench().get_option(get_file_handler_conf_key(ext), "system") == "thonny" def supports_new_file(self): return False def get_selected_file(self): selection = self.get_selection_info(False) if not selection or len(selection["paths"]) > 1: return return selection["paths"][0] def supports_rename(self): return False def rename_file(self): old_name = self.get_selected_file() if old_name is None: return file_name = os.path.basename(old_name) new_name = simpledialog.askstring( tr("Rename '%s'") % file_name, tr("Enter new name"), initialvalue=file_name, parent=self ) if new_name: self.perform_rename(old_name, new_name) self.refresh_tree() def perform_rename(self, old_name, new_name): raise Exception("overload this in subclass") def supports_copypaste(self): return self.copypaste def cut_files(self): assert self.copypaste self.copypaste.cut() def copy_files(self): assert self.copypaste self.copypaste.copy() def paste_files(self): assert self.copypaste target = self.get_selected_file() assert target if os.path.isfile(target): target = os.path.dirname(target) self.copypaste.paste(target) class CopyPaste(object): def __init__(self, filebrowser): self.fb = filebrowser self.reset() def reset(self): self.mode = None self.paths = [] def get_selection_paths(self): selection = self.fb.get_selection_info(True) if selection: return selection["paths"] return [] def has_selection(self): return len(self.paths) > 0 def dirname(self, path): if os.path.isfile(path): path = os.path.dirname(path) return path def _conflicts(self, target): target = self.dirname(target) + os.sep folder = set(map(lambda x: self.dirname(x) + os.sep, self.paths)) if target in folder: return True for p in self.paths: p_isdir = os.path.isdir(p) if p_isdir: if target.startswith(p + os.sep): return True if p.startswith(target): _conf = p.find(os.sep, len(target)) < 0 if _conf: return True return False def conflicts(self, target): conf = self._conflicts(target) return conf def cut(self): self.paths = self.get_selection_paths() self.mode = "X" def copy(self): self.paths = self.get_selection_paths() self.mode = "C" def paste(self, target): # https://docs.python.org/3/library/shutil.html#shutil.move # depends on os.rename semantics try: if self.conflicts(target): messagebox.showerror( tr("Paste failed"), tr("There are conflicting folders"), parent=self ) return for f in self.paths: isfile = os.path.isfile(f) if self.mode == "C": if isfile: shutil.copy2(f, target) else: folder_target = os.path.join(target, os.path.basename(f)) shutil.copytree(f, folder_target, dirs_exist_ok=True) elif self.mode == "X": dest = shutil.move(f, target) else: raise Exception("unsupported mode") finally: self.reset() class BaseLocalFileBrowser(BaseFileBrowser): def __init__(self, master, show_expand_buttons=True): super().__init__(master, show_expand_buttons=show_expand_buttons) get_workbench().bind("WindowFocusIn", self.on_window_focus_in, True) get_workbench().bind("LocalFileOperation", self.on_local_file_operation, True) self.copypaste = CopyPaste(self) def destroy(self): super().destroy() get_workbench().unbind("WindowFocusIn", self.on_window_focus_in) get_workbench().unbind("LocalFileOperation", self.on_local_file_operation) def path_exists(self, path: str) -> Optional[bool]: return os.path.exists(path) def create_new_file_editor(self, path): get_workbench().get_editor_notebook().open_new_file(path) def request_dirs_child_data(self, node_id, paths): self.cache_dirs_child_data(get_dirs_children_info(paths, show_hidden_files())) self.render_children_from_cache(node_id) def split_path(self, path): parts = super().split_path(path) if running_on_windows() and path.startswith("\\\\"): # Don't split a network name! sep = self.get_dir_separator() for i in reversed(range(len(parts))): prefix = sep.join(parts[: i + 1]) if os.path.ismount(prefix): return [prefix] + parts[i + 1 :] # Could not find the prefix corresponding to mount return [path] else: return parts def open_file(self, path): get_workbench().get_editor_notebook().show_file(path) def open_path_with_system_app(self, path): try: open_with_default_app(path) except Exception as e: logger.error("Could not open %r in external. app", path, exc_info=e) messagebox.showerror( "Error", "Could not open '%s' in external app\nError: %s" % (path, e), parent=self.winfo_toplevel(), ) def on_window_focus_in(self, event=None): self.refresh_tree() def on_local_file_operation(self, event): if event["operation"] in ["save", "delete"]: self.refresh_tree() self.select_path_if_visible(event["path"]) def request_fs_info(self, path): if path == "": self.notify_missing_selection() else: if not os.path.isdir(path): path = os.path.dirname(path) import shutil self.present_fs_info(shutil.disk_usage(path)._asdict()) def perform_delete(self, paths, description): # Deprecated. moving to trash should be used instead raise NotImplementedError() def perform_move_to_trash(self, paths, description): # TODO: do it with subprocess dialog import send2trash for path in paths: send2trash.send2trash(path) def perform_mkdir(self, parent_dir, name): os.mkdir(os.path.join(parent_dir, name), mode=0o700) def supports_trash(self): try: import send2trash # @UnusedImport return True except ImportError: return False def supports_new_file(self): return True def supports_rename(self): return self.get_selected_file() def perform_rename(self, old_name, new_name): basepath = os.path.dirname(old_name) full_path = os.path.join(basepath, new_name) logger.debug("rename %s to %s" % (old_name, full_path)) if old_name == full_path: return if os.path.exists(full_path): raise UserError(tr("File already exists")) os.rename(old_name, full_path) class BaseRemoteFileBrowser(BaseFileBrowser): def __init__(self, master, show_expand_buttons=True): super().__init__(master, show_expand_buttons=show_expand_buttons) self.dir_separator = "/" get_workbench().bind("get_dirs_children_info_response", self.update_dir_data, True) get_workbench().bind("get_fs_info_response", self.present_fs_info, True) get_workbench().bind("RemoteFileOperation", self.on_remote_file_operation, True) def destroy(self): super().destroy() get_workbench().unbind("get_dirs_children_info_response", self.update_dir_data) get_workbench().unbind("get_fs_info_response", self.present_fs_info) get_workbench().unbind("RemoteFileOperation", self.on_remote_file_operation) def get_root_text(self): runner = get_runner() if runner: return runner.get_node_label() return "Back-end" def create_new_file_editor(self, path): get_workbench().get_editor_notebook().open_new_file(path, remote=True) def request_dirs_child_data(self, node_id, paths): if get_runner(): get_runner().send_command( InlineCommand( "get_dirs_children_info", node_id=node_id, paths=paths, include_hidden=show_hidden_files(), ) ) def request_fs_info(self, path): if get_runner(): get_runner().send_command(InlineCommand("get_fs_info", path=path)) def get_dir_separator(self): return self.dir_separator def update_dir_data(self, msg): if msg.get("error"): self.show_error(msg["error"]) else: self.dir_separator = msg["dir_separator"] self.cache_dirs_child_data(msg["data"]) self.render_children_from_cache(msg["node_id"]) if self.path_to_highlight: self.select_path_if_visible(self.path_to_highlight) self.path_to_highlight = None def open_file(self, path): get_workbench().get_editor_notebook().show_remote_file(path) def open_path_with_system_app(self, path): messagebox.showinfo( tr("Not supported"), tr("Opening remote files in external app is not supported.") + "\n\n" + tr( "If it is a text file, then you can configure it to open in Thonny " "by right-clicking it and selecting 'Configure ... files'." ) + "\n\n" + tr( "If the file needs to be opened in external app, then download it to a local " "directory and open it from there!" ), master=self, ) def supports_directories(self): runner = get_runner() if not runner: return False proxy = runner.get_backend_proxy() if not proxy: return False return proxy.supports_remote_directories() def on_remote_file_operation(self, event): path = event["path"] exists_in_cache = self.file_exists_in_cache(path) if ( event["operation"] == "save" and exists_in_cache or event["operation"] == "delete" and not exists_in_cache ): # No need to refresh return if "/" in path: parent = path[: path.rfind("/")] if not parent: parent = "/" else: parent = "" self.refresh_tree([parent]) self.path_to_highlight = path def perform_delete(self, paths, description): get_runner().send_command_and_wait( InlineCommand("delete", paths=paths, description=description), dialog_title=tr("Deleting"), ) def perform_mkdir(self, parent_dir, name): path = (parent_dir + self.get_dir_separator() + name).replace("//", "/") get_runner().send_command_and_wait( InlineCommand("mkdir", path=path), dialog_title=tr("Creating directory"), ) def supports_trash(self): return get_runner().get_backend_proxy().supports_trash() def request_focus_into(self, path): if not get_runner().ready_for_remote_file_operations(show_message=True): return False # super().request_focus_into(path) if not get_runner().supports_remote_directories(): assert path == "" self.focus_into(path) elif self.current_focus == path: # refreshes self.focus_into(path) else: self.request_new_focus(path) return True def request_new_focus(self, path): # Overridden in active browser self.focus_into(path) def cmd_refresh_tree(self): if not get_runner().ready_for_remote_file_operations(show_message=True): return super().cmd_refresh_tree() def perform_rename(self, old_name, new_name): # TODO: raise NotImplementedError() class DialogRemoteFileBrowser(BaseRemoteFileBrowser): def __init__(self, master, dialog): super().__init__(master, show_expand_buttons=False) self.dialog = dialog self.tree["show"] = ("tree", "headings") self.tree.configure(displaycolumns=(5,)) self.tree.configure(height=10) def open_file(self, path): self.dialog.double_click_file(path) def should_open_name_in_thonny(self, name): # In dialog, all file types are to be opened in Thonny return True class BackendFileDialog(CommonDialog): def __init__(self, master, kind, initial_dir): super().__init__(master=master) self.result = None self.updating_selection = False self.kind = kind if kind == "open": self.title(tr("Open from %s") % get_runner().get_node_label()) else: assert kind == "save" self.title(tr("Save to %s") % get_runner().get_node_label()) background = ttk.Frame(self) background.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.browser = DialogRemoteFileBrowser(background, self) self.browser.grid( row=0, column=0, columnspan=4, sticky="nsew", pady=self.get_large_padding(), padx=self.get_large_padding(), ) self.browser.configure(borderwidth=1, relief="groove") self.browser.tree.configure(selectmode="browse") self.name_label = ttk.Label(background, text=tr("File name:")) self.name_label.grid( row=1, column=0, pady=(0, self.get_large_padding()), padx=self.get_large_padding(), sticky="w", ) self.name_var = create_string_var("") self.name_entry = ttk.Entry( background, textvariable=self.name_var, state="normal" if kind == "save" else "disabled" ) self.name_entry.grid( row=1, column=1, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="we", ) self.name_entry.bind("", self.on_name_edit, True) self.ok_button = ttk.Button(background, text=tr("OK"), command=self.on_ok) self.ok_button.grid( row=1, column=2, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="e", ) self.cancel_button = ttk.Button(background, text=tr("Cancel"), command=self.on_cancel) self.cancel_button.grid( row=1, column=3, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="e", ) background.rowconfigure(0, weight=1) background.columnconfigure(1, weight=1) self.bind("", self.on_cancel, True) self.bind("", self.on_ok, True) self.protocol("WM_DELETE_WINDOW", self.on_cancel) self.tree_select_handler_id = self.browser.tree.bind( "<>", self.on_tree_select, True ) self.browser.request_focus_into(initial_dir) self.name_entry.focus_set() def on_ok(self, event=None): tree = self.browser.tree name = self.name_var.get() if not name: messagebox.showerror(tr("Error"), tr("You need to select a file!"), master=self) return for node_id in tree.get_children(""): if name and name == tree.set(node_id, "name"): break else: node_id = None if node_id is not None: node_kind = tree.set(node_id, "kind") if node_kind != "file": messagebox.showerror(tr("Error"), tr("You need to select a file!"), master=self) return elif self.kind == "save": if not messagebox.askyesno( tr("Overwrite?"), tr("Do you want to overwrite '%s' ?") % name, master=self ): return parent_path = tree.set("", "path") if parent_path == "" or parent_path.endswith("/"): self.result = parent_path + name else: self.result = parent_path + "/" + name self.destroy() def on_cancel(self, event=None): self.result = None self.destroy() def on_tree_select(self, event=None): if self.updating_selection: return if self.browser.get_selected_kind() == "file": name = self.browser.get_selected_name() if name: self.name_var.set(name) def on_name_edit(self, event=None): self.updating_selection = True tree = self.browser.tree if self.tree_select_handler_id: tree.unbind("<>", self.tree_select_handler_id) self.tree_select_handler_id = None name = self.name_var.get() for node_id in tree.get_children(""): if name == tree.set(node_id, "name"): tree.selection_add(node_id) else: tree.selection_remove(node_id) self.updating_selection = False self.tree_select_handler_id = tree.bind("<>", self.on_tree_select, True) def double_click_file(self, path): assert path.endswith(self.name_var.get()) self.on_ok() def set_initial_focus(self, node=None) -> bool: self.name_entry.focus_set() return True class NodeChoiceDialog(CommonDialog): def __init__(self, master, prompt): super().__init__(master=master) self.result = None self.title(prompt) background = ttk.Frame(self) background.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) local_caption = get_local_files_root_text() remote_caption = get_runner().get_node_label() button_width = max(len(local_caption), len(remote_caption)) + 10 self.local_button = ttk.Button( background, text=" \n" + local_caption + "\n ", width=button_width, command=self.on_local, ) self.local_button.grid(row=0, column=0, pady=20, padx=20) self.remote_button = ttk.Button( background, text=" \n" + remote_caption + "\n ", width=button_width, command=self.on_remote, ) self.remote_button.grid(row=1, column=0, pady=(0, 20), padx=20) self.local_button.focus_set() self.bind("", self.on_cancel, True) self.bind("", self.on_return, True) self.bind("", self.on_down, True) self.bind("", self.on_up, True) self.protocol("WM_DELETE_WINDOW", self.on_cancel) def on_local(self, event=None): self.result = "local" self.destroy() def on_remote(self, event=None): self.result = "remote" self.destroy() def on_return(self, event=None): if self.focus_get() == self.local_button: self.on_local(event) elif self.focus_get() == self.remote_button: self.on_remote(event) def on_down(self, event=None): if self.focus_get() == self.local_button: self.remote_button.focus_set() def on_up(self, event=None): if self.focus_get() == self.remote_button: self.local_button.focus_set() def on_cancel(self, event=None): self.result = None self.destroy() def ask_backend_path(master, dialog_kind): proxy = get_runner().get_backend_proxy() if not proxy: return None assert proxy.supports_remote_files() dlg = BackendFileDialog(master, dialog_kind, proxy.get_cwd()) show_dialog(dlg, master) return dlg.result def choose_node_for_file_operations(master, prompt): if get_runner().supports_remote_files(): dlg = NodeChoiceDialog(master, prompt) show_dialog(dlg, master) if dlg.result == "remote" and not get_runner().ready_for_remote_file_operations( show_message=True ): return None return dlg.result else: return "local" def get_local_files_root_text(): global _LOCAL_FILES_ROOT_TEXT if not _LOCAL_FILES_ROOT_TEXT: # translation can't be done in module load time _LOCAL_FILES_ROOT_TEXT = tr("This computer") return _LOCAL_FILES_ROOT_TEXT def get_file_handler_conf_key(extension): return "file_default_handlers.%s" % extension def show_hidden_files(): return get_workbench().get_option(HIDDEN_FILES_OPTION) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/codeview.py0000644000076600000240000005252514730022736017120 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import codecs import io import os import re import sys import time import tkinter as tk from logging import getLogger from tkinter import messagebox from typing import Dict, Union # @UnusedImport from thonny import get_workbench, roughparse, tktextext, ui_utils from thonny.common import TextRange from thonny.tktextext import EnhancedText from thonny.ui_utils import EnhancedTextWithLogging, ask_string, scrollbar_style _syntax_options = {} # type: Dict[str, Union[str, int]] # BREAKPOINT_SYMBOL = "•" # Bullet # BREAKPOINT_SYMBOL = "○" # White circle BREAKPOINT_SYMBOL = "●" # Black circle OLD_MAC_LINEBREAK = re.compile("\r(?!\n)") UNIX_LINEBREAK = re.compile("(?", self._start_toggle_breakpoint, True) self._gutter.bind("", self._consider_toggle_breakpoint, True) # self.text.tag_configure("breakpoint_line", background="pink") self._gutter.tag_configure("breakpoint", foreground="crimson") editor_font = tk.font.nametofont("EditorFont") spacer_font = editor_font.copy() spacer_font.configure(size=editor_font.cget("size") // 4) self._gutter.tag_configure("spacer", font=spacer_font) self._gutter.tag_configure("active", font="BoldEditorFont") self._gutter.tag_raise("spacer") def get_content(self): return self.text.get("1.0", "end-1c") # -1c because Text always adds a newline itself def detect_encoding(self, data): enc = self.detect_encoding_without_check(data) try: codecs.lookup(enc) return enc except LookupError: messagebox.showerror( "Error", "Unknown encoding '%s'. Using utf-8 instead" % enc, master=self ) return "utf-8" def detect_encoding_without_check(self, data): if self.text.is_python_text(): import tokenize encoding, _ = tokenize.detect_encoding(io.BytesIO(data).readline) return encoding else: ENCODING_MARKER = re.compile( rb"(charset|coding)[\t ]*[=: ][\t ]*[\"\']?([a-z][0-9a-z-_ ]*[0-9a-z])[\"\'\n\r\t ]?", re.IGNORECASE, ) for line in data[:1024].splitlines(): match = ENCODING_MARKER.search(line) if match and len(match.group(2)) > 2: return match.group(2).decode("ascii", errors="replace") return "UTF-8" def set_file_type(self, file_type): self.text.set_file_type(file_type) def get_content_as_bytes(self): content = self.get_content() for callback in get_workbench().iter_save_hooks(): content = callback(self, content=content) # convert all linebreaks to original format content = OLD_MAC_LINEBREAK.sub(self._original_newlines, content) content = WINDOWS_LINEBREAK.sub(self._original_newlines, content) content = UNIX_LINEBREAK.sub(self._original_newlines, content) return content.encode(self.detect_encoding(content.encode("ascii", errors="replace"))) def set_content_as_bytes(self, data, keep_undo=False): encoding = self.detect_encoding(data) logger.debug("Detected encoding %s", encoding) while True: try: chars = data.decode(encoding) if self.looks_like_text(chars): self.set_content(chars, keep_undo) return True except UnicodeDecodeError: pass encoding = ask_string( "Bad encoding", "Could not read as %s text.\nYou could try another encoding" % encoding, initial_value=encoding, options=get_proposed_encodings(), master=self.winfo_toplevel(), ) if not encoding: return False def looks_like_text(self, chars): if not chars: return True non_text_char_count = 0 for ch in chars: if ch in NON_TEXT_CHARS: non_text_char_count += 1 return non_text_char_count / len(chars) < 0.01 def set_content(self, content, keep_undo=False): content, self._original_newlines = tweak_newlines(content) for callback in get_workbench().iter_load_hooks(): content = callback(self, content=content) self.text.direct_delete("1.0", tk.END) self.text.direct_insert("1.0", content) if not keep_undo: self.text.edit_reset() def _start_toggle_breakpoint(self, event): self._start_toggle_breakpoint_index = "@%d,%d" % (event.x, event.y) def _consider_toggle_breakpoint(self, event): if time.time() - self._last_toggle_breakpoint_time < 0.3: # it was probably a double-click. Don't want to double-toggle in this case. return index = "@%d,%d" % (event.x, event.y) if index != self._start_toggle_breakpoint_index: # it was probably a drag return start_index = index + " linestart" end_index = index + " lineend" if self.text.tag_nextrange("breakpoint_line", start_index, end_index): self.text.tag_remove("breakpoint_line", start_index, end_index) else: line_content = self.text.get(start_index, end_index).strip() if line_content and line_content[0] != "#": self.text.tag_add("breakpoint_line", start_index, end_index) self.update_gutter(clean=True) self._last_toggle_breakpoint_time = time.time() def _clean_selection(self): self.text.tag_remove("sel", "1.0", "end") self._gutter.tag_remove("sel", "1.0", "end") def _text_changed(self, event): self.update_gutter( clean=self.text._last_event_changed_line_count and self.text.tag_ranges("breakpoint_line") ) def compute_gutter_line(self, lineno, plain=False): if plain: yield str(lineno) + " ", () else: visual_line_number = self._first_line_number + lineno - 1 linestart = str(visual_line_number) + ".0" yield str(lineno), () if self.text.tag_nextrange("breakpoint_line", linestart, linestart + " lineend"): yield BREAKPOINT_SYMBOL, ("breakpoint",) else: yield " ", () def select_range(self, text_range): self.text.tag_remove("sel", "1.0", tk.END) if text_range: if isinstance(text_range, int): # it's line number start = str(text_range - self._first_line_number + 1) + ".0" end = str(text_range - self._first_line_number + 1) + ".end" elif isinstance(text_range, TextRange): start = "%s.%s" % ( text_range.lineno - self._first_line_number + 1, text_range.col_offset, ) end = "%s.%s" % ( text_range.end_lineno - self._first_line_number + 1, text_range.end_col_offset, ) else: assert isinstance(text_range, tuple) start, end = text_range self.text.tag_add("sel", start, end) if isinstance(text_range, int): self.text.mark_set("insert", end) self.text.see("%s -1 lines" % start) def get_breakpoint_line_numbers(self): result = set() for num_line in self._gutter.get("1.0", "end").splitlines(): if BREAKPOINT_SYMBOL in num_line: result.add(int(num_line.replace(BREAKPOINT_SYMBOL, ""))) return result def get_selected_range(self): if self.text.has_selection(): lineno, col_offset = map(int, self.text.index(tk.SEL_FIRST).split(".")) end_lineno, end_col_offset = map(int, self.text.index(tk.SEL_LAST).split(".")) else: lineno, col_offset = map(int, self.text.index(tk.INSERT).split(".")) end_lineno, end_col_offset = lineno, col_offset return TextRange(lineno, col_offset, end_lineno, end_col_offset) def destroy(self): super().destroy() get_workbench().unbind("SyntaxThemeChanged", self._reload_theme_options) def _reload_gutter_theme_options(self, event=None): # super()._reload_gutter_theme_options(event) if "GUTTER" in _syntax_options: opts = _syntax_options["GUTTER"].copy() if "background" in opts and "selectbackground" not in opts: opts["selectbackground"] = opts["background"] opts["inactiveselectbackground"] = opts["background"] if "foreground" in opts and "selectforeground" not in opts: opts["selectforeground"] = opts["foreground"] self._gutter.configure(opts) if "background" in opts: background = opts["background"] self._margin_line.configure(background=background) self._gutter.tag_configure("sel", background=background) if "breakpoint" in _syntax_options: self._gutter.tag_configure("breakpoint", _syntax_options["breakpoint"]) def set_syntax_options(syntax_options): global _syntax_options _syntax_options = syntax_options get_workbench().event_generate("SyntaxThemeChanged") def get_syntax_options_for_tag(tag, **base_options): global _syntax_options if tag in _syntax_options: base_options.update(_syntax_options[tag]) return base_options def tweak_newlines(content): cr_count = len(OLD_MAC_LINEBREAK.findall(content)) lf_count = len(UNIX_LINEBREAK.findall(content)) crlf_count = len(WINDOWS_LINEBREAK.findall(content)) if cr_count > 0 and lf_count == 0 and crlf_count == 0: original_newlines = "\r" elif crlf_count > 0 and lf_count == 0 and cr_count == 0: original_newlines = "\r\n" elif lf_count > 0 and crlf_count == 0 and cr_count == 0: original_newlines = "\n" else: original_newlines = os.linesep content = OLD_MAC_LINEBREAK.sub("\n", content) content = WINDOWS_LINEBREAK.sub("\n", content) return content, original_newlines def perform_python_return(text: EnhancedText, event): # copied from idlelib.EditorWindow (Python 3.4.2) # slightly modified # pylint: disable=lost-exception assert text is event.widget assert isinstance(text, EnhancedText) try: # delete selection first, last = text.get_selection_indices() if first and last: text.delete(first, last) text.mark_set("insert", first) # Strip whitespace after insert point # (ie. don't carry whitespace from the right of the cursor over to the new line) while text.get("insert") in [" ", "\t"]: text.delete("insert") left_part = text.get("insert linestart", "insert") # locate first non-white character i = 0 n = len(left_part) while i < n and left_part[i] in " \t": i = i + 1 # is it only whitespace? if i == n: # start the new line with the same whitespace text.insert("insert", "\n" + left_part) return "break" # Turned out the left part contains visible chars # Remember the indent indent = left_part[:i] # Strip whitespace before insert point # (ie. after inserting the linebreak this line doesn't have trailing whitespace) while text.get("insert-1c", "insert") in [" ", "\t"]: text.delete("insert-1c", "insert") # start new line text.insert("insert", "\n") # adjust indentation for continuations and block # open/close first need to find the last stmt lno = tktextext.index2line(text.index("insert")) y = roughparse.RoughParser(text.indent_width, text.tabwidth) for context in roughparse.NUM_CONTEXT_LINES: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" rawtext = text.get(startatindex, "insert") y.set_str(rawtext) bod = y.find_good_parse_start( False, roughparse._build_char_in_string_func(startatindex) ) if bod is not None or startat == 1: break y.set_lo(bod or 0) c = y.get_continuation_type() if c != roughparse.C_NONE: # The current stmt hasn't ended yet. if c == roughparse.C_STRING_FIRST_LINE: # after the first line of a string; do not indent at all pass elif c == roughparse.C_STRING_NEXT_LINES: # inside a string which started before this line; # just mimic the current indent text.insert("insert", indent) elif c == roughparse.C_BRACKET: # line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the # last open bracket text._reindent_to(y.compute_bracket_indent()) elif c == roughparse.C_BACKSLASH: # if more than one line in this stmt already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of # non-whitespace on initial line if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: text._reindent_to(y.compute_backslash_indent()) else: assert 0, "bogus continuation type %r" % (c,) return "break" # This line starts a brand new stmt; indent relative to # indentation of initial line of closest preceding # interesting stmt. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): text.perform_smart_tab(event) elif indent and y.is_block_closer(): text.perform_smart_backspace(event) return "break" finally: text.see("insert") text.event_generate("<>") return "break" def perform_simple_return(text: EnhancedText, event): assert text is event.widget assert isinstance(text, EnhancedText) text._log_keypress_for_undo(event) try: # delete selection first, last = text.get_selection_indices() if first and last: text.delete(first, last) text.mark_set("insert", first) # Strip whitespace after insert point # (ie. don't carry whitespace from the right of the cursor over to the new line) while text.get("insert") in [" ", "\t"]: text.delete("insert") left_part = text.get("insert linestart", "insert") # locate first non-white character i = 0 n = len(left_part) while i < n and left_part[i] in " \t": i = i + 1 # start the new line with the same whitespace text.insert("insert", "\n" + left_part[:i]) return "break" finally: text.see("insert") text.event_generate("<>") return "break" class BinaryFileException(RuntimeError): pass def get_proposed_encodings(): # https://w3techs.com/technologies/overview/character_encoding result = [ "UTF-8", "ISO-8859-1", "Windows-1251", "Windows-1252", "GB2312", "Shift JIS", "GBK", "EUC-KR", "ISO-8859-9", "Windows-1254", "EUC-JP", "Big5", "ISO-8859-2 ", "Windows-1250", "Windows-874", "Windows-1256", "ISO-8859-15", "US-ASCII", "Windows-1255", "TIS-620", "ISO-8859-7", "Windows-1253", "UTF-16", "KOI8-R", "GB18030", "Windows-1257", "KS C 5601", "UTF-7", "ISO-8859-8", "Windows-31J", "ISO-8859-5", "ISO-8859-6", "ISO-8859-4", "ANSI_X3.110-1983", "ISO-8859-3", "KOI8-U", "Big5 HKSCS", "ISO-2022-JP", "Windows-1258", "ISO-8859-13", "ISO-8859-14", "Windows-949", "ISO-8859-10", "ISO-8859-11", "ISO-8859-16", ] sys_enc = sys.getdefaultencoding() for item in result[:]: if item.lower() == sys_enc.lower(): result.remove(item) sys_enc = item result.insert(0, sys_enc) return result ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/common.py0000644000076600000240000005624414730022736016605 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- """ Classes used both by front-end and back-end """ import os.path import site import sys from collections import namedtuple from dataclasses import dataclass from logging import getLogger from typing import Any, Callable, Dict, List, Optional, Tuple # @UnusedImport logger = getLogger(__name__) STRING_PSEUDO_FILENAME = "" REPL_PSEUDO_FILENAME = "" MESSAGE_MARKER = "\x02" OBJECT_LINK_START = "[object_link_for_thonny=%d]" OBJECT_LINK_END = "[/object_link_for_thonny]" REMOTE_PATH_MARKER = " :: " PROCESS_ACK = "OK" IGNORED_FILES_AND_DIRS = [ "System Volume Information", "._.Trashes", ".Trashes", "__MACOSX", ".DS_Store", ] ValueInfo = namedtuple("ValueInfo", ["id", "repr"]) FrameInfo = namedtuple( "FrameInfo", [ "id", "filename", "module_name", "code_name", "source", "lineno", "firstlineno", "in_library", "locals", "globals", "freevars", "event", "focus", "node_tags", "current_statement", "current_root_expression", "current_evaluations", ], ) TextRange = namedtuple("TextRange", ["lineno", "col_offset", "end_lineno", "end_col_offset"]) @dataclass(frozen=True) class DistInfo: key: str project_name: str version: str location: str class Record: def __init__(self, **kw): self.__dict__.update(kw) def update(self, e, **kw): self.__dict__.update(e, **kw) def setdefault(self, **kw): "updates those fields that are not yet present (similar to dict.setdefault)" for key in kw: if not hasattr(self, key): setattr(self, key, kw[key]) def get(self, key, default=None): return self.__dict__.get(key, default) def __getitem__(self, key): return self.__dict__[key] def __delitem__(self, key): self.__dict__.__delitem__(key) def __setitem__(self, key, value): self.__dict__[key] = value def __contains__(self, key): return key in self.__dict__ def __repr__(self): keys = self.__dict__.keys() items = ("{}={}".format(k, repr(self.__dict__[k])) for k in keys) return "{}({})".format(self.__class__.__name__, ", ".join(items)) def __str__(self): keys = sorted(self.__dict__.keys()) items = ("{}={}".format(k, repr(self.__dict__[k])) for k in keys) return "{}({})".format(self.__class__.__name__, ", ".join(items)) def __eq__(self, other): # pylint: disable=unidiomatic-typecheck if type(self) != type(other): return False if len(self.__dict__) != len(other.__dict__): return False for key in self.__dict__: if not hasattr(other, key): return False self_value = getattr(self, key) other_value = getattr(other, key) if type(self_value) != type(other_value) or self_value != other_value: return False return True def __ne__(self, other): return not self.__eq__(other) def __hash__(self): return hash(repr(self)) def range_contains_smaller(one: TextRange, other: TextRange) -> bool: this_start = (one.lineno, one.col_offset) this_end = (one.end_lineno, one.end_col_offset) other_start = (other.lineno, other.col_offset) other_end = (other.end_lineno, other.end_col_offset) return ( this_start < other_start and this_end > other_end or this_start == other_start and this_end > other_end or this_start < other_start and this_end == other_end ) def range_contains_smaller_or_equal(one: TextRange, other: TextRange) -> bool: return range_contains_smaller(one, other) or one == other class InputSubmission(Record): """For sending data to backend's stdin""" def __init__(self, data: str, **kw) -> None: super().__init__(**kw) self.data = data class CommandToBackend(Record): """Command meant for the back-end""" def __init__(self, name: str, **kw) -> None: super().__init__(**kw) self.name = name class ImmediateCommand(CommandToBackend): pass class EOFCommand(CommandToBackend): def __init__(self, **kw) -> None: if "name" in kw: del kw["name"] super().__init__("eof", **kw) class ToplevelCommand(CommandToBackend): def __init__(self, name: str, argv: List[str] = [], **kw) -> None: super().__init__(name, **kw) self.argv = argv class DebuggerCommand(CommandToBackend): pass class InlineCommand(CommandToBackend): """ Can be used both during debugging and in waiting_toplevel_command state (eg. for sending variable and heap info requests) """ pass class MessageFromBackend(Record): def __init__(self, **kw) -> None: self.event_type = type(self).__name__ # allow event_type to be overridden by kw super().__init__(**kw) if not hasattr(self, "sequence"): self.sequence = self.event_type class ToplevelResponse(MessageFromBackend): pass class DebuggerResponse(MessageFromBackend): pass class BackendEvent(MessageFromBackend): def __init__(self, event_type: str, **kw) -> None: super().__init__(**kw) self.event_type = event_type class OscEvent(BackendEvent): def __init__(self, text: str): self.text = text super().__init__("OscEvent") def __repr__(self): return f"OscEvent({self.text!r})" class InlineResponse(MessageFromBackend): def __init__(self, command_name: str, **kw) -> None: super().__init__(**kw) self.command_name = command_name self.event_type = self.command_name + "_response" def serialize_message(msg: Record, max_line_length=65536) -> str: # I want to transfer only ASCII chars because encodings are not reliable # (eg. can't find a way to specify PYTHONIOENCODING for cx_freeze'd program) # The possibility for splitting message into several lines is required because of # default (safe) window size in Paramiko (https://github.com/thonny/thonny/issues/1680) msg_str = ascii(msg) lines = [] for i in range(0, len(msg_str), max_line_length): lines.append(msg_str[i : i + max_line_length]) return MESSAGE_MARKER + str(len(lines)) + " " + "\n".join(lines) def parse_message(msg_string: str) -> Record: # DataFrames may have nan # pylint: disable=unused-variable nan = float("nan") # @UnusedVariable assert msg_string[0] == MESSAGE_MARKER assert msg_string.strip().endswith(")") msg_start = msg_string.index(" ") line_count = int(msg_string[1:msg_start]) assert line_count == msg_string.strip().count("\n") + 1 return eval(msg_string[msg_start:].replace("\n", "")) def normpath_with_actual_case(name: str) -> str: """In Windows return the path with the case it is stored in the filesystem""" if not os.path.exists(name): return os.path.normpath(name) if os.name == "nt": try: # https://stackoverflow.com/questions/2113822/python-getting-filename-case-as-stored-in-windows/2114975 norm_name = os.path.normpath(name) from ctypes import create_unicode_buffer, windll buf = create_unicode_buffer(512) # GetLongPathNameW alone doesn't fix filename part windll.kernel32.GetShortPathNameW(norm_name, buf, 512) # @UndefinedVariable windll.kernel32.GetLongPathNameW(buf.value, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != norm_name.casefold(): # Sometimes GetShortPathNameW + GetLongPathNameW doesn't work # see eg. https://github.com/thonny/thonny/issues/925 windll.kernel32.GetLongPathNameW(norm_name, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != norm_name.casefold(): result = norm_name if result[1] == ":": # ensure drive letter is capital return result[0].upper() + result[1:] else: return result except Exception: logger.warning( "Could not compute normpath_with_actual_case for %r", name, exc_info=True ) return os.path.normpath(name) else: # easy on Linux # too difficult on mac # https://stackoverflow.com/questions/14515073/in-python-on-osx-with-hfs-how-can-i-get-the-correct-case-of-an-existing-filenam # Hopefully only correct case comes into Thonny (eg. via open dialog) return os.path.normpath(name) def is_same_path(name1: str, name2: str) -> bool: return os.path.normpath(os.path.normcase(name1)) == os.path.normpath(os.path.normcase(name2)) def path_startswith(child_name: str, dir_name: str) -> bool: normchild = os.path.normpath(os.path.normcase(child_name)) normdir = os.path.normpath(os.path.normcase(dir_name)) return normdir == normchild or normchild.startswith(normdir.rstrip(os.path.sep) + os.path.sep) def read_source(filename): import tokenize with tokenize.open(filename) as fp: return fp.read() def get_exe_dirs(): result = [] if site.ENABLE_USER_SITE: if sys.platform == "win32": if site.getusersitepackages(): result.append(site.getusersitepackages().replace("site-packages", "Scripts")) else: if site.getuserbase(): result.append(site.getuserbase() + "/bin") main_scripts = os.path.join(sys.prefix, "Scripts") if os.path.isdir(main_scripts) and main_scripts not in result: result.append(main_scripts) if os.path.dirname(sys.executable) not in result: result.append(os.path.dirname(sys.executable)) # These entries are used by Anaconda for part in [ "Library/mingw-w64/bin", "Library/usr/bin", "Library/bin", "Scripts", "bin", "condabin", ]: dirpath = os.path.join(sys.prefix, part.replace("/", os.sep)) if os.path.isdir(dirpath) and dirpath not in result: result.append(dirpath) if sys.platform != "win32" and "/usr/local/bin" not in result: # May be missing on macOS, when started as bundle # (yes, more may be missing, but this one is most useful) result.append("/usr/local/bin") return result def get_site_dir(symbolic_name, executable=None): if not executable or executable == sys.executable: result = getattr(site, symbolic_name, "") else: import subprocess result = ( subprocess.check_output( [executable, "-m", "site", "--" + symbolic_name.lower().replace("_", "-")], universal_newlines=True, ) .decode() .strip() ) return result if result else None def get_base_executable(): if sys.exec_prefix == sys.base_exec_prefix: return sys.executable if sys.platform == "win32": guess = sys.base_exec_prefix + "\\" + os.path.basename(sys.executable) if os.path.isfile(guess): return normpath_with_actual_case(guess) if os.path.islink(sys.executable): return os.path.realpath(sys.executable) raise RuntimeError("Don't know how to locate base executable") def get_augmented_system_path(extra_dirs): path_items = os.environ.get("PATH", "").split(os.pathsep) for d in reversed(extra_dirs): if d not in path_items: path_items.insert(0, d) return os.pathsep.join(path_items) def update_system_path(env, value): # in Windows, env keys are not case sensitive # this is important if env is a dict (not os.environ) if sys.platform == "win32": found = False for key in env: if key.upper() == "PATH": found = True env[key] = value if not found: env["PATH"] = value else: env["PATH"] = value @dataclass class SignatureParameter: kind: str name: str annotation: Optional[str] default: Optional[str] @dataclass class SignatureInfo: name: str params: List[SignatureParameter] return_type: Optional[str] current_param_index: Optional[int] = None call_bracket_start: Optional[Tuple[int, int]] = None @dataclass class CompletionInfo: name: str name_with_symbols: str full_name: str type: str prefix_length: int # the number of chars to be deleted before inserting name signatures: Optional[List[SignatureInfo]] docstring: Optional[str] module_name: Optional[str] module_path: Optional[str] @dataclass class NameReference: module_name: str module_path: str row: int column: int length: int class UserError(RuntimeError): """Errors of this class are meant to be presented without stacktrace""" pass def is_hidden_or_system_file(path: str) -> bool: if os.path.basename(path).startswith("."): return True elif sys.platform == "win32": from ctypes import windll FILE_ATTRIBUTE_HIDDEN = 0x2 FILE_ATTRIBUTE_SYSTEM = 0x4 return bool( windll.kernel32.GetFileAttributesW(path) # @UndefinedVariable & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM) ) else: return False def get_dirs_children_info( paths: List[str], include_hidden: bool = False ) -> Dict[str, Optional[Dict[str, Dict]]]: return {path: get_single_dir_child_data(path, include_hidden) for path in paths} def get_single_dir_child_data(path: str, include_hidden: bool = False) -> Optional[Dict[str, Dict]]: if path == "": if sys.platform == "win32": return {**get_windows_volumes_info(), **get_windows_network_locations()} else: return get_single_dir_child_data("/", include_hidden) elif os.path.isdir(path) or os.path.ismount(path): result = {} try: for child in os.listdir(path): full_child_path = os.path.join(path, child) if not os.path.exists(full_child_path): # must be broken link continue full_child_path = normpath_with_actual_case(full_child_path) hidden = is_hidden_or_system_file(full_child_path) if not hidden or include_hidden: name = os.path.basename(full_child_path) st = os.stat(full_child_path, dir_fd=None, follow_symlinks=True) result[name] = { "size": None if os.path.isdir(full_child_path) else st.st_size, "modified": st.st_mtime, "hidden": hidden, } except PermissionError: result[""] = { "kind": "error", "size": -1, "modified": None, "hidden": None, } return result else: return None def get_windows_volumes_info(): # http://stackoverflow.com/a/2288225/261181 # http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939%28v=vs.85%29.aspx import string from ctypes import windll all_drive_types = [ "DRIVE_UNKNOWN", "DRIVE_NO_ROOT_DIR", "DRIVE_REMOVABLE", "DRIVE_FIXED", "DRIVE_REMOTE", "DRIVE_CDROM", "DRIVE_RAMDISK", ] required_drive_types = ["DRIVE_REMOVABLE", "DRIVE_FIXED", "DRIVE_REMOTE", "DRIVE_RAMDISK"] result = {} bitmask = windll.kernel32.GetLogicalDrives() # @UndefinedVariable for letter in string.ascii_uppercase: if not bitmask & 1: pass else: drive_type = all_drive_types[ windll.kernel32.GetDriveTypeW("%s:\\" % letter) ] # @UndefinedVariable # NB! Drive A can be present in bitmask but actually missing. # In this case querying information about it would freeze the UI # for several seconds. # One solution is to uninstall the device in device manager, # but OS may restore the drive later. # Therefore it is safest to skip A drive (user can access it via Open dialog) if drive_type in required_drive_types and ( letter != "A" or drive_type != "DRIVE_REMOVABLE" ): drive = letter + ":" path = drive + "\\" try: st = os.stat(path) volume_name = get_windows_volume_name(path) if not volume_name: volume_name = "Disk" label = volume_name + " (" + drive + ")" result[path] = { "label": label, "size": None, "modified": max(st.st_mtime, st.st_ctime), } except OSError as e: logger.warning("Could not get information for %s", path, exc_info=e) bitmask >>= 1 return result def get_windows_volume_name(path): # https://stackoverflow.com/a/12056414/261181 import ctypes kernel32 = ctypes.windll.kernel32 volume_name_buffer = ctypes.create_unicode_buffer(1024) file_system_name_buffer = ctypes.create_unicode_buffer(1024) serial_number = None max_component_length = None file_system_flags = None result = kernel32.GetVolumeInformationW( ctypes.c_wchar_p(path), volume_name_buffer, ctypes.sizeof(volume_name_buffer), serial_number, max_component_length, file_system_flags, file_system_name_buffer, ctypes.sizeof(file_system_name_buffer), ) if result: return volume_name_buffer.value else: return None def get_windows_network_locations(): import ctypes.wintypes CSIDL_NETHOOD = 0x13 SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(0, CSIDL_NETHOOD, 0, SHGFP_TYPE_CURRENT, buf) shortcuts_dir = buf.value if not buf.value: logger.warning("Could not determine windows shortcuts directory") return {} result = {} for entry in os.scandir(shortcuts_dir): # full_path = normpath_with_actual_case(entry.path) lnk_path = os.path.join(entry.path, "target.lnk") if os.path.exists(lnk_path): try: target = get_windows_lnk_target(lnk_path) result[target] = { "label": entry.name + " (" + target + ")", "size": None, "modified": None, } except Exception: logger.error("Can't get target from %s", lnk_path, exc_info=True) return result def get_windows_lnk_target(lnk_file_path): import subprocess import thonny script_path = os.path.join(os.path.dirname(thonny.__file__), "res", "PrintLnkTarget.vbs") cmd = ["cscript", "/NoLogo", script_path, lnk_file_path] result = subprocess.check_output(cmd, universal_newlines=True, timeout=3) return result.strip() def execute_system_command(cmd, cwd=None, disconnect_stdin=False): import subprocess logger.debug("execute_system_command, cmd=%r, cwd=%s", cmd, cwd) env = dict(os.environ).copy() encoding = "utf-8" env["PYTHONIOENCODING"] = encoding # Make sure this python interpreter and its scripts are available # in PATH update_system_path(env, get_augmented_system_path(get_exe_dirs())) popen_kw = dict( env=env, universal_newlines=True, bufsize=0, ) if cwd and os.path.isdir(cwd): popen_kw["cwd"] = cwd if disconnect_stdin: popen_kw["stdin"] = subprocess.DEVNULL if sys.version_info >= (3, 6): popen_kw["errors"] = "replace" popen_kw["encoding"] = encoding if isinstance(cmd.cmd_line, str) and cmd.cmd_line.startswith("!"): cmd_line = cmd.cmd_line[1:] popen_kw["shell"] = True else: assert isinstance(cmd.cmd_line, list) cmd_line = cmd.cmd_line logger.debug("Popen(%r, ...)", cmd_line) proc = subprocess.Popen(cmd_line, **popen_kw) proc.communicate() return proc.wait() def universal_dirname(path: str) -> str: if "/" in path: sep = "/" elif "\\" in path: sep = "\\" else: # micro:bit return "" path = path.rstrip(sep) result = path[: path.rindex(sep)] if not result: return sep else: return result def universal_relpath(path: str, context: str) -> str: """Tries to give relative path""" if "/" in path: import pathlib p = pathlib.PurePosixPath(path) try: return str(p.relative_to(context)) except ValueError: return path else: return os.path.relpath(path, context) def get_python_version_string(): result = sys.version.split()[0] if sys.maxsize <= 2**32: result += ", 32-bit" return result def execute_with_frontend_sys_path(function: Callable) -> Any: import ast try: frontend_sys_path = ast.literal_eval(os.environ["THONNY_FRONTEND_SYS_PATH"]) assert isinstance(frontend_sys_path, list) logger.info("Using THONNY_FRONTEND_SYS_PATH %s", frontend_sys_path) except Exception as e: logger.debug("Could not get THONNY_FRONTEND_SYS_PATH", exc_info=e) frontend_sys_path = [] extra_items = [item for item in frontend_sys_path if item not in sys.path] sys.path = sys.path + extra_items try: return function() finally: for item in extra_items: if item in sys.path: sys.path.remove(item) def try_load_modules_with_frontend_sys_path(module_names): def load(): from importlib import import_module for name in module_names: try: import_module(name) except ImportError: pass execute_with_frontend_sys_path(load) def read_one_incoming_message_str(line_reader): msg_str = line_reader() if msg_str == "": return "" if not msg_str.startswith(MESSAGE_MARKER): return msg_str line_count = int(msg_str[1:].split(maxsplit=1)[0]) read_lines = 1 while read_lines < line_count: msg_str += line_reader() read_lines += 1 return msg_str def is_virtual_executable(executable): exe_dir = os.path.dirname(executable) return os.path.exists(os.path.join(exe_dir, "activate")) or os.path.exists( os.path.join(exe_dir, "activate.bat") ) def is_private_python(executable): result = os.path.exists(os.path.join(os.path.dirname(executable), "thonny_python.ini")) logger.debug("is_private_python(%r) == %r", executable, result) return result def running_in_virtual_environment() -> bool: return ( hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix or hasattr(sys, "real_prefix") and getattr(sys, "real_prefix") != sys.prefix ) def is_remote_path(s: str) -> bool: return REMOTE_PATH_MARKER in s def is_local_path(s: str) -> bool: return not is_remote_path(s) and not s.startswith("<") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/config.py0000644000076600000240000001442714730022736016557 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import ast import configparser import datetime import os.path import sys import tkinter as tk from configparser import ConfigParser from logging import exception, getLogger from thonny import THONNY_USER_DIR logger = getLogger(__name__) _manager_cache = {} def try_load_configuration(filename): if filename in _manager_cache: return _manager_cache[filename] try: # use cache so Workbench doesn't create duplicate manager # when FirstRunWindow already created one mgr = ConfigurationManager(filename) except configparser.Error as e: new_path = filename + ".corrupt" os.replace(filename, new_path) mgr = ConfigurationManager(filename, error_reading_existing_file=e) _manager_cache[filename] = mgr return mgr class ConfigurationManager: def __init__(self, filename, error_reading_existing_file=None): self._ini = ConfigParser(interpolation=None) self.error_reading_existing_file = error_reading_existing_file self._filename = filename self._defaults = {} self._defaults_overrides_str = {} self._variables = {} # Tk variables if os.path.exists(self._filename): with open(self._filename, "r", encoding="UTF-8") as fp: self._ini.read_file(fp) if not self.get_option("general.configuration_creation_timestamp"): self.set_option( "general.configuration_creation_timestamp", datetime.datetime.now().isoformat() ) # print(prefs_filename, self.sections()) self._init_default_overrides() def _init_default_overrides(self): overrides_path = os.path.join(os.path.dirname(__file__), "defaults.ini") if not os.path.isfile(overrides_path): return defparser = configparser.ConfigParser() defparser.read(overrides_path, "utf-8") for section in defparser.sections(): for key in defparser[section]: # leave parsing until base default value is known self._defaults_overrides_str[section + "." + key] = defparser[section][key] def get_option(self, name, secondary_default=None): section, option = self._parse_name(name) name = section + "." + option # variable may have more recent value if name in self._variables: return self._variables[name].get() try: val = self._ini.get(section, option) # if option's data type is str (inferred from the default value) # then don't try to parse anything (unless it's None) if val == "None": return None elif isinstance(self._defaults.get(name), str): return val else: return self._parse_value(val) except Exception: if name in self._defaults: return self._defaults[name] else: return secondary_default def has_option(self, name): return name in self._defaults def set_option(self, name, value): section, option = self._parse_name(name) name = section + "." + option if not self._ini.has_section(section): self._ini.add_section(section) if isinstance(value, str): self._ini.set(section, option, value) else: self._ini.set(section, option, repr(value)) # update variable if name in self._variables: self._variables[name].set(value) def set_default(self, name, primary_default_value): # normalize name section, option = self._parse_name(name) name = section + "." + option self._defaults[name] = primary_default_value if name in self._defaults_overrides_str: if isinstance(primary_default_value, str): value = self._defaults_overrides_str[name] else: value = self._parse_value(self._defaults_overrides_str[name]) else: value = primary_default_value self._defaults[name] = value def get_variable(self, name: str) -> tk.Variable: section, option = self._parse_name(name) name = section + "." + option if name in self._variables: return self._variables[name] else: value = self.get_option(name) if isinstance(value, bool): var = tk.BooleanVar(value=value) # type: tk.Variable elif isinstance(value, int): var = tk.IntVar(value=value) elif isinstance(value, str): var = tk.StringVar(value=value) elif isinstance(value, float): var = tk.StringVar(value=value) else: raise KeyError( "Can't create Tk Variable for " + name + ". Type is " + str(type(value)) ) self._variables[name] = var return var def save(self): # save all tk variables for name in self._variables: self.set_option(name, self._variables[name].get()) # store if not os.path.exists(self._filename): os.makedirs(os.path.dirname(self._filename), mode=0o700, exist_ok=True) # Normal saving occasionally creates corrupted file: # https://bitbucket.org/plas/thonny/issues/167/configuration-file-occasionally-gets # Now I'm saving the configuration to a temp file # and if the save is successful, I replace configuration file with it temp_filename = self._filename + ".temp" with open(temp_filename, "w", encoding="UTF-8") as fp: self._ini.write(fp) try: ConfigurationManager(temp_filename) # temp file was created successfully os.chmod(temp_filename, 0o600) os.replace(temp_filename, self._filename) os.chmod(self._filename, 0o600) except Exception: exception("Could not save configuration file. Reverting to previous file.") def _parse_name(self, name): if "." in name: return name.split(".", 1) else: return "general", name def _parse_value(self, value): try: return ast.literal_eval(value) except Exception: return value ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/config_ui.py0000644000076600000240000001310414730022736017243 0ustar00aivarannamaastaffimport tkinter as tk from logging import getLogger from tkinter import ttk from typing import Optional from thonny import get_workbench, ui_utils from thonny.languages import tr from thonny.ui_utils import CommonDialog logger = getLogger(__name__) class ConfigurationDialog(CommonDialog): last_shown_tab_index = 0 def __init__(self, master, page_records_with_order): super().__init__(master) self.title(tr("Thonny options")) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.backend_restart_required = False self.gui_restart_required = False main_frame = ttk.Frame(self) # otherwise there is wrong color background with clam main_frame.grid(row=0, column=0, sticky=tk.NSEW) main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(0, weight=1) self._notebook = ttk.Notebook(main_frame) self._notebook.grid( row=0, column=0, columnspan=3, sticky=tk.NSEW, padx=self.get_medium_padding(), pady=(self.get_medium_padding(), 0), ) self._ok_button = ttk.Button(main_frame, text=tr("OK"), command=self._ok, default="active") self._cancel_button = ttk.Button(main_frame, text=tr("Cancel"), command=self._cancel) self._ok_button.grid( row=1, column=1, padx=(0, self.get_medium_padding()), pady=(self.get_medium_padding(), self.get_medium_padding()), ) self._cancel_button.grid( row=1, column=2, padx=(0, self.get_medium_padding()), pady=(self.get_medium_padding(), self.get_medium_padding()), ) self._page_records = [] for key, title, page_class, _ in sorted( page_records_with_order, key=lambda r: (r[3], r[0]) ): try: spacer = ttk.Frame(self) spacer.rowconfigure(0, weight=1) spacer.columnconfigure(0, weight=1) page = page_class(spacer) page.key = key page.dialog = self self._page_records.append((key, title, page)) page.grid(sticky=tk.NSEW, pady=(15, 10), padx=15) self._notebook.add(spacer, text=title) except Exception as e: logger.exception("Could not create configuration page %s", key, exc_info=e) self.bind("", self._ok, True) self.bind("", self._cancel, True) self._notebook.select(self._notebook.tabs()[ConfigurationDialog.last_shown_tab_index]) def select_page(self, key): for i, tab in enumerate(self._notebook.tabs()): if self._page_records[i][0] == key: self._notebook.select(tab) def _ok(self, event=None): for _, title, page in self._page_records: try: if page.apply() is False: return except Exception: get_workbench().report_exception("Error when applying options in " + title) self.destroy() def _cancel(self, event=None): for _, title, page in self._page_records: try: page.cancel() except Exception: get_workbench().report_exception("Error when cancelling options in " + title) self.destroy() def destroy(self): ConfigurationDialog.last_shown_tab_index = self._notebook.index(self._notebook.select()) super().destroy() class ConfigurationPage(ttk.Frame): """This is an example dummy implementation of a configuration page. It's not required that configuration pages inherit from this class (can be any widget), but the class must have constructor with single parameter for getting the master.""" def __init__(self, master): ttk.Frame.__init__(self, master) self.dialog = None # type: Optional[ConfigurationDialog] def add_checkbox( self, flag_name, description, row=None, column=0, padx=0, pady=0, columnspan=1, tooltip=None ): variable = get_workbench().get_variable(flag_name) checkbox = ttk.Checkbutton(self, text=description, variable=variable) checkbox.grid( row=row, column=column, sticky=tk.W, padx=padx, pady=pady, columnspan=columnspan ) if tooltip is not None: ui_utils.create_tooltip(checkbox, tooltip) def add_combobox( self, variable, values, row=None, column=0, padx=0, pady=0, columnspan=1, width=None ): if isinstance(variable, str): variable = get_workbench().get_variable(variable) combobox = ttk.Combobox( self, exportselection=False, textvariable=variable, state="readonly", height=15, width=width, values=values, ) combobox.grid( row=row, column=column, sticky=tk.W, pady=pady, padx=padx, columnspan=columnspan ) return variable def add_entry(self, option_name, row=None, column=0, pady=0, padx=0, columnspan=1, **kw): variable = get_workbench().get_variable(option_name) entry = ttk.Entry(self, textvariable=variable, **kw) entry.grid(row=row, column=column, sticky=tk.W, pady=pady, columnspan=columnspan, padx=padx) def apply(self): """Apply method should return False, when page contains invalid input and configuration dialog should not be closed.""" pass def cancel(self): """Called when dialog gets cancelled""" pass ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0816019 thonny-4.1.7/thonny/dbus/0000755000076600000240000000000014730055627015672 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074724.0 thonny-4.1.7/thonny/dbus/org.freedesktop.DBus.ObjectManager.xml0000644000076600000240000000126314626075444025056 0ustar00aivarannamaastaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074724.0 thonny-4.1.7/thonny/dbus/org.freedesktop.UDisks2.xml0000644000076600000240000002572414626075444023015 0ustar00aivarannamaastaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/defaults.ini0000644000076600000240000000051714417536743017255 0ustar00aivarannamaastaff; This file can be used by 3rd party packagers for specifying custom default values for options. ; Use the same sections and keys as configuration.ini ; Priorities of the values specified in different locations: ; 1. explicit values in configuration.ini ; 2. overridden defaults in this file ; 3. base defaults given in Thonny's code ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/editor_helpers.py0000644000076600000240000003070514730022736020317 0ustar00aivarannamaastaffimport tkinter as tk import traceback from logging import getLogger from typing import List, Optional, Tuple from thonny import get_workbench from thonny.codeview import CodeViewText, SyntaxText, get_syntax_options_for_tag from thonny.common import SignatureInfo, SignatureParameter from thonny.editors import Editor from thonny.misc_utils import running_on_mac_os from thonny.shell import ShellText from thonny.tktextext import TextFrame from thonny.ui_utils import get_tk_version_info all_boxes = [] a_box_is_appearing = False logger = getLogger(__name__) class EditorInfoBox(tk.Toplevel): def __init__(self): super().__init__(master=get_workbench()) self._has_shown_on_screen: bool = False all_boxes.append(self) self._target_text_widget: Optional[SyntaxText] = None get_workbench().bind("", self._workbench_focus_out, True) # If the box has received focus, then it may lose it by a messagebox # or mouse click on the main window self.bind("", self._workbench_focus_out, True) get_workbench().bind("", self.hide, True) self.bind("", self.hide, True) get_workbench().bind_class("EditorCodeViewText", "<1>", self.hide, True) get_workbench().bind_class("ShellText", "<1>", self.hide, True) get_workbench().bind("SyntaxThemeChanged", self._update_theme, True) def _set_window_attributes(self): if running_on_mac_os(): try: # Must be the first thing to do after creating window # https://wiki.tcl-lang.org/page/MacWindowStyle self.tk.call( "::tk::unsupported::MacWindowStyle", "style", self._w, "help", "noActivates" ) if get_tk_version_info() >= (8, 6, 10) and running_on_mac_os(): self.wm_overrideredirect(1) except tk.TclError: pass else: self.wm_overrideredirect(1) self.wm_transient(get_workbench()) # From IDLE # TODO: self.update_idletasks() # Need for tk8.6.8 on macOS: #40128. self.lift() def _update_theme(self, event=None): pass def _check_bind_for_keypress(self, text: tk.Text): tag_prefix = "pb_" + type(self).__name__.replace(".", "_") if getattr(text, tag_prefix, False): return False # Need to know about certain keypresses while the completer is active # Other plugins (eg. auto indenter) may eat up returns, therefore I need to # raise the priority of this binding tag = tag_prefix + "_" + str(text.winfo_id()) text.bindtags((tag,) + text.bindtags()) text.bind_class(tag, "", self._on_text_keypress, True) setattr(text, tag_prefix, True) def _on_text_keypress(self, event=None): pass def _workbench_focus_out(self, event=None) -> None: if not self.is_visible(): return # if a_box_is_appearing: # making a box appear may mess up FocusOut events # return # Need to close when another app or a Thonny's dialog appears # (othewise the box will float above this, at least in Linux). # Don't do anything if another EditorInfoBox appears for box in all_boxes: try: # need to try because asking for focus via wrong window may give exception if box.focus_get(): # it's alright return except: pass self.hide() def _get_related_box(self) -> Optional["EditorInfoBox"]: return None def _show_on_target_text( self, index: str, expected_box_height: int, preferred_position: str, y_offset: int = 0, ) -> None: text = self._target_text_widget bbox = text.bbox(index) if not bbox: logger.warning("Could not compute bbox") return text_box_x, text_box_y, _, text_box_height = bbox cursor_root_x = text.winfo_rootx() + text_box_x cursor_root_y = text.winfo_rooty() + text_box_y if ( preferred_position == "below" and cursor_root_y + text_box_height + expected_box_height > text.winfo_screenheight() ): position = "above" else: position = preferred_position if position == "above": # negative value signifies pixels between window bottom and screen bottom y = cursor_root_y - text.winfo_screenheight() else: y = cursor_root_y + text_box_height # TODO reduce x if the box wouldn't fit by width x = cursor_root_x self._show_on_screen(x, y + y_offset) def _show_on_screen(self, x: int, y: int) -> None: global a_box_is_appearing if a_box_is_appearing: logger.debug("Box already appearing, skipping _show_on_screen") return try: a_box_is_appearing = True if y < 0: self.geometry("+%d-%d" % (x, -y)) else: self.geometry("+%d+%d" % (x, y)) if not self.winfo_ismapped(): self._set_window_attributes() self._check_update_size() self.deiconify() if not self._has_shown_on_screen: self.tweak_first_appearance() else: self._check_update_size() finally: a_box_is_appearing = False self._has_shown_on_screen = True def _check_update_size(self) -> None: if hasattr(self, "_update_size"): # It looks it's not worth trying to move the window away from the viewport # for calculations. At least in Ubuntu it doesn't give any advantages and # may produce glitches # self.geometry("+10000+5000") # move away from visible screen # self.withdraw() self.update() # gives proper data for size calculations self._update_size() self.update() # applies updated size def hide(self, event: Optional[tk.Event] = None) -> None: if self.winfo_ismapped(): self.withdraw() related_box = self._get_related_box() if related_box and related_box.is_visible(): related_box.hide(event) # Following looks like a good idea, but in at least in Ubuntu, it would fix # entry cursor to the given text and it can't be moved to another text anymore # if self._target_text_widget: # self._target_text_widget.focus_set() # in case the user has clicked on the box def is_visible(self) -> bool: return self.winfo_ismapped() def tweak_first_appearance(self): pass class DocuBoxBase(EditorInfoBox): def __init__(self, show_vertical_scrollbar: bool): super().__init__() self.text_frame = TextFrame( master=self, horizontal_scrollbar=False, vertical_scrollbar=show_vertical_scrollbar, read_only=True, height=7, width=40, font="TkDefaultFont", wrap="word", ) self.text_frame.grid() self.text = self.text_frame.text self._update_theme() def _update_theme(self, event=None): super()._update_theme(event) comment_opts = get_syntax_options_for_tag("comment") gutter_opts = get_syntax_options_for_tag("GUTTER") text_opts = get_syntax_options_for_tag("TEXT") self.text["background"] = gutter_opts["background"] self.text["foreground"] = text_opts["foreground"] self.text.tag_configure("prose", font="TkDefaultFont") self.text.tag_configure("active", font="BoldTkDefaultFont") self.text.tag_configure("annotation", **comment_opts) self.text.tag_configure("default", **comment_opts) self.text.tag_configure("marker", **comment_opts) def _append_chars(self, chars, tags=()): self.text.direct_insert("end", chars, tags=tuple(tags)) def render_signatures(self, signatures: List[SignatureInfo], only_params=False) -> None: for i, sig in enumerate(signatures): if i > 0: self._append_chars("\n") self.render_signature(sig, only_params) def render_signature(self, sig: SignatureInfo, only_params) -> None: if not only_params: self._append_chars(sig.name) self._append_chars("(") is_positional = False is_kw_only = False for i, param in enumerate(sig.params): if i > 0: self._append_chars(", ") if len(sig.params) > 20: self._append_chars("\n ") is_positional |= param.kind == "POSITIONAL_ONLY" if is_positional and param.kind != "POSITIONAL_ONLY": self._append_chars("/, ", ["marker"]) is_positional = False if param.kind == "VAR_POSITIONAL": is_kw_only = True elif param.kind == "KEYWORD_ONLY" and not is_kw_only: self._append_chars("*, ", ["marker"]) is_kw_only = True is_active_parameter = sig.current_param_index == i self.render_parameter(param, is_active_parameter) if is_positional: self._append_chars(", /", ["marker"]) self._append_chars(")") if sig.return_type and not only_params: self._append_chars(" -> ", ["marker"]) self._append_chars(sig.return_type, ["annotation"]) def render_parameter(self, param: SignatureParameter, active: bool) -> None: if active: base_tags = ["active"] else: base_tags = [] if param.kind == "VAR_POSITIONAL": self._append_chars("*", base_tags) elif param.kind == "VAR_KEYWORD": self._append_chars("**", base_tags) self._append_chars(param.name, base_tags) if param.annotation: self._append_chars(":\u00A0" + param.annotation, base_tags + ["annotation"]) if param.default: self._append_chars("=" + param.default, base_tags + ["default"]) def format_signature(self, s: str) -> str: s = s.replace(": ", ":\u00A0") if len(s) > self.text["width"] * 1.8 and s.count("(") and s.count(")"): args_index = s.index("(") + 1 suffix_index = s.rindex(")") prefix = s[:args_index] args = s[args_index:suffix_index].split(", ") suffix = s[suffix_index:] s = prefix + "\n " + ",\n ".join(args) + "\n" + suffix # don't keep / and * alone on a line s = ( s.replace("\n /,", " /,") .replace("\n *,", " *,") .replace("\n /\n)", " /\n)") .replace("\n *\n)", " *\n)") ) return s else: return s class DocuBox(DocuBoxBase): def __init__(self): super().__init__(show_vertical_scrollbar=True) def set_content(self, name, item_type, signatures, docstring): self.text.direct_delete("1.0", "end") # self._append_chars(item_type + "\n") if signatures: self.render_signatures(signatures) if signatures and docstring: self._append_chars("\n\n") if docstring: self._append_chars(docstring, ["prose"]) def get_active_text_widget() -> Optional[SyntaxText]: widget = get_workbench().focus_get() if isinstance(widget, (CodeViewText, ShellText)): return widget return None def get_cursor_position(text: SyntaxText) -> Tuple[int, int]: parts = text.index("insert").split(".") return int(parts[0]), int(parts[1]) def get_text_filename(text: SyntaxText) -> Optional[str]: if isinstance(text, ShellText): return "" elif isinstance(text, CodeViewText): editor = getattr(text.master, "home_widget") if isinstance(editor, Editor): return editor.get_filename() return None def get_relevant_source_and_cursor_position(text: SyntaxText) -> Tuple[str, int, int]: if isinstance(text, ShellText): source = text.get("input_start", "insert") lines = source.splitlines() if not lines: return source, 1, 0 else: return source, len(lines), len(lines[-1]) else: row, col = get_cursor_position(text) return text.get("1.0", "end-1c"), row, col ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361746.0 thonny-4.1.7/thonny/editors.py0000644000076600000240000012367614730041222016761 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import os.path import re import sys import tkinter as tk import traceback from logging import exception, getLogger from tkinter import messagebox, simpledialog, ttk from typing import Optional from _tkinter import TclError from thonny import get_runner, get_workbench, ui_utils from thonny.base_file_browser import ask_backend_path, choose_node_for_file_operations from thonny.codeview import BinaryFileException, CodeView, CodeViewText from thonny.common import ( REMOTE_PATH_MARKER, InlineCommand, TextRange, ToplevelResponse, is_local_path, is_remote_path, is_same_path, normpath_with_actual_case, universal_dirname, ) from thonny.languages import tr from thonny.misc_utils import running_on_mac_os, running_on_windows from thonny.tktextext import rebind_control_a from thonny.ui_utils import ( askopenfilename, asksaveasfilename, get_beam_cursor, select_sequence, windows_known_extensions_are_hidden, ) PYTHON_FILES_STR = tr("Python files") _dialog_filetypes = [(PYTHON_FILES_STR, ".py .pyw .pyi"), (tr("all files"), ".*")] PYTHON_EXTENSIONS = {"py", "pyw", "pyi"} PYTHONLIKE_EXTENSIONS = set() logger = getLogger(__name__) class EditorCodeViewText(CodeViewText): """Allows separate class binding for CodeViewTexts which are inside editors""" def __init__(self, master=None, cnf={}, **kw): super().__init__( master=master, cnf=cnf, **kw, ) self.bindtags(self.bindtags() + ("EditorCodeViewText",)) class Editor(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) assert isinstance(master, EditorNotebook) self.notebook = master # type: EditorNotebook # parent of codeview will be workbench so that it can be maximized self._code_view = CodeView( get_workbench(), propose_remove_line_numbers=True, font="EditorFont", text_class=EditorCodeViewText, cursor=get_beam_cursor(), ) get_workbench().event_generate( "EditorTextCreated", editor=self, text_widget=self.get_text_widget() ) self._code_view.grid(row=0, column=0, sticky=tk.NSEW, in_=self) self._code_view.home_widget = self # don't forget home self.maximizable_widget = self._code_view self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self._filename = None self._last_known_mtime = None self._code_view.text.bind("<>", self._on_text_modified, True) self._code_view.text.bind("<>", self._on_text_change, True) self._code_view.text.bind("", self._control_tab, True) get_workbench().bind("DebuggerResponse", self._listen_debugger_progress, True) get_workbench().bind("ToplevelResponse", self._listen_for_toplevel_response, True) self.update_appearance() def get_text_widget(self): return self._code_view.text def get_code_view(self): # TODO: try to get rid of this return self._code_view def get_content(self) -> str: return self._code_view.get_content() def set_filename(self, path): self._filename = path def get_filename(self, try_hard=False): if self._filename is None and try_hard: self.save_file() return self._filename def get_identifier(self): if self._filename: return self._filename else: return str(self.winfo_id()) def get_title(self): if self.get_filename() is None: result = tr("") elif is_remote_path(self.get_filename()): path = extract_target_path(self.get_filename()) name = path.split("/")[-1] result = "[ " + name + " ]" else: result = os.path.basename(self.get_filename()) if self.is_modified(): result += " *" return result def check_for_external_changes(self): if self._filename is None: return if is_remote_path(self._filename): return if self._last_known_mtime is None: return elif not os.path.exists(self._filename): self.master.select(self) if messagebox.askyesno( tr("File is gone"), tr("Looks like '%s' was deleted or moved.") % self._filename + "\n\n" + tr("Do you want to also close the editor?"), master=self, ): self.master.close_editor(self) else: self.get_text_widget().edit_modified(True) self._last_known_mtime = None elif os.path.getmtime(self._filename) != self._last_known_mtime: skip_confirmation = not self.is_modified() and get_workbench().get_option( "edit.auto_refresh_saved_files" ) if not skip_confirmation: self.master.select(self) if skip_confirmation or messagebox.askyesno( tr("External modification"), tr("Looks like '%s' was modified outside of the editor.") % self._filename + "\n\n" + tr( "Do you want to discard current editor content and reload the file from disk?" ), master=self, ): prev_location = self.get_text_widget().index("insert") self._load_file(self._filename, keep_undo=True) try: self.get_text_widget().mark_set("insert", prev_location) self.see_line(int(prev_location.split(".")[0])) except Exception: logger.exception("Could not restore previous location") self._last_known_mtime = os.path.getmtime(self._filename) def get_long_description(self): if self._filename is None: result = tr("") else: result = self._filename try: index = self._code_view.text.index("insert") if index and "." in index: line, col = index.split(".") result += " @ {} : {}".format(line, int(col) + 1) except Exception: exception("Finding cursor location") return result def _load_file(self, filename, keep_undo=False): try: if is_remote_path(filename): result = self._load_remote_file(filename) else: result = self._load_local_file(filename, keep_undo) if not result: return False except BinaryFileException: messagebox.showerror( tr("Problem"), tr("%s doesn't look like a text file") % (filename,), master=self ) return False except SyntaxError as e: assert "encoding" in str(e).lower() messagebox.showerror( tr("Problem loading file"), tr( "This file seems to have problems with encoding.\n\n" "Make sure it is in UTF-8 or contains proper encoding hint." ), master=self, ) return False self.update_appearance() return True def _load_local_file(self, filename, keep_undo=False): with open(filename, "rb") as fp: source = fp.read() # Make sure Windows filenames have proper format filename = normpath_with_actual_case(filename) self._filename = filename self.update_file_type() self._last_known_mtime = os.path.getmtime(self._filename) get_workbench().event_generate("Open", editor=self, filename=filename) if not self._code_view.set_content_as_bytes(source, keep_undo): return False self.get_text_widget().edit_modified(False) self._code_view.focus_set() self.master.remember_recent_file(filename) return True def _load_remote_file(self, filename): self._filename = filename self.update_file_type() self._code_view.set_content("") self._code_view.text.set_read_only(True) target_filename = extract_target_path(self._filename) self.update_title() response = get_runner().send_command_and_wait( InlineCommand( "read_file", path=target_filename, description=tr("Loading %s") % target_filename ), dialog_title=tr("Loading"), ) if response.get("error"): # TODO: make it softer raise RuntimeError(response["error"]) content = response["content_bytes"] self._code_view.text.set_read_only(False) if not self._code_view.set_content_as_bytes(content): return False self.get_text_widget().edit_modified(False) self.update_title() return True def is_modified(self): return bool(self._code_view.text.edit_modified()) def save_file_enabled(self): return self.is_modified() or not self.get_filename() def save_file(self, ask_filename=False, save_copy=False, node=None) -> Optional[str]: if self._filename is not None and not ask_filename: save_filename = self._filename get_workbench().event_generate("Save", editor=self, filename=save_filename) else: save_filename = self.ask_new_path(node) if not save_filename: return None if self.notebook.get_editor(save_filename) is not None: messagebox.showerror( tr("File is open"), tr( "This file is already open in Thonny.\n\n" "If you want to save with this name,\n" "close the existing editor first!" ), master=get_workbench(), ) return None get_workbench().event_generate( "SaveAs", editor=self, filename=save_filename, save_copy=save_copy ) content_bytes = self._code_view.get_content_as_bytes() if is_remote_path(save_filename): result = self.write_remote_file(save_filename, content_bytes, save_copy) else: result = self.write_local_file(save_filename, content_bytes, save_copy) if not result: return None if not save_copy: self._filename = save_filename self.update_file_type() self.update_title() return save_filename def write_local_file(self, save_filename, content_bytes, save_copy): process_shebang = content_bytes.startswith(b"#!/") and get_workbench().get_option( "file.make_saved_shebang_scripts_executable" ) if process_shebang: content_bytes = content_bytes.replace(b"\r\n", b"\n") try: f = open(save_filename, mode="wb") f.write(content_bytes) f.flush() # Force writes on disk, see https://learn.adafruit.com/adafruit-circuit-playground-express/creating-and-editing-code#1-use-an-editor-that-writes-out-the-file-completely-when-you-save-it os.fsync(f) f.close() if process_shebang: os.chmod(save_filename, 0o755) if not save_copy or save_filename == self._filename: self._last_known_mtime = os.path.getmtime(save_filename) get_workbench().event_generate( "LocalFileOperation", path=save_filename, operation="save" ) except PermissionError: messagebox.showerror( tr("Permission Error"), tr("Looks like this file or folder is not writable."), master=self, ) return False if not save_copy or save_filename == self._filename: self.master.remember_recent_file(save_filename) if not save_copy or save_filename == self._filename: self._code_view.text.edit_modified(False) return True def update_file_type(self): if self._filename is None: self._code_view.set_file_type(None) else: ext = self._filename.split(".")[-1].lower() if ext in PYTHON_EXTENSIONS: file_type = "python" elif ext in PYTHONLIKE_EXTENSIONS: file_type = "pythonlike" else: file_type = None self._code_view.set_file_type(file_type) self.update_appearance() def write_remote_file(self, save_filename, content_bytes, save_copy): if get_runner().ready_for_remote_file_operations(show_message=True): target_filename = extract_target_path(save_filename) result = get_runner().send_command_and_wait( InlineCommand( "write_file", path=target_filename, content_bytes=content_bytes, editor_id=id(self), blocking=True, description=tr("Saving to %s") % target_filename, make_shebang_scripts_executable=get_workbench().get_option( "file.make_saved_shebang_scripts_executable" ), ), dialog_title=tr("Saving"), ) if "error" in result: messagebox.showerror(tr("Could not save"), str(result["error"])) return False if not save_copy: self._code_view.text.edit_modified(False) self.update_title() # NB! edit_modified is not falsed yet! get_workbench().event_generate( "RemoteFileOperation", path=target_filename, operation="save" ) get_workbench().event_generate("RemoteFilesChanged") return True else: messagebox.showerror(tr("Could not save"), tr("Back-end is not ready")) return False def ask_new_path(self, node=None): if node is None: node = choose_node_for_file_operations(self.winfo_toplevel(), tr("Where to save to?")) if not node: return None if node == "local": return self.ask_new_local_path() else: assert node == "remote" return self.ask_new_remote_path() def ask_new_remote_path(self): target_path = ask_backend_path(self.winfo_toplevel(), "save") if target_path: target_path = self._check_add_py_extension(target_path) return make_remote_path(target_path) else: return None def ask_new_local_path(self): if self._filename is None: initialdir = get_workbench().get_local_cwd() initialfile = None else: initialdir = os.path.dirname(self._filename) initialfile = os.path.basename(self._filename) # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm type_var = tk.StringVar(value="") new_filename = asksaveasfilename( filetypes=_dialog_filetypes, defaultextension=None, initialdir=initialdir, initialfile=initialfile, parent=get_workbench(), typevariable=type_var, ) logger.info("Save dialog returned %r with typevariable %r", new_filename, type_var.get()) # Different tkinter versions may return different values if new_filename in ["", (), None]: return None if running_on_windows(): # may have /-s instead of \-s and wrong case new_filename = os.path.join( normpath_with_actual_case(os.path.dirname(new_filename)), os.path.basename(new_filename), ) if type_var.get() == PYTHON_FILES_STR or type_var.get() == "": new_filename = self._check_add_py_extension( new_filename, without_asking=type_var.get() == PYTHON_FILES_STR ) if new_filename.endswith(".py"): base = os.path.basename(new_filename) mod_name = base[:-3].lower() if running_on_windows(): mod_name = mod_name.lower() if mod_name in [ "math", "turtle", "random", "statistics", "pygame", "matplotlib", "numpy", ]: # More proper name analysis will be performed by ProgramNamingAnalyzer if not tk.messagebox.askyesno( tr("Potential problem"), tr( "If you name your script '%s', " "you won't be able to import the library module named '%s'" ) % (base, mod_name) + ".\n\n" + tr("Do you still want to use this name for your script?"), master=self, ): return self.ask_new_local_path() return new_filename def show(self): self.master.select(self) def update_appearance(self): self._code_view.set_gutter_visibility( get_workbench().get_option("view.show_line_numbers") or get_workbench().in_simple_mode() ) self._code_view.set_line_length_margin( get_workbench().get_option("view.recommended_line_length") ) self._code_view.text.update_tabs() self._code_view.text.event_generate("<>") self._code_view.grid_main_widgets() def _listen_debugger_progress(self, event): # Go read-only # TODO: check whether this module is active? self._code_view.text.set_read_only(True) def _listen_for_toplevel_response(self, event: ToplevelResponse) -> None: self._code_view.text.set_read_only(False) def _control_tab(self, event): if event.state & 1: # shift was pressed direction = -1 else: direction = 1 self.master.select_next_prev_editor(direction) return "break" def _shift_control_tab(self, event): self.master.select_next_prev_editor(-1) return "break" def select_range(self, text_range): self._code_view.select_range(text_range) def select_line(self, lineno, col_offset=None): self._code_view.select_range(TextRange(lineno, 0, lineno + 1, 0)) self.see_line(lineno) if col_offset is None: col_offset = 0 self.get_text_widget().mark_set("insert", "%d.%d" % (lineno, col_offset)) def see_line(self, lineno): # first see an earlier line in order to push target line downwards self._code_view.text.see("%d.0" % max(lineno - 4, 1)) self._code_view.text.see("%d.0" % lineno) def focus_set(self): self._code_view.focus_set() def is_focused(self): return self.focus_displayof() == self._code_view.text def _on_text_modified(self, event): self.update_title() def update_title(self): try: self.master.update_editor_title(self) except Exception as e: logger.exception("Could not update editor title", exc_info=e) def _on_text_change(self, event): self.update_title() def destroy(self): get_workbench().unbind("DebuggerResponse", self._listen_debugger_progress) get_workbench().unbind("ToplevelResponse", self._listen_for_toplevel_response) ttk.Frame.destroy(self) get_workbench().event_generate( "EditorTextDestroyed", editor=self, text_widget=self.get_text_widget() ) def _check_add_py_extension(self, path: str, without_asking: bool = False) -> str: assert path parts = re.split(r"[/\\]", path) name = parts[-1] if "." not in name: if without_asking or messagebox.askyesno( title=tr("Confirmation"), message=tr("Python files usually have .py extension.") + "\n\n" + tr("Did you mean '%s'?" % (name + ".py")), parent=self.winfo_toplevel(), ): return path + ".py" else: return path return path class EditorNotebook(ui_utils.ClosableNotebook): """ Manages opened files / modules """ def __init__(self, master): super().__init__(master, padding=0) get_workbench().set_default("file.reopen_all_files", False) get_workbench().set_default("file.open_files", []) get_workbench().set_default("file.current_file", None) get_workbench().set_default("file.recent_files", []) get_workbench().set_default("view.highlight_current_line", False) get_workbench().set_default("view.show_line_numbers", True) get_workbench().set_default("view.recommended_line_length", 0) get_workbench().set_default("edit.indent_with_tabs", False) get_workbench().set_default("edit.auto_refresh_saved_files", True) get_workbench().set_default("file.make_saved_shebang_scripts_executable", True) self._recent_menu = tk.Menu( get_workbench().get_menu("file"), postcommand=self._update_recent_menu ) self._init_commands() self.enable_traversal() # open files from last session """ TODO: they should go only to recent files for filename in prefs["open_files"].split(";"): if os.path.exists(filename): self._open_file(filename) """ # should be in the end, so that it can be detected when # constructor hasn't completed yet self.preferred_size_in_pw = None self._checking_external_changes = False get_workbench().bind("WindowFocusIn", self.check_for_external_changes, True) get_workbench().bind("ToplevelResponse", self.check_for_external_changes, True) self.bind("<>", self.on_tab_changed, True) def on_tab_changed(self, *args): if sys.platform == "darwin": # Since Tk 8.6.11, after closing an editor, the previous editor re-appeared with # widgets disappeared, at least on Aivar's machine. for child in self.get_all_editors(): assert isinstance(child, Editor) child.get_code_view().grid_main_widgets() self.update_idletasks() def _init_commands(self): # TODO: do these commands have to be in EditorNotebook ?? # Create a module level function install_editor_notebook ?? # Maybe add them separately, when notebook has been installed ?? get_workbench().add_command( "new_file", "file", tr("New"), self._cmd_new_file, caption=tr("New"), default_sequence=select_sequence("", ""), extra_sequences=[""], group=10, image="new-file", include_in_toolbar=True, ) get_workbench().add_command( "open_file", "file", tr("Open..."), self._cmd_open_file, caption=tr("Load"), default_sequence=select_sequence("", ""), extra_sequences=[""], group=10, image="open-file", include_in_toolbar=True, ) get_workbench().add_command( "recents", "file", tr("Recent files"), group=10, submenu=self._recent_menu ) # http://stackoverflow.com/questions/22907200/remap-default-keybinding-in-tkinter get_workbench().bind_class("Text", "", self._control_o) get_workbench().bind_class("Text", "", self._control_o) rebind_control_a(get_workbench()) get_workbench().add_command( "close_file", "file", tr("Close"), self._cmd_close_file, default_sequence=select_sequence("", ""), extra_sequences=[""], tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "close_files", "file", tr("Close all"), self.close_tabs, tester=lambda: self.get_current_editor() is not None, default_sequence=select_sequence("", ""), group=10, ) get_workbench().add_command( "save_file", "file", tr("Save"), self._cmd_save_file, caption=tr("Save"), default_sequence=select_sequence("", ""), extra_sequences=[""], tester=self._cmd_save_file_enabled, group=10, image="save-file", include_in_toolbar=True, ) get_workbench().add_command( "save_all_files", "file", tr("Save All files"), self._cmd_save_all_files, caption=tr("Save All files"), default_sequence=select_sequence("", ""), tester=self._cmd_save_all_files_enabled, group=10, ) get_workbench().add_command( "save_file_as", "file", tr("Save as..."), self._cmd_save_file_as, default_sequence=select_sequence("", ""), extra_sequences=[""], tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "save_copy", "file", tr("Save copy..."), self._cmd_save_copy, tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "move_rename_file", "file", tr("Move / rename..."), self._cmd_move_rename_file, tester=self._cmd_move_rename_file_enabled, group=10, ) get_workbench().add_command( "goto_source_line", "edit", tr("Go to line..."), self._cmd_goto_source_line, default_sequence=select_sequence("", ""), # tester=, # no global switch, or cross plugin switch? # todo use same as find and replace -> plugins/find_replace.py group=60, ) get_workbench().createcommand("::tk::mac::OpenDocument", self._mac_open_document) def load_startup_files(self): """If no filename was sent from command line then load previous files (if setting allows)""" cmd_line_filenames = [ os.path.abspath(name) for name in sys.argv[1:] if os.path.exists(name) ] if len(cmd_line_filenames) > 0: filenames = cmd_line_filenames elif get_workbench().get_option("file.reopen_all_files"): filenames = get_workbench().get_option("file.open_files") elif get_workbench().get_option("file.current_file"): filenames = [get_workbench().get_option("file.current_file")] else: filenames = [] if len(filenames) > 0: for filename in filenames: if os.path.exists(filename): self.show_file(filename) cur_file = get_workbench().get_option("file.current_file") # choose correct active file if len(cmd_line_filenames) > 0: self.show_file(cmd_line_filenames[0]) elif cur_file and os.path.exists(cur_file): self.show_file(cur_file) else: self._cmd_new_file() else: self._cmd_new_file() def save_all_named_editors(self): all_saved = True for editor in self.winfo_children(): if editor.get_filename() and editor.is_modified(): success = editor.save_file() all_saved = all_saved and success return all_saved def remember_recent_file(self, filename): recents = get_workbench().get_option("file.recent_files") if filename in recents: recents.remove(filename) recents.insert(0, filename) relevant_recents = [name for name in recents if os.path.exists(name)][:15] get_workbench().set_option("file.recent_files", relevant_recents) self._update_recent_menu() def _update_recent_menu(self): recents = get_workbench().get_option("file.recent_files") relevant_recents = [ path for path in recents if os.path.exists(path) and not self.file_is_opened(path) ] self._recent_menu.delete(0, "end") for path in relevant_recents: def load(path=path): self.show_file(path) self._recent_menu.insert_command("end", label=path, command=load) def remember_open_files(self): if ( self.get_current_editor() is not None and self.get_current_editor().get_filename() is not None ): current_file = self.get_current_editor().get_filename() else: current_file = None get_workbench().set_option("file.current_file", current_file) open_files = [ editor.get_filename() for editor in self.winfo_children() if editor.get_filename() ] get_workbench().set_option("file.open_files", open_files) def _cmd_new_file(self): self.open_new_file() def open_new_file(self, path=None, remote=False): new_editor = Editor(self) get_workbench().event_generate("NewFile", editor=new_editor) if path: if remote: new_editor.set_filename(make_remote_path(path)) else: new_editor.set_filename(path) self.add(new_editor, text=new_editor.get_title()) self.select(new_editor) new_editor.focus_set() def _cmd_open_file(self): node = choose_node_for_file_operations(self.winfo_toplevel(), "Where to open from?") if not node: return if node == "local": initialdir = get_workbench().get_local_cwd() if ( self.get_current_editor() is not None and self.get_current_editor().get_filename() is not None ): initialdir = os.path.dirname(self.get_current_editor().get_filename()) path = askopenfilename( filetypes=_dialog_filetypes, initialdir=initialdir, parent=get_workbench() ) else: assert node == "remote" target_path = ask_backend_path(self.winfo_toplevel(), "open") if not target_path: return path = make_remote_path(target_path) if path: # self.close_single_untitled_unmodified_editor() self.show_file(path, propose_dialog=False) def _control_o(self, event): # http://stackoverflow.com/questions/22907200/remap-default-keybinding-in-tkinter self._cmd_open_file() return "break" def _close_files(self, except_index=None): for tab_index in reversed(range(len(self.winfo_children()))): if except_index is not None and tab_index == except_index: continue else: editor = self.get_child_by_index(tab_index) if self.check_allow_closing(editor): self.forget(editor) editor.destroy() def _cmd_close_file(self): self.close_tab(self.index(self.select())) def close_tab(self, index): editor = self.get_child_by_index(index) if editor: self.close_editor(editor) def close_editor(self, editor, force=False): if not force and not self.check_allow_closing(editor): return self.forget(editor) editor.destroy() def _cmd_save_file(self): if self.get_current_editor(): self.get_current_editor().save_file() self.update_editor_title(self.get_current_editor()) def _cmd_save_file_enabled(self): return self.get_current_editor() and self.get_current_editor().save_file_enabled() def _cmd_save_all_files(self): for editor in self.get_all_editors(): if editor.save_file_enabled() == True: editor.save_file() self.update_editor_title(editor) def _cmd_save_all_files_enabled(self): for editor in self.get_all_editors(): if editor.save_file_enabled() == True: return True return False def _cmd_save_file_as(self, node=None): if not self.get_current_editor(): return self.get_current_editor().save_file(ask_filename=True, node=node) self.update_editor_title(self.get_current_editor()) get_workbench().update_title() def _cmd_save_copy(self): if not self.get_current_editor(): return self.get_current_editor().save_file(ask_filename=True, save_copy=True) self.update_editor_title(self.get_current_editor()) def _cmd_save_file_as_enabled(self): return self.get_current_editor() is not None def _cmd_move_rename_file(self): editor = self.get_current_editor() old_filename = editor.get_filename() assert old_filename is not None if is_remote_path(old_filename): node = "remote" else: node = "local" self._cmd_save_file_as(node=node) if editor.get_filename() != old_filename: if is_remote_path(old_filename): remote_path = extract_target_path(old_filename) get_runner().send_command_and_wait( InlineCommand( "delete", paths=[remote_path], description=tr("Deleting" + remote_path) ), dialog_title=tr("Deleting"), ) get_workbench().event_generate( "RemoteFileOperation", path=remote_path, operation="delete" ) else: os.remove(old_filename) get_workbench().event_generate( "LocalFileOperation", path=old_filename, operation="delete" ) def _cmd_move_rename_file_enabled(self): return self.get_current_editor() and self.get_current_editor().get_filename() is not None def close_single_untitled_unmodified_editor(self): editors = self.winfo_children() if len(editors) == 1 and not editors[0].is_modified() and not editors[0].get_filename(): self._cmd_close_file() def _cmd_goto_source_line(self): editor = self.get_current_editor() if editor: line_no = simpledialog.askinteger(tr("Go to line"), tr("Line number")) if line_no: editor.select_line(line_no) def _mac_open_document(self, *args): for arg in args: if isinstance(arg, str) and os.path.exists(arg): self.show_file(arg) get_workbench().become_active_window() def get_current_editor(self) -> Optional[Editor]: return self.get_current_child() def get_current_editor_content(self): editor = self.get_current_editor() if editor is None: return None else: return editor.get_content() def get_all_editors(self): # When workspace is closing, self.winfo_children() # may return an unexplainable tkinter.Frame return [child for child in self.winfo_children() if isinstance(child, Editor)] def select_next_prev_editor(self, direction): cur_index = self.index(self.select()) next_index = (cur_index + direction) % len(self.tabs()) self.select(self.get_child_by_index(next_index)) def file_is_opened(self, path): for editor in self.get_all_editors(): if editor.get_filename() and is_same_path(path, editor.get_filename()): return True return False def show_file(self, filename, text_range=None, set_focus=True, propose_dialog=True): # self.close_single_untitled_unmodified_editor() try: editor = self.get_editor(filename, True) except PermissionError: logger.exception("Loading " + filename) msg = tr("Got permission error when trying to load\n%s") % (filename,) if running_on_mac_os() and propose_dialog: msg += "\n\n" + tr("Try opening it with File => Open.") messagebox.showerror(tr("Permission error"), msg, master=self) return None if editor is None: return self.select(editor) if set_focus: editor.focus_set() if text_range is not None: editor.select_range(text_range) return editor def show_remote_file(self, target_filename): if not get_runner().ready_for_remote_file_operations(show_message=True): return None else: return self.show_file(make_remote_path(target_filename)) def show_file_at_line(self, filename, lineno, col_offset=None): editor = self.show_file(filename) editor.select_line(lineno, col_offset) def update_appearance(self): for editor in self.winfo_children(): editor.update_appearance() def update_editor_title(self, editor, title=None): if title is None: title = editor.get_title() try: self.tab(editor, text=title) except TclError: pass try: self.indicate_modification() except Exception: logger.exception("Could not update modification indication") def indicate_modification(self): if not running_on_mac_os(): return atts = self.winfo_toplevel().wm_attributes() if "-modified" in atts: i = atts.index("-modified") mod = atts[i : i + 2] rest = atts[:i] + atts[i + 2 :] else: mod = () rest = atts for editor in self.get_all_editors(): if editor.is_modified(): if mod != ("-modified", 1): self.winfo_toplevel().wm_attributes(*(rest + ("-modified", 1))) break else: if mod == ("-modified", 1): self.winfo_toplevel().wm_attributes(*(rest + ("-modified", 0))) def _open_file(self, filename): editor = Editor(self) if editor._load_file(filename): self.add(editor, text=editor.get_title()) return editor else: editor.destroy() return None def get_editor(self, filename_or_id, open_when_necessary=False): if os.path.isfile(filename_or_id): filename_or_id = normpath_with_actual_case(os.path.abspath(filename_or_id)) for child in self.winfo_children(): assert isinstance(child, Editor) child_identifier = child.get_identifier() if child_identifier == filename_or_id: return child if open_when_necessary: return self._open_file(filename_or_id) else: return None def check_allow_closing(self, editor=None): if not editor: modified_editors = [e for e in self.winfo_children() if e.is_modified()] else: if not editor.is_modified(): return True else: modified_editors = [editor] if len(modified_editors) == 0: return True message = tr("Do you want to save files before closing?") if editor: message = tr("Do you want to save file before closing?") confirm = messagebox.askyesnocancel( title=tr("Save On Close"), message=message, default=messagebox.YES, master=self ) if confirm: for editor_ in modified_editors: assert isinstance(editor_, Editor) if editor_.get_filename(True): if not editor_.save_file(): return False else: return False return True elif confirm is None: return False else: return True def check_for_external_changes(self, event=None): if self._checking_external_changes: # otherwise the method will be re-entered when focus # changes because of a confirmation message box return self._checking_external_changes = True try: for editor in self.get_all_editors(): editor.check_for_external_changes() finally: self._checking_external_changes = False def get_current_breakpoints(): result = {} for editor in get_workbench().get_editor_notebook().get_all_editors(): filename = editor.get_filename() if filename: linenos = editor.get_code_view().get_breakpoint_line_numbers() if linenos: result[filename] = linenos return result def get_saved_current_script_filename(force=True): editor = get_workbench().get_editor_notebook().get_current_editor() if not editor: return None filename = editor.get_filename(force) if not filename: return None if editor.is_modified(): filename = editor.save_file() return filename def get_target_dirname_from_editor_filename(s): if is_local_path(s): return os.path.dirname(s) else: return universal_dirname(extract_target_path(s)) def extract_target_path(s): assert is_remote_path(s) return s[s.find(REMOTE_PATH_MARKER) + len(REMOTE_PATH_MARKER) :] def make_remote_path(target_path): return get_runner().get_node_label() + REMOTE_PATH_MARKER + target_path ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/export.py0000644000076600000240000000302214417536743016632 0ustar00aivarannamaastaffimport tkinter as tk from tkinter import ttk from thonny.languages import tr from thonny.ui_utils import CommonDialog page_specs = [] class ExportDialog(CommonDialog): def __init__(self, master): super().__init__(master=master) self.title("Export file") self.protocol("WM_DELETE_WINDOW", self.on_cancel) mainframe = ttk.Frame(self) mainframe.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.notebook = ttk.Notebook(mainframe) self.notebook.grid(row=3, column=0, columnspan=3, padx=20, pady=(20, 0), sticky="nsew") self.ok_button = ttk.Button(mainframe, text=tr("OK"), command=self.on_ok) self.ok_button.grid(row=4, column=1, sticky="e", padx=(20, 10), pady=(10, 20)) self.cancel_button = ttk.Button(mainframe, text=tr("Cancel"), command=self.on_cancel) self.cancel_button.grid(row=4, column=2, sticky="e", padx=(0, 20), pady=(10, 20)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(3, weight=1) for title, page_class in page_specs: page = page_class(self.notebook) self.notebook.add(page, text=title) def on_ok(self): print("OK") def on_cancel(self): print("Cancel") self.destroy() class LocalFilesExportPage(ttk.Frame): def __init__(self, master): super().__init__(master=master) def add_export_page(title, page_class): page_specs.append((title, page_class)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/first_run.py0000644000076600000240000000667014730022736017326 0ustar00aivarannamaastaffimport os.path import tkinter as tk from tkinter import ttk from thonny import is_portable, languages, ui_utils STD_MODE_TEXT = "Standard" RPI_MODE_TEXT = "Raspberry Pi (simple)" class FirstRunWindow(tk.Tk): def __init__(self, configuration_manager): super().__init__(className="Thonny") ttk.Style().theme_use(ui_utils.get_default_basic_theme()) self.title("Welcome to Thonny!" + " [portable]" if is_portable() else "") self.protocol("WM_DELETE_WINDOW", self.destroy) self.ok = False self.conf = configuration_manager self.main_frame = ttk.Frame(self) self.main_frame.grid(row=1, column=1, sticky="nsew") self.columnconfigure(1, weight=1) self.rowconfigure(1, weight=1) self.main_frame.rowconfigure(1, weight=1) logo_file = os.path.join(os.path.dirname(__file__), "res", "thonny.png") self.logo = tk.PhotoImage(file=logo_file) logo_label = ttk.Label(self.main_frame, image=self.logo) logo_label.grid(row=1, rowspan=3, column=1, sticky="nsew") self.padx = 50 self.pady = 50 self.language_variable = ui_utils.create_string_var( languages.BASE_LANGUAGE_NAME, self.on_change_language ) self.add_combo( 1, "Language:", self.language_variable, list(languages.LANGUAGES_DICT.values()) ) self.mode_variable = tk.StringVar(value=STD_MODE_TEXT) self.add_combo(2, "Initial settings:", self.mode_variable, [STD_MODE_TEXT, RPI_MODE_TEXT]) ok_button = ttk.Button(self.main_frame, text="Let's go!", command=self.on_ok) ok_button.grid( row=3, column=3, padx=(0, self.padx), pady=(self.pady * 0.7, self.pady), sticky="se" ) self.center() def on_change_language(self): print(self.language_variable.get()) def add_combo(self, row, label_text, variable, values): pady = 7 label = ttk.Label(self.main_frame, text=label_text) label.grid(row=row, column=2, sticky="sw", pady=(pady, 0)) assert isinstance(variable, tk.Variable) combobox = ttk.Combobox( self.main_frame, exportselection=False, textvariable=variable, state="readonly", height=15, width=20, values=values, ) combobox.grid(row=row, column=3, padx=(10, self.padx), sticky="sw", pady=(pady, 0)) def center(self): width = max(self.winfo_reqwidth(), 640) height = max(self.winfo_reqheight(), 300) screen_width = self.winfo_screenwidth() screen_height = self.winfo_screenheight() if screen_width > screen_height * 2: # probably dual monitors screen_width //= 2 left = max(int(screen_width / 2 - width / 2), 0) top = max(int(screen_height / 2 - height / 2), 0) # Positions the window in the center of the page. self.geometry("+{}+{}".format(left, top)) def on_ok(self): if self.mode_variable.get() == RPI_MODE_TEXT: self.conf.set_option("debugger.preferred_debugger", "faster") self.conf.set_option("view.ui_theme", "Raspberry Pi") self.conf.set_option("general.ui_mode", "simple") self.conf.set_option( "general.language", languages.get_language_code_by_name(self.language_variable.get()) ) self.conf.save() self.ok = True self.destroy() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/gridtable.py0000644000076600000240000002230714417536743017255 0ustar00aivarannamaastaffimport math import tkinter as tk from tkinter import ttk from thonny import get_workbench class GridTable(tk.Frame): def __init__(self, master, header_rows, data_row_count, footer_row_count, frozen_column_count): super().__init__(master) self.header_widgets = {} self.data_widgets = {} self.bind("", self.on_configure, True) self.screen_row_height = 22 # TODO: self.first_visible_data_row_no = 0 self.visible_data_row_count = 0 self.header_rows = header_rows self.data_rows = {} self.screen_row_count = 0 self.data_row_count = data_row_count self.column_count = len(self.header_rows[-1]) self.header_row_count = len(header_rows) self.footer_row_count = footer_row_count self.frozen_column_count = frozen_column_count self.update_header_rows() def set_data(self, data_rows): # self.data_rows.update(data_rows) # dict version self.data_rows = data_rows self.data_row_count = len(data_rows) self.update_screen_data() def update_header_rows(self): for row_no in range(self.header_row_count): for col_no in range(self.column_count): w = self.get_header_widget(self.screen_row_count, col_no) w.grid(row=row_no, column=col_no, sticky="nsew", pady=(0, 1), padx=(0, 1)) w.configure(text=self.get_header_value(row_no, col_no)) self.screen_row_count = self.header_row_count def get_data_widget(self, screen_row_no, col_no): if (screen_row_no, col_no) not in self.data_widgets: self.data_widgets[(screen_row_no, col_no)] = self.create_data_widget(col_no) return self.data_widgets[(screen_row_no, col_no)] def get_header_widget(self, row_no, col_no): if (row_no, col_no) not in self.header_widgets: self.header_widgets[(row_no, col_no)] = self.create_header_widget(col_no) return self.header_widgets[(row_no, col_no)] def create_data_widget(self, col_no): if col_no < self.frozen_column_count: background = None else: background = "white" return tk.Label(self, background=background, anchor="e", padx=7, text="") def create_header_widget(self, col_no): return tk.Label(self, anchor="e", padx=7, text="") def set_first_visible_data_row_no(self, n): self.first_visible_data_row_no = max(min(n, self.data_row_count), 0) self.update_screen_data() def _clear_screen_row(self, row_no): for widget in self.grid_slaves(row=row_no): widget.grid_remove() def update_screen_widgets(self, available_screen_height): max_screen_rows = available_screen_height // self.screen_row_height target_screen_row_count = max( min( max_screen_rows, self.header_row_count + self.data_row_count + self.footer_row_count - self.first_visible_data_row_no, ), self.header_row_count + 1 + self.footer_row_count, ) # target_screen_row_count = 30 # remove cells not required anymore ... while self.screen_row_count > target_screen_row_count: # print("removing") self._clear_screen_row(self.screen_row_count - 1) self.screen_row_count -= 1 # ... or add cells that can be shown while self.screen_row_count < target_screen_row_count: # print("adding") for col in range(self.column_count): w = self.get_data_widget(self.screen_row_count, col) w.grid( row=self.screen_row_count, column=col, sticky="nsew", pady=(0, 1), padx=(0, 1) ) self.screen_row_count += 1 self.visible_data_row_count = ( self.screen_row_count - self.header_row_count - self.footer_row_count ) def update_screen_data(self): self.update_screen_widgets(self.winfo_height()) for screen_row_no in range(self.header_row_count, self.screen_row_count): data_row_no = self.first_visible_data_row_no + screen_row_no - self.header_row_count if data_row_no == self.data_row_count: break for col_no in range(self.column_count): w = self.get_data_widget(screen_row_no, col_no) value = self.get_data_value(data_row_no, col_no) if value is None: w.configure(text="") else: w.configure(text=str(value)) def get_data_value(self, row_no, col_no): """lazy dict version: assert 0 <= row_no < self.data_row_count if row_no in self.data_rows: return self.data_rows[row_no][col_no] else: return "" """ return self.data_rows[row_no][col_no] def get_header_value(self, row_no, col_no): return self.header_rows[row_no][col_no] def on_configure(self, event): # query row height _, _, _, height = self.grid_bbox(row=1) if height > 10 and height < 100: "self.screen_row_height = height + 2" # screen_available_height = self.winfo_height() # print("HE", self.winfo_height(), event.height, self.screen_row_height) self.update_screen_widgets(event.height) self.update_screen_data() class ScrollableGridTable(ttk.Frame): def __init__(self, master, header_rows, data_row_count, footer_row_count, frozen_column_count): ttk.Frame.__init__(self, master) # set up scrolling with canvas hscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL) self.canvas = tk.Canvas(self, bd=0, highlightthickness=0, xscrollcommand=hscrollbar.set) get_workbench().bind_all("", self.debug) self.create_infopanel(data_row_count) hscrollbar.config(command=self.canvas.xview) self.canvas.xview_moveto(0) self.canvas.yview_moveto(0) self.canvas.grid(row=0, column=0, columnspan=2, sticky=tk.NSEW) self.infopanel.grid(row=1, column=0, sticky=tk.NSEW) hscrollbar.grid(row=1, column=1, sticky=tk.NSEW) # vertical scrollbar performs virtual scrolling self.vscrollbar = ttk.Scrollbar( self, orient=tk.VERTICAL, command=self._handle_vertical_scroll ) self.vscrollbar.grid(row=0, column=2, sticky=tk.NSEW) self.columnconfigure(1, weight=1) self.rowconfigure(0, weight=1) self.interior = ttk.Frame(self.canvas) self.interior.columnconfigure(0, weight=1) self.interior.rowconfigure(0, weight=1) self.interior_id = self.canvas.create_window(0, 0, window=self.interior, anchor=tk.NW) self.bind("", self._configure_interior, True) self.bind("", self._on_expose, True) self.grid_table = GridTable( self.interior, header_rows, data_row_count, footer_row_count, frozen_column_count ) self.grid_table.grid(row=0, column=0, sticky=tk.NSEW) self._update_vertical_scrollbar() def debug(self, event=None): print("DE", self.vscrollbar.get()) def create_infopanel(self, data_row_count): self.infopanel = ttk.Frame(self) self.size_label = ttk.Label(self.infopanel, text=str(data_row_count) + " rows") self.size_label.grid(row=0, column=0, padx=5) def _update_vertical_scrollbar(self): first = self.grid_table.first_visible_data_row_no / self.grid_table.data_row_count last = first + self.grid_table.visible_data_row_count / self.grid_table.data_row_count # print(first, last, self.grid_table.visible_data_row_count) self.vscrollbar.set(first, last) def _handle_vertical_scroll(self, *args): # print("vscroll", args, self.vscrollbar.get()) if len(args) == 3 and args[0] == "scroll": amount = int(args[1]) unit = args[2] if unit == "pages": amount *= self.grid_table.visible_data_row_count self.grid_table.set_first_visible_data_row_no( self.grid_table.first_visible_data_row_no + amount ) else: assert args[0] == "moveto" pos = max(min(float(args[1]), 1.0), 0.0) top_row = math.floor( (self.grid_table.data_row_count - self.grid_table.visible_data_row_count + 1) * pos ) self.grid_table.set_first_visible_data_row_no(top_row) self._update_vertical_scrollbar() def _on_expose(self, event): self.update_idletasks() self._configure_interior(event) def _configure_interior(self, event): # update the scrollbars to match the size of the inner frame size = (self.interior.winfo_reqwidth(), self.canvas.winfo_height()) self.canvas.config(scrollregion="0 0 %s %s" % size) if ( self.interior.winfo_reqheight() != self.canvas.winfo_height() and self.canvas.winfo_height() > 10 ): # update the interior's height to fit canvas self.canvas.itemconfigure(self.interior_id, height=self.canvas.winfo_height()) self._update_vertical_scrollbar() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361746.0 thonny-4.1.7/thonny/jedi_utils.py0000644000076600000240000002345714730041222017437 0ustar00aivarannamaastaff""" Utils to handle different jedi versions """ import os.path from logging import getLogger from typing import Dict, List, Optional import jedi.api.classes from jedi.api.classes import BaseSignature, ParamName from thonny.common import ( CompletionInfo, NameReference, SignatureInfo, SignatureParameter, is_local_path, ) logger = getLogger(__name__) _last_jedi_completions: Optional[List[jedi.api.classes.Completion]] = None def get_script_completions( source: str, row: int, column: int, filename: str, sys_path=None ) -> List[CompletionInfo]: global _last_jedi_completions try: script = _create_script(source, filename, sys_path) completions = script.complete(line=row, column=column, fuzzy=False) except Exception: logger.exception("Jedi error") completions = [] completions = _filter_completions(completions, sys_path) _last_jedi_completions = completions return _export_completions(completions) def get_interpreter_completions( source: str, namespaces: List[Dict], sys_path=None ) -> List[CompletionInfo]: global _last_jedi_completions try: interpreter = _create_interpreter(source, namespaces, sys_path) # assuming cursor is at the end of the source completions = interpreter.complete() except Exception: logger.exception("Jedi error") completions = [] completions = _filter_completions(completions, sys_path) _last_jedi_completions = completions return _export_completions(completions) def get_completion_details(full_name: str) -> Optional[CompletionInfo]: if not _last_jedi_completions: return None # assuming this name can be found in the list of last completions try: for completion in _last_jedi_completions: if completion.type in {"function", "class"}: signatures = [_export_signature(s) for s in completion.get_signatures()] raw_docstring = True else: signatures = None raw_docstring = False if completion.full_name == full_name: return CompletionInfo( name=completion.name, name_with_symbols=_get_completion_name_with_symbols(completion, signatures), full_name=completion.full_name, type=completion.type, prefix_length=completion.get_completion_prefix_length(), signatures=signatures, docstring=completion.docstring(raw=raw_docstring), module_name=completion.module_name, module_path=completion.module_path and str(completion.module_path), ) except Exception: logger.exception("Jedi error") return None def get_script_signatures( source: str, row: int, column: int, filename: str, sys_path=None ) -> List[SignatureInfo]: try: script = _create_script(source, filename, sys_path) sigs = script.get_signatures(line=row, column=column) except Exception: sigs = [] return [_export_signature(sig) for sig in sigs] def get_interpreter_signatures( source: str, namespaces: List[Dict], sys_path=None ) -> List[SignatureInfo]: try: # assuming cursor is at the end of the source interpreter = _create_interpreter(source, namespaces, sys_path) sigs = interpreter.get_signatures() except Exception: logger.exception("Jedi error") sigs = [] return [_export_signature(sig) for sig in sigs] def get_definitions( source: str, row: int, column: int, filename: str, sys_path: List[str] = None ) -> List[NameReference]: try: script = _create_script(source, filename, sys_path) defs = script.goto(line=row, column=column, follow_imports=True) except Exception: logger.exception("Jedi error") defs = [] return [_export_reference(d) for d in defs] def get_references( source: str, row: int, column: int, filename: str, scope: str, sys_path: Optional[List[str]] = None, ) -> List[NameReference]: try: script = _create_script(source + ")", filename, sys_path) references = script.get_references(row, column, include_builtins=False, scope=scope) except Exception: logger.exception("Jedi error") return [] # some refs (e.g. in Jedi 0.16) may lack line and column references = [ref for ref in references if ref.line is not None and ref.column is not None] return [_export_reference(ref) for ref in references] def _create_script(source: str, filename: str, sys_path: List[str]) -> jedi.api.Script: # Beside local scripts, this is also used for MicroPython remote scripts and also in MP shell if filename and is_local_path(filename) or filename is None: # local and unnamed files project_path = os.getcwd() smart_sys_path = True else: # remote files and shell project_path = None smart_sys_path = False project = jedi.Project(path=project_path, sys_path=sys_path, smart_sys_path=smart_sys_path) return jedi.Script( code=source, path=filename, project=project, ) def _create_interpreter( source: str, namespaces: List[Dict], sys_path: Optional[List[str]] ) -> jedi.api.Interpreter: # not using this method for remote MicroPython, therefore it's OK to use cwd as project path project = jedi.Project(path=os.getcwd(), sys_path=sys_path) return jedi.Interpreter(source, namespaces, project=project) def _export_completions(completions: List[jedi.api.classes.Completion]) -> List[CompletionInfo]: return [_export_completion(comp) for comp in completions] def _filter_completions( completions: List[jedi.api.classes.Completion], sys_path: Optional[List[str]] ) -> List[jedi.api.classes.Completion]: if sys_path is None: return completions result = [] for completion in completions: if completion.name.startswith("__"): continue result.append(completion) return result def _export_completion(completion: jedi.api.classes.Completion) -> CompletionInfo: # In jedi before 0.16, the name attribute did not contain trailing '=' for argument completions, # since 0.16 it does. # When older jedi versions were supported, I needed to ensure similar result for all supported # versions. # Also, for MicroPython there are some completions which are not created by jedi. return CompletionInfo( name=completion.name and completion.name.strip("="), name_with_symbols=_get_completion_name_with_symbols(completion), full_name=completion.full_name and completion.full_name.strip("="), type=completion.type, prefix_length=completion.get_completion_prefix_length(), signatures=None, # must be queried separately docstring=None, # must be queried separately module_name=completion.module_name, module_path=completion.module_path and str(completion.module_path), ) def _export_signature(sig: BaseSignature) -> SignatureInfo: as_string = sig.to_string() if "->" in as_string: # No documented API for getting the return type in 0.18 return_type = as_string.split("->")[-1].strip() else: return_type = None current_param_index = None call_bracket_start = None if hasattr(sig, "index"): # only in subclass (Signature or CallSignature) current_param_index = sig.index if hasattr(sig, "bracket_start"): # only in subclass (Signature or CallSignature) call_bracket_start = sig.bracket_start return SignatureInfo( name=sig.name, params=[_export_param(p) for p in sig.params], return_type=return_type, current_param_index=current_param_index, call_bracket_start=call_bracket_start, ) def _export_param(param: ParamName) -> SignatureParameter: # No documented API for getting separate annotation and default, need to parse s = param.to_string() if s.count("=") == 1: without_default, default = s.split("=") else: without_default = (s,) default = None if without_default.count(":") == 1: annotation = without_default.split(":")[-1].strip() else: annotation = None return SignatureParameter( kind=str(param.kind), name=param.name, annotation=annotation, default=default ) def _export_reference(ref) -> NameReference: return NameReference( module_name=ref.module_name, module_path=None if not ref.module_path else str(ref.module_path), row=ref.line, column=ref.column, length=len(ref.name), ) def _get_completion_name_with_symbols( completion: jedi.api.classes.Completion, signatures: Optional[List[BaseSignature]] = None, ) -> str: if completion.type == "param": # Older jedi versions may give trailing "=" also for actual arguments. # NB! Not all params are names of the params! return completion.name_with_symbols elif completion.type == "function": if not signatures: # signatures not found or haven't been computed yet return completion.name + "(" else: # logger.info("name: %s, type: %s, sigs: %s", completion.name, completion.type, signatures) # assuming type=instance can also have signature # if it can only be called with 0 params, then add closing paren as well different_param_counts = {len(sig.params) for sig in signatures} if different_param_counts == {0}: return completion.name + "()" else: return completion.name + "(" elif completion.type == "keyword" and completion.name != "pass": return completion.name + " " return completion.name_with_symbols ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/languages.py0000644000076600000240000000502614670256721017261 0ustar00aivarannamaastaffimport gettext import os from logging import getLogger logger = getLogger(__name__) BASE_LANGUAGE_CODE = "en_US" BASE_LANGUAGE_NAME = "English (US) [default]" # https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes LANGUAGES_DICT = { "be_BY": "Беларуская мова [BETA]", "ca_ES": "Català", "cs_CZ": "Čeština [BETA]", "de_DE": "Deutsch", "et_EE": "Eesti", "en_GB": "English (UK)", BASE_LANGUAGE_CODE: BASE_LANGUAGE_NAME, "es_ES": "Español", "eu_ES": "Euskara [BETA]", "fr_FR": "Français", "it_IT": "Italiano", "lt_LT": "Lietuvių", "hu_HU": "Magyar [BETA]", "nb_NO": "Norsk (Bokmål)", "nn_NO": "Norsk (Nynorsk)", "nl_NL": "Nederlands", "pl_PL": "Polski", "pt_PT": "Português (PT)", "pt_BR": "Português (BR)", "ro_RO": "Română", "ru_RU": "Русский", "sl_SI": "Slovenščina", "sk_SK": "Slovenčina", "fi_FI": "Suomi [BETA]", "sv_SE": "Svenska [ALPHA]", "sq_AL": "Shqip [BETA]", "vi_VN": "Tiếng Việt", "tr_TR": "Türkçe [BETA]", "uk_UA": "Українська", "zh_TW": "繁體中文-TW", "zh_CN": "简体中文 ", "zh_Hans": "简体中文 (zh-Hans) [BETA]", "ja_JP": "日本語", "hy_AM": "Հայերէն [BETA]", "fa_IR": "فارسی", "el_GR": "Ελληνικά", "ko_KR": "한국어 [韓國語] [BETA]", "ar_AR": "[BETA] عربي", "ta_IN": "தமிழ் [BETA]", "th_TH": "ภาษาไทย [BETA]", } # how many spaces to add to button caption in order to make whole text visible BUTTON_PADDING_SIZES = {"zh_TW": 4, "zh_CN": 4, "ja_JP": 4} _translation = gettext.NullTranslations() def get_button_padding(): from thonny import get_workbench code = get_workbench().get_option("general.language") if code in BUTTON_PADDING_SIZES: return BUTTON_PADDING_SIZES[code] * " " else: return "" def get_language_code_by_name(name): for code in LANGUAGES_DICT: if LANGUAGES_DICT[code] == name: return code raise RuntimeError("Unknown language name '%s'" % name) def tr(message: str) -> str: return _translation.gettext(message) def set_language(language_code: str) -> None: global _translation try: path = os.path.join(os.path.dirname(__file__), "locale") _translation = gettext.translation("thonny", path, [language_code]) except Exception as e: logger.exception("Could not set language to '%s", language_code, exc_info=e) _translation = gettext.NullTranslations() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0841436 thonny-4.1.7/thonny/locale/0000755000076600000240000000000014730055627016174 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726014166.0 thonny-4.1.7/thonny/locale/.DS_Store0000644000076600000240000003400414670161326017655 0ustar00aivarannamaastaffBud100 _ITlg1Scoit_ITlg1Scompar_ARmoDDblob  @ @ @ @_it_ITmoDDblobOzAit_ITmodDblobOzAit_ITph1Scompja_JPlg1Scomp$ja_JPmoDDblob2ϓzAja_JPmodDblob2ϓzAja_JPph1ScompPko_KRlg1Scomp%ko_KRmoDDblobzAko_KRmodDblobzAko_KRph1Scomplt_LTlg1Scompflt_LTmoDDblobzAlt_LTmodDblobzAlt_LTph1Scomppnb_NOlg1Scompnb_NOmoDDblob?zAnb_NOmodDblob?zAnb_NOph1Scompnl_NLlg1Scompnl_NLmoDDblob[zAnl_NLmodDblob[zAnl_NLph1Scompnn_NOlg1Scompb{nn_NOmoDDblob1yzAnn_NOmodDblob1yzAnn_NOph1Scomppl_PLlg1Scompipl_PLmoDDblob͍zApl_PLmodDblob͍zApl_PLph1Scomppt_BRlg1Scompl0pt_BRmoDDblobeb@Apt_BRmodDblobeb@Apt_BRph1Scomppt_PTlg1Scomppt_PTmoDDblobݔzApt_PTmodDblobݔzApt_PTph1Scompro_ROlg1Scomp9ro_ROmoDDblobozAro_ROmodDblobozAro_ROph1Scomp ru_RUlg1Scompq+ru_RUmoDDblobc zAru_RUmodDblobc zAru_RUph1Scompsk_SKlg1Scompsk_SKmoDDblob3%zAsk_SKmodDblob3%zAsk_SKph1Scompsl_SIlg1Scompžsl_SImoDDblob8zAsl_SImodDblob8zAsl_SIph1Scompsq_ALlg1Scompsq_ALmoDDblobRzAsq_ALmodDblobRzAsq_ALph1Scompsv_SElg1ScompOsv_SEmoDDblobYlzAsv_SEmodDblobYlzAsv_SEph1Scompta_INlg1Scompta_INmoDDblob1}zAta_INmodDblob1}zAta_INph1Scomp th_THlg1Scompth_THmoDDblobLzAth_THmodDblobLzAth_THph1Scomptr_TRlg1Scompktr_TRmoDDblobحzAtr_TRmodDblobحzAtr_TRph1Scompuk_UAlg1Scomp(uk_UAmoDDblob•zAuk_UAmodDblob•zAuk_UAph1Scompvi_VNlg1Scomp,;vi_VNmoDDblob)CAvi_VNmodDblob)CAvi_VNph1ScompPzh_CNlg1ScompHzh_CNmoDDblobzAzh_CNmodDblobzAzh_CNph1Scompzh_Hanslg1Scompzh_HansmoDDblobc HAzh_HansmodDblobc HAzh_Hansph1Scompzh_TWlg1Scompmzh_TWmoDDblob zAzh_TWmodDblob zAzh_TWph1Scomp@ar_ARlg1Scompar_ARmoDDblobxzAar_ARmodDblobxzAar_ARph1Scompbe_BYlg1Scompbe_BYmoDDblobYB(HAbe_BYmodDblobYB(HAbe_BYph1Scompca_ESlg1Scompca_ESmoDDblob 4WFAca_ESmodDblob 4WFAca_ESph1Scompcs_CZlg1Scompcs_CZmoDDblobqzAcs_CZmodDblobqzAcs_CZph1Scompde_DElg1Scompde_DEmoDDblobDzAde_DEmodDblobDzAde_DEph1Scomp el_GRlg1ScompTel_GRmoDDblobĒzAel_GRmodDblobĒzAel_GRph1Scomppen_GBlg1Scomppen_GBmoDDblob!*AAen_GBmodDblob!*AAen_GBph1Scompen_USlg1Scompxen_USmoDDblobz䒱zAen_USmodDblobz䒱zAen_USph1Scompes_ESlg1Scomp!es_ESmoDDblob]zAes_ESmodDblob]zAes_ESph1Scomp@et_EElg1Scompۑet_EEmoDDblobnzAet_EEmodDblobnzAet_EEph1Scompeu_ESlg1Scompeu_ESmoDDblob6JHAeu_ESmodDblob6JHAeu_ESph1Scompfa_IRlg1ScompGfa_IRmoDDblob*zAfa_IRmodDblob*zAfa_IRph1Scomp`fi_FIlg1Scompnfi_FImoDDblob>zAfi_FImodDblob>zAfi_FIph1Scompfr_FRlg1Scompfr_FRmoDDblobqvzAfr_FRmodDblobqvzAfr_FRph1Scomphu_HUlg1Scomphu_HUmoDDblob񇓱zAhu_HUmodDblob񇓱zAhu_HUph1Scomphy_AMlg1Scomp#hy_AMmoDDblob0zAhy_AMmodDblob0zAhy_AMph1Scomp@ta_INmoDDblob1}zAta_INmodDblob1}zAta_INph1Scomp th_THlg1Scompth_THmoDDblobLzAth_THmodDblobLzAth_THph1Scomptr_TRlg1Scompktr_TRmoDDblobحzAtr_TRmodDblobحzAtr_TRph1Scompuk_UAlg1Scomp(uk_UAmoDDblob•zAuk_UAmodDblob•zAuk_UAph1Scompvi_VNlg1Scomp,;vi_VNmoDDblob)CAvi_VNmodDblob)CAvi_VNph1ScompPzh_CNlg1ScompHzh_CNmoDDblobzAzh_CNmodDblobzAzh_CNph1Scompzh_Hanslg1Scompzh_HansmoDDblobc HAzh_HansmodDblobc HAzh_Hansph1Scompzh_TWlg1Scompmzh_TWmoDDblob zAzh_TWmodDblob zAzh_TWph1Scomp0 E DSDB `8@ @ @h1Scompeu_ESlg1Scompeu_ESmoDDblob6JHAeu_ESmodDblob6JHAeu_ESph1Scompfa_IRlg1ScompGfa_IRmoDDblob*zAfa_IRmodDblob*zAfa_IRph1Scomp`fi_FIlg1Scompnfi_FImoDDblob>zAfi_FImodDblob>zAfi_FIph1Scompfr_FRlg1Scompfr_FRmoDDblobqvzAfr_FRmodDblobqvzAfr_FRph1Scomphu_HUlg1Scomphu_HUmoDDblob񇓱zAhu_HUmodDblob񇓱zAhu_HUph1Scomphy_AMlg1Scomp#hy_AMmoDDblob0zAhy_AMmodDblob0zAhy_AMph1Scomp././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.931244 thonny-4.1.7/thonny/locale/ar_AR/0000755000076600000240000000000014730055627017160 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0851874 thonny-4.1.7/thonny/locale/ar_AR/LC_MESSAGES/0000755000076600000240000000000014730055627020745 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/ar_AR/LC_MESSAGES/thonny.mo0000644000076600000240000011121714670256721022625 0ustar00aivarannamaastaffL |}]$) *3^ m&z+-! D.7s&      1x?  &5< P[j;{    , GD I [ c <x % * !%!8!U!Y!^!d!y!!!3!""1"8"H" Q"]"m"u"|""!" """ #B#\#b#g#v### ##%##/#'$.B$q$ w$$$ $$ $$$$ $$$$$ %"%(% 1% >% I%U%g%,&/2&=b& &&&&&0&' ''6,'c'}'''''''''L(FM((C\)))7)***!*9*X* s** ** ***3*+ ++&+/+E+T+Y+ a+l+|+ +++~,z1-;---. %.13. e......../ /"/n2//,v000<01-1U1c)222 2n2!3 53 A3 O3 ]3k3q333?3C3454'S4){4 444445&5;5TC5 5555 555H5O'65w66666667 $707:87s7x77&777777 8 8 8*8;8M8a8f8 x8B888 88 8&9)9 19=9 V9 d9q99 999 9 999 9"9: : /: :: G: U:`: g:t:z:: :: : ::2:/;8O;;:;; ;< <0!<R<d<v< {< <<<-<< < <= === 0= ==)K=u=}= ====== =>=n=>0>!> > ? ? @b@@ATA/fAA@PBBB"BBB B CC#C0,C ]CgC lCvCCCCCCC CC2D%7D]DcD lDvDDDLDDD5E EEEECF#YF}F F FF FF1F%F G%GV7GIG GG GGH&H J J9JHJ/@K pK ~KXKKcKccL5LL=M@MN NN -N!:N\NeN-|NNNOOO#OJO;;P wPP P"PPqP YQzQQQQQ QQ1QR5RSS 4SG?SS SSSZS4)TB^T/TT+TU U#U&2U1YU1U1UNU>V<YVVVV VVVVV WD3WxW/W&WW]W RX ^XiXX X XXX1X0Y<@Y8}YGYYZZ Z/Z>ZGZ[Z(vZZZZZZZ"[ *[6[L[ d[r[[[I\@\a0]] ]]] ]a]M^^^(~^N^,^,#_P_7j____ _ _`s `~`G`]Gaa<aPaNb Wb!bb#b-b8bc c =cHc Xcecc]ccc! d -d8dWd kd vd d!d dd1dAdAf5g_gFhdh}hh7hDh&/iVi!ui#i!ii i'i'&jNjbjLkQelSlg msmB?nxnzn voooo49pnpppppp ppoq]sq(q(q8#rC\rrr(r8r,*s$Ws!|s ss8tLt Ut btott t\tdu;wuuuu uu6v*EvpvvZvvww;1w mwzw wwww w xx$'xLx jx2wxxlx 5y @yKycyyyJy yy,z/zBzXzwz z z zzz&zC{"S{:v{{{{{{|-|4|G|P|f|||:|||6|G}Kg}p}$~d8~/~E~  V6( 049nw 1Mm-v&& #=cOAI6ƒDރ#C3pφ@<Raxڈ-4 N7Y"/"hp " %>N_WsTˋ -CV(tzi _2k#ŽL܎2) \g ;Ï118Oq!2 Tu%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: ar Language-Team: ar Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=0 && n%100<=2 ? 4 : 5); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d عنصر(في هذه الحالة ، تستخدم الواجهة الخلفية لثوني نفس المفسر، لذا فإن كلا الحوارات يديران نفس الحزم.)(إعادة تشغيل ثوني بعد تعديل هذه)(يستخدم عند النقر زر شريط أدوات التنقيح)بيئة افتراضية خاصة (مهملة)Birdseye عنعن ثونيالتثبيت المتقدم / التحديث / الرجوع إلى إصدار أقدمخيارات متقدمةTab السماح بالتكملة التلقائية في الصدفة باستخدام مفتاحTab السماح بالتكملة التلقائية في المحرر باستخدام مفتاحالسماح بسخة واحدة فقط من ثونيالسماح بالدخول إلى المكتبات (على سبيل المثال ، خارج دليل السكربت الرئيسي)مفسر بايثون بديل أو بيئة افتراضيةهل أنت متأكد أنك تريد إلغاء تثبيته؟المساعدخصائصالمصادقةالمؤلفالتكملة التلقائيةعودةالعودة إلى %sالعودة إلى الإطار الحاليمجلد غير صالحBirdseye عبارة عن منقح للغة بايثون والذي يتطلب تثبيته بشكل منفصل. هل ترغب بفتح صفحة المساعدة لمزيد من التفاصيل؟Birdseye منفذاستعراض الحزمتعقب الاخطاءلا يمكن الإغلاق بعدلا يمكن العثور على اسم الحزمة من القائمة:لا يمكن العثور على القرص المناسبالغاءالغاء العملية؟إلغاءحساسية حالة الأحرفتغيير حجم الخطتغيير دليل العمل الحالي إلى دليل السكربت على التشغيل / التنقيحسيركت بايثون (عام)CircuitPython جهاز مسحمسح الصدفةإضغطإضغط على إغلاقإغلاق الكلإغلاق نوافذ التبويب الاخرىتحويل إلى تعليقتم تحديث الإعدادات. أعد تشغيل ثوني لبدء العمل في الوضع العادي. (راجع "أدوات ← خيارات ← عام" إذا غيرت رأيك لاحقًا.)إعداد ملفات %sإعداد المفسرتأكيدConnect your device to the computer and select corresponding port belowنسخالنسخ إلى الحافظةينسخينسخ %s إلى %sلم نتمكن من إيجاد القرص '%s'. هل ترغب بتحديده بنفسك؟تعذر العثور على الحزمة من PyPI.PyPI تعذر العثور على معلومات الحزمة منإنشاء بيئة افتراضية جديدةإنشاء دليلقيد إنشاء بيئة افتراضيةقصبياناتالتنقيحتنقيح السكربت الحاليتنقيح السكربت الحالي (birdseye)تنقيح السكربت الحالي (أسرع)تنقيح السكربت الحالي (الطف)وضع التنقيح (يوفر سجلات تشخيص أكثر تفصيلاً)تقليص حجم الخطإزالة مسافة بادئة للأسطر المحددةحذفحذف المحددحذفحذف %sالإصدار المطلوبالتفاصيلجهازخصائص الدليلتعطيل صوت التنبيهتعطيل الفحوصات (معرف واحد فقط لكل سطر)قطع الاتصالهل ترغب باستبدال الملف '%s'?إرساء نوافذ المستخدمالتوثيقلا تنس أن main.py يعمل فقط بدون السكربت الرئيسي المضمن.انتهى!لأسفلالتنزيل إلى %sتنزيل %s إلى %sتحريرالمحررخط المحررإدخل عدد صحيحأدخل اسم لدليل الجديد تحت %sأكتب النص المراد استبداله.أدخل عبارة مرور مفتاحك الخاص لـ {}أدخل كلمة المرور الخاصة بك لـ {}متغيرات البيئة (المفتاح=القيمة لكل سطر)خطأرمز الخطأ:خطأ:الأحداثاستثناءخروجإغلاق ثونيتوسع في الصدفةتصدير سجلات الاستخدامملفاسم الملف:خصائص الملفالملفاتابحثالبحث والاستبدالالبحث عن حزمة في PyPIالبحث:برنامج ثابتتنشيط المحررركز علىتنشيط الصدفةوضع تحجيم الخطلأسباب تتعلق بالأداء ، تتجنب الصدفة عرض الأسطر الطويلة جدًا بالكامل (راجع الأدوات => الخيارات => الصدفة). هنا يمكنك التفاعل مع جزء النص الأصلي.لإلغاء التثبيت، احذف الملفات المتطابقة.للتحديث، قم بتثبيت الحزمة مرة أخرى.تم العثور على عدة أقراص '%s'. هل تريد اختيار واحد بنفسك؟الشاشة كاملةالدالةاستدعاء دالة في %sعامالكومةوضع الكومة قيد التشغيل. أغلق عرض الكومة لإيقاف تشغيلهالمساعدةمحتويات المساعدةإخفاء الملفات المخفيةتمييز السطر الحالي (يتطلب إعادة فتح المحرر)تمييز المتغيرات المحليةتمييز الأسماء المتطابقةتمييز الأقواستمييز عناصر التعليمة البرمجيةتمييز أحرف التابالرئيسيةالموقع الرسميالمعرفتثبيتOI خطإذا رمى الأمر الأخير استثناءً ، فسيُظهر هذا العرض تفاصيل الخطأ.إذا لم تتمكن من العثور عليه ، فقد تحتاج إلى تثبيت تعريف USB مناسب أولاً.إذا كنت لا تعرف من أين تحصل على الحزمة، إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر.زيادة حجم الخطإضافة مسافة بادئة للأسطر المحددةمسافة بادئة بأحرف جدولة (غير مستحسن لبايثون)فهرستثبيتPyPI التثبيت من خلالالتثبيت من ملف محليالتثبيت من ملف المتطلباتتثبيت أو إزالة البرنامج الثابتمثبت على:الإصدار المثبت:تثبيتتثبيت '%s'المفسرإيقاف التنفيذإلىالبقاء على نافذة الطرفية بعد انتهاء عملية البايثونالمفتاحمعرف المفتاحالمفسرات المعروفةاللغةأحدث اصدار مستقراحدث اصدارتحميلتحميلتحميل %sالمتغيرات المحليةالموقعالموقع: سجل أحداث استخدام البرنامجيبدو أنك تقوم بتثبيت حزمة متعلقة بثوني. إذا كنت تقصد تثبيت مكون إضافي من ثوني، فيجب عليك اختيار "أدوات... > إدارة الإضافات" بدلاً من ذلك. هل أنت متأكد من أنك تريد تثبيت %s بالخلفية؟يبدو أنك تحاول تثبيت إضافة لثوني لإصدار قديم (لم تحدد الإضافة إصدار ثوني المطلوب). إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر.صنع في جامعة تارتو ، إستونيا ، بمساعدة كل من مجتمع مفتوح المصدر ، ومؤسسة رسبري باي، وشركة Cybernetica ASتأكد بأن مايكروبايثون مثبت مسبقاً على micro:bit الخاص بكإدارة الحزم لـ %sإدارة الحزم...إدارة الإضافات...تكبير العرضأقصى طول لشظايا الخط قبل الضغطالحد الأقصى لعدد الأسطر للاحتفاظ بها.قد يجعل التنقيح أبطأ.مايكروبايثون (SSH)مايكروبايثون (عام)مايكروبايثون (محلي)جهاز مايكروبايثونتم التعديلالوحدةنقل إلى سلة المحذوفاتنقل إلى سلة المحذوفاتنقل %s إلى %sملاحظة! يجب تفعيل الإغلاق التلقائي في إعدادات الطرفية (ملفات التعريف > الصدفة > عند الخروج من الصدفة)ملاحظة! قد لا يعمل زر اختيار الملف بشكل صحيح عند تحديد الملفات القابلة للتنفيذ من بيئة افتراضية. في هذه الحالة ، اختر تفعيل السكربت بدلاً من المفسر (أو أدخل المسار مباشرة في مربع النص)!ملاحظة! قد تؤدي القيم الكبيرة إلى ضعف الأداء!ملاحظة! أعد تشغيل ثوني بعد تغيير هذه الخيارات!ملاحظة! بعض تنسيق العناصر يتغير فقط بعد إعادة تشغيل ثوني!ملاحظة! قد يكون هناك إصدار آخر متاح متوافق مع إصدار ثوني الحالي. انقر فوق الزر '...' لاختيار الإصدار المراد تثبيته.ملاحظة! ثوني يدعم فقط بايثون 3.5 وأعلىملاحظة! تحتاج إلى إعادة تشغيل ثوني بعد تثبيت / تحديث / إزالة لإضافة.ملاحظة! مايكروباثيون نشرت إصدار %s من هذه الحزمة وسوف تثبت تلقائياً.الاسمجديددليل جديدسيتم أيضًا تثبيت الحزم الجديدة في هذا الدليل. يجب أن تدار المواقع الأخرى بوسائل بديلة.سيتم تثبيت الحزم الجديدة علىالكائن التاليغير متوفرغير متصلغير مدعومملاحظاتلا شيء محددموافقمراقب الكائنافتح المساعد تلقائياً عندما يحتوي الكود الخاص بك على تحذيراتافتح المساعد تلقائيًا عند تعطل البرنامج مع استثناءفتح مجلد بيانات ثوني...فتح مجلد برنامج ثوني...فتح وإغلاق عرض المكدس تلقائياًافتح القيم المقيمة في مراقب الكائناتافتح من %sافتح في ثونيافتح في محرر نصوص ثونيافتح في تطبيق النظام الافتراضيفتح في مدير ملفات النظامفتح إعادة التشغيل ...افتح صدفة النظام...فتح...افتح عرض المكدس عند أول استدعاء وأغلقه عندما يعود البرنامج إلى الإطار الرئيسي.الخيارات...خارجالمخططالتالياستبدال المف؟استبدال السمة '%s'الحزمةالحزمة "{}" مطلوبة لتثبيت وإلغاء تثبيت الحزم الأخرى.PyPI الخزمة غير متوفرة في مايكروبايثون. سيتم تثبت إصدارة مدير الحزم غير متوفر لهذا المفسردليل الحزمكلمة المرورلصقالمسارMyPy تنفيذ فحوصاتPylint تنفيذ الفحوصات المحددة منيرجى التحقق من الإملاء!الرجاء الانتظارالتخطيطيصور المخطط سلسلة من الأرقام المطبوعة إلى الصدفة.منفذWebREPL أو منفذالمنقح المفضلتقديم Python REPL بعد انتهاء البرنامجمعاينةالكائن السابقطباعة...وسائط البرنامجوسائط البرنامج:شجرة البرنامجخصائصPyPI صفحةPygame نمط الصفربايثون قابل للتنفيذمفسرات البايثونالخروجهل تريد إلغاء التثبيت حقًا؟الملفات الحاليةالحد الأقصى لطول السطر الموصى به (اختر صفر لإزالة خط الهامش)تكرارتحديثالوضع العاديRemote Python 3 (SSH)إعادة تسمية...إعادة فتح جميع الملفات من الجلسة السابقةاستبدلاستبدال الكلاستبدال التاب بالمسافاتاستبدل بـ:ابحث+استبدلالإبلاغ عن مشكلةالمتطلباتيتطلب:استأنفتشغيلالتشغيل والتنقيحتشغيل / استأنفتشغيل السكربت الحاليتشغيل السكربت الحالي في موجه الأوامرالتشغيل إلى المؤشرتشغيل السكربت الحالي في الطرفيةحفظحفظ كافة الملفاتحفظ باسم...حفظ نسخة...حفظ كلمة المرورالحفظ في %sحفظالحفظ في %sمجالPyPI البحث في نتائج البحثيبحثراجع المساعدة لمزيد من التفاصيلتحديد الكلتحديد الكلاختر عنصر ومن ثم حاول مرة آخرىحدد مجلد فارغ لبيئة الافتراضية الجديدةاختيار مجلد موجود أو إنشاء مجلد جديد فارغحدد ما إذا كانت مربعات حوار الملفات ظهرت خلف النافذة الرئيسيةحدد المفسرالمجلد المحدد ليس فارغاً. حدد مجلد اخر أو الغاء العمليةإرسال EOF / إعادة تشغيل لينةالعناصر المظللة (غير قابلة للاستيراد):الصدفةعرض التخطيطعرض استدعاءات الدوال (الإطارات) في نوافذ منفصلةإظهار الملفات المخفيةعرض أرقام الأسطرالحجمالحجم (البايت)الكود المصدرينص مضغوط (%d حرف)مكدسابدأ بتحديد الحزمة من اليساريبدأعودة للخلفأدخلأخرجالتاليإيقافإيقاف/إعادة تشغيل بالخليفةمعلومات التخزينمساحة التخزينمساخة التخزين في هذا القرص أو نظام الملفاتموجزالتبديل إلى الوضع العاديسمة الصياغةموقع الجهاز المستهدفطراز الجهاز المستهدفالهدف:الطرفيةمحاكي الطرفيةالجواب هوهذه العملية قيد التشغيل. هل أنت متأكد برغبتك بالالغاء؟التمثيل أعلاه هو قيمة تقريبية لعدد العشري. القيمة الدقيقة المخزنة هي %s وهي حوالي %sنفس المفسر الذي يشغّل ثوني (افتراضي)لم يتم العثور على النص المحدد!السمات والخطوطهذه النافذة مخصصة لكتابة ملاحظاتك -- مثل تعليمات المعلم، مقتطفات أكواد، أي شي. سوف تحفظ وتعرض تلقائياً عندما تفتح برنامج ثوني مرة اخرى. يمكنك حذف هذا النص لتوفير مساحة لملاحئاتك.الكمبيوتر الحاليهذه النافذة مخصصة لإدارة المكونات الإضافية لثوني وتبعياتها. إذا كنت ترغب في تثبيت حزم لبرامجك الخاصة ، فاختر أدوات ← إدارة الحزم ...يسرد مربع الحوار هذا جميع الحزم المتاحة ، ولكنه يسمح بترقية وإلغاء تثبيت الحزم فقط منيسرد مربع الحوار هذا وحدات المستوى الأعلى من الأدلة التالية: هذا تعليقهذه الحزمة تتطلب إصدار آخر لثوني:لا يقدم البرنامج أي ضمان على الإطلاق! إنه برنامج حر،ونرحب بإعادة توزيعه بشروط معينة،لمزيد من التفاصيل راجع https://opensource.org/licenses/MIT تتم صيانة هذه البيئة الافتراضية تلقائياً من قبل ثوني.خيارات ثونيإضافات ثونيإضافة لثوني بدون متطلباتتبديل التعليقأدواتمحاولة اكتشاف المنفذ تلقائياًوضع واجهة المستخدمعامل تحجيم واجهة المستخدمسمة واجهة المستخدمقم بإلغاء تحديد إذا كنت تريد المزيد من التجربة التقليدية.إزالة التعليقتراجعإلغاء التثبيتإزالة '%s'متطلبات غير ملائمةلأعلىتحديثتحديث الاعتماديةتحديث أو إلغاء تثبيتتحديث '%s'رفع إلى %sرفع %s إلى %sاستخدم الأمر "إيقاف" اذا كنت ترغب بإلغاء التنقيحاستخدم مربع حوار الملفات لتي كي بدلاً من زينتيالقيمةمعرف القيمةالمتغيراتتاريخ الإصداراتالإصدار المراد تثبيتهعرضماذا تفعل بملف %s عند النقر فوقه نقرًا مزدوجًا في مستعرض ملفات ثوني؟ما المفسر أو الجهاز ترغب باستخدامه لتشغيل الكود الخاص بك؟مع المفسر الحالي يمكنك فقط استعراض الحزم هنا. استخدم "الأدوات > افتح صدفة النظام..." لتثبيت، أو تحديث، أو الغاء التثبيت.يعمل...التفاف النص (قد يكون بطيئاً)أنت تحتاج إلى إدخاليجب تحديد ملف!تحتاج إلى إيقاف برنامجك لتشغيل مدير الحزممفسرك غير موجود في القائمة؟تكبيركافة الملفاتالخ، الخالبايتالمساحة المتوفرةهناابحث عن اسم جهازك ، "USB Serial" أو "UART"لا يوجد دليل lib مطلق في sys.pathالرجاء الانتظارANSI دعم أنماط والالوان الأساسيةلتحديد موقع ملف الحزمة وتثبيته (عادةً بامتداد .whl أو .tar.gz أو .zip).إذا كنت لا تعرف من أين تحصل على الحزمة ، فغالبًا ما سترغب في البحث في فهرس حزمة البايثون. ابدأ بإدخال اسم الحزمة في مربع البحث أعلاه واضغط على ENTER.المساحة الكليةنص_غير_مغلقالمساحة المستخدمةموقع حزم المستخدمبيئة افتراضية././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ar_AR/LC_MESSAGES/thonny.po0000644000076600000240000015444214417536743022643 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: ar\n" #: thonny/workbench.py:357 msgid "File" msgstr "ملف" #: thonny/workbench.py:358 msgid "Edit" msgstr "تحرير" #: thonny/workbench.py:359 msgid "View" msgstr "عرض" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "تشغيل" #: thonny/workbench.py:361 msgid "Tools" msgstr "أدوات" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "المساعدة" #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "مفسر بايثون بديل أو بيئة افتراضية" #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "بيئة افتراضية خاصة (مهملة)" #: thonny/workbench.py:582 msgid "Exit" msgstr "خروج" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "تقليص حجم الخط" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "تنشيط المحرر" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "تنشيط الصدفة" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "تكبير العرض" #: thonny/workbench.py:653 msgid "Full screen" msgstr "الشاشة كاملة" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "وسائط البرنامج" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "عن ثوني" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "صنع في جامعة تارتو ، إستونيا ، بمساعدة كل من مجتمع مفتوح المصدر ، ومؤسسة رسبري باي، وشركة\n" "Cybernetica AS" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "لا يقدم البرنامج أي ضمان على الإطلاق!\n" "إنه برنامج حر،ونرحب بإعادة توزيعه بشروط معينة،لمزيد من التفاصيل راجع\n" "https://opensource.org/licenses/MIT " #: thonny/plugins/about.py:152 msgid "Version history" msgstr "تاريخ الإصدارات" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "الإبلاغ عن مشكلة" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "افتح المساعد تلقائيًا عند تعطل البرنامج مع استثناء" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "افتح المساعد تلقائياً عندما يحتوي الكود الخاص بك على تحذيرات" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Pylint تنفيذ الفحوصات المحددة من" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy تنفيذ فحوصات" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "تعطيل الفحوصات (معرف واحد فقط لكل سطر)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "المساعد" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "التكملة التلقائية" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "ما المفسر أو الجهاز ترغب باستخدامه لتشغيل الكود الخاص بك؟" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "المفسر" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "Birdseye عن" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye\n" "عبارة عن منقح للغة بايثون والذي يتطلب تثبيته بشكل منفصل.\n" "هل ترغب بفتح صفحة المساعدة لمزيد من التفاصيل؟" #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "تنقيح السكربت الحالي (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "تبديل التعليق" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "تحويل إلى تعليق" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "إزالة التعليق" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "تراجع" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "تكرار" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "قص" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "نسخ" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "لصق" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "تحديد الكل" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "التشغيل إلى المؤشر" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "لا يمكن الإغلاق بعد" #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "استخدم الأمر \"إيقاف\" اذا كنت ترغب بإلغاء التنقيح" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "إرساء نوافذ المستخدم" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "تمييز الأسماء المتطابقة" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "تمييز المتغيرات المحلية" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "تمييز الأقواس" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "تمييز عناصر التعليمة البرمجية" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "تمييز السطر الحالي (يتطلب إعادة فتح المحرر)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "Tab السماح بالتكملة التلقائية في المحرر باستخدام مفتاح" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "Tab السماح بالتكملة التلقائية في الصدفة باستخدام مفتاح" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "عرض أرقام الأسطر" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "الحد الأقصى لطول السطر الموصى به\n" "(اختر صفر لإزالة خط الهامش)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "المحرر" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "تصدير سجلات الاستخدام" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "الأحداث" #: thonny/plugins/files.py:551 msgid "Files" msgstr "الملفات" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "البحث والاستبدال" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "البحث:" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "استبدل بـ:" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "حساسية حالة الأحرف" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "لأعلى" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "لأسفل" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "ابحث" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "استبدل" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "ابحث+استبدل" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "استبدال الكل" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "أكتب النص المراد استبداله." #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "لم يتم العثور على النص المحدد!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "السماح بسخة واحدة فقط من ثوني" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "إعادة فتح جميع الملفات من الجلسة السابقة" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "تعطيل صوت التنبيه" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "وضع تحجيم الخط" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "وضع الكومة قيد التشغيل.\n" "أغلق عرض الكومة لإيقاف تشغيله" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "الكومة" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "اللغة" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "هذه النافذة مخصصة لكتابة ملاحظاتك -- مثل تعليمات المعلم، مقتطفات أكواد، أي شي.\n" "\n" "سوف تحفظ وتعرض تلقائياً عندما تفتح برنامج ثوني مرة اخرى.\n" "\n" "يمكنك حذف هذا النص لتوفير مساحة لملاحئاتك." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "ملاحظات" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "الكائن السابق" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "الكائن التالي" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "مراقب الكائن" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "المخطط" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame نمط الصفر" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "البحث عن حزمة في PyPI" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "إلغاء التثبيت" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "إغلاق" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "إضغط على " #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "هنا" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "تحديث" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "تعذر العثور على الحزمة من PyPI." #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "أحدث اصدار مستقر" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "احدث اصدار" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "موجز" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "المؤلف" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "الموقع الرسمي" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "تعقب الاخطاء" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "التوثيق" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "PyPI صفحة" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "المتطلبات" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "هل تريد إلغاء التثبيت حقًا؟" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "هل أنت متأكد أنك تريد إلغاء تثبيته؟" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "العودة إلى\n" "الإطار الحالي" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "المتغيرات" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "الكمبيوتر الحالي" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "تحديث" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "ركز على" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "خطأ" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "يجب تحديد ملف!" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "استبدال المف؟" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "هل ترغب باستبدال الملف '%s'?" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "جديد" #: thonny/editors.py:565 msgid "Open..." msgstr "فتح..." #: thonny/editors.py:567 msgid "Load" msgstr "تحميل" #: thonny/editors.py:576 msgid "Recent files" msgstr "الملفات الحالية" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "إغلاق الكل" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "حفظ" #: thonny/editors.py:633 msgid "Save as..." msgstr "حفظ باسم..." #: thonny/editors.py:644 msgid "Save copy..." msgstr "حفظ نسخة..." #: thonny/editors.py:653 msgid "Rename..." msgstr "إعادة تسمية..." #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "خيارات ثوني" #: thonny/running.py:121 msgid "Run current script" msgstr "تشغيل السكربت الحالي" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "تشغيل السكربت الحالي في موجه الأوامر" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "إيقاف/إعادة تشغيل بالخليفة" #: thonny/running.py:166 msgid "Stop" msgstr "إيقاف" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "إيقاف التنفيذ" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "إرسال EOF / إعادة تشغيل لينة" #: thonny/running.py:201 msgid "Disconnect" msgstr "قطع الاتصال" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "المفسرات المعروفة" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "مفسرك غير موجود في القائمة؟" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "ملاحظة! ثوني يدعم فقط بايثون 3.5 وأعلى" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "إنشاء بيئة افتراضية جديدة" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "اختيار مجلد موجود أو إنشاء مجلد جديد فارغ" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "مفسرات البايثون" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "كافة الملفات" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "حدد مجلد فارغ لبيئة الافتراضية الجديدة" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "مجلد غير صالح" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "المجلد المحدد ليس فارغاً.\n" "حدد مجلد اخر أو الغاء العملية" #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "قيد إنشاء بيئة افتراضية" #: thonny/shell.py:83 msgid "Clear shell" msgstr "مسح الصدفة" #: thonny/shell.py:138 msgid "Plotter" msgstr "التخطيط" #: thonny/shell.py:269 msgid "Clear" msgstr "مسح" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "عرض التخطيط" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "لأسباب تتعلق بالأداء ، تتجنب الصدفة عرض الأسطر الطويلة جدًا بالكامل (راجع الأدوات => الخيارات => الصدفة).\n" "هنا يمكنك التفاعل مع جزء النص الأصلي." #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "التفاف النص (قد يكون بطيئاً)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "النسخ إلى الحافظة" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "توسع في الصدفة" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "نص مضغوط (%d حرف)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "يصور المخطط سلسلة من الأرقام المطبوعة إلى الصدفة." #: thonny/shell.py:1796 msgid "See Help for details." msgstr "راجع المساعدة لمزيد من التفاصيل" #: thonny/ui_utils.py:449 msgid "Close others" msgstr "إغلاق نوافذ التبويب الاخرى" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "ينسخ" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "ينسخ\n" "%s\n" "إلى\n" "%s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "الغاء" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "موافق" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "الغاء العملية؟" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "هذه العملية قيد التشغيل.\n" "هل أنت متأكد برغبتك بالالغاء؟" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "تحديد الكل" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "الصدفة" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "نفس المفسر الذي يشغّل ثوني (افتراضي)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "تتم صيانة هذه البيئة الافتراضية تلقائياً من قبل ثوني." #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "الموقع: " #: thonny/workbench.py:592 msgid "Options..." msgstr "الخيارات..." #: thonny/workbench.py:599 msgid "Increase font size" msgstr "زيادة حجم الخط" #: thonny/workbench.py:664 msgid "Change font size" msgstr "تغيير حجم الخط" #: thonny/workbench.py:665 msgid "Zoom" msgstr "تكبير" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "إغلاق ثوني" #: thonny/workbench.py:677 msgid "Quit" msgstr "الخروج" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "استبدال السمة '%s'" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "وسائط البرنامج:" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "الوضع العادي" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "تم تحديث الإعدادات. أعد تشغيل ثوني لبدء العمل في الوضع العادي.\n" "\n" "(راجع \"أدوات ← خيارات ← عام\" إذا غيرت رأيك لاحقًا.)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "شجرة البرنامج" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "حدد المفسر" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "استأنف" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "تشغيل / استأنف" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "تنقيح السكربت الحالي" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "التنقيح" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "تنقيح السكربت الحالي (الطف)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "تنقيح السكربت الحالي (أسرع)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "التالي" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "التالي" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "أدخل" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "إلى" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "أخرج" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "خارج" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "عودة للخلف" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "عودة" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "مكدس" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "استثناء" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "سجل أحداث استخدام البرنامج" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "وضع التنقيح (يوفر سجلات تشخيص أكثر تفصيلاً)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "وضع واجهة المستخدم" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "عامل تحجيم واجهة المستخدم" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "ملاحظة! أعد تشغيل ثوني بعد تغيير هذه الخيارات!" #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "عام" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "استعراض الحزم" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "مع المفسر الحالي يمكنك فقط استعراض الحزم هنا.\n" "استخدم \"الأدوات > افتح صدفة النظام...\" لتثبيت، أو تحديث، أو الغاء التثبيت." #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "دليل الحزم" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "PyPI التثبيت من خلال" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "إذا كنت لا تعرف من أين تحصل على الحزمة، " #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "إذا كنت لا تعرف من أين تحصل على الحزمة ، فغالبًا ما سترغب في البحث في فهرس حزمة البايثون. ابدأ بإدخال اسم الحزمة في مربع البحث أعلاه واضغط على ENTER." #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "إضغط" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "لتحديد موقع ملف الحزمة وتثبيته (عادةً بامتداد .whl أو .tar.gz أو .zip)." #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "تحديث أو إلغاء تثبيت" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "ابدأ بتحديد الحزمة من اليسار" #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "الهدف:" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "بيئة افتراضية" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "موقع حزم المستخدم" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "يسرد مربع الحوار هذا جميع الحزم المتاحة ، ولكنه يسمح بترقية وإلغاء تثبيت الحزم فقط من" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "سيتم أيضًا تثبيت الحزم الجديدة في هذا الدليل. يجب أن تدار المواقع الأخرى بوسائل بديلة." #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "الإصدار المثبت:" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "مثبت على:" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "يرجى التحقق من الإملاء!" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "أنت تحتاج إلى إدخال" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "PyPI تعذر العثور على معلومات الحزمة من" #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "رمز الخطأ:" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "لا يمكن العثور على اسم الحزمة من القائمة:" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "الحزمة \"{}\" مطلوبة لتثبيت وإلغاء تثبيت الحزم الأخرى." #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "الحزمة" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "إدارة الحزم لـ %s" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "تأكيد" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "يبدو أنك تقوم بتثبيت حزمة متعلقة بثوني.\n" "إذا كنت تقصد تثبيت مكون إضافي من ثوني، فيجب عليك اختيار \"أدوات... > إدارة الإضافات\" بدلاً من ذلك.\n" "\n" "هل أنت متأكد من أنك تريد تثبيت %s بالخلفية؟" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "ملاحظة! قد يكون هناك إصدار آخر متاح متوافق مع إصدار ثوني الحالي. انقر فوق الزر '...' لاختيار الإصدار المراد تثبيته." #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "إضافة لثوني بدون متطلبات" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "يبدو أنك تحاول تثبيت إضافة لثوني لإصدار قديم (لم تحدد الإضافة إصدار ثوني المطلوب).\n" "\n" "إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر." #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "متطلبات غير ملائمة" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "هذه الحزمة تتطلب إصدار آخر لثوني:" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر." #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "(في هذه الحالة ، تستخدم الواجهة الخلفية لثوني نفس المفسر، لذا فإن كلا الحوارات يديران نفس الحزم.)" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "ملاحظة! تحتاج إلى إعادة تشغيل ثوني بعد تثبيت / تحديث / إزالة لإضافة." #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "إضافات ثوني" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "التثبيت المتقدم / التحديث / الرجوع إلى إصدار أقدم" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "الإصدار المطلوب" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "تحديث الاعتمادية" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "يتطلب:" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "خطأ:" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "إدارة الحزم..." #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "إدارة الإضافات..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "فتح إعادة التشغيل ..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "تغيير دليل العمل الحالي إلى دليل السكربت على التشغيل / التنقيح" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "عرض استدعاءات الدوال (الإطارات) في نوافذ منفصلة" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "قم بإلغاء تحديد إذا كنت تريد المزيد من التجربة التقليدية." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "فتح وإغلاق عرض المكدس تلقائياً" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "افتح عرض المكدس عند أول استدعاء وأغلقه عندما يعود البرنامج إلى الإطار الرئيسي." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "السماح بالدخول إلى المكتبات (على سبيل المثال ، خارج دليل السكربت الرئيسي)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "قد يجعل التنقيح أبطأ." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "المنقح المفضل" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(يستخدم عند النقر زر شريط أدوات التنقيح)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseye منفذ" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(إعادة تشغيل ثوني بعد تعديل هذه)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "التشغيل والتنقيح" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "محاكي الطرفية" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "ANSI دعم أنماط والالوان الأساسية" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "الحد الأقصى لعدد الأسطر للاحتفاظ بها." #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "ملاحظة! قد تؤدي القيم الكبيرة إلى ضعف الأداء!" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "أقصى طول لشظايا الخط قبل الضغط" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "تشغيل السكربت الحالي في الطرفية" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "تقديم Python REPL بعد انتهاء البرنامج" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "البقاء على نافذة الطرفية بعد انتهاء عملية البايثون" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "ملاحظة! يجب تفعيل الإغلاق التلقائي في إعدادات الطرفية\n" "(ملفات التعريف > الصدفة > عند الخروج من الصدفة)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "الطرفية" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "سمة واجهة المستخدم" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "سمة الصياغة" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "خط المحرر" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "OI خط" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "معاينة" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "هذا تعليق" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "الجواب هو" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "نص_غير_مغلق" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "الخ، الخ" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "ملاحظة! بعض تنسيق العناصر يتغير فقط بعد إعادة تشغيل ثوني!" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "إدخل عدد صحيح" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "السمات والخطوط" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "فتح مجلد برنامج ثوني..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "فتح مجلد بيانات ثوني..." #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "الرئيسية" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "محتويات المساعدة" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "CircuitPython جهاز " #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "جهاز مايكروبايثون" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "Connect your device to the computer and select corresponding port below" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "ابحث عن اسم جهازك ، \"USB Serial\" أو \"UART\"" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "إذا لم تتمكن من العثور عليه ، فقد تحتاج إلى تثبيت تعريف USB مناسب أولاً." #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "منفذ" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "محاولة اكتشاف المنفذ تلقائياً" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "مايكروبايثون (عام)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "طباعة..." #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "افتح صدفة النظام..." #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "التفاصيل" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "التثبيت من ملف المتطلبات" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "التثبيت من ملف محلي" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "هذه النافذة مخصصة لإدارة المكونات الإضافية لثوني وتبعياتها.\n" "إذا كنت ترغب في تثبيت حزم لبرامجك الخاصة ، فاختر أدوات ← إدارة الحزم ..." #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "سيركت بايثون (عام)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "إضافة مسافة بادئة للأسطر المحددة" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "إزالة مسافة بادئة للأسطر المحددة" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "التبديل إلى\n" "الوضع\n" "العادي" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "تأكد بأن مايكروبايثون مثبت مسبقاً على micro:bit الخاص بك" #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "لا تنس أن main.py يعمل فقط بدون السكربت الرئيسي المضمن." #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "الرجاء الانتظار" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "انتهى!" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "برنامج ثابت" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "لم نتمكن من إيجاد القرص '%s'. هل ترغب بتحديده بنفسك؟" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "تم العثور على عدة أقراص '%s'. هل تريد اختيار واحد بنفسك؟" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "لا يمكن العثور على القرص المناسب" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "%d عنصر" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "نقل إلى سلة المحذوفات" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "نقل إلى سلة المحذوفات" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "حذف" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "دليل جديد" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "خصائص" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "مساحة التخزين" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "المسار" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "خصائص الدليل" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "خصائص الملف" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "البايت" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "الحجم" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "تم التعديل" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "حذف %s" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "نقل %s إلى %s" #: thonny/editors.py:219 msgid "Loading" msgstr "تحميل" #: thonny/editors.py:335 msgid "Saving" msgstr "حفظ" #: thonny/running.py:1408 msgid "Working..." msgstr "يعمل..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "رفع %s إلى %s" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "رفع إلى %s" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "تنزيل %s إلى %s" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "التنزيل إلى %s" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "فتح في مدير ملفات النظام" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "إخفاء الملفات المخفية" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "إظهار الملفات المخفية" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "افتح في ثوني" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "افتح في تطبيق النظام الافتراضي" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "إعداد ملفات %s" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "ماذا تفعل بملف %s عند النقر فوقه نقرًا مزدوجًا في مستعرض ملفات ثوني؟" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "حذف" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "إنشاء دليل" #: thonny/editors.py:217 msgid "Loading %s" msgstr "تحميل %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "الحفظ في %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "حفظ كافة الملفات" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "إعداد المفسر" #: thonny/workbench.py:1501 msgid "Device" msgstr "جهاز" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "إلغاء" #: thonny/workdlg.py:212 msgid "Starting" msgstr "يبدأ" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "المصادقة" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "أدخل عبارة مرور مفتاحك الخاص لـ\n" "{}" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "أدخل كلمة المرور الخاصة بك لـ\n" "{}" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "التمثيل أعلاه هو قيمة تقريبية لعدد العشري. القيمة الدقيقة المخزنة هي %s وهي حوالي %s" #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "نتائج البحث" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "يبحث" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "تثبيت '%s'" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "تحديث '%s'" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "إزالة '%s'" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "مدير الحزم غير متوفر لهذا المفسر" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "غير مدعوم" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "غير متوفر" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "تحتاج إلى إيقاف برنامجك لتشغيل مدير الحزم" #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "افتح القيم المقيمة في مراقب الكائنات" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "بايثون قابل للتنفيذ" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "ملاحظة! قد لا يعمل زر اختيار الملف بشكل صحيح عند تحديد الملفات القابلة للتنفيذ من بيئة افتراضية. في هذه الحالة ، اختر تفعيل السكربت بدلاً من المفسر (أو أدخل المسار مباشرة في مربع النص)!" #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "Remote Python 3 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "غير متصل" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "خيارات متقدمة" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "تثبيت أو إزالة البرنامج الثابت" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "مايكروبايثون (محلي)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "مايكروبايثون (SSH)" #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "الوحدة" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "العناصر المظللة (غير قابلة للاستيراد):" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "PyPI الخزمة غير متوفرة في مايكروبايثون. سيتم تثبت إصدارة " #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "ملاحظة! مايكروباثيون نشرت إصدار %s من هذه الحزمة وسوف تثبت تلقائياً." #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "للتحديث، قم بتثبيت الحزمة مرة أخرى." #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "لإلغاء التثبيت، احذف الملفات المتطابقة." #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "مجال" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "يسرد مربع الحوار هذا وحدات المستوى الأعلى من الأدلة التالية:\n" "\n" "" #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "سيتم تثبيت الحزم الجديدة على" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "لا يوجد دليل lib مطلق في sys.path" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "الإصدار المراد تثبيته" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "موقع الجهاز المستهدف" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "طراز الجهاز المستهدف" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "الرجاء الانتظار" #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "PyPI البحث في " #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "حذف المحدد" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "افتح في محرر نصوص ثوني" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "مساخة التخزين في هذا القرص أو نظام الملفات" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "المساحة الكلية" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "المساحة المستخدمة" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "المساحة المتوفرة" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "معلومات التخزين" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "استبدال التاب بالمسافات" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "تمييز أحرف التاب" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "مسافة بادئة بأحرف جدولة (غير مستحسن لبايثون)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "الاسم" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "الحجم (البايت)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "أدخل اسم لدليل الجديد تحت %s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "لا شيء محدد" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "اختر عنصر ومن ثم حاول مرة آخرى" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "افتح من %s" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "الحفظ في %s" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "اسم الملف:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "معرف القيمة" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "القيمة" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "حفظ كلمة المرور" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "استدعاء دالة في %s" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "المتغيرات المحلية" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "الدالة" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "الموقع" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "إذا رمى الأمر الأخير استثناءً ، فسيُظهر هذا العرض تفاصيل الخطأ." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "المعرف" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "بيانات" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "خصائص" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "فهرس" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "معرف المفتاح" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "المفتاح" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "العودة إلى %s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "WebREPL أو منفذ" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "كلمة المرور" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "الكود المصدري" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "استخدم مربع حوار الملفات لتي كي بدلاً من زينتي" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "حدد ما إذا كانت مربعات حوار الملفات ظهرت خلف النافذة الرئيسية" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "متغيرات البيئة (المفتاح=القيمة لكل سطر)" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9317584 thonny-4.1.7/thonny/locale/be_BY/0000755000076600000240000000000014730055627017154 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0863748 thonny-4.1.7/thonny/locale/be_BY/LC_MESSAGES/0000755000076600000240000000000014730055627020741 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/be_BY/LC_MESSAGES/thonny.mo0000644000076600000240000013735314670256721022632 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4KSv]SSS S>TZET@THT*U%UUUU V-VtLVqVl3W WW)W3W%XBXY-Y0GY+xYOYPYEZ VZ*cZ&ZZC[b[[[!B\d\y\\\\%\\$]"<^0_^^l^_/+_[_#r_=_g_<<`Xy`*`#`>!a`aqaa,a7a9a74belb*b.b),cVcgczcccc(c'c0'dbXddrdTBee<.fQkfSf:gLguegggg h(h$BhghB}h"h0h_i'ti_ii j"j 2j?j Tjaj;xj'jjjkk4k!Gk iktk"kk-kk$k0l\Nl{lh'nnn!nn n# oV-ooqoop*,pWp8p>q.Oq@~q8q qr#r>r+Srr|s1tt=uv~wKx,xBycIy yyyy"y z=z7Zz/z-zz$ {0{G{c{'|{H{{u{f|%o||0||| |}}0}A}U}!o} }Y}\ ~di~g~6TaqVӂ-*$X&}!]ƃV$-{؄,!2N(-*؅|XWiO(:#<@}#΍ݍ"$?D?Uď\wGTVFF$7 AzUВ&Ó qeg͔ * 4&=7dRؕ +o8!ǖ#B PP!×1 #?$cј$ E#e 'ڙl՚V_p6"֛*s$~,eD&̝#*@B$B"(Haȟ& $ >>IAfY[KS\΢,+*X9 ȣ-&7/ gt NŤ*?f^ ťҥ#6 Z@6Ҧצ# ( 34Av<ʨgʪ2QLD]xt3ұ' r"K@c">lų2O`q: Ĵϴ.&6PhlEյXt+ ޶D}0ǷYxt#FtX(ͻz ̼QԼ@&Ggn7 %d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: be Language-Team: be Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d элементаў%s не падобны на тэкставы файл(запусціць Thonny нанова пасля змены)(ужываецца па пстрычке на кнопку адладкі на панэлі інструментаў)<без назвы>Пра BirdseyeПра ThonnyАктываваць віртуальнае асяроддзеПашыраная ўсталяванне / абнаўленне / адкат версііДазволіць толькі адзін асобнік ThonnyДазволіць выкананне сцэнараў без назвыДазволіць доступ да бібліятэк (па-за межамі асноўнага каталогу праграмы)Ці жадаеце выдаліць?ПамочнікАтрыбутыІдэнтыфікацыяАўтарАўтаматычнае завяршэннеАўтаматычна прапанаваць варыянты завяршэння пры ўводзе тэкстуАўтаматычна паказваць дакументацыю для варыянтаў завяршэнняАўтаматычна паказваць інфармацыю аб наладзе пасля ўводу '('НазадНазад да %sНазад да бягучага акнаСерверная частка не гатоваяНеправільны каталогBirdseye — гэта адладчык Python, які неабходна ўсталяваць асобна. Ці жадаеце вы адчыніць старонку даведкі і даведацца больш?Порт BirdseyeАгляд пакетаўСродак адсочвання памылакПакуль не магу зачыніцьНе атрымалася знайсці назву пакета ў спісе:Не атрымалася знайсці дыск, які падыходзіцьАдмяніцьАдменаАдчувальны да рэгістраЗмяніць памер шрыфтуЗмяніць працоўны каталог на каталог сцэнара пры запуску Выканаць / АдладзіцьCircuitPython (агульны)Прылада CircuitPythonАчысціцьАчысціць абалонку перад запускам новага працэсу (Выканаць, Адладка, Спыніць/Запусціць нанова, ...)Ачысціць абалонкуПстрыкніцеПстрыкніце ЗачыніцьЗачыніць усёЗачыніць іншыяКаманда недаступнаяПракаментавацьКанфігурацыя была абноўленая. Запусціце Thonny нанова, каб пачаць працу ў звычайным рэжыме. (Глядзіце 'Інструменты → Налады → Агульныя', калі пазней перадумаеце.)Наладзіць %s файлаўНаладзіць інтэрпрэтатар...ПацверджаннеЗлучыць прыладу з кампутарам і абраць адпаведны порт ніжэйКапіравацьКапіраваць ў буфер абменуКапіраваннеКапіраванее %s у %sНе атрымалася знайсці вызначэннеНе атрымалася знайсці дыск '%s'. Ці жадаеце вы знайсці яго?Не атрымалася знайсці пакет у PyPI.Не атрымалася знайсці інфармацыю аб пакеце ў PyPI.Не атрымалася захавацьСтварэнне каталогуСтварэнне віртуальнага асяроддзяВыразацьДадзеныяАдладзіцьАдладзіць бягучы сцэнарАдладзіць бягучы сцэнар (birdseye)Адладзіць бягучы сцэнар (хутка)Адладзіць бягучы сцэнар (лепш)Рэжым адладкі (больш падрабязныя часопісы дыягностыкі)Паменшыць памер шрыфтуВыкрасліць абраныя радкіПершапачатковы парольВыдаліцьВыдаленнеВыдаленне %sЖаданая версіяПадрабязнасціПрыладаЦі мелі вы на ўвазе '%s'?Уласцівасці каталогуАдключыць гук апавяшчэнняАдключыць праверкі (па адным ідэнтыфікатару на радок)Раз'яднацьЦі сапраўды вы жадаеце ўжываць гэтую назву для вашага сцэнара?Ці жадаеце вы так сама зачыніць сродак праўкі?Ці жадаеце вы выдаліць бягучы змест сродку праўкі і загрузіць файл нанова з дыску?Ці жадаеце вы запісаць '%s' нанова?Ці жадаеце вы захаваць файл перад закрыццём?Ці жадаеце вы захаваць файлы перад закрыццём?Замацаваць прыстасаваныя вокныДакументацыяНе забывайце, што main.py працуе без ўбудаванага асноўнага сцэнара.УнізСпампаваць у %sСпампоўка %s у %sПраўкаСродак праўкіШрыфт сродку праўкіУвязіце лікУвядзіце імя дла новага каталогу ў %sУвядзіце новае імяУвядзіце радок для замены.Увядзіце кодавую фразу вашага закрытага ключа для {}Увядзіце пароль для {}Зменныя асяроддзя (па адному КЛЮЧ=ЗНАЧЭННЕ на радок)ПамылкаКод памылкі:Памылка:ПадзеіВыключэннеВыйсціВыйсці з ThonnyЭкспартаваць часопіс ужывання...Вонкавая мадыфікацыяФайлФайл ужл існуеФайл выдаленыФайл адчыненыІмя файлу:Уласцівасці файлуФайлыЗнайсціЗнайсці і замяніцьЗнайсці:Перайсці ў сродак праўкіПерайсці ўПерайсці ў абалонкуРэжым маштабавання шрыфтуДля адладкі праграму спачатку неабходна захаваць.Па меркаваннях прадукцыйнасці, абалонка пазбягае поўнага адлюстравання вельмі доўгіх радкоў цалкам (глядзіце Інструменты → Налады → Абалонка). Тут вы можаце ўзаемадзейнічаць з зыходным фрагментам тэксту.Знойдзена некалькі дыскаў '%s'. Ці жадаеце вы абраць адзін?Поўны экранФункцыяВыклік функцыі ў %sАгульныяПерайсці да радкаПерайсці да радка...Атрымана памылка дазволу пры спробе загрузкі %sКучаРэжым кучы ўключаны. Зачыніце прагляд кучы, каб адключыць яго.ДапамогаЗмест дапамогіСхаваць схаваныя файлыПадсвятліць бягучы радок (патрабуецца адчыніць нанова сродак праўкі)Падсвятліць лакальныя зменныяПадсвятліць імёны, якія супадаюцьПадсвятліць парныя дужкіПадсвятліць сінтаксічныя элементыПадсвятліць сімвалы табуляцыіДахатыХатняя старонкаІдэнтыфікатарУСТАЛЯВАЦЬШрыфт акна ўводу-вывадуКалі гэта тэкставы файл, вы можаце наладзіць яго для адкрыцця ў Thonny, калі пстрыкнуць яго правай кнопкай мышы і абраць 'Наладзіць ... файлаў'.Калі апошняя каманда выклыкала выключэнне, то ў гэтым праглядзе будзе паказаная трасіроўка стэку.Калі файл трэба адчыніць у вонкавай праграме, то спампуйце яго ў лакальны каталог і адчыніце адтуль!Калі вы не можаце зняйсці яго, магчыма, вам спачатку спатрэбіцца ўсталяваць адпаведны драйвер USB.Калі вы не ведаеце, адкуль узяць пакет, то, хутчэй за ўсё, вам захочацца выканаць пошук па індэксе пакетаў Python. Пачніце з уводу назвы пакета ў поле пошуку вышэй і націсніце Enter.Калі вы назавеце свой сцэнар '%s', вы не зможаце імпартаваць бібліятэчны модуль з іменем '%s'.Калі вы складаеце значэнне зменнай асяроддзя ў двукоссі, двукоссі будуць часткай значэння. Ці хацелі вы гэтага?Калі вы ўсё яшчэ жадаеце яго, то, калі ласка, усталюйце яго з каманднага радка.Павялічыць памер шрыфтуПавялічыць водступ у абраных радкахВодступ з знакамі табуляцыі (не рэкамендуецца для Python)ІндэксІнфармацыяІнфармацыяУсталявацьУсталяваць CircuitPythonУсталяваць MicroPythonУсталяваць з PyPIУсталяваць з лакальнага файлуУсталяваць з файлу requirementsУсталяваць ці абнавіць %sУсталяваная ў:Усталяваная верстя:УсталяваннеУсталяванне '%s'ІнтэпрэтатарПерапыніць выкананнеПерапыніць працу праграмы пры злучэнніУПакінуць акно тэрміналу адчыненым пасля завяршэння працэсу PythonКлючІдэнтыфікатар ключаМоваАпошняя стабільная версіяАпошняя версіяЛіцэнзіяРадокНумар радкаЗагрузіцьЗагрузкаЗагрузка %sЛакальны Python 3Лакальныя зменныяМесцазнаходжаннеРэгістраваць падзеі ўжывання праграмы ў часопісПадобна на тое, што '%s' быў выдалены ці перамешчаны.Падобна на тое, што '%s' быў зменены па-за сродкам праўкі.Падобна на тое, што файл ці каталог недаступны да запісу.Падобна на тое, што вы жадаеце ўсталяваць пакет, які звязаны з Thonny. Калі вы мелі намер усталяваць дадатак для Thonny, то замест гэтага вам варта ужыць 'Інструменты → Кіраванне дадаткамі...' Ці ўпэўненыя вы, што жадаеце ўсталяваць %s для сервернай часткі?Распрацавана ў эстонскім Тартускім універсітэце пры ўдзеле супольнасці распрацоўнікаў з адкрытым зыходным кодам, фонда распрацоўкі Raspbery Pi і кампані CyberneticaЗрабіць захаваныя сцэнары shebang як выконваемыяПераканайцеся, што MicroPython быў усталяваны на ваш micro:bit.Зрабіць загружаныя сцэнары shebang як выконваемыяКіраванне пакетамі для %sКіраваць пакетамі...Кіраваць дадаткамі...Разгарнуць выглядНайбольшая даўжыня фрагментаў лініі перад сціскамНайбольшая колькасць радкоў, якія захоўваюцца.Можа запаволіць адладку.MicroPython (SSH)MicroPython (агульны)MicroPython (лакальны)Прылада MicroPythonЗмененыПерамясціць %s у сметнік?Перамясціць / пераназваць...Перамясціць у сметнікПерамяшчэнне %s у сметнікПерамяшчэнне ў сметнікЗаўвага! Аўтаматычнае закрыццё павінна быць уключана ў наладах тэрмінала (Профілі → Абалонка → Пры выхадзе з абалонкі)Заўвага! Кнопка выбору файла можа працаваць некарэктна пры выбары выконваемых файлаў з віртуальнага асяроддзя. У гэтым выпадку абярыце сцэнар 'актываваць' праграму замест інтэрпрэтатара (ці ўвядзіце шлях непасрэдна ў полі)!Заўвага! Вялікія значэнні могуць прывесці да зніжэння прадукцыйнасці!Заўвага! Запусціце Thonny нанова пасля змены налад!Заўвага! Некаторыя элементы стылю змяняюцца толькі пасля запуску Thonny нанова!Заўвага! Можа быць даступная іншая версія, якая сумяшчальная з бягучай версіяй Thonny. Націсніце кнопку '...', каб абраць версію для ўсталявання.Заўвага! Thonny падтрымлівае толькі Python %s і пазнейшыя версііЗаўвага! Вам неабходна запусціць Thonny нанова пасля ўсталявання, абнаўлення ці выдалення дадатку.ІмяНовыНовы каталогНовы файлНовыя пакеты таксама будуць усталяваныя ў гэты каталог. Кіраванне іншымі размяшчэннямі павінна ажыццяўляцца іншымі сродкамі.Наступны аб'ектРадок з пазнакай #todo не знойдзеныНедаступныБез злучэнняНе падтрымліваеццаНататкіНічога не абранаОКІнспектар аб'ектаўАўтаматычна адчыняць акно Памочніка, калі ў ім з'явіцца папярэджанне для вашага кодуАўтаматычна адчыняць акно Памочніка пры аварыйным завяршэнні праграмыАдчыніць каталог з дадзенымі Thonny...Адчыніць каталог з праграмай Thonny...Аўтаматычна адчыняць і зачыняць прагляд стэкуАдчыніць вылічаныя значэнні ў Інспектары аб'ектаўАдчыніць з %sАдчыніць у ThonnyАдчыніць у тэкставым сродку праўкі ThonnyАдчыніць у першапачатковай вонкавай праграмеАдчыніць у сістэмнай першапачатковай праграмеАдчыніць у сістэмным кіраўніку файлаўАдчыніць паўторна...Адчыніць сістэмную абалонку...Адчыніць...Адкрыццё падаленых файлаў ў вонкавай праграме не падтрымліваецца.Адчыняе прагляд стэку пры першым выкліку і зачыняе яго, калі праграма вяртаецца ў асноўны блок.Налады...ЗПланПразЦі перазапісаць?Перазапісаць тэму '%s'ПакетПакет '{}' неабходны для ўсталявання і выдалення іншых пакетаў.Кіраўнік пакетаў недаступны для гэтага інтэрпрэтатараКаталог пакетаўПарольУставіцьНе атрымалася ўставіцьШляхВыканаць праверкі MyPyВыканаць абраныя праверкі PylintПамылка дазволуПамылка дазволуКалі ласка, праверце правільнасць напісання!ПлотэрПлотэр візуалізуе серыю лікаў, якія надрукаваныя ў абалонцы.ПортПорт ці WebREPLМагчымая праблемаПераважны адладчыкПадрыхтоўка (прапусціць частку VS Code)Перайсці ў Python REPL пасля завяршэння праграмыПапярэдні праглядПапярэдні аб'ектНадрукаваць...ПраблемаПраблема з загрузкай файлуАргументы праграмыАргументы праграмы:Дрэва праграмыУласцівасціСтаронка PyPIРэжым Pygame ZeroВыконваемы файл PythonФайлы PythonФайлы Python звычайна маюць пашырэнне .py.Інтэрпрэтатары PythonВыйсціЦі сапраўды выдаліць?Нядаўнія файлыРэкамендуемая найбольшая даўжыня радкоў (калі 0, ліні водступу будуць нябачныя)Зрабіць нановаАбнавіцьЗвычайны рэжымПадалены Python 3 (SSH)ПераназвацьПераназваць '%s'Адчыніць нанова ўсе файлы з папярэдняга сеансуЗамяніцьЗамяніць усёЗамяніць табуляцыю прабеламіЗамяніць на:Замяніць і знайсціПаведаміць аб праблемеЗапытаць варыянты завяршэння з дапамогай клавішы Tab ў абалонцыЗапытаць варыянты завяршэння з дапамогай клавішы Tab ў сродках праўкіЗалежнасціПатрабуецца:Запусціць нанова інтэрпрэтатар перад запускам сцэнараАднавіцьВыканацьВыканаць і адладзіцьВыканаць / аднавіцьВыканаць бягучы сцэнарВыканаць бягучы сцэнар у тэрміналеВыканаць да курсоруЗапуск бягучага сцэнару ў тэрміналеЗахавацьЗахаваць усе файлыЗахаваць пры закрыцціЗахаваць як...Захаваць копію...Захаваць парольЗахаваць у %sЗахаваннеЗахаванне ў в %sЗнайсці micropython-lib і PyPIЗнайсці на PyPIВынікі пошукуПошукПадрабязнасці глядзіце ў даведцы.Абраць усёАбраць усёАбярыце элемент і паўтарыце спробу!Абраць пусты каталог для новага віртуальнага асяроддзяАбрярыце, калі файлавыя дыялогавыя вокны з файламі адлюстроўваюцца за галоўным акномАбраны каталог не пусты. Абярыце іншы ці адмяніце.Адправіць EOF / праграмная загрузка нановаАбалонкаПаказаць плотэрПаказаць выклікі функцый (блокаў) у асобных вокнахПаказаць схаваныя файлыПаказаць нумары радкоўПаказаць інфармацыю пра наладуПамерПамер (байтаў)Зыходны кодСціснуты тэкст (%d знакаў)СтэкПачніце з выбару пакета злева.ЗапускКрок назадКрок уВыйсці зКрок празСпыніцьСпыніць/запусціць нанова серверную часткуІнфармацыя аб сховішчыМесца ў сховішчыМесца для захоўвання на гэтым дыску ці файлавай сістэмеРэзюмэПадтрымкаПадтрымаць УкраінуПераключыць у звычайны рэжымСінхранізаваць гадзіннік рэальнага часу прыладыТэма падсвятлення сінтаксісуTODOМэтавы каталогТэрміналЭмуляцыя тэрміналуАдказПрыведзенае вышэй прадстаўленне з'яўляецца прыблізным значэннем гэтага ліку з коскай. Дакладнае захаванае значэнне роўнае – %s, што складае каля %sПаказаны тэкст не знойдзены!Тэма і шрыфтЁсць каталогі, якія канфліктуюцьДадзенае акно прызначана для вашых працоўных нататак - інструкцый па прызначэнні, фрагментаў коду і чаго заўгодна. Усё будзе аўтаматычна захавана і загружана, калы вы адчыніце Thonny у наступны раз. Не саромейцеся выдаляць гэты тэкст, каб вызваліць месца для вашых уласных нататак.Гэта каманда недаступная, калі Thonny запускаецца праз FlatpakГэты кампутарДадзенае дыялогавае акно прызначана для кіравання дадаткамі Thonny і іх залежнасцямі. Калі вы жадаеце ўсталяваць пакеты для ўласных праграм, абярыце 'Інструменты → Кіраванне пакетамі...'Тут пералічаныя ўсе даступныя пакеты, але дазваляецца абнавіць і выдаліць толькі пакеты зГэтае не падобна на пакет MicroPython/CircuitPython. Ці ўпэўненыя вы, што жадаеце яго ўсталяваць?Гэты файл ужо адчынены ў Thonny. Калі вы жадаеце захаваць з гэтым іменем, спачатку зачыніце сродак праўкі!Надобна на тое, што ў гэтага файла пораблемы з кадоўкай. Пераканайцеся, што ён у UTF-8 ці змяшчае падказку абправільнай кадоўцы.Гэта каментарДля дадзенага пакета патрабуецца іншая версія Thonny:Гэтае праграмнае забеспячэнне пастаўляецца БЕЗ ЯКІХ-НЕБУДЗЬ ГАРАНТЫЙ! Гэта бяспратнае праграмнае забеспячэнне, і вы можаце распаўсюджваць яго на пэўных умовах, глядзіце падрабязнасці https://opensource.org/licenses/MITНалады ThonnyДадаткі ThonnyДадаткі Thonny без залежнасцяўPython у ThonnyПераключыць каментарІнструментыПаспрабуйце адчыніць яго з дапамогай каманды Файл → Адчыніць.Паспрабаваць аўтаматычна вызначыць портРэжым карыстальніцкага інтэрфейсуКаэфіцыент маштабавання карыстальніцкага інтэрфейсуТэма карыстальніцкага інтэрфейсуНе птушка, калі вы жадаеце атрымаць больш традыцыйны вопыт.РаскаментавацьАдкаціцьВыдаліцьВыдаленне '%s'Залежнасці, якія не падыходзяцьУверхАбнавіцьЗалежнасці ад абнаўленняАбнавіць ці выдаліцьАбнаўленне '%s'Загрузіць у в %sУжывайце каманду "Стоп", калі вы жадаеце адмяніць адладкуУжываць файлавыя дыялогі Tk замест ZenityУжываць мясцовы час у гадзінніку рэальнага часуЗначэннеІдэнтыфікатар значэнняЗменныяГісторыя версійВыглядВізуалізаваць бягучы сцэнар у Python TutorПапярэдзіць, калі карыстальніцкі модуль зацяняе бібліятэчны модульПапярэджаннеШто рабіць з файлам %s, калі двойчы пстрыкнуць па ім у файлавым аглядальніку Thonny?Куды захаваць?Які тып інтэрпрэтатара варта ўжываць Thonny для запуску вашага коду?З бягучым інтэрпрэтатарам вы можце праглядаць пакеты толькі тут. Ужывайце 'Інструменты → Адчыніць сістэмную абалонку...', каб ўсталяваць, абнавіць ці выдаліць.Пераносіць радкі (можа быць павольным)Вы таксама можаце актываваць існуючае віртуальнае асяроддзе з дапамогай кантэкстнага меню правай кнопкі мышы ў навігацыі па файлах пры выбары каталога віртуальнага асяроддзя ці файла 'pyveng.cfg' унутры яе.Вам трэба абраць файл!Вам неабходна спыніць вашую праграму перад запускам кіраўніка пакетаў.Павелічэннеусе файлыбла, блабайтаўвольнатут,знайдзіце назву вашай прылады, "USB Serial" ці "UART"у sys.path няма абсалютнага каталогу libпадтрымка асноўных колераў ANSI і стылейкаб знайсці і ўсталяваць файл пакета (звычайна з пашырэннем .whl, .tar.gz ці .zip).каб знайсці файл requirements.txt і ўсталяваць названыя ў ім пакеты.агульны памернезачынены_радокужыта././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/be_BY/LC_MESSAGES/thonny.po0000644000076600000240000020653314670256721022632 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: be\n" #: thonny/workbench.py:375 msgid "File" msgstr "Файл" #: thonny/workbench.py:376 msgid "Edit" msgstr "Праўка" #: thonny/workbench.py:377 msgid "View" msgstr "Выгляд" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Выканаць" #: thonny/workbench.py:379 msgid "Tools" msgstr "Інструменты" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Дапамога" #: thonny/workbench.py:598 msgid "Exit" msgstr "Выйсці" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Паменшыць памер шрыфту" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Перайсці ў сродак праўкі" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Перайсці ў абалонку" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Разгарнуць выгляд" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Поўны экран" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Аргументы праграмы" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Пра Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Распрацавана ў\n" "эстонскім Тартускім універсітэце\n" "пры ўдзеле супольнасці распрацоўнікаў\n" "з адкрытым зыходным кодам,\n" "фонда распрацоўкі Raspbery Pi\n" "і кампані Cybernetica" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Гэтае праграмнае забеспячэнне пастаўляецца\n" "БЕЗ ЯКІХ-НЕБУДЗЬ ГАРАНТЫЙ!\n" "Гэта бяспратнае праграмнае забеспячэнне, і вы можаце\n" "распаўсюджваць яго на пэўных умовах,\n" "глядзіце падрабязнасці\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Гісторыя версій" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Паведаміць аб праблеме" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Аўтаматычна адчыняць акно Памочніка пры аварыйным завяршэнні праграмы" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Аўтаматычна адчыняць акно Памочніка, калі ў ім з'явіцца папярэджанне для вашага коду" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Выканаць абраныя праверкі Pylint" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Выканаць праверкі MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Адключыць праверкі (па адным ідэнтыфікатару на радок)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Памочнік" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Аўтаматычнае завяршэнне" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Інтэпрэтатар" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Пра Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye — гэта адладчык Python, які неабходна ўсталяваць асобна.\n" "\n" "Ці жадаеце вы адчыніць старонку даведкі і даведацца больш?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Адладзіць бягучы сцэнар (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Пераключыць каментар" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Пракаментаваць" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Раскаментаваць" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Адкаціць" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Зрабіць нанова" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Выразаць" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Капіраваць" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Уставіць" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Абраць усё" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Выканаць да курсору" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Пакуль не магу зачыніць" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Ужывайце каманду \"Стоп\", калі вы жадаеце адмяніць адладку" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Замацаваць прыстасаваныя вокны" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Падсвятліць імёны, якія супадаюць" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Падсвятліць лакальныя зменныя" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Падсвятліць парныя дужкі" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Падсвятліць сінтаксічныя элементы" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Падсвятліць бягучы радок (патрабуецца адчыніць нанова сродак праўкі)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Паказаць нумары радкоў" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Рэкамендуемая найбольшая даўжыня радкоў\n" "(калі 0, ліні водступу будуць нябачныя)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Сродак праўкі" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Экспартаваць часопіс ужывання..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Падзеі" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Файлы" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Знайсці і замяніць" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Знайсці:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Замяніць на:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Адчувальны да рэгістра" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Уверх" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Уніз" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Знайсці" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Замяніць" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Замяніць і знайсці" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Замяніць усё" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Увядзіце радок для замены." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Паказаны тэкст не знойдзены!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Дазволіць толькі адзін асобнік Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Адчыніць нанова ўсе файлы з папярэдняга сеансу" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Адключыць гук апавяшчэння" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Рэжым маштабавання шрыфту" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Рэжым кучы ўключаны.\n" "Зачыніце прагляд кучы, каб адключыць яго." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Куча" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Мова" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Дадзенае акно прызначана для вашых працоўных нататак - інструкцый па прызначэнні, фрагментаў коду і чаго заўгодна.\n" "\n" "Усё будзе аўтаматычна захавана і загружана, калы вы адчыніце Thonny у наступны раз.\n" "\n" "Не саромейцеся выдаляць гэты тэкст, каб вызваліць месца для вашых уласных нататак." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Нататкі" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Папярэдні аб'ект" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Наступны аб'ект" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Інспектар аб'ектаў" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "План" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Рэжым Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Выдаліць" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Зачыніць" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Пстрыкніце " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "тут," #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Абнавіць" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Усталяваць" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Не атрымалася знайсці пакет у PyPI." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Апошняя стабільная версія" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Апошняя версія" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Рэзюмэ" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Аўтар" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Хатняя старонка" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Сродак адсочвання памылак" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Дакументацыя" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "Старонка PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Залежнасці" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Ці сапраўды выдаліць?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Ці жадаеце выдаліць?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Назад да\n" "бягучага акна" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Зменныя" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Гэты кампутар" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Абнавіць" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Перайсці ў" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Памылка" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Вам трэба абраць файл!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Ці перазапісаць?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Ці жадаеце вы запісаць '%s' нанова?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Новы" #: thonny/editors.py:671 msgid "Open..." msgstr "Адчыніць..." #: thonny/editors.py:673 msgid "Load" msgstr "Загрузіць" #: thonny/editors.py:682 msgid "Recent files" msgstr "Нядаўнія файлы" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Зачыніць усё" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Захаваць" #: thonny/editors.py:739 msgid "Save as..." msgstr "Захаваць як..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Захаваць копію..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Налады Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "Выканаць бягучы сцэнар" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Выканаць бягучы сцэнар у тэрмінале" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Спыніць/запусціць нанова серверную частку" #: thonny/running.py:205 msgid "Stop" msgstr "Спыніць" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Перапыніць выкананне" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Адправіць EOF / праграмная загрузка нанова" #: thonny/running.py:240 msgid "Disconnect" msgstr "Раз'яднаць" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Інтэрпрэтатары Python" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "усе файлы" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Абраць пусты каталог для новага віртуальнага асяроддзя" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Неправільны каталог" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Абраны каталог не пусты.\n" "Абярыце іншы ці адмяніце." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Стварэнне віртуальнага асяроддзя" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Ачысціць абалонку" #: thonny/shell.py:185 msgid "Plotter" msgstr "Плотэр" #: thonny/shell.py:317 msgid "Clear" msgstr "Ачысціць" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Паказаць плотэр" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Па меркаваннях прадукцыйнасці, абалонка пазбягае поўнага адлюстравання вельмі доўгіх радкоў цалкам (глядзіце Інструменты → Налады → Абалонка).\n" "Тут вы можаце ўзаемадзейнічаць з зыходным фрагментам тэксту." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Пераносіць радкі (можа быць павольным)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Капіраваць ў буфер абмену" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Сціснуты тэкст (%d знакаў)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Плотэр візуалізуе серыю\n" "лікаў, якія надрукаваныя ў абалонцы." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Падрабязнасці глядзіце ў даведцы." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Зачыніць іншыя" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Капіраванне" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Капіраванее\n" " %s\n" "у\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Адмяніць" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "ОК" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Абраць усё" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Абалонка" #: thonny/workbench.py:608 msgid "Options..." msgstr "Налады..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Павялічыць памер шрыфту" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Змяніць памер шрыфту" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Павелічэнне" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Выйсці з Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Выйсці" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Перазапісаць тэму '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Аргументы праграмы:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Звычайны рэжым" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Канфігурацыя была абноўленая. Запусціце Thonny нанова, каб пачаць працу ў звычайным рэжыме.\n" "\n" "(Глядзіце 'Інструменты → Налады → Агульныя', калі пазней перадумаеце.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Дрэва праграмы" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Аднавіць" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Выканаць / аднавіць" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Адладзіць бягучы сцэнар" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Адладзіць" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Адладзіць бягучы сцэнар (лепш)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Адладзіць бягучы сцэнар (хутка)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Крок праз" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Праз" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Крок у" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "У" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Выйсці з" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "З" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Крок назад" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Назад" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Стэк" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Выключэнне" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Рэгістраваць падзеі ўжывання праграмы ў часопіс" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Рэжым адладкі (больш падрабязныя часопісы дыягностыкі)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Рэжым карыстальніцкага інтэрфейсу" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Каэфіцыент маштабавання карыстальніцкага інтэрфейсу" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "Заўвага!\n" "Запусціце Thonny нанова пасля змены налад!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Агульныя" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "УСТАЛЯВАЦЬ" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Агляд пакетаў" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "З бягучым інтэрпрэтатарам вы можце праглядаць пакеты толькі тут.\n" "Ужывайце 'Інструменты → Адчыніць сістэмную абалонку...', каб ўсталяваць, абнавіць ці выдаліць." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Каталог пакетаў" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Усталяваць з PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Калі вы не ведаеце, адкуль узяць пакет, то, хутчэй за ўсё, вам захочацца выканаць пошук па індэксе пакетаў Python.\n" "Пачніце з уводу назвы пакета ў поле пошуку вышэй і націсніце Enter." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "каб знайсці файл requirements.txt і ўсталяваць названыя ў ім пакеты." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Пстрыкніце" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "каб знайсці і ўсталяваць файл пакета (звычайна з пашырэннем .whl, .tar.gz ці .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Абнавіць ці выдаліць" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Пачніце з выбару пакета злева." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Тут пералічаныя ўсе даступныя пакеты, але дазваляецца абнавіць і выдаліць толькі пакеты з" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Новыя пакеты таксама будуць усталяваныя ў гэты каталог.\n" "Кіраванне іншымі размяшчэннямі павінна ажыццяўляцца іншымі сродкамі." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Усталяваная верстя:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Усталяваная ў:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Калі ласка, праверце правільнасць напісання!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Не атрымалася знайсці інфармацыю аб пакеце ў PyPI." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Код памылкі:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Не атрымалася знайсці назву пакета ў спісе:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Пакет '{}' неабходны для ўсталявання і выдалення іншых пакетаў." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Пакет" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Кіраванне пакетамі для %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Пацверджанне" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Падобна на тое, што вы жадаеце ўсталяваць пакет, які звязаны з Thonny. \n" "Калі вы мелі намер усталяваць дадатак для Thonny, то замест гэтага вам варта\n" "ужыць 'Інструменты → Кіраванне дадаткамі...'\n" "\n" "Ці ўпэўненыя вы, што жадаеце ўсталяваць %s для сервернай часткі?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Заўвага!\n" "Можа быць даступная іншая версія, якая сумяшчальная з бягучай версіяй Thonny.\n" "Націсніце кнопку '...', каб абраць версію для ўсталявання." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Дадаткі Thonny без залежнасцяў" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Залежнасці, якія не падыходзяць" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Для дадзенага пакета патрабуецца іншая версія Thonny:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Калі вы ўсё яшчэ жадаеце яго, то, калі ласка, усталюйце яго з каманднага радка." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Заўвага!\n" "Вам неабходна запусціць Thonny нанова пасля ўсталявання, абнаўлення ці выдалення дадатку." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Дадаткі Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Пашыраная ўсталяванне / абнаўленне / адкат версіі" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Жаданая версія" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Залежнасці ад абнаўлення" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Патрабуецца:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Памылка:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Кіраваць пакетамі..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Кіраваць дадаткамі..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Адчыніць паўторна..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Змяніць працоўны каталог на каталог сцэнара пры запуску Выканаць / Адладзіць" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Паказаць выклікі функцый (блокаў) у асобных вокнах" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Не птушка, калі вы жадаеце атрымаць больш традыцыйны вопыт." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Аўтаматычна адчыняць і зачыняць прагляд стэку" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Адчыняе прагляд стэку пры першым выкліку і зачыняе яго, калі праграма вяртаецца ў асноўны блок." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Дазволіць доступ да бібліятэк (па-за межамі асноўнага каталогу праграмы)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Можа запаволіць адладку." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Пераважны адладчык" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(ужываецца па пстрычке на кнопку адладкі на панэлі інструментаў)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Порт Birdseye" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(запусціць Thonny нанова пасля змены)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Выканаць і адладзіць" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Эмуляцыя тэрміналу" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "падтрымка асноўных колераў ANSI і стылей" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Найбольшая колькасць радкоў, якія захоўваюцца." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Заўвага!\n" "Вялікія значэнні могуць прывесці да зніжэння прадукцыйнасці!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Найбольшая даўжыня фрагментаў лініі перад сціскам" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Запуск бягучага сцэнару ў тэрмінале" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Перайсці ў Python REPL пасля завяршэння праграмы" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Пакінуць акно тэрміналу адчыненым пасля завяршэння працэсу Python" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Заўвага!\n" "Аўтаматычнае закрыццё павінна быць уключана ў наладах тэрмінала \n" "(Профілі → Абалонка → Пры выхадзе з абалонкі)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Тэрмінал" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Тэма карыстальніцкага інтэрфейсу" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Тэма падсвятлення сінтаксісу" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Шрыфт сродку праўкі" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Шрыфт акна ўводу-вываду" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Папярэдні прагляд" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Гэта каментар" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "Адказ" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "незачынены_радок" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "бла, бла" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Заўвага!\n" "Некаторыя элементы стылю змяняюцца толькі пасля запуску Thonny нанова!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Увязіце лік" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Тэма і шрыфт" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Адчыніць каталог з праграмай Thonny..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Адчыніць каталог з дадзенымі Thonny..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Дахаты" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Змест дапамогі" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "Прылада CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "Прылада MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Злучыць прыладу з кампутарам і абраць адпаведны порт ніжэй" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "знайдзіце назву вашай прылады, \"USB Serial\" ці \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Калі вы не можаце зняйсці яго, магчыма, вам спачатку спатрэбіцца ўсталяваць адпаведны драйвер USB." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Порт" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Паспрабаваць аўтаматычна вызначыць порт" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (агульны)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Надрукаваць..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Адчыніць сістэмную абалонку..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Падрабязнасці" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Усталяваць з файлу requirements" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Усталяваць з лакальнага файлу" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Дадзенае дыялогавае акно прызначана для кіравання дадаткамі Thonny і іх залежнасцямі.\n" "Калі вы жадаеце ўсталяваць пакеты для ўласных праграм, абярыце 'Інструменты → Кіраванне пакетамі...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (агульны)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Павялічыць водступ у абраных радках" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Выкрасліць абраныя радкі" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Пераключыць у\n" "звычайны \n" "рэжым" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Пераканайцеся, што MicroPython быў усталяваны на ваш micro:bit." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Не забывайце, што main.py працуе без ўбудаванага асноўнага сцэнара." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Не атрымалася знайсці дыск '%s'.\n" "Ці жадаеце вы знайсці яго?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Знойдзена некалькі дыскаў '%s'.\n" "Ці жадаеце вы абраць адзін?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Не атрымалася знайсці дыск, які падыходзіць" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d элементаў" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Перамясціць у сметнік" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Выдаліць" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Новы каталог" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Уласцівасці" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Месца ў сховішчы" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Шлях" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Уласцівасці каталогу" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Уласцівасці файлу" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "байтаў" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Памер" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Зменены" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Выдаленне %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Загрузка" #: thonny/editors.py:395 msgid "Saving" msgstr "Захаванне" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Загрузіць у в %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Спампоўка %s у %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Спампаваць у %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Адчыніць у сістэмным кіраўніку файлаў" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Схаваць схаваныя файлы" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Паказаць схаваныя файлы" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Адчыніць у Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Адчыніць у сістэмнай першапачатковай праграме" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Наладзіць %s файлаў" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Што рабіць з файлам %s, калі двойчы пстрыкнуць па ім у файлавым аглядальніку Thonny?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Выдаленне" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Стварэнне каталогу" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Загрузка %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Захаванне ў в %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Захаваць усе файлы" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Наладзіць інтэрпрэтатар..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Прылада" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Адмена" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Запуск" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Ідэнтыфікацыя" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Увядзіце кодавую фразу вашага закрытага ключа для\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Увядзіце пароль для\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Прыведзенае вышэй прадстаўленне з'яўляецца прыблізным значэннем гэтага ліку з коскай.\n" "Дакладнае захаванае значэнне роўнае – %s, што складае каля %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Вынікі пошуку" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Пошук" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Усталяванне '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Абнаўленне '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Выдаленне '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Усталяванне" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Кіраўнік пакетаў недаступны для гэтага інтэрпрэтатара" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Не падтрымліваецца" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Недаступны" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Вам неабходна спыніць вашую праграму перад запускам кіраўніка пакетаў." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Адчыніць вылічаныя значэнні ў Інспектары аб'ектаў" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Выконваемы файл Python" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Заўвага!\n" "Кнопка выбору файла можа працаваць некарэктна пры выбары выконваемых файлаў\n" "з віртуальнага асяроддзя. У гэтым выпадку абярыце сцэнар 'актываваць' праграму замест\n" "інтэрпрэтатара (ці ўвядзіце шлях непасрэдна ў полі)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Падалены Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Без злучэння" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (лакальны)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "у sys.path няма абсалютнага каталогу lib" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Знайсці на PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Адчыніць у тэкставым сродку праўкі Thonny" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Месца для захоўвання на гэтым дыску ці файлавай сістэме" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "агульны памер" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "ужыта" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "вольна" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Інфармацыя аб сховішчы" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Замяніць табуляцыю прабеламі" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Падсвятліць сімвалы табуляцыі" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Водступ з знакамі табуляцыі (не рэкамендуецца для Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Імя" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Памер (байтаў)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Увядзіце імя дла новага каталогу ў\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Нічога не абрана" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Абярыце элемент і паўтарыце спробу!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Адчыніць з %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Захаваць у %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Імя файлу:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "Ідэнтыфікатар значэння" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Значэнне" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Захаваць пароль" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Выклік функцыі ў %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Лакальныя зменныя" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Функцыя" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Месцазнаходжанне" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Калі апошняя каманда выклыкала выключэнне, то ў гэтым праглядзе будзе паказаная трасіроўка стэку." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "Ідэнтыфікатар" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Дадзеныя" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Атрыбуты" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Індэкс" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Ідэнтыфікатар ключа" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Ключ" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Назад да\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Порт ці WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Пароль" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Зыходны код" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Ужываць файлавыя дыялогі Tk замест Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Абрярыце, калі файлавыя дыялогавыя вокны з файламі адлюстроўваюцца за галоўным акном" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Зменныя асяроддзя (па адному КЛЮЧ=ЗНАЧЭННЕ на радок)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Новы файл" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Пераназваць" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Пераназваць '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Увядзіце новае імя" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Не атрымалася ўставіць" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Ёсць каталогі, якія канфліктуюць" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Файл ужл існуе" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Калі гэта тэкставы файл, вы можаце наладзіць яго для адкрыцця ў Thonny, калі пстрыкнуць яго правай кнопкай мышы і абраць 'Наладзіць ... файлаў'." #: thonny/editors.py:38 msgid "Python files" msgstr "Файлы Python" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "<без назвы>" #: thonny/editors.py:150 msgid "File is gone" msgstr "Файл выдалены" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Ці жадаеце вы так сама зачыніць сродак праўкі?" #: thonny/editors.py:169 msgid "External modification" msgstr "Вонкавая мадыфікацыя" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Ці жадаеце вы выдаліць бягучы змест сродку праўкі і загрузіць файл нанова з дыску?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Файлы Python звычайна маюць пашырэнне .py." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Ці мелі вы на ўвазе '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Перамясціць / пераназваць..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Перайсці да радка..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Нумар радка" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Ці жадаеце вы захаваць файлы перад закрыццём?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Ці жадаеце вы захаваць файл перад закрыццём?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Захаваць пры закрыцці" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Каманда недаступная" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Гэта каманда недаступная, калі Thonny запускаецца праз Flatpak" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Падтрымаць Украіну" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Які тып інтэрпрэтатара варта ўжываць Thonny для запуску вашага коду?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Паказаць інфармацыю пра наладу" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Аўтаматычна паказваць інфармацыю аб наладзе пасля ўводу '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Аўтаматычна прапанаваць варыянты завяршэння пры ўводзе тэксту" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Аўтаматычна паказваць дакументацыю для варыянтаў завяршэння" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Запытаць варыянты завяршэння з дапамогай клавішы Tab ў сродках праўкі" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Запытаць варыянты завяршэння з дапамогай клавішы Tab ў абалонцы" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Праблема" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Не атрымалася знайсці вызначэнне" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Ачысціць абалонку перад запускам новага працэсу (Выканаць, Адладка, Спыніць/Запусціць нанова, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Python у Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Перапыніць працу праграмы пры злучэнні" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Сінхранізаваць гадзіннік рэальнага часу прылады" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Ужываць мясцовы час у гадзінніку рэальнага часу" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Запусціць нанова інтэрпрэтатар перад запускам сцэнара" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Гэтае не падобна на пакет MicroPython/CircuitPython. \n" "Ці ўпэўненыя вы, што жадаеце яго ўсталяваць?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Перамяшчэнне ў сметнік" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Перамясціць %s у сметнік?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Перамяшчэнне %s у сметнік" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Адчыніць у першапачатковай вонкавай праграме" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "Адкрыццё падаленых файлаў ў вонкавай праграме не падтрымліваецца." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Калі файл трэба адчыніць у вонкавай праграме, то спампуйце яго ў лакальны каталог і адчыніце адтуль!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Падобна на тое, што '%s' быў выдалены ці перамешчаны." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Падобна на тое, што '%s' быў зменены па-за сродкам праўкі." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "Заўвага!\n" "Thonny падтрымлівае толькі Python %s і пазнейшыя версіі" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Перайсці да радка" #: thonny/workbench.py:703 msgid "Support" msgstr "Падтрымка" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Не атрымалася захаваць" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Папярэджанне" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Калі вы складаеце значэнне зменнай асяроддзя ў двукоссі, двукоссі будуць часткай значэння.\n" "Ці хацелі вы гэтага?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Усталяваць MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Усталяваць CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Зрабіць загружаныя сцэнары shebang як выконваемыя" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Зрабіць захаваныя сцэнары shebang як выконваемыя" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Актываваць віртуальнае асяроддзе" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Мэтавы каталог" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Візуалізаваць бягучы сцэнар у Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Радок" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Інфармацыя" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Радок з пазнакай #todo не знойдзены" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Усталяваць ці абнавіць %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Лакальны Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Вы таксама можаце актываваць існуючае віртуальнае асяроддзе з дапамогай кантэкстнага меню правай кнопкі мышы ў навігацыі па файлах пры выбары каталога віртуальнага асяроддзя ці файла 'pyveng.cfg' унутры яе." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Падрыхтоўка (прапусціць частку VS Code)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Першапачатковы пароль" #: thonny/running.py:392 msgid "Information" msgstr "Інфармацыя" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Для адладкі праграму спачатку неабходна захаваць." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s не падобны на тэкставы файл" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Праблема з загрузкай файлу" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Надобна на тое, што ў гэтага файла пораблемы з кадоўкай.\n" "\n" "Пераканайцеся, што ён у UTF-8 ці змяшчае падказку абправільнай кадоўцы." #: thonny/editors.py:295 msgid "File is open" msgstr "Файл адчынены" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Гэты файл ужо адчынены ў Thonny.\n" "\n" "Калі вы жадаеце захаваць з гэтым іменем,\n" "спачатку зачыніце сродак праўкі!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Памылка дазволу" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Падобна на тое, што файл ці каталог недаступны да запісу." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Серверная частка не гатовая" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Куды захаваць?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Магчымая праблема" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Калі вы назавеце свой сцэнар '%s', вы не зможаце імпартаваць бібліятэчны модуль з іменем '%s'." #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Ці сапраўды вы жадаеце ўжываць гэтую назву для вашага сцэнара?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Атрымана памылка дазволу пры спробе загрузкі\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Паспрабуйце адчыніць яго з дапамогай каманды Файл → Адчыніць." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Памылка дазволу" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Дазволіць выкананне сцэнараў без назвы" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Ліцэнзія" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Папярэдзіць, калі карыстальніцкі модуль зацяняе бібліятэчны модуль" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Знайсці micropython-lib і PyPI" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.932205 thonny-4.1.7/thonny/locale/ca_ES/0000755000076600000240000000000014730055627017146 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0873206 thonny-4.1.7/thonny/locale/ca_ES/LC_MESSAGES/0000755000076600000240000000000014730055627020733 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/ca_ES/LC_MESSAGES/thonny.mo0000644000076600000240000011003414670256721022607 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4K GT\dlr=44iy~#7 [iLvÄԄfShH87OXk  ҈$؈(&AZ6zˉӉ %B] o9z72 % 2< R-]GӋRً,E@$B@/pw 2-܎" d-Y  %d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: ca Language-Team: ca Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d ítems%s no sembla un fitxer de text(reinicia el Thonny després de canviar això)(s'utilitza en fer clic al botó Depura de la barra d'eines)Sobre el BirdseyeSobre ThonnyActiva l'entorn virtualInstal·lació avançada / actualització / desactualitzacióPermet només una instància del ThonnyPermet executar programes sense nomPermet passar a les biblioteques (per exemple. fora del directori principal de l'script)Estàs segur/a que vols desinstal·lar-ho?AssistentAtributsAutenticacióAutorCompleta automàticamentProposa automàticament les complecions mentre s'escriuMostra automàticament la documentació per a les complecionsMostra automàticament la informació del paràmetre després d'escriure '('EnrereTorna a %sTornar al marc actualEl back-end no està preparatDirectori incorrecteBirdeyes és un depurador de Python que s’ha d’instal·lar a part. Vols obrir la pàgina web d’ajuda i obtenir més informació?Port per al BirdeyesNavega pels paquetsRastrejador d'errorsEncara no es pot tancarNo s'ha pogut trobar el nom del paquet de la llista:No es pot trobar el disc adequatCancel·laCancel·lantDistingeix entre majúscules i minúsculesCanvia la mida de la lletraCanvia el directori de treball al directori de l'script a executar / depurarCircuitPython (genèric)Dispositiu CircuitPythonNetejaNeteja la consola abans d'iniciar un procés nou (Executa, Depura, Atura/Reinicia, ...)Neteja la consolaClicClic TancaTanca-ho totTanca altresOrdre no disponibleConverteix a comentariS'ha actualitzat la configuració. Reiniciï Thonny per començar a treballar en mode regular. (Consulti 'Eines → Opcions → General' si canvia d'opinió més endavant.)Configura %s fitxersConfigura l'intèrpret...ConfirmacióConnecta el dispositiu a l'ordinador i selecciona el port corresponent a sotaCopiaCopia al porta-retallsCopiantCopiant %s a %sNo s'ha pogut trobar la definicióNo s'ha pogut trobar el disc '%s'. Vols localitzar-lo tu mateix?No s'ha pogut trobar el paquet al PyPI.No es va poder trobar la informació del paquet de PyPI.No s'ha pogut desarCreant directoryCreant entorn virtualRetallaDadaDepuraDepura l'script actualDepura l’script actual (Birdeyes)Depura l’script actual (ràpid)Depura l’script actual (millor)Mode de depuració (amb diagnòstic detallat dels registres)Redueix la mida de la lletraDes-indenta les línies seleccionadesContrasenya per defecteEsborraEsborrantEsborrat %sVersió desitjadaDetallsDispositiuVolíes dir «%s»?Propietat dels directorisDesactiva els sons de notificacióDesactiva comprovacions (un id per línia)DesconnectaEncara vols utilitzar aquest nom per al teu script?Vols tancar també l'editor?Vols descartar el contingut actual de l'editor i tornar a carregar el fitxer des del disc?Vols sobreescriure '%s'?Vols desar els fitxers abans de sortir?Vols desar els fitxers abans de sortir?Ancora les finestres de l’usuariDocumentacióNo oblidis que «main.py» només funciona sense un script principal incrustat.AvallDescarregat a %sDescarregant %s a %sEditaEditaTipus de lletra de l'editorIntrodueix un enterIntrodueix el nom del directori nou a %sIntrodueix el nou nomIntrodueix la cadena a reemplaçar.Introdueix la contrasenya de la teva clau privada per a {}Introdueix la teva contrasenya per a {}Variables d'entorn (una CLAU=VALOR per línia)ErrorCodi d'error:Error:EsdevenimentExcepcióSurtSurt del ThonnyExporta registres d'ús...Modificació externaFitxerEl fitxer ja existeixEl fitxer ha desaparegutEl fitxer està obertNom del fitxer:Propietats del fitxersArxiusCercaCerca i reemplaçaCerca:Ves a l’editorCentra-se enVes a la consolaMode d’escalat de la lletraPer depurar el programa l'has de desar primer.Per raons de rendiment, la consola evita mostrar línies molt llargues (vegeu Eines => Opcions => Consola). Aquí pots interactuar amb el fragment de text original.S'han trobat diversos discs '%s'. Vols triar-ne un tu mateix?Pantalla completaFuncióCrida de funció a %sGeneralVes a la líniaVes a la línia...S'ha obtingut un error de permís intentant carregar %sHeapMode Heap activat. Selecciona Visualització Heap per a tancar-ho.AjudaContingut de l'ajudaAmaga els fitxers ocultsRessalta la línia actual (requereix obrir de nou l’editor)Ressalta les variables localsRessalta les coincidències de nomsRessalta els parèntesiRessalta els elements sintàcticsRessalta els caràcters de tabulacióIniciPàgina d'iniciIDINSTAL·LATipus de lletra Entrada/SortidaSi és un fitxer de text, aleshores pots configurar-lo per obrir-lo a Thonny fent clic amb el botó dret i seleccionant 'Configura... fitxers'.Si l'última ordre ha produït una excepció, aquesta vista mostrarà el seguiment de la pila.Si cal obrir el fitxer en una aplicació externa, baixa-ho a un directori local i obre-ho des d'allà!Si no el pots trobar, és possible que primer hagis d'instal·lar el controlador USB adequat.Si no saps d'on està el paquet, probablement vols buscar-lo en Python Package Index. Introdueix el nom del paquet en el quadre de cerca i pressiona ENTER.Si li poses el nom '%s' al teu script, no podràs importar el mòdul de la biblioteca anomenat ''%sSi cites el valor d'una variable d'entorn, les cometes formaran part del valor. Tenies aquesta intenció?Si encara el vols, instal·la-ho des de la línia d'ordres.Augmenta la mida de la lletraIndenta les línies seleccionadesIndenta amb caràcters de tabulació (no es recomana per a Python)ÍndexInfoInformacióInstal·laInstal·la el CircuitPythonInstal·la el MicroPythonInstal·la des del PyPIInstal·la des d'un fitxer localInstal·la des del fitxer de requisitsInstal·la o actualitza %sInstal·lat per a:Versió instal·lada:Instal·lantInstal·lant '%s'IntèrpretInterromp l’execucióInterromp el programa de treball en connectarEntraMantén oberta la finestra del terminal després de finalitzar el procés de PythonClauID de la clauIdiomaÚltima versió estableÚltima versióLlicènciaLíniaNúmero de líniaCarregaCarregantCarregant %sPython 3 localVariables localsUbicacióRegistra els esdeveniments d’ús del programaSembla que '%s' s'ha suprimit o mogut.Sembla que '%s' s'ha modificat fora de l'editor.Sembla que no es pot escriure en aquest fitxer o carpeta.Sembla que estàs instal·lant un paquet relacionat amb Thonny. Si el que volies és instal·lar un plugin de Thonny, llavors hauries de triar 'Eines → Administrar plugins...' Segur que vols instal·lar %s per al back-end?Desenvolupat a la universitat de Tartu, Estònia, amb l'ajuda de la Comunitat de codi obert, la Raspberry Pi Foundation i Cybernetica ASFa executables els scripts amb Shebang desatsAssegura't que el MicroPython s'ha instal·lat a la vostra micro:bit.Fer executables els scripts amb shebang carregatsAdministra paquets per a %sGestiona els paquets...Gestiona els plug-ins...Maximitza vistaLongitud màxima de fragments de línia abans de condensarNombre màxim de línies a mantenir.Pot fer que la depuració sigui més lenta.MicroPython (SSH)MicroPython (genèric)MicroPython (local)Dispositiu MicroPythonModificatVols moure %s a la paperera?Mou / reanomena...Mou a la papereraS'està movent %s a la papereraS'està movent a la papereraNB! Cal habilitar el tancament automàtic a la configuració del Terminal (Eines → Opcions → Terminal)NB! El botó de selecció de fitxers pot no funcionar correctament en seleccionar executables d'un entorn virtual. En aquest cas, tria en el seu lloc l'script 'activa' de l'intèrpret (o introdueix el camí directament al quadre)!NB! Els valors grans poden causar un mal rendiment!NB! Reinicia Thonny després de canviar les opcions!NB! Alguns elements d'estil només canvien després de reiniciar Thonny!NB! Ha d'haver-hi una altra versió disponible que sigui compatible amb la versió actual de Thonny. Fes clic en el botó '...' per a triar la versió i instal·lar-la.NB! Thonny només admet Python %s i posteriorsNB! És necessari reiniciar Thonny després d'instal·lar / actualitzar / desinstal·lar un plug-in.NomNouNou directoriNou fitxerTambé s'instal·laran nous paquets en aquest directori. Altres ubicacions hauran de ser gestionades per medis alternatius.Següent objecteNo s'ha trobat cap línia marcada amb #todoNo disponibleNo connectatNo suportatNotesNo s'ha seleccionat resD'acordInspector d'objectesObre l'Assistent automàticament si hi ha avisos en el teu codiObre l'Assistent automàticament si el programa es bloqueja amb una excepcióObre el directori de dades de Thonny...Obre el directori del programa Thonny...Obre i tanca la vista de pila automàticamentObre els valors a avaluar a l'inspector d'objectesObre des de %sObre en el ThonnyObre a l'editor de text de ThonnyObre en l'aplicació externa predeterminadaObre a l'aplicació predeterminada del sistemaObre al gestor de fitxers del sistemaObre el reproductor...Obre l'intèrpret d'ordres del sistema...Obre...No s'admet obrir fitxers remots en aplicacions externes.Obre la vista de pila a la primera crida i la tanca quan el programa torna al marc principal.Opcions...SurtEsquemaSaltaSobreescriure?Sobreescriu el tema '%s'PaquetEl paquet '{}' es requereix per a instal·lar i desinstal·lar altres paquets.El gestor de paquets no està disponible per a aquest intèrpretDirectori dels paquetsContrasenyaEnganxaHa fallat a l'enganxarCamíRealitza les comprovacions MyPyRealitza les comprovacions Pylint seleccionadesError de permísError de permísSi us plau, verifica l'ortografia!PlòterEl plòter visualitzarà sèries de números impresos a la consola.PortPort o WebREPLProblema potencialDepurador preferitPreparacions (omet la part del codi VS)Continuar amb el REPL de Python després de la finalització del programaPrevisualitzacióObjecte anteriorImprimeix...ProblemaProblema al carregar el fitxerParàmetres de l’execució del programaArguments del programa:Arbre del programaPropietatsPàgina de PyPIMode Pygame ZeroExecutable del PythonFitxers del PythonEls fitxers Python normalment tenen extensió .py.Intèrprets de PythonSurtRealment vols desinstal·lar-ho?Arxius recentsLongitud de línia màxima recomanada (posar a 0 per a desactivar el marge de línia)RefésActualitzaMode regularPython 3 Remot (SSH)ReanomenarReanomena '%s'Torna a obrir tots els arxius de la sessió anteriorReemplaçaReemplaça-ho totSubstitueix els tabuladors per espaisReemplaça amb:Reemplaça+CercaInforma d'un problemaDemana complecions amb la tecla de tabulació a la consolaDemana complecions amb la tecla de tabulació en els editorsRequereixRequereix:Reinicia l'intèrpret abans d'executar un scriptReprènExecutaExecuta i depuraExecuta/reprènExecuta l'script actualExecuta l'script actual al terminalExecuta fins on està el cursorExecuta l’script actual al terminal del sistemaDesaDesa tots els fitxersDesa al TancarDesa com...Desa una còpia...Desa la contrassenyaDesa a %sDesantDesant a %sCerca micropython-lib i el PyPICerca a PyPIResultats de la cercaCercantVegeu l'ajuda per a més detalls.Selecciona-ho totSelecciona-ho totSelecciona un element i torna a provar-ho!Selecciona un directori buit per al nou entorn virtualSelecciona si els diàlegs de fitxer acaben darrere de la finestra principalEl directori seleccionat no està buit. Selecciona un altre o cancel·la.Envia EOF / Reinici suauConsolaMostra el PlòterMostra les crides a les funcions (marcs) en finestres separadesMostra els fitxers ocultsMostra els números de líniaMostra la informació del paràmetreMidaMida(bytes)Codi fontText reduït (%d caràcters)PilaComenci seleccionant el paquet de l'esquerra.IniciantTorna enrereEntrantSortintSaltantAturaAtura/Reprèn back-endInformació d'emmagatzematgeEspai d'emmagatzematgeEspai d'emmagatzematge en aquesta unitat o sistema de fitxersResumSuportDona suport a UcraïnaCanvia a mode normalSincronitza el rellotge de temps real del dispositiuTema de sintaxiTODOObjectiuTerminalTerminal d'emulacióLa resposta ésLa representació anterior és un valor aproximat d'aquest 'float'. El valor exacte emmagatzemat és %s que és aproximadament %sEl text especificat no s'ha trobat!Tema i LletraHi ha carpetes en conflicteAquesta casella és per a les teves notes de treball -- instruccions, fragments de codi, o altres. Tot es guardarà automàticament i es carregarà quan obri Thonny la pròxima vegada. Esborra aquest text per a fer lloc a les teves notes.Aquesta ordre no està disponible si el Thonny s'està executant via FlatpakAquest ordinadorAquest diàleg és per a gestionar els plug-ins de Thonny i les seves dependències. Si vols instal·lar paquets per als teus propis programes, tria 'Eines → Gestiona els paquets...'Aquest diàleg llista tots els paquets disponibles, però només actualitza i desinstal·la paquets deAixò no sembla un paquet MicroPython/CircuitPython. Segur que vols instal·lar-lo?Aquest fitxer ja està obert a Thonny. Si el vols desar amb aquest nom, primer tanca l'editor existent!Sembla que aquest fitxer té problemes amb la codificació. Assegura't que estigui en UTF-8 o que contingui la codificació adequada.Això és un comentariAquest paquet requereix una versió diferent de Thonny:Aquest programa ve COMPLETAMENT SENSE GARANTIA! És programari lliure, per la qual cosa pots redistribuir-ho sota unes determinades condicions, veure https://opensource.org/licenses/MIT per a més detallsOpcions del ThonnyPlug-ins del ThonnyPlugin de Thonny sense requisitsPython de ThonnyActiva/desactiva com a comentariEinesProva d'obrir-lo amb Fitxer => Obre.Intenta detectar el port automàticamentMode IU Interfície UsuariFactor d’escalat de IUTema de la interfície d'usuariDesmarca-ho si vols una experiència més tradicional.Desactiva com a comentariDesfésDesinstal·larS'està desinstal·lant '%s'Requisits inadequatsAmuntActualitzaActualitza les dependènciesActualitza o desinstal·laActualitzant '%s'Pujat a %sUtilitza l'ordre "Stop" si vols cancel·lar la depuracióUsa quadres de diàleg de fitxers Tk en lloc del ZenityUtilitza l'hora local en el rellotge de temps realValorID del valorVariablesHistorial de versionsVisualitzaVisualitza l'script actual al Tutor de PythonAvisa si un mòdul d'usuari fa ombra 'shadow' a un mòdul de bibliotecaAvísQuè fer amb un fitxer %s quan facis doble clic al navegador de fitxers de Thonny?A on vols desar-ho?Quin intèrpret hauria d'utilitzar Thonny per a executar el teu codi?Amb l'intèrpret actual només pots navegar pels paquets aquí. Utilitza 'Eines → Consola del sistema...' Per a instal·lar, actualitzar o desinstal·lar.Ajusta el text (pot ser lent)També pots activar un entorn virtual existent mitjançant el menú contextual fent clic dret al fitxer de navegació quan seleccionis una carpeta d'entorn virtual o el fitxer 'pyveng.cfg' que hi ha a dins.Has de seleccionar un fitxer!Has d'aturar el programa abans de llançar el gestor de paquets.AmpliaTots el fitxersbla, blabytesEspai lliureAquícerca el nom del dispositiu, "USB Serial" o "UART"no hi ha cap directori Lib absolut a sys.pathadmet colors i estils ANSI bàsicsPer a localitzar i instal·lar el fitxer del paquet (normalment amb extensió .whl, .tar.gz o .zip).Per a localitzar el fitxer requirements.txt i instal·lar els paquets allí especificats.Espai totalcadena_sense tancarEspai utilitzat././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/ca_ES/LC_MESSAGES/thonny.po0000644000076600000240000015723614626075445022634 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: ca\n" #: thonny/workbench.py:375 msgid "File" msgstr "Fitxer" #: thonny/workbench.py:376 msgid "Edit" msgstr "Edita" #: thonny/workbench.py:377 msgid "View" msgstr "Visualitza" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Executa" #: thonny/workbench.py:379 msgid "Tools" msgstr "Eines" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Ajuda" #: thonny/workbench.py:598 msgid "Exit" msgstr "Surt" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Redueix la mida de la lletra" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Ves a l’editor" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Ves a la consola" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Maximitza vista" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Pantalla completa" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Paràmetres de l’execució del programa" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Sobre Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Desenvolupat a \n" "la universitat de Tartu, Estònia, \n" "amb l'ajuda de \n" "la Comunitat de codi obert, \n" "la Raspberry Pi Foundation \n" "i Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Aquest programa ve \n" "COMPLETAMENT SENSE GARANTIA!\n" "És programari lliure, per la qual cosa pots \n" "redistribuir-ho sota unes determinades \n" "condicions, veure https://opensource.org/licenses/MIT \n" "per a més detalls" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Historial de versions" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Informa d'un problema" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Obre l'Assistent automàticament si el programa es bloqueja amb una excepció" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Obre l'Assistent automàticament si hi ha avisos en el teu codi" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Realitza les comprovacions Pylint seleccionades" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Realitza les comprovacions MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Desactiva comprovacions (un id per línia)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistent" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Completa automàticament" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Intèrpret" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Sobre el Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdeyes és un depurador de Python que s’ha d’instal·lar \n" "a part.\n" "Vols obrir la pàgina web d’ajuda i obtenir més informació?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Depura l’script actual (Birdeyes)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Activa/desactiva com a comentari" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Converteix a comentari" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Desactiva com a comentari" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Desfés" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Refés" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Retalla" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Copia" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Enganxa" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Selecciona-ho tot" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Executa fins on està el cursor" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Encara no es pot tancar" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Utilitza l'ordre \"Stop\" si vols cancel·lar la depuració" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ancora les finestres de l’usuari" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Ressalta les coincidències de noms" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Ressalta les variables locals" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Ressalta els parèntesi" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Ressalta els elements sintàctics" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Ressalta la línia actual (requereix obrir de nou l’editor)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Mostra els números de línia" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Longitud de línia màxima recomanada \n" "(posar a 0 per a desactivar el marge de línia)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Edita" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exporta registres d'ús..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Esdeveniment" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Arxius" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Cerca i reemplaça" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Cerca:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Reemplaça amb:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Distingeix entre majúscules i minúscules" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Amunt" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Avall" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Cerca" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Reemplaça" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Reemplaça+Cerca" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Reemplaça-ho tot" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Introdueix la cadena a reemplaçar." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "El text especificat no s'ha trobat!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Permet només una instància del Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Torna a obrir tots els arxius de la sessió anterior" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Desactiva els sons de notificació" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Mode d’escalat de la lletra" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Mode Heap activat.\n" "Selecciona Visualització Heap per a tancar-ho." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Idioma" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Aquesta casella és per a les teves notes de treball -- instruccions, fragments de codi, o altres.\n" "\n" "Tot es guardarà automàticament i es carregarà quan obri Thonny la pròxima vegada.\n" "\n" "Esborra aquest text per a fer lloc a les teves notes." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notes" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Objecte anterior" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Següent objecte" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Inspector d'objectes" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Esquema" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Mode Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Desinstal·lar" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Tanca" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Clic " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "Aquí" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Actualitza" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Instal·la" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "No s'ha pogut trobar el paquet al PyPI." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Última versió estable" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Última versió" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Resum" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Pàgina d'inici" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Rastrejador d'errors" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Documentació" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "Pàgina de PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Requereix" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Realment vols desinstal·lar-ho?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Estàs segur/a que vols desinstal·lar-ho?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Tornar al \n" "marc actual" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variables" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Aquest ordinador" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Actualitza" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Centra-se en" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Error" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Has de seleccionar un fitxer!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Sobreescriure?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Vols sobreescriure '%s'?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Nou" #: thonny/editors.py:671 msgid "Open..." msgstr "Obre..." #: thonny/editors.py:673 msgid "Load" msgstr "Carrega" #: thonny/editors.py:682 msgid "Recent files" msgstr "Arxius recents" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Tanca-ho tot" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Desa" #: thonny/editors.py:739 msgid "Save as..." msgstr "Desa com..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Desa una còpia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Opcions del Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "Executa l'script actual" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Executa l'script actual al terminal" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Atura/Reprèn back-end" #: thonny/running.py:205 msgid "Stop" msgstr "Atura" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Interromp l’execució" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Envia EOF / Reinici suau" #: thonny/running.py:240 msgid "Disconnect" msgstr "Desconnecta" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Intèrprets de Python" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "Tots el fitxers" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Selecciona un directori buit per al nou entorn virtual" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Directori incorrecte" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "El directori seleccionat no està buit.\n" "Selecciona un altre o cancel·la." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Creant entorn virtual" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Neteja la consola" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plòter" #: thonny/shell.py:317 msgid "Clear" msgstr "Neteja" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Mostra el Plòter" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Per raons de rendiment, la consola evita mostrar línies molt llargues (vegeu Eines => Opcions => Consola).\n" "Aquí pots interactuar amb el fragment de text original." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Ajusta el text (pot ser lent)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Copia al porta-retalls" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Text reduït (%d caràcters)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "El plòter visualitzarà sèries de \n" "números impresos a la consola." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Vegeu l'ajuda per a més detalls." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Tanca altres" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Copiant" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Copiant\n" " %s\n" "a\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Cancel·la" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "D'acord" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Selecciona-ho tot" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Consola" #: thonny/workbench.py:608 msgid "Options..." msgstr "Opcions..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Augmenta la mida de la lletra" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Canvia la mida de la lletra" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Amplia" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Surt del Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Surt" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Sobreescriu el tema '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Arguments del programa:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Mode regular" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "S'ha actualitzat la configuració. Reiniciï Thonny per començar a treballar en mode regular. \n" "(Consulti 'Eines → Opcions → General' si canvia d'opinió més \n" "endavant.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Arbre del programa" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Reprèn" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Executa/reprèn" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Depura l'script actual" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Depura" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Depura l’script actual (millor)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Depura l’script actual (ràpid)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Saltant" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Salta" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Entrant" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Entra" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Sortint" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Surt" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Torna enrere" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Enrere" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Pila" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Excepció" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Registra els esdeveniments d’ús del programa" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Mode de depuració (amb diagnòstic detallat dels registres)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Mode IU Interfície Usuari" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Factor d’escalat de IU" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Reinicia Thonny després de canviar les opcions!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "General" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTAL·LA" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Navega pels paquets" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Amb l'intèrpret actual només pots navegar pels paquets \n" "aquí. Utilitza 'Eines → Consola del sistema...' Per a instal·lar, actualitzar o desinstal·lar." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Directori dels paquets" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instal·la des del PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Si no saps d'on està el paquet, probablement vols buscar-lo en Python Package Index. Introdueix el nom del paquet en el quadre de cerca i pressiona ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "Per a localitzar el fitxer requirements.txt i instal·lar els paquets allí especificats." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Clic" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "Per a localitzar i instal·lar el fitxer del paquet (normalment amb extensió .whl, .tar.gz o .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Actualitza o desinstal·la" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Comenci seleccionant el paquet de l'esquerra." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Aquest diàleg llista tots els paquets disponibles, però només actualitza i desinstal·la paquets de" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "També s'instal·laran nous paquets en aquest directori. Altres ubicacions hauran de ser gestionades per medis alternatius." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Versió instal·lada:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Instal·lat per a:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Si us plau, verifica l'ortografia!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "No es va poder trobar la informació del paquet de PyPI." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Codi d'error:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "No s'ha pogut trobar el nom del paquet de la llista:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "El paquet '{}' es requereix per a instal·lar i desinstal·lar altres paquets." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Paquet" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Administra paquets per a %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Confirmació" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Sembla que estàs instal·lant un paquet relacionat amb Thonny. \n" "Si el que volies és instal·lar un plugin de Thonny, llavors hauries de \n" "triar 'Eines → Administrar plugins...'\n" "\n" "Segur que vols instal·lar %s per al back-end?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! Ha d'haver-hi una altra versió disponible que sigui compatible amb la versió actual de Thonny. Fes clic en el botó '...' per a triar la versió i instal·lar-la." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Plugin de Thonny sense requisits" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Requisits inadequats" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Aquest paquet requereix una versió diferent de Thonny:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Si encara el vols, instal·la-ho des de la línia d'ordres." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! És necessari reiniciar Thonny després d'instal·lar / actualitzar / desinstal·lar un plug-in." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Plug-ins del Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Instal·lació avançada / actualització / desactualització" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Versió desitjada" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Actualitza les dependències" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Requereix:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Error:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Gestiona els paquets..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Gestiona els plug-ins..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Obre el reproductor..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Canvia el directori de treball al directori de l'script a executar / depurar" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Mostra les crides a les funcions (marcs) en finestres separades" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Desmarca-ho si vols una experiència més tradicional." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Obre i tanca la vista de pila automàticament" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Obre la vista de pila a la primera crida i la tanca quan el programa torna al marc principal." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Permet passar a les biblioteques (per exemple. fora del directori principal de l'script)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Pot fer que la depuració sigui més lenta." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Depurador preferit" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(s'utilitza en fer clic al botó Depura de la barra d'eines)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Port per al Birdeyes" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(reinicia el Thonny després de canviar això)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Executa i depura" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminal d'emulació" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "admet colors i estils ANSI bàsics" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Nombre màxim de línies a mantenir." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "NB! Els valors grans poden causar un mal rendiment!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Longitud màxima de fragments de línia abans de condensar" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Executa l’script actual al terminal del sistema" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Continuar amb el REPL de Python després de la finalització del programa" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Mantén oberta la finestra del terminal després de finalitzar el procés de Python" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! Cal habilitar el tancament automàtic a la configuració del Terminal\n" "(Eines → Opcions → Terminal)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Tema de la interfície d'usuari" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Tema de sintaxi" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Tipus de lletra de l'editor" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Tipus de lletra Entrada/Sortida" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Previsualització" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Això és un comentari" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "La resposta és" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "cadena_sense tancar" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Alguns elements d'estil només canvien després de reiniciar Thonny!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Introdueix un enter" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Tema i Lletra" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Obre el directori del programa Thonny..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Obre el directori de dades de Thonny..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Inici" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Contingut de l'ajuda" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "Dispositiu CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "Dispositiu MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Connecta el dispositiu a l'ordinador i selecciona el port corresponent a sota" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "cerca el nom del dispositiu, \"USB Serial\" o \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Si no el pots trobar, és possible que primer hagis d'instal·lar el controlador USB adequat." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Intenta detectar el port automàticament" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (genèric)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Imprimeix..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Obre l'intèrpret d'ordres del sistema..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Detalls" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instal·la des del fitxer de requisits" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instal·la des d'un fitxer local" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Aquest diàleg és per a gestionar els plug-ins de Thonny i les seves dependències.\n" "Si vols instal·lar paquets per als teus propis programes, tria 'Eines → Gestiona els paquets...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (genèric)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Indenta les línies seleccionades" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Des-indenta les línies seleccionades" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Canvia a\n" "mode\n" "normal" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Assegura't que el MicroPython s'ha instal·lat a la vostra micro:bit." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "No oblidis que «main.py» només funciona sense un script principal incrustat." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "No s'ha pogut trobar el disc '%s'. Vols localitzar-lo tu mateix?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "S'han trobat diversos discs '%s'. Vols triar-ne un tu mateix?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "No es pot trobar el disc adequat" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d ítems" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Mou a la paperera" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Esborra" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Nou directori" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Propietats" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Espai d'emmagatzematge" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Camí" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Propietat dels directoris" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Propietats del fitxers" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Mida" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Modificat" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Esborrat %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Carregant" #: thonny/editors.py:395 msgid "Saving" msgstr "Desant" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Pujat a %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Descarregant %s a %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Descarregat a %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Obre al gestor de fitxers del sistema" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Amaga els fitxers ocults" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Mostra els fitxers ocults" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Obre en el Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Obre a l'aplicació predeterminada del sistema" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Configura %s fitxers" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Què fer amb un fitxer %s quan facis doble clic al navegador de fitxers de Thonny?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Esborrant" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Creant directory" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Carregant %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Desant a %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Desa tots els fitxers" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Configura l'intèrpret..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Dispositiu" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Cancel·lant" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Iniciant" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Autenticació" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Introdueix la contrasenya de la teva clau privada per a\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Introdueix la teva contrasenya per a\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "La representació anterior és un valor aproximat d'aquest 'float'. El valor exacte emmagatzemat és %s que és aproximadament %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Resultats de la cerca" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Cercant" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Instal·lant '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Actualitzant '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "S'està desinstal·lant '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Instal·lant" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "El gestor de paquets no està disponible per a aquest intèrpret" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "No suportat" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "No disponible" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Has d'aturar el programa abans de llançar el gestor de paquets." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Obre els valors a avaluar a l'inspector d'objectes" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Executable del Python" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! El botó de selecció de fitxers pot no funcionar correctament en seleccionar executables \n" "d'un entorn virtual. En aquest cas, tria en el seu lloc l'script 'activa' \n" "de l'intèrpret (o introdueix el camí directament al quadre)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 Remot (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "No connectat" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "no hi ha cap directori Lib absolut a sys.path" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Cerca a PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Obre a l'editor de text de Thonny" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Espai d'emmagatzematge en aquesta unitat o sistema de fitxers" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "Espai total" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "Espai utilitzat" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "Espai lliure" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Informació d'emmagatzematge" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Substitueix els tabuladors per espais" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Ressalta els caràcters de tabulació" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Indenta amb caràcters de tabulació (no es recomana per a Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Nom" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Mida(bytes)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Introdueix el nom del directori nou a\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "No s'ha seleccionat res" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Selecciona un element i torna a provar-ho!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Obre des de %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Desa a %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Nom del fitxer:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "ID del valor" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Valor" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Desa la contrassenya" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Crida de funció a %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Variables locals" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Funció" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Ubicació" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Si l'última ordre ha produït una excepció, aquesta vista mostrarà el seguiment de la pila." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Dada" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atributs" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Índex" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "ID de la clau" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Clau" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Torna a\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Port o WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Contrasenya" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Codi font" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Usa quadres de diàleg de fitxers Tk en lloc del Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Selecciona si els diàlegs de fitxer acaben darrere de la finestra principal" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Variables d'entorn (una CLAU=VALOR per línia)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Nou fitxer" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Reanomenar" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Reanomena '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Introdueix el nou nom" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Ha fallat a l'enganxar" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Hi ha carpetes en conflicte" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "El fitxer ja existeix" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Si és un fitxer de text, aleshores pots configurar-lo per obrir-lo a Thonny fent clic amb el botó dret i seleccionant 'Configura... fitxers'." #: thonny/editors.py:38 msgid "Python files" msgstr "Fitxers del Python" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "El fitxer ha desaparegut" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Vols tancar també l'editor?" #: thonny/editors.py:169 msgid "External modification" msgstr "Modificació externa" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Vols descartar el contingut actual de l'editor i tornar a carregar el fitxer des del disc?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Els fitxers Python normalment tenen extensió .py." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Volíes dir «%s»?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Mou / reanomena..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Ves a la línia..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Número de línia" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Vols desar els fitxers abans de sortir?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Vols desar els fitxers abans de sortir?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Desa al Tancar" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Ordre no disponible" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Aquesta ordre no està disponible si el Thonny s'està executant via Flatpak" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Dona suport a Ucraïna" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Quin intèrpret hauria d'utilitzar Thonny per a executar el teu codi?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Mostra la informació del paràmetre" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Mostra automàticament la informació del paràmetre després d'escriure '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Proposa automàticament les complecions mentre s'escriu" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Mostra automàticament la documentació per a les complecions" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Demana complecions amb la tecla de tabulació en els editors" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Demana complecions amb la tecla de tabulació a la consola" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problema" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "No s'ha pogut trobar la definició" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Neteja la consola abans d'iniciar un procés nou (Executa, Depura, Atura/Reinicia, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Python de Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Interromp el programa de treball en connectar" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Sincronitza el rellotge de temps real del dispositiu" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Utilitza l'hora local en el rellotge de temps real" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Reinicia l'intèrpret abans d'executar un script" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Això no sembla un paquet MicroPython/CircuitPython.\n" "Segur que vols instal·lar-lo?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "S'està movent a la paperera" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Vols moure %s a la paperera?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "S'està movent %s a la paperera" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Obre en l'aplicació externa predeterminada" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "No s'admet obrir fitxers remots en aplicacions externes." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Si cal obrir el fitxer en una aplicació externa, baixa-ho a un directori local i obre-ho des d'allà!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Sembla que '%s' s'ha suprimit o mogut." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Sembla que '%s' s'ha modificat fora de l'editor." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "NB! Thonny només admet Python %s i posteriors" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Ves a la línia" #: thonny/workbench.py:703 msgid "Support" msgstr "Suport" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "No s'ha pogut desar" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Avís" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Si cites el valor d'una variable d'entorn, les cometes formaran part del valor.\n" "Tenies aquesta intenció?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Instal·la el MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Instal·la el CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Fer executables els scripts amb shebang carregats" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Fa executables els scripts amb Shebang desats" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Activa l'entorn virtual" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Objectiu" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualitza l'script actual al Tutor de Python" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Línia" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "No s'ha trobat cap línia marcada amb #todo" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Instal·la o actualitza %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Python 3 local" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "També pots activar un entorn virtual existent mitjançant el menú contextual fent clic dret al fitxer de navegació quan seleccionis una carpeta d'entorn virtual o el fitxer 'pyveng.cfg' que hi ha a dins." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Preparacions (omet la part del codi VS)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Contrasenya per defecte" #: thonny/running.py:392 msgid "Information" msgstr "Informació" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Per depurar el programa l'has de desar primer." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s no sembla un fitxer de text" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problema al carregar el fitxer" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Sembla que aquest fitxer té problemes amb la codificació.\n" "\n" "Assegura't que estigui en UTF-8 o que contingui la codificació adequada." #: thonny/editors.py:295 msgid "File is open" msgstr "El fitxer està obert" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Aquest fitxer ja està obert a Thonny.\n" "\n" "Si el vols desar amb aquest nom,\n" "primer tanca l'editor existent!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Error de permís" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Sembla que no es pot escriure en aquest fitxer o carpeta." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "El back-end no està preparat" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "A on vols desar-ho?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Problema potencial" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Si li poses el nom '%s' al teu script, no podràs importar el mòdul de la biblioteca anomenat ''%s" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Encara vols utilitzar aquest nom per al teu script?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "S'ha obtingut un error de permís intentant carregar\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Prova d'obrir-lo amb Fitxer => Obre." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Error de permís" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Permet executar programes sense nom" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Llicència" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Avisa si un mòdul d'usuari fa ombra 'shadow' a un mòdul de biblioteca" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Cerca micropython-lib i el PyPI" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/compile_mo.bat0000644000076600000240000000011514417536743021011 0ustar00aivarannamaastaffcd ..\.. C:\Py3\Scripts\pybabel compile -d thonny/locale/ -D thonny pause ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9326978 thonny-4.1.7/thonny/locale/cs_CZ/0000755000076600000240000000000014730055627017175 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0881534 thonny-4.1.7/thonny/locale/cs_CZ/LC_MESSAGES/0000755000076600000240000000000014730055627020762 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/cs_CZ/LC_MESSAGES/thonny.mo0000644000076600000240000007073414670256721022652 0ustar00aivarannamaastaffl $)   /&<c!tD&   .!0P2  x ao &;AYnGt     G*2G<a%*%:Zx3    $ 7 L !g  ( ) ! !B'!j!o!~!!! !!%!!!")" /";"B" I"S" X"d"y""" """""" " " "##=# #$ $$ &$ 1$?$0D$u$ z$$6$$$%%4%M%R%[%c%mk%F% &m&CV'''''''( /(=(P( `(l((3(((((( (() ))%4)3Z))zc*;*+1+D+ W+1e+ +++++,",+,=, N,\,o,n,,,0-<L--,.UJ... ..n.!// Q/]/c/t/w/?/C/ 0'0'E0)m0 000001$151J16R1T1 1111 122H$25m2222 2222 3 '333:;3v3{3&3333333 4 4 4%4 64(C4l444 4B444 455 5&*5Q5 Y5e5 ~5 555 5+555 5 5 66 >6"L6o6t6 6 6 6 6 6666 66 6 77227:e777 7077 8838 88 E8Q8o8-u8 8 88 888 88899 )969>9G9 Z9!h9 99:: ::bv;^;8</J<z<4=C="S=v=== ====0= >> >)>;>S>V>^>s> >2>%>> >>?&?+?L3?B??S@k@@ @ @@ @@1@ @%@VAIqAAAAA C%CEC D D'D-0D^D#qDMDDDEE*)E1TE/EE EEEzEsFF FF"F!FGGGJ5GGGGbG H)H2H8H AHOHaH |HH I !IB,I oIzI III/I"I/"JRJ#mJJJJ&J)J% K.2KaKzKKKKK KKKK&L@LHL'^L(LL LJL!M'M7MHMPM WMdM!{MMMMMMN NNN!N"1NTNhNoNNNNNNNN NNO O3O PP"P8P@PTPkPApP PPPDP*QJQdQ{QQQQ Q QrQWMRRgS>S:TTT tT~T T3T'T U U6U IUUUeU9nUU UUUUUU V V)"V,LV/yVVsVW:WXX0XBX+UXXXXXXX YY0YMYaY{YyY/ Z(:Z;cZZ6&[N][[[[ [['X\\ \\\\C\@ ]N]#m]5]4]] ^ ^(=^*f^*^^^ ^J_bP____ _ ___J_7B`z`````` ``a"a5*a`aea+{aaaaaaaa b b!b2b/EbubbbbYbcc $c2c LcYc2kcc cc ccc d d+d DdPdUdjdd&dd&ddee0e@e Qe_e oeyeeee e e#e=e<9fvfff9fff!g3gpOpXp _pmp@qpp'pVpLBqq$qq%d items(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating virtual environmentCutDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter your password for {}ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageINSTALLIO fontIf the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:Installing '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLine numberLoadLoadingLocal variablesLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingScopeSearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.Step backStep intoStep outStep overStopStop/Restart backendStorage spaceSummarySupportSupport UkraineSwitch to regular modeSyntax themeTarget:TerminalTerminal emulationThe answer isThe specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueVariablesVersion historyVersion to be installedViewWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You need to select a file!Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"please waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.unclosed_stringuser site packagesvirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: cs Language-Team: cs Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d položek(restartujte Thonny po této změně)(používá se po kliknutí na tlačítko Debug na panelu nástrojů)O BirdseyeO ThonnyRozšířená instalace / upgrade / downgradePokročílé volbyPovolit pouze jednu instanci ThonnyUmožnit vstupovat do knihoven (například mimo adresář hlavního skriptu)Jste si jisti odinstalací?AsistentAutorAutomatické doplňováníAutomaticky našeptávat zatímco píšeteAutomaticky zobrazit dokumentaci v našeptávačiAutomaticky zobrazit parametry po napsání '('ZpětZpět na %sZpět k aktuálnímu snímkuŠpatný adresářBirdseye je Debuger Pythonu, který musí být instalován samostatně. Chcete otevřít nápovědu a dozvědět se více? Birdseye port Projít balíkButrackerještě není možné zavřítNemůžu najít balík ze seznamu:Není možné najít vhodný diskZrušitCitlivé na velikostZměnit velikost písmaZměnit pracovní adresář na adresář skriptu při Spuštění / DebuguCircuitPython (generic)CircuitPython zařízeníSmazatVyčistit shell před spuštěním nového procesu (Spustit, Debugovat, Zastavit/Restartovat, ...)Smazat shellKliknoutKlik ZavřítZavřít všeZavřít ostatníPříkaz není k dispoziciZakomentovatKonfigurace byla změněna. Restartujte Thonny pro práci v normálním módu. (Pro změnu jděte do "Nástroje - Volby - Obecné)Nastavit %s souboryPotvrzeníPřipojte zařízení k počítači a vyberte odpovídající portKopírovatZkopírovat do schránkyKopírujiKopíruji %s do %sNepodařilo se najít definiciNenalezen disk '%s'. Chcete jej najít sám(a)?Není možné najít balík z PyPINení možné najít informace o balíku z PyPIUkládání se nezdaříloVytvářím virtuální prostředíVyjmoutDebugDebugovat aktuální skriptDebugovat aktuální skript (birdseye)Debugovat aktuální skript (rychlejší)Debugovat aktuální skript (hezčí)Ladící režim (poskytuje detailnější log)Zmenšit velikost písmaZmenšit odstazení o úroveňSmazatMažu %sŽádaná verzeDetailyZařízeníMěli jste na mysli '%s'?Vlastnosti adresářeVypnout notifikační zvukyvypnout kontrolu (jedno id na řádek)OdpojitChcete přepsat '%s'?Chcete soubor uložit před zavřením?Chcete soubory uložit před zavřením?Ukotvit uživatelská oknaDokumentaceNezapomeňte, že main.py funguje pouze bez vloženého hlavního skriptu.DolůStáhnout do %sStahuju %s do %sUpravitEditorFont editoruZapište celé čísloZadejte jméno nové složky v %sZadejte nové jménoVložte řetězec k nahrazeníZadejte svoje heslo pro {}ChybaChybový kód:Chyba:UdálostiVyjímkyKonecUkončit ThonnyExportovat protokoly využití ...Externí modifikaceSouborSoubor již existujeJméno souboru:Vlastnosti souboruSouboryNajítNajít a nahraditNajít:Přepnout do editoruPřepnout doPřepnout do shelluMód škálování písmaZ důvodů výkonu se Shell vyhýbá zobrazování velmi dlouhých řádků v plné délce (viz Nástroje => Možnosti => Shell). Zde můžete pracovat s původním fragmentem textu.Nalezeno několik '%s' disků. Chcete jeden vybrat?Celá obrazovkaFunkceVolání funkce na %sObecnéPřejít na řádekPřejít na řádek...HeapHeap mód je zapnutý. Zavřete Heap zobrazení pro jeho vypnutíNápovědaObsah nápovědySkrýt skryté souboryZvýrazňovat aktuální řádek (vyžaduje znovuotevření editoru)Zvýraznit lokální proměnnéZvýraznit stejná jménaZvýrazňovat závorkyZvýrazňovat synaxiZvýraznit znaky tabulátoruDomůDomovská stránkaINTALOVATIO písmoPokud je potřeba otevřít soubor v externí aplikaci, uložte jej do lokální složky a otevřete jej odtamtud!Pokud jej nemůžete najít, možná musíte nedříve nainstalovat správný ovladač.Pokud nevíte, odkud balíček získat, pak budete pravděpodobně hledat Python Package Index. Začněte zadáním názvu balíčku do vyhledávacího pole výše a stisknutím klávesy ENTER.Když napíšete hodnotu proměnné prostředí do uvozovek, tyto uvozovky se stanou součástí hodnoty proměnné. Opravdu to tak chcete udělat?Pokud to stále chcete, instalujte to z příkazového řádkuZvětšit velikost písmaZvětšit odstazení o úroveňInstalaceInstalovat z PyPIInstalovat z lokálního souboruInstalace ze souboru požadavků (requirements.txt)Nainstalovat nebo aktualizovat firmwareNainstalováno do:Nainstalovaná verze:Instalování '%s'InterpreterPřerušit běhDovnitřNechat otevřený terminál po ukončení Python programuKlíčID klíčeJazykPoslední stabilní verzePoslední verzeČíslo řádkuNahrátNahrávámLokální proměnnéProtokolovat události využití programuZdá se že '%s' byl smazán nebo přesunut.Vypadá to že '%s' byl změněný mimo editor.Vypadá to že instalujete balík do Thonny. Pokud chcete instalovat Thonny plugin, potom vyberte 'Nástroje - Spáva pluginů' Určitě chcete instalovat %s bro back-end?Vytvořeno v University of Tartu, Estonia, s pomocí komunity open-source, Raspberry Pi Foundation a Cybernetica ASUjistěte se že na micro:bit je nainstalován MicroPythonSpravovat balíky pro %sSpravovat balíkySpravovat pluginyMaximalizovat oknoMaximální délka řádky před zalomenímMaximální počet řádkůMůže zpomalit debugingMicroPython (SSH)MicroPython (generic)MicroPython (lokální)MicroPython zařzeníZměněnoPřesunout '%s' do koše?Přesunout / přejmenovat...Přesunout do košePřesouvám '%s' do košePřesouvám do košePozn. V nastavení terminálu musí být povoleno automatické zavírání (Profily → Shell → Když skočí z shellu)!Velké hodnoty mohou způsobit nízký výkon!!Restartuje Thonny po těchto změnách!!Některé změny stylu se projeví až po restartu Thonny!!Zřejmě existuje další verze která je kompatibilní s aktuální verzí Thonny. Klikněte na '...' pro výběr verze k instalaci!Poznámka: Thonny podporuje jen Python %s a novější!Je potřeba resatartovat Thonny po instalaci / upgrade / odinstalaci pluginu!JménoNovýNový adresářNový souborDo tohoto adresáře budou nainstalovány také nové balíčky. Ostatní místa musí být řízena alternativními prostředky.Nové balíčky budou nainstalovány donásledující objektPoznámkyNic není vybránoOKInspektor objektůOtevřít Asistenta automaticky když má varování pro váš kódOtevřít Asistenta automaticky pokud program skončí výjimkouOtevřít adresář dat ThonnyOtevřít adresář programu ThonnyOtevřít a zavřít pohled na zásobník automatickyOtevřít vyhodnocené hodnoty v Inspektoru objektůOtevřít z '%s'Otevřít v ThonnyOtevřít v editoru v ThonnyOtevřít ve výchozí externí aplikaciOtevřít v systémové výchozí aplikaciOtevřít v systémovém správci souborůOtevřít prohlížeč historieOtevřít systémový shellOtevřít...Otevírání vzdálených souborů v externí aplikaci není podporováno.Otevře první zobrazení zásobníku a zavře jej, když se program vrátí do hlavního snímku.Volby...VenOsnovaPreskočitPřepsat?Přepsat motiv '%s'BalíkBalík '{}' je požadován pro instalaci a odinstalaci ostatních balíkůSprávce balíčků není v tomto interpretru dostupnýAdresář balíkůHesloVložitVkládání se nezdařiloCestaProvést MyPy kontroluProvést vybranou Pylint kontoluProsím, zkontrolujte zápisVyčkejte prosímPlotterPlotter vykresluje řady čísel vypsaných do ShelluPortPreferovaný debuggerPo skončení programu zobrazí Python REPLNáhledPředhozí objektTisk...ProblémArgumenty programuArgumenty programu:Strom programuVlastnostiPyPI stránkyPygame Zero módPythonové souboryPythonové soubory mají obvykle příponu .py.Interpretery PythonuUkončitOpravdu odinstalovat?Nedávné souboryDoporučené maximum znaků na řádek (nastavte 0 pro vypnutí čáry pro konec řádku)VpředObnovitObvyklý módVzdálený Python 3 (SSH)PřejmenovatPřejmenovat '%s'Otevřít všechny soubory z předchozího sezeníNahraditNahradit všeNahradit tabulátory mezeramiNahradit s:Najít a nahraditNahlásit problémVyžadujeVyžadje:Restartuje interpretr než spustíte skriptPokračovatBěhSpustit & DebugouvatSpustit / pokračovatSpustit aktuální skriptSpustit aktuální skript v termináluSkoč na kurzorSpustit aktuální skript v termináluUložitUložit všechny souboryUložit při zavřeníUložit jako...Uložit kopii...Uložit hesloUložit do '%s'UkládámRozsahVýsledky vyhledáváníVyhledáváníDetaily viz nápovědaVybrat všeVybrat všeVyberte položku a zkuste to znovu!Vyberte prázdný adresář pro nové virtuální prostředíVybraný adresář není prázdný. Vyberte jiný adresář.Poslat EOF / Soft rebootShellZobrat PlotterZobrazit volání funkcí (rámce) v samostatných oknechZobrazit skryté souboryZobrazit čísla řádkůZobrazit informace o parameterechVelikostVelikost (v bajtech)Zdrojový textZkrátit text (%d znaků)ZásobníkZačněte vybráním balíku vlevo.Krok zpětKrok dovnitřKrok venPřeskočitZastavitZastavit/restartovat backendÚložištěSouhrnPodporaPodpořte UkrajinuPřepnout do běžného režimuMotiv syntaxeCíl:TerminálEmulace TermináluOdpověď jeText nebyl nalezenMotiv & PísmoToto pole je určeno pro vaše pracovní poznámky -- k přiřazení úkolů, úryvků kódu, pro cokoli. Všechno se automaticky uloží a načte, když příště otevřete Thonny. Neváhejte tento text smazat a vytvořte si tak prostor pro vlastní poznámky.Tento příkaz není k dispozici v Thonny spuštěném z FlatpackuTento počítačToto okno je pro správu pluginů Thonny a jejich závislostí. Pokud chcete instalovat pluginy pro vlatní programy, potom vyberte 'Nástroje - Spravovat balíky'Tento dialog zobrazuje všechny dostupné balíky, ale umožňuje upgrade nebo odinstalaci pouze zTohle nevypadá jako balíček pro MicroPython/CircuitPython. Jste si jistí, že jej chcete nainstalovat.Tohle je komentářTento balík vyžaduje jinou verzi Thonny:Tento program je šířen BEZ JAKÉKOLI ZÁRUKY! Jedná se o svobodný software a jeho šíření v souladu s licencí je vítáno, viz https://opensource.org/licenses/MITVolby ThonnyThonny pluginyThonny plugin bez požaradkůThonnyho PythonPřepnout komentářeNástrojeZkusti detekovat port automatickyMód UIUI škálovací faktorMotiv UIZrušte zaškrtnutí, pokud chcete více tradiční uživatelské prostředí.OdkomentovatZpětOdinstalovatOdinstaluje se '%s'Nesplnitelné požadavkyNahoruUpgradeZávislosti upgradeUpgrade a odinstalaceNahrát do %sPoužijte "Stop" příkaz pro ukončení debugginguPoužít Tk souborové dialogy namísto ZenityHodnotaProměnnéHistorie verzíVerze která se má nainstalovatZobrazeníVarováníCo se má stát s %s souborem když na něj poklepete v Thonnyho souborovém dialogu?Který interpretr má Thonny použít ke spuštění vašeho kódu?S aktuálním interpreterem zde můžete procházet pouze balíčky. K instalaci, upgradu nebo odinstalaci použijte 'Nástroje → Otevřít systémový shell ...'.Zalomte text (může být pomalý)Musíte vybrat soubor!Zvětšitvšechny souborybla, blabajtůvolné místozdezkontrolujte název zařízení, např. "USB Serial" nebo "UART"prosím čekejtepodporuje základní ANSI barvy a stylynajít a nainstalovat soubor balíčku (obvykle s příponou .whl, .tar.gz nebo .zip).vyhledejte soubor requirements.txt a nainstalujte balíčky v něm uvedené.unclosed_stringbalíčky z uživatelských stránekvirtuální prostředí././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/cs_CZ/LC_MESSAGES/thonny.po0000644000076600000240000014620614417536743022657 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: cs\n" #: thonny/workbench.py:361 msgid "File" msgstr "Soubor" #: thonny/workbench.py:362 msgid "Edit" msgstr "Upravit" #: thonny/workbench.py:363 msgid "View" msgstr "Zobrazení" #: thonny/running.py:116 thonny/workbench.py:364 msgid "Run" msgstr "Běh" #: thonny/workbench.py:365 msgid "Tools" msgstr "Nástroje" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:366 msgid "Help" msgstr "Nápověda" #: thonny/workbench.py:583 msgid "Exit" msgstr "Konec" #: thonny/workbench.py:610 msgid "Decrease font size" msgstr "Zmenšit velikost písma" #: thonny/workbench.py:622 msgid "Focus editor" msgstr "Přepnout do editoru" #: thonny/workbench.py:631 msgid "Focus shell" msgstr "Přepnout do shellu" #: thonny/workbench.py:642 msgid "Maximize view" msgstr "Maximalizovat okno" #: thonny/workbench.py:654 msgid "Full screen" msgstr "Celá obrazovka" #: thonny/workbench.py:1457 msgid "Program arguments" msgstr "Argumenty programu" #: thonny/plugins/about.py:21 thonny/plugins/about.py:140 msgid "About Thonny" msgstr "O Thonny" #: thonny/plugins/about.py:66 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Vytvořeno v\n" "University of Tartu, Estonia,\n" "s pomocí\n" "komunity open-source,\n" "Raspberry Pi Foundation\n" "a Cybernetica AS" #: thonny/plugins/about.py:86 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Tento program je šířen\n" "BEZ JAKÉKOLI ZÁRUKY!\n" "Jedná se o svobodný software a jeho šíření\n" "v souladu s licencí je vítáno, viz\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:129 msgid "Version history" msgstr "Historie verzí" #: thonny/plugins/about.py:136 msgid "Report problems" msgstr "Nahlásit problém" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Otevřít Asistenta automaticky pokud program skončí výjimkou" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Otevřít Asistenta automaticky když má varování pro váš kód" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Provést vybranou Pylint kontolu" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Provést MyPy kontrolu" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "vypnout kontrolu (jedno id na řádek)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Asistent" #: thonny/plugins/autocomplete.py:512 msgid "Auto-complete" msgstr "Automatické doplňování" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Interpreter" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "O Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye je Debuger Pythonu, který musí být\n" "instalován samostatně.\n" "Chcete otevřít nápovědu a dozvědět se více?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Debugovat aktuální skript (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Přepnout komentáře" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Zakomentovat" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Odkomentovat" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Zpět" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Vpřed" #: thonny/base_file_browser.py:721 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2294 msgid "Cut" msgstr "Vyjmout" #: thonny/base_file_browser.py:722 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2295 msgid "Copy" msgstr "Kopírovat" #: thonny/base_file_browser.py:724 thonny/base_file_browser.py:730 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2296 msgid "Paste" msgstr "Vložit" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Vybrat vše" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Skoč na kurzor" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "ještě není možné zavřít" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Použijte \"Stop\" příkaz pro ukončení debuggingu" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ukotvit uživatelská okna" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Zvýraznit stejná jména" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Zvýraznit lokální proměnné" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Zvýrazňovat závorky" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Zvýrazňovat synaxi" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Zvýrazňovat aktuální řádek (vyžaduje znovuotevření editoru)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Zobrazit čísla řádků" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Doporučené maximum znaků na řádek\n" "(nastavte 0 pro vypnutí čáry pro konec řádku)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exportovat protokoly využití ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Události" #: thonny/plugins/files.py:606 msgid "Files" msgstr "Soubory" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:430 msgid "Find & Replace" msgstr "Najít a nahradit" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Najít:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Nahradit s:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Citlivé na velikost" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Nahoru" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Dolů" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Najít" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Nahradit" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Najít a nahradit" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Nahradit vše" #: thonny/plugins/find_replace.py:249 msgid "Enter string to be replaced." msgstr "Vložte řetězec k nahrazení" #: thonny/plugins/find_replace.py:333 msgid "The specified text was not found!" msgstr "Text nebyl nalezen" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Povolit pouze jednu instanci Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Otevřít všechny soubory z předchozího sezení" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Vypnout notifikační zvuky" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Mód škálování písma" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Heap mód je zapnutý.\n" "Zavřete Heap zobrazení pro jeho vypnutí" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Jazyk" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Toto pole je určeno pro vaše pracovní poznámky -- k přiřazení úkolů, úryvků kódu, pro cokoli.\n" "\n" "Všechno se automaticky uloží a načte, když příště otevřete Thonny.\n" "\n" "Neváhejte tento text smazat a vytvořte si tak prostor pro vlastní poznámky." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Poznámky" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Předhozí objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "následující objekt" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Inspektor objektů" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Osnova" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero mód" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Odinstalovat" #: thonny/editors.py:667 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1871 thonny/workdlg.py:162 msgid "Close" msgstr "Zavřít" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klik " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "zde" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Upgrade" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:348 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Instalace" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Není možné najít balík z PyPI" #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Poslední stabilní verze" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Poslední verze" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Souhrn" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Domovská stránka" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Butracker" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentace" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPI stránky" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Vyžaduje" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Opravdu odinstalovat?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Jste si jisti odinstalací?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Zpět k\n" "aktuálnímu snímku" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Proměnné" #: thonny/base_file_browser.py:1558 msgid "This computer" msgstr "Tento počítač" #: thonny/base_file_browser.py:641 msgid "Refresh" msgstr "Obnovit" #: thonny/base_file_browser.py:650 msgid "Focus into" msgstr "Přepnout do" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Chyba" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 msgid "You need to select a file!" msgstr "Musíte vybrat soubor!" #: thonny/base_file_browser.py:1409 msgid "Overwrite?" msgstr "Přepsat?" #: thonny/base_file_browser.py:1409 msgid "Do you want to overwrite '%s' ?" msgstr "Chcete přepsat '%s'?" #: thonny/editors.py:632 thonny/editors.py:634 msgid "New" msgstr "Nový" #: thonny/editors.py:645 msgid "Open..." msgstr "Otevřít..." #: thonny/editors.py:647 msgid "Load" msgstr "Nahrát" #: thonny/editors.py:656 msgid "Recent files" msgstr "Nedávné soubory" #: thonny/editors.py:678 thonny/ui_utils.py:493 msgid "Close all" msgstr "Zavřít vše" #: thonny/editors.py:688 thonny/editors.py:690 msgid "Save" msgstr "Uložit" #: thonny/editors.py:713 msgid "Save as..." msgstr "Uložit jako..." #: thonny/editors.py:724 msgid "Save copy..." msgstr "Uložit kopii..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Volby Thonny" #: thonny/running.py:115 msgid "Run current script" msgstr "Spustit aktuální skript" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Spustit aktuální skript v terminálu" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Zastavit/restartovat backend" #: thonny/running.py:160 msgid "Stop" msgstr "Zastavit" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Přerušit běh" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "Poslat EOF / Soft reboot" #: thonny/running.py:195 msgid "Disconnect" msgstr "Odpojit" #: thonny/plugins/cpython_frontend/cp_front.py:268 msgid "Python interpreters" msgstr "Interpretery Pythonu" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:269 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "všechny soubory" #: thonny/plugins/cpython_frontend/cp_front.py:297 msgid "Select empty directory for new virtual environment" msgstr "Vyberte prázdný adresář pro nové virtuální prostředí" #: thonny/plugins/cpython_frontend/cp_front.py:304 msgid "Bad directory" msgstr "Špatný adresář" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Vybraný adresář není prázdný.\n" "Vyberte jiný adresář." #: thonny/plugins/cpython_frontend/cp_front.py:322 msgid "Creating virtual environment" msgstr "Vytvářím virtuální prostředí" #: thonny/shell.py:100 msgid "Clear shell" msgstr "Smazat shell" #: thonny/shell.py:174 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:306 msgid "Clear" msgstr "Smazat" #: thonny/shell.py:319 msgid "Show Plotter" msgstr "Zobrat Plotter" #: thonny/shell.py:1648 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Z důvodů výkonu se Shell vyhýbá zobrazování velmi dlouhých řádků v plné délce (viz Nástroje => Možnosti => Shell).\n" "Zde můžete pracovat s původním fragmentem textu." #: thonny/shell.py:1659 msgid "Wrap text (may be slow)" msgstr "Zalomte text (může být pomalý)" #: thonny/ui_utils.py:1866 msgid "Copy to clipboard" msgstr "Zkopírovat do schránky" #: thonny/shell.py:1701 msgid "Squeezed text (%d characters)" msgstr "Zkrátit text (%d znaků)" #: thonny/shell.py:1871 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotter vykresluje řady čísel\n" "vypsaných do Shellu" #: thonny/shell.py:1873 msgid "See Help for details." msgstr "Detaily viz nápověda" #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Zavřít ostatní" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Kopíruji" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopíruji\n" "%s\n" "do\n" "%s" #: thonny/base_file_browser.py:1364 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1818 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Zrušit" #: thonny/base_file_browser.py:1355 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:100 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1815 thonny/workdlg.py:206 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2300 msgid "Select All" msgstr "Vybrat vše" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:155 #: thonny/workbench.py:162 msgid "Shell" msgstr "Shell" #: thonny/workbench.py:593 msgid "Options..." msgstr "Volby..." #: thonny/workbench.py:600 msgid "Increase font size" msgstr "Zvětšit velikost písma" #: thonny/workbench.py:665 msgid "Change font size" msgstr "Změnit velikost písma" #: thonny/workbench.py:666 msgid "Zoom" msgstr "Zvětšit" #: thonny/workbench.py:675 msgid "Exit Thonny" msgstr "Ukončit Thonny" #: thonny/workbench.py:678 msgid "Quit" msgstr "Ukončit" #: thonny/workbench.py:1236 thonny/workbench.py:1244 msgid "Overwriting theme '%s'" msgstr "Přepsat motiv '%s'" #: thonny/workbench.py:1428 msgid "Program arguments:" msgstr "Argumenty programu:" #: thonny/workbench.py:1482 msgid "Regular mode" msgstr "Obvyklý mód" #: thonny/workbench.py:1483 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Konfigurace byla změněna. Restartujte Thonny pro \n" "práci v normálním módu.\n" "(Pro změnu jděte do \"Nástroje - Volby - Obecné)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Strom programu" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Pokračovat" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Spustit / pokračovat" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Debugovat aktuální skript" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Debug" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Debugovat aktuální skript (hezčí)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Debugovat aktuální skript (rychlejší)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Přeskočit" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Preskočit" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Krok dovnitř" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Dovnitř" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Krok ven" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Ven" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Krok zpět" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Zpět" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Zásobník" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Vyjímky" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Protokolovat události využití programu" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Ladící režim (poskytuje detailnější log)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Mód UI" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI škálovací faktor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "!Restartuje Thonny po těchto změnách!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Obecné" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INTALOVAT" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Projít balík" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "S aktuálním interpreterem zde můžete procházet pouze balíčky.\n" "K instalaci, upgradu nebo odinstalaci použijte 'Nástroje → Otevřít systémový shell ...'." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Adresář balíků" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instalovat z PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Pokud nevíte, odkud balíček získat, pak budete pravděpodobně hledat Python Package Index. Začněte zadáním názvu balíčku do vyhledávacího pole výše a stisknutím klávesy ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "vyhledejte soubor requirements.txt a nainstalujte balíčky v něm uvedené." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Kliknout" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "najít a nainstalovat soubor balíčku (obvykle s příponou .whl, .tar.gz nebo .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Upgrade a odinstalace" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Začněte vybráním balíku vlevo." #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Cíl:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "virtuální prostředí" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "balíčky z uživatelských stránek" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Tento dialog zobrazuje všechny dostupné balíky, ale umožňuje\n" "upgrade nebo odinstalaci pouze z" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Do tohoto adresáře budou nainstalovány také nové balíčky. Ostatní místa musí být řízena alternativními prostředky." #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Nainstalovaná verze:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Nainstalováno do:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Prosím, zkontrolujte zápis" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Není možné najít informace o balíku z PyPI" #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Chybový kód:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "Nemůžu najít balík ze seznamu:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Balík '{}' je požadován pro instalaci a odinstalaci ostatních balíků" #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Balík" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Spravovat balíky pro %s" #: thonny/editors.py:571 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Potvrzení" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Vypadá to že instalujete balík do Thonny.\n" "Pokud chcete instalovat Thonny plugin,\n" "potom vyberte 'Nástroje - Spáva pluginů'\n" "\n" "Určitě chcete instalovat %s bro back-end?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "!Zřejmě existuje další verze která je kompatibilní s aktuální\n" "verzí Thonny. Klikněte na '...' pro výběr verze k instalaci!" #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Thonny plugin bez požaradků" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Nesplnitelné požadavky" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Tento balík vyžaduje jinou verzi Thonny:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Pokud to stále chcete, instalujte to z příkazového řádku" #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "!Je potřeba resatartovat Thonny po instalaci / upgrade / odinstalaci pluginu!" #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonny pluginy" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Rozšířená instalace / upgrade / downgrade" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Žádaná verze" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Závislosti upgrade" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Vyžadje:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Chyba:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Spravovat balíky" #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Spravovat pluginy" #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Otevřít prohlížeč historie" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Změnit pracovní adresář na adresář skriptu při Spuštění / Debugu" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Zobrazit volání funkcí (rámce) v samostatných oknech" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Zrušte zaškrtnutí, pokud chcete více tradiční uživatelské prostředí." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Otevřít a zavřít pohled na zásobník automaticky" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Otevře první zobrazení zásobníku a zavře jej, když se program vrátí do hlavního snímku." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Umožnit vstupovat do knihoven (například mimo adresář hlavního skriptu)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Může zpomalit debuging" #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Preferovaný debugger" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(používá se po kliknutí na tlačítko Debug na panelu nástrojů)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr " Birdseye port " #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(restartujte Thonny po této změně)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Spustit & Debugouvat" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Emulace Terminálu" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "podporuje základní ANSI barvy a styly" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maximální počet řádků" #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "!Velké hodnoty mohou způsobit nízký výkon!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximální délka řádky před zalomením" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Spustit aktuální skript v terminálu" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Po skončení programu zobrazí Python REPL" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Nechat otevřený terminál po ukončení Python programu" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Pozn. V nastavení terminálu musí být povoleno automatické zavírání\n" "(Profily → Shell → Když skočí z shellu)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminál" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Motiv UI" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Motiv syntaxe" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Font editoru" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "IO písmo" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Náhled" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Tohle je komentář" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "Odpověď je" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "unclosed_string" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "!Některé změny stylu se projeví až po restartu Thonny!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Zapište celé číslo" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Motiv & Písmo" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Otevřít adresář programu Thonny" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Otevřít adresář dat Thonny" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Domů" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Obsah nápovědy" #: thonny/plugins/micropython/mp_front.py:300 msgid "CircuitPython device" msgstr "CircuitPython zařízení" #: thonny/plugins/micropython/mp_front.py:304 msgid "MicroPython device" msgstr "MicroPython zařzení" #: thonny/plugins/micropython/mp_front.py:541 msgid "Connect your device to the computer and select corresponding port below" msgstr "Připojte zařízení k počítači a vyberte odpovídající port" #: thonny/plugins/micropython/mp_front.py:544 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "zkontrolujte název zařízení, např. \"USB Serial\" nebo \"UART\"" #: thonny/plugins/micropython/mp_front.py:546 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Pokud jej nemůžete najít, možná musíte nedříve nainstalovat správný ovladač." #: thonny/plugins/micropython/mp_front.py:439 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:449 msgid "Try to detect port automatically" msgstr "Zkusti detekovat port automaticky" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (generic)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Tisk..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Otevřít systémový shell" #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Detaily" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instalace ze souboru požadavků (requirements.txt)" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instalovat z lokálního souboru" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Toto okno je pro správu pluginů Thonny a jejich závislostí.\n" "Pokud chcete instalovat pluginy pro vlatní programy, potom vyberte 'Nástroje - Spravovat balíky'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generic)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Zvětšit odstazení o úroveň" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Zmenšit odstazení o úroveň" #: thonny/workbench.py:1471 msgid "Switch to\n" "regular\n" "mode" msgstr "Přepnout do\n" "běžného\n" "režimu" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Ujistěte se že na micro:bit je nainstalován MicroPython" #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Nezapomeňte, že main.py funguje pouze bez vloženého hlavního skriptu." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "prosím čekejte" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Nenalezen disk '%s'. Chcete jej najít sám(a)?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Nalezeno několik '%s' disků. Chcete jeden vybrat?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Není možné najít vhodný disk" #: thonny/base_file_browser.py:287 msgid "%d items" msgstr "%d položek" #: thonny/base_file_browser.py:736 msgid "Move to Trash" msgstr "Přesunout do koše" #: thonny/base_file_browser.py:739 msgid "Delete" msgstr "Smazat" #: thonny/base_file_browser.py:718 thonny/base_file_browser.py:869 msgid "New directory" msgstr "Nový adresář" #: thonny/base_file_browser.py:742 msgid "Properties" msgstr "Vlastnosti" #: thonny/base_file_browser.py:744 msgid "Storage space" msgstr "Úložiště" #: thonny/base_file_browser.py:754 msgid "Path" msgstr "Cesta" #: thonny/base_file_browser.py:756 msgid "Directory properties" msgstr "Vlastnosti adresáře" #: thonny/base_file_browser.py:758 msgid "File properties" msgstr "Vlastnosti souboru" #: thonny/base_file_browser.py:760 msgid "bytes" msgstr "bajtů" #: thonny/base_file_browser.py:763 msgid "Size" msgstr "Velikost" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:774 msgid "Modified" msgstr "Změněno" #: thonny/base_file_browser.py:833 msgid "Deleting %s" msgstr "Mažu %s" #: thonny/editors.py:253 msgid "Loading" msgstr "Nahrávám" #: thonny/editors.py:382 msgid "Saving" msgstr "Ukládám" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Nahrát do %s" #: thonny/plugins/files.py:417 msgid "Downloading %s to %s" msgstr "Stahuju %s do %s" #: thonny/plugins/files.py:323 msgid "Download to %s" msgstr "Stáhnout do %s" #: thonny/base_file_browser.py:643 msgid "Open in system file manager" msgstr "Otevřít v systémovém správci souborů" #: thonny/base_file_browser.py:671 msgid "Hide hidden files" msgstr "Skrýt skryté soubory" #: thonny/base_file_browser.py:671 msgid "Show hidden files" msgstr "Zobrazit skryté soubory" #: thonny/base_file_browser.py:654 msgid "Open in Thonny" msgstr "Otevřít v Thonny" #: thonny/base_file_browser.py:685 msgid "Open in system default app" msgstr "Otevřít v systémové výchozí aplikaci" #: thonny/base_file_browser.py:666 thonny/base_file_browser.py:693 msgid "Configure %s files" msgstr "Nastavit %s soubory" #: thonny/base_file_browser.py:694 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Co se má stát s %s souborem když na něj poklepete v Thonnyho souborovém dialogu?" #: thonny/base_file_browser.py:1240 thonny/editors.py:953 thonny/editors.py:955 msgid "Deleting" msgstr "" #: thonny/base_file_browser.py:1247 msgid "Creating directory" msgstr "" #: thonny/editors.py:251 msgid "Loading %s" msgstr "" #: thonny/editors.py:377 msgid "Saving to %s" msgstr "" #: thonny/editors.py:702 thonny/editors.py:704 msgid "Save All files" msgstr "Uložit všechny soubory" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:869 msgid "Configure interpreter..." msgstr "" #: thonny/workbench.py:1581 msgid "Device" msgstr "Zařízení" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "" #: thonny/workdlg.py:220 msgid "Starting" msgstr "" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Zadejte svoje heslo pro\n" "{}" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Výsledky vyhledávání" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Vyhledávání" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Instalování '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Odinstaluje se '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "Správce balíčků není v tomto interpretru dostupný" #: thonny/base_file_browser.py:1191 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "" #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Otevřít vyhodnocené hodnoty v Inspektoru objektů" #: thonny/plugins/cpython_frontend/cp_front.py:208 msgid "Python executable" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:231 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Vzdálený Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:310 msgid "Not connected" msgstr "" #: thonny/plugins/micropython/mp_front.py:515 msgid "Advanced options" msgstr "Pokročílé volby" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Nainstalovat nebo aktualizovat firmware" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (lokální)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Rozsah" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Nové balíčky budou nainstalovány do" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Verze která se má nainstalovat" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Vyčkejte prosím" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "" #: thonny/base_file_browser.py:686 msgid "Open in Thonny's text editor" msgstr "Otevřít v editoru v Thonny" #: thonny/base_file_browser.py:339 msgid "Storage space on this drive or filesystem" msgstr "" #: thonny/base_file_browser.py:340 msgid "total space" msgstr "" #: thonny/base_file_browser.py:342 msgid "used space" msgstr "" #: thonny/base_file_browser.py:343 msgid "free space" msgstr "volné místo" #: thonny/base_file_browser.py:350 msgid "Storage info" msgstr "" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Nahradit tabulátory mezerami" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Zvýraznit znaky tabulátoru" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Jméno" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Velikost (v bajtech)" #: thonny/base_file_browser.py:870 msgid "Enter name for new directory under\n" "%s" msgstr "Zadejte jméno nové složky v\n" "%s" #: thonny/base_file_browser.py:893 msgid "Nothing selected" msgstr "Nic není vybráno" #: thonny/base_file_browser.py:893 msgid "Select an item and try again!" msgstr "Vyberte položku a zkuste to znovu!" #: thonny/base_file_browser.py:1311 msgid "Open from %s" msgstr "Otevřít z '%s'" #: thonny/base_file_browser.py:1314 msgid "Save to %s" msgstr "Uložit do '%s'" #: thonny/base_file_browser.py:1333 msgid "File name:" msgstr "Jméno souboru:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Hodnota" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Uložit heslo" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Volání funkce na %s" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Lokální proměnné" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Funkce" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "ID klíče" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Klíč" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Zpět na %s" #: thonny/plugins/micropython/mp_front.py:439 msgid "Port or WebREPL" msgstr "" #: thonny/plugins/micropython/mp_front.py:583 msgid "Password" msgstr "Heslo" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Zdrojový text" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Použít Tk souborové dialogy namísto Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "" #: thonny/base_file_browser.py:715 msgid "New file" msgstr "Nový soubor" #: thonny/base_file_browser.py:733 msgid "Rename" msgstr "Přejmenovat" #: thonny/base_file_browser.py:919 msgid "Rename '%s'" msgstr "Přejmenovat '%s'" #: thonny/base_file_browser.py:919 msgid "Enter new name" msgstr "Zadejte nové jméno" #: thonny/base_file_browser.py:1007 msgid "Paste failed" msgstr "Vkládání se nezdařilo" #: thonny/base_file_browser.py:1007 msgid "There are conflicting folders" msgstr "" #: thonny/base_file_browser.py:1129 msgid "File already exists" msgstr "Soubor již existuje" #: thonny/base_file_browser.py:1194 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "" #: thonny/editors.py:35 msgid "Python files" msgstr "Pythonové soubory" #: thonny/editors.py:119 thonny/editors.py:182 msgid "" msgstr "" #: thonny/editors.py:146 msgid "File is gone" msgstr "" #: thonny/editors.py:149 msgid "Do you want to also close the editor?" msgstr "" #: thonny/editors.py:165 msgid "External modification" msgstr "Externí modifikace" #: thonny/editors.py:168 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "" #: thonny/editors.py:572 msgid "Python files usually have .py extension." msgstr "Pythonové soubory mají obvykle příponu .py." #: thonny/editors.py:574 msgid "Did you mean '%s'?" msgstr "Měli jste na mysli '%s'?" #: thonny/editors.py:733 msgid "Move / rename..." msgstr "Přesunout / přejmenovat..." #: thonny/editors.py:742 msgid "Go to line..." msgstr "Přejít na řádek..." #: thonny/editors.py:977 msgid "Line number" msgstr "Číslo řádku" #: thonny/editors.py:1123 msgid "Do you want to save files before closing?" msgstr "Chcete soubory uložit před zavřením?" #: thonny/editors.py:1125 msgid "Do you want to save file before closing?" msgstr "Chcete soubor uložit před zavřením?" #: thonny/editors.py:1128 msgid "Save On Close" msgstr "Uložit při zavření" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Příkaz není k dispozici" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Tento příkaz není k dispozici v Thonny spuštěném z Flatpacku" #: thonny/workbench.py:686 thonny/workbench.py:786 msgid "Support Ukraine" msgstr "Podpořte Ukrajinu" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Který interpretr má Thonny použít ke spuštění vašeho kódu?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Zobrazit informace o parameterech" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Automaticky zobrazit parametry po napsání '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Automaticky našeptávat zatímco píšete" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Automaticky zobrazit dokumentaci v našeptávači" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problém" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Nepodařilo se najít definici" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Vyčistit shell před spuštěním nového procesu (Spustit, Debugovat, Zastavit/Restartovat, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:170 msgid "Thonny's Python" msgstr "Thonnyho Python" #: thonny/plugins/micropython/mp_front.py:487 msgid "Interrupt working program on connect" msgstr "" #: thonny/plugins/micropython/mp_front.py:494 msgid "Synchronize device's real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:500 msgid "Use local time in real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:506 msgid "Restart interpreter before running a script" msgstr "Restartuje interpretr než spustíte skript" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Tohle nevypadá jako balíček pro MicroPython/CircuitPython.\n" "Jste si jistí, že jej chcete nainstalovat." #: thonny/base_file_browser.py:844 msgid "Moving to Trash" msgstr "Přesouvám do koše" #: thonny/base_file_browser.py:845 msgid "Move %s to Trash?" msgstr "Přesunout '%s' do koše?" #: thonny/base_file_browser.py:852 msgid "Moving %s to Trash" msgstr "Přesouvám '%s' do koše" #: thonny/base_file_browser.py:659 msgid "Open in default external app" msgstr "Otevřít ve výchozí externí aplikaci" #: thonny/base_file_browser.py:1192 msgid "Opening remote files in external app is not supported." msgstr "Otevírání vzdálených souborů v externí aplikaci není podporováno." #: thonny/base_file_browser.py:1199 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Pokud je potřeba otevřít soubor v externí aplikaci, uložte jej do lokální složky a otevřete jej odtamtud!" #: thonny/editors.py:147 msgid "Looks like '%s' was deleted or moved." msgstr "Zdá se že '%s' byl smazán nebo přesunut." #: thonny/editors.py:166 msgid "Looks like '%s' was modified outside of the editor." msgstr "Vypadá to že '%s' byl změněný mimo editor." #: thonny/plugins/cpython_frontend/cp_front.py:229 msgid "NB! Thonny only supports Python %s and later" msgstr "Poznámka: Thonny podporuje jen Python %s a novější" #: thonny/editors.py:977 msgid "Go to line" msgstr "Přejít na řádek" #: thonny/workbench.py:689 msgid "Support" msgstr "Podpora" #: thonny/editors.py:386 thonny/editors.py:401 msgid "Could not save" msgstr "Ukládání se nezdařílo" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Varování" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Když napíšete hodnotu proměnné prostředí do uvozovek, tyto uvozovky se stanou součástí hodnoty proměnné.\n" "Opravdu to tak chcete udělat?" #: thonny/workbench.py:859 msgid "Install MicroPython" msgstr "" #: thonny/workbench.py:863 msgid "Install CircuitPython" msgstr "" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "" #: thonny/plugins/todo_view.py:42 msgid "Line" msgstr "" #: thonny/plugins/todo_view.py:43 msgid "Info" msgstr "" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:530 msgid "Install or update %s" msgstr "" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:239 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9331107 thonny-4.1.7/thonny/locale/de_DE/0000755000076600000240000000000014730055627017134 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0890555 thonny-4.1.7/thonny/locale/de_DE/LC_MESSAGES/0000755000076600000240000000000014730055627020721 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/de_DE/LC_MESSAGES/thonny.mo0000644000076600000240000011103414670256721022576 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4Kj#_j"jjj jj jj. k:k+?k kk vkkkkkk kk kkkk l!l11l8clNllm/HnJxn/nn oo5o4Ho:}oooopp *p!4p Vpwppp]p1qACr;rOrs4snsbtgt kt xtztt(u8uIuYulutuuuGuOu)2v/\v-v5vvvw/w!Owqwww w>wl x yxx xxxxxWx;%yayty }yyy!y0yy z,zJz4Rzzzzz.z#z{"{ 4{@{H{e{x{ { { {{{{3{$|7|?|X|Sj|| ||!| }}2)}\}e}%t}}}}*}'} ~ '~,2~ _~ j~u~~~'~~' )3Icw (?P1a5>ɀV_ u8́ -7T,Z Ă؂ 2FVe* ǃԃكރ )#DŽ1ȅ zԆYO2܈6)  ?N c.m)ƊϊG5 ERat ""ċE 4S" ŒՌ.݌Q ^ef̍M9#EK P]flC(ʐ)]`{ܑ%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: de Language-Team: de Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d Elemente%s sieht nicht wie eine Textdatei aus(Nach dieser Änderung Thonny neu starten)(wird beim Klicken auf die Schaltfläche Debuggen in der Symbolleiste verwendet)Über Birdseye (Debugger)Über ThonnyVirtuelle Umgebung aktivierenErweitertes Installieren / Aktualisierung / DowngradeNur eine Instanz von Thonny zulassenAusführung unbenannter Programme erlaubenWechseln in Bibliotheken erlauben (d.h. außerhalb des Hauptskriptverzeichnisses)Bist du sicher, dass du es deinstallieren möchtest?AssistentAttributeAuthentifizierungAutorAutovervollständigenBiete beim Tippen Auto-Vervollständigen anZeige automatisch Dokumentation für VervollständigungenZeige automatisch Parameter-Info nach Eingabe von '('ZurückZurück nach %sZurück zum aktuellen FrameDas Back-end ist noch nicht bereitOrdner nicht leerBirdseye ist ein Python-Debugger, der separat installiert werden muss. Möchtest du die Hilfe-Seite öffnen und mehr erfahren?Birdseye portPakete durchsuchenBugtrackerSchließen noch nicht möglichPaketname kann in der Liste nicht gefunden werden:Geeignetes Laufwerk kann nicht gefunden werdenAbbrechenAbbrechenGroß-/Kleinschreibung beachtenSchriftgröße ändernÄndern Sie das Arbeitsverzeichnis in das Skriptverzeichnis unter "Ausführen / Debuggen"CircuitPython (generic)CircuitPython deviceLeerenLeere das Terminal-Fenster vor dem Start des neuen Prozesses (ausführen, debuggen, Stop/Restart, ...)Kommandozeile leerenKlickKlick SchließenAlle schließenAndere schließenBefehl nicht verfügbarAuskommentierenDie Konfiguration wurde aktualisiert. Starten Sie Thonny starten erneut, um im Standard-Modus zu arbeiten. (siehe 'Extras → Optionen → Allgemeines' wenn Sie sich anders entscheiden.)Konfiguriere %s DateienKonfiguriere den Interpreter ...BestätigungVerbinden Sie Ihr Gerät mit dem Computer und wählen Sie den relevanten Port unten ausKopierenKopie in ZwischenablageKopierenKopiere %s nach %sDefinition nicht gefundenKonnte Laufwerk '%s' nicht finden. Möchten Sie das Laufwerk selbst suchen?Das Paket konnte nicht im PyPI gefunden werden.Paketinformation kann nicht im PyPI gefunden werden.Konnte nicht gespeichert werdenErstelle ein VerzeichnisVirtuelle Umgebung erzeugenAusschneidenDatenDebuggenAktuelles Skript debuggenAktuelles Skript debuggen (birdseye)Aktuelles Skript debuggen (schneller)Aktuelles Skript debuggen (besser)Debug-Modus (liefert detaillierteres Diagnoseprotokoll)Schrift verkleinernEntferne in den ausgewählten Zeilen führende LeerzeichenStandard-PasswortLöschenLöschen%s löschenGewünschte VersionDetailsGerätMeinten Sie '%s'?Eigenschaften des OrdnersBenachrichtigungston deaktivierenAbgewählte Prüfungen (eine ID per Zeile)Verbindung unterbrechenMöchtest du diesen Namen weiterhin für dein Skript verwenden?Willst Du auch den Editor schließen?Wollen Sie den jetzigen Editor-Inhalt verwerfen und die Datei von der Platte neu laden?Wollen Sie '%s' überschreiben?Wollen Sie die Datei vor dem Schließen speichern?Wollen Sie die Dateien vor dem Schließen speichern?Benutzerfenster andockenDokumentationVergessen Sie nicht, dass main.py nur ohne eingebettetes Hauptskript funktioniert.UntenDownload nach %sDownload von %s nach %sBearbeitenEditorSchriftart im EditorGanzzahl eingebenBestimmen Sie einen Namen für ein neues Verzeichnis unter %sNeuen Namen eingebenGib die zu ersetzende Zeichenkette ein.Geben sie Ihren persönlichen Passwort-Satz für {} eingeben Sie hier Ihr Passwort für {} einUmgebungs-Variablen (jeweils eine pro Zeile)FehlerFehler-Code:Fehler:EreignisseAusnahmeBeendenThonny schließenProtokoll Dateien exportien ...Externe VeränderungDateiDatei existiert bereitsDatei ist verschwundenDatei ist geöffnetDateiname:Eigenschaften der DateiDateienSuchenSuchen & ErsetzenSuchen:Den Cursor im Editor aktivierenCursor inDen Cursor der Shell aktivierenSchrift-SkalierungsmodusUm den Programmfehler zu korrigieren muss das Program zuerst gespeichert werden.Aus Performancegründen werden sehr lange Zeilen nicht vollständig gezeigt (siehe Extras > Optionen > Kommandozeile). Hier können Sie den originalen Textabschnitt beeinflussen.Es wurden mehrere '%s' Laufwerke gefunden. Möchten Sie selbst eines auswählen?VollbildFunktionFunktionsaufruf bei %sAllgemeinesGehe zu ZeileGehe zu Zeile ...Zugangsfehler beim Versuch %s zu ladenHeapHeap-Modus ist an. Schließe Heap-Ansicht um ihn auszuschalten.HilfeHilfe InhaltVerborgene Dateien ausblendenAktuelle Zeile hervorheben (erfordert erneutes Öffnen des Editors)Lokale Variablen hervorhebenÜbereinstimmende Namen hervorhebenKlammern hervorhebenSyntax-Elemente hervorhebenHebe Tabulatorzeichen hervorHomeHomepageIDInstallierenSchriftart im TerminalWenn es eine Textdatei ist, kannst Du sie in Thonny öffnen, indem Du rechts klickst und 'Konfiguriere ... Dateien' wählst.Falls das letzte Kommando eine Exception (interrupt) ausgelöst hat, dann wird in diesem Fenster der zugehörige Stack gezeigt.Wenn die Datei von einer externen App geöffnet werden muss, dann speichere sie in einem lokalen Verzeichnis und öffne sie von dort!Falls Sie es nicht finden, müssen Sie möglicherweise erst den richtigen USB-Treiber installieren.Wenn Sie nicht wissen, woher Sie das Paket beziehen können, sollten Sie den Python-Paketindex durchsuchen. Geben Sie den Anfang des Paketnamens in das Suchfeld oben ein und drücken die EINGABETASTE.Wenn Sie Ihr Skript '%s' nennen, sind Sie nicht in der Lage das Bibliotheksmodul '%s' zu importierenWenn der Wert einer Umgebungsvariable in Anführungszeichen gesetzt wird, werden die Anführungszeichen Teil des Werts. War das beabsichtigt?Falls Sie das trotzdem möchten, dann benutzen Sie bitte die Kommandozeile.Schrift vergrößernAusgewählte Zeilen einrückenEinrücken mit Tab (für Python nicht empfohlen)IndexInfoInformationInstallierenCircuitPython installierenMicroPython installierenInstalliere vom PyPIInstallieren mit lokalen DateienInstallieren mit requirements Datei%s installieren oder aktualisierenInstalliert in:Installierte Version:InstalliereInstalliere '%s'InterpreterAusführung abbrechenBeim Verbinden laufendes Programm unterbrechenIntoNach Programmende Terminal geöffnet lassenSchlüsselSchlüssel-IDSpracheNeueste stabile VersionNeueste VersionLizenzZeileZeilennummerLadenwird geladenLade %sLokales Python 3Lokale VariablenOrtProgrammereignisse protokollierenAnscheinend wurde '%s' gelöscht oder verschoben.Anscheinend wurde '%s' außerhalb des Editors geändert.Es sieht so aus, als ob diese Datei oder dieser Ordner nicht beschreibbar ist.Es scheint, Sie wollen ein Thonny zugehöriges Paket installieren. Falls es ein Thonny Plug-in ist, dann wählen Sie bitte 'Extras → Verwalte Plug-ins...' Sind Sie sicher, dass Sie %s als Back-end installieren wollen?Hergestellt an der Universität Tartu, Estland, mit Hilfe der Open-Source-Community, Raspberry Pi Foundation und Cybernetica ASGespeicherte Shebang-Skripte ausführbar machenStellen Sie sicher, dass MicroPython auf Ihrem micro: bit installiert ist.Hochgeladene Shebang-Skripte ausführbar machenVerwalte Pakete für %sVerwalte Pakete ...Verwalte Plug-ins ...Ansicht maximierenMaximal angezeigte Zeichenlänge bis zum VerschiebenMaximale Anzahl der Zeilen, die beibehalten werden sollen.Kann das Debuggen verzögern.MicroPython(über SSH)MicroPython (generic)MicroPython (lokal)MicroPython deviceGeändert%s in den Papierkorb verschieben?Verschieben / Umbenennen von ...In den Papierkorb verschiebenVerschiebe %s in den PapierkorbIn den Papierkorb verschiebenHinweis: Das automatische Schließen muss in den Einstellungen des Terminals aktiviert sein (Hinweis: Die Dateiauswahl funktioniert möglicherweise nicht richtig, wenn Programme aus einer virtuellen Umgebung heraus aufgerufen werden. In diesem Fall ist das 'activate' Script anstelle des Interpreters zu wählen (oder der Pfad direkt in der Eingabebox einzugeben).Hinweis: Große Werte können zu Geschwindigkeitsverlust führen!Hinweis: Thonny nach Änderung dieser Optionen neu starten!Hinweis: Einige Einstellungen ändern sich erst nach einem Neustart von Thonny!Hinweis: Möglicherweise ist eine andere kompatible Version für Ihre Thonny-Version verfügbar. Klicken Sie den '...'-Button um die zu installierende Version auszuwählen.Hinweis: Thonny unterstützt nur Python %s und neuerHinweis: Sie müssen Thonny nach der Installation / Aktualisierung / Deinstallation eines Plugins neu starten.NameNeuNeuer OrdnerNeue DateiNeue Pakete werden ebenso in diesen Ordner installiert. Andere Ordner müssen mit alternativen Verfahren verwaltet werden.Nächstes ObjektKeine mit #todo markierte Zeile gefundenNicht verfügbarNicht verbundenNicht unterstütztNotizenNichts ausgewähltOKObjektinspektorAssistenten automatisch öffnen, wenn er Warnungen für deinen Code hatAssistenten automatisch öffnen, wenn das Programm mit einer Ausnahme abstürztArbeitsverzeichnis von Thonny öffnen ...Installationsverzeichnis von Thonny öffnen ...Stack View automatisch öffnen und schließenSehen Sie den Wert des Ausdruckes im Objekt-InspektorÖffnen von %sÖffnen in ThonnyIn Thonnys Texteditor öffnenÖffne in externer Standard-AppÖffnen in der Systemstandard-AppIm Systemdateimanager öffnenLogdatei schreiben...System Terminal öffnen ...Öffnen ...Remote-Dateien können nicht in externer App geöffnet werden.Stack View beim ersten Aufruf öffnen und bei Programmreturn schließen um zum Hauptfenster zurückzukehren.Optionen...HerausGliederungÜberÜberschreiben?Theme überschreiben '%s'PaketDas Paket '{}' wird für die Installation und Deinstallation weiterer Pakete benötigt.für diesen Interpreter ist kein Package-Manager verfügbarOrdner für PaketePasswortEinfügenEinfügen gescheitertPfadMyPy-Überprüfungen durchführenAusgewählte Pylint-Überprüfungen durchführenBerechtigungsfehlerBerechtigungsfehlerBitte überprüfen Sie Ihre Rechtschreibung!DruckenDrucker visualisiert Anzahl von Nummern im Terminal.PortPort oder WebREPLMögliches ProblemBevorzugter DebuggerVorbereitungen (überspringe den VS-Code-Teil)Zeige Python REPL nach ProgrammendeVorschauVorheriges ObjektDrucken ...ProblemProblem beim Laden der DateiProgramm-ArgumenteProgrammargumente:ProgrammbaumEigenschaftenPyPI-SeitePygame Zero-ModusAusführbares Python-ProgrammPython-DateienPython-Dateien haben üblicherweise die Endung .py.Python-InterpreterBeendenWirklich deinstallieren?Zuletzt verwendetEmpfohlene maximale Zeilenlänge (auf 0 einstellen, um die Randlinie auszuschalten)WiederherstellenAktualisierenStandard-ModusNichtlokales Python 3 (über SSH)UmbenennenBenenne '%s' umAlle Dateien der vorherigen Sitzung erneut öffnenErsetzenAlles ersetzenErsetze Tabulatoren durch LeerzeichenErsetzen durch:Ersetzen+SuchenProbleme meldenAutovervollständigen mit Tab in der ShellAutovervollständigen mit Tab im EditorBenötigtBenötigt:Vor Start des Skript Interpreter neu startenFortfahrenAusführenAusführen & DebuggenAusführen / fortfahrenAktuelles Skript ausführenAktuelles Skript in Terminal ausführenBis zum Cursor ausführenAktuelles Skript in Terminal ausführenSpeichernSpeicher alle DateienBeim Schließen speichernSpeichern unter ...Kopie speichern ...Passwort speichernSpeichern nach %sspeichern läuftSpeichern nach %sSuche micropython-lib und PyPISuche im PyPISuchergebnisseSuchenKonsultieren Sie die Hilfe für Details.Alles auswählenAlles auswählenWählen Sie ein Item und versuchen Sie es erneut!Leeren Ordner für neue virtuelle Umgebung auswählenAuswählen, falls Dialoge hinter dem Hauptfenster verschwindenDer ausgewählte Ordner ist nicht leer. Wählen Sie einen anderen oder brechen Sie ab.EOF senden / NeustartKommandozeileDrucker anzeigenFunktionsaufrufe in separaten Fenstern (Frames) anzeigenVerborgene Dateien anzeigenZeilennummern anzeigenZeige Parameter-InfoGrößeGröße (Bytes)Quellcodegekürzter Text (%d Zeichen)StackBeginne mit der Auswahl mit dem Paket links.BeginnenZurück schreitenEintretenVerlassenEinzelschrittAusführung beendenStopp/Restart ausführenSpeicherinformationSpeicherplatzSpeicherplatz auf diesem Laufwerk oder DateisystemZusammenfassungUnterstützungUnterstützen Sie die UkraineWechsle zu Standard ModeSynchronisiere die Echtzeituhr des GerätsSyntax ThemeToDoZielTerminalTerminal-EmulationDie Antwort istDer angezeigte Wert ist ein Schätzwert dieser Gleitkommazahl. Der genaue gespeicherte Wert ist %s, was ungefähr %s entsprichtDer angegebene Text wurde nicht gefunden!Theme & SchriftartEs gibt sich widersprechende OrdnerDiese Box ist für Ihre Notizen gedacht -- Aufgaben, Code-Snippets, etc. Text wird automatisch gespeichert und beim nächsten Öffnen von Thonny geladen. Löschen Sie diesen Text um für Ihre Notizen Platz zu schaffen.Dieser Befehl ist nicht unter Flatpack verfügbarDieser ComputerIn diesem Fenster werden Thonny Plug-ins und Ihre Korrespondierenden Pakete verwaltet. Falls Sie Pakete für Ihre eigenen Programme installieren möchten, wählen Sie "Extras → Pakete verwalten ...".Dieser Dialog führt alle verfügbaren Pakete auf, erlaubt die Aktualisierung oder Deinstallation von Paketen aber nur vonDas scheint kein Micro-/CircuitPython-Paket zu sein. Wollen Sie es wirklich installieren?Die Datei ist bereits von Thonny geöffnet. Wenn Sie sie unter diesem Namen speichern wollen, sollten Sie den Editor zuerst schließen!Es ist ein Problem mit der Eingabecodierung aufgetreten. Stellen Sie sicher, dass die Datei entweder UTF-8 konform ist, oder explizit auf die Eingabekodierung hinweist.Das ist ein KommentarDieses Paket erfordert eine andere Version von Thonny:Diese Programm wird ohne Gewährleistung zur Verfügung gestellt. Es ist freie Software, die du unter bestimmte Bedingungen weiterverbreiten kannst, siehe https://opensource.org/licenses/MIT für weitere InformationThonny ExtrasThonny-PluginsThonny-Plugin ohne AnforderungenThonnys PythonKommentar umschaltenWerkzeugeVersuche, sie mit Datei => Öffnen zu öffnen.Versuche den Port automatisch zu erkennenUI-ModusUI-SkalierungsfaktorUI ThemeKontrollkästchen deaktivieren, falls klassisches Verhalten erwünscht.EntkommentierenRückgängigDeinstallierenDeinstalliere '%s'Ungeeignete AnforderungenObenAktualisierenAbhängigkeiten bei AktualisierungAktualisierung oder DeinstallationAktualisieren von '%s'Upload nach %sVerwende den Befehl "Stopp", wenn du das Debuggen abbrechen möchtestBenutzen Sie die TK-Dateiauswahl anstelle von ZenityBenutze lokale Zeit in EchtzeituhrWertID-WertVariablenVersionsgeschichteAnsichtAktuelles Skript im Python Tutor visualisierenWarne wenn ein benutzerdefiniertes Modul ein Bibliotheksmodul unzugänglich machtWarnungWie soll mit einer %s Datei umgegangen werden, wenn Sie in Thonnys Dateibrowser darauf doppelklicken?Wohin soll gespeichert werden?Welche Art von Interpreter soll Thonny zur Ausführung Deines Codes benutzen?Mit dem aktuellen Interpreter können Sie nur die Pakete hier durchsuchen. Zum Installieren, Aktualisieren oder Deinstallieren nutzen Sie "Extras → Systemterminal öffnen ..."Text einklappen (kann langsam sein)Es kann eine vorhandene virtuelle Umgebung auch über das Rechtsklick-Kontextmenü in der Dateinavigation aktiviert werden, wenn ein virtueller Umgebungsordner oder die darin enthaltene Datei 'pyveng.cfg' ausgewählt wird.Selektiere eine Datei!Sie müssen ihr Programm stoppen, bevor Sie den Paketmanager starten.ZoomAlle Dateienbla, blaBytesfreier SpeicherplatzhierSuchen Sie nach Ihrer Geräteschnittstelle "USB Serial" oder "UART"es gibt kein lib-Verzeichnis im sys.pfadUnterstützt basis ANSI-Farben und -StileFinde und installiere die Paketdatei (üblicherweise mit der Endung .whl, .tar.gz oder .zip).Finde die requirements.txt Datei zu finden und die in Ihr spezifizierten Pakete zu installieren.Speicherplatz totaloffene_Zeichenfolgebenutzter Speicherplatz././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/de_DE/LC_MESSAGES/thonny.po0000644000076600000240000016573614626075445022626 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: de\n" #: thonny/workbench.py:375 msgid "File" msgstr "Datei" #: thonny/workbench.py:376 msgid "Edit" msgstr "Bearbeiten" #: thonny/workbench.py:377 msgid "View" msgstr "Ansicht" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Ausführen" #: thonny/workbench.py:379 msgid "Tools" msgstr "Werkzeuge" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Hilfe" #: thonny/workbench.py:598 msgid "Exit" msgstr "Beenden" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Schrift verkleinern" #. Cursor in Editor workspace -> DE: Cursor in Editorfenster aktivieren #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Den Cursor im Editor aktivieren" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Den Cursor der Shell aktivieren" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Ansicht maximieren" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Vollbild" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Programm-Argumente" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Über Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Hergestellt an der\n" "Universität Tartu, Estland,\n" "mit Hilfe der\n" "Open-Source-Community,\n" "Raspberry Pi Foundation\n" "und Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Diese Programm wird ohne Gewährleistung zur Verfügung gestellt. Es ist freie Software, die du unter bestimmte Bedingungen weiterverbreiten kannst, siehe https://opensource.org/licenses/MIT für weitere Information" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Versionsgeschichte" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Probleme melden" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Assistenten automatisch öffnen, wenn das Programm mit einer Ausnahme abstürzt" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Assistenten automatisch öffnen, wenn er Warnungen für deinen Code hat" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Ausgewählte Pylint-Überprüfungen durchführen" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy-Überprüfungen durchführen" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Abgewählte Prüfungen (eine ID per Zeile)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistent" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Autovervollständigen" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Interpreter" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Über Birdseye (Debugger)" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye ist ein Python-Debugger, der separat installiert werden muss.\n" "\n" "Möchtest du die Hilfe-Seite öffnen und mehr erfahren?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Aktuelles Skript debuggen (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Kommentar umschalten" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Auskommentieren" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Entkommentieren" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Rückgängig" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Wiederherstellen" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Ausschneiden" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Kopieren" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Einfügen" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Alles auswählen" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Bis zum Cursor ausführen" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Schließen noch nicht möglich" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Verwende den Befehl \"Stopp\", wenn du das Debuggen abbrechen möchtest" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Benutzerfenster andocken" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Übereinstimmende Namen hervorheben" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Lokale Variablen hervorheben" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Klammern hervorheben" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Syntax-Elemente hervorheben" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Aktuelle Zeile hervorheben (erfordert erneutes Öffnen des Editors)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Zeilennummern anzeigen" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Empfohlene maximale Zeilenlänge\n" "(auf 0 einstellen, um die Randlinie auszuschalten)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Protokoll Dateien exportien ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Ereignisse" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Dateien" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Suchen & Ersetzen" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Suchen:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Ersetzen durch:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Groß-/Kleinschreibung beachten" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Oben" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Unten" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Suchen" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Ersetzen" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Ersetzen+Suchen" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Alles ersetzen" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Gib die zu ersetzende Zeichenkette ein." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Der angegebene Text wurde nicht gefunden!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Nur eine Instanz von Thonny zulassen" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Alle Dateien der vorherigen Sitzung erneut öffnen" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Benachrichtigungston deaktivieren" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Schrift-Skalierungsmodus" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Heap-Modus ist an.\n" "Schließe Heap-Ansicht um ihn auszuschalten." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Sprache" #. Question for consistence: Is there consent how to translate "you" in this project? The more formal "Sie", or the "Du". It depends on personal custom, yet for me "Sie" leans more to the professional side. #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Diese Box ist für Ihre Notizen gedacht -- Aufgaben, Code-Snippets, etc.\n" "\n" "Text wird automatisch gespeichert und beim nächsten Öffnen von Thonny geladen.\n" "\n" "Löschen Sie diesen Text um für Ihre Notizen Platz zu schaffen." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notizen" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Vorheriges Objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Nächstes Objekt" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Objektinspektor" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Gliederung" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero-Modus" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Deinstallieren" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Schließen" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klick " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "hier" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Aktualisieren" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Installieren" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Das Paket konnte nicht im PyPI gefunden werden." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Neueste stabile Version" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Neueste Version" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Zusammenfassung" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Homepage" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Bugtracker" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Dokumentation" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "PyPI-Seite" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Benötigt" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Wirklich deinstallieren?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Bist du sicher, dass du es deinstallieren möchtest?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Zurück zum\n" "aktuellen Frame" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variablen" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Dieser Computer" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Aktualisieren" #. Fokus means cursor active in ... #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Cursor in" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Fehler" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Selektiere eine Datei!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Überschreiben?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Wollen Sie '%s' überschreiben?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Neu" #: thonny/editors.py:671 msgid "Open..." msgstr "Öffnen ..." #: thonny/editors.py:673 msgid "Load" msgstr "Laden" #. Edited files is better. #: thonny/editors.py:682 msgid "Recent files" msgstr "Zuletzt verwendet" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Alle schließen" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Speichern" #: thonny/editors.py:739 msgid "Save as..." msgstr "Speichern unter ..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Kopie speichern ..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny Extras" #: thonny/running.py:160 msgid "Run current script" msgstr "Aktuelles Skript ausführen" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Aktuelles Skript in Terminal ausführen" #. What means "backend" in English? from beginning? From Line start? #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Stopp/Restart ausführen" #. I think "Stopp" is better then "Halt". The meaning is maybe the Program stop. #: thonny/running.py:205 msgid "Stop" msgstr "Ausführung beenden" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Ausführung abbrechen" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "EOF senden / Neustart" #: thonny/running.py:240 msgid "Disconnect" msgstr "Verbindung unterbrechen" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Python-Interpreter" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "Alle Dateien" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Leeren Ordner für neue virtuelle Umgebung auswählen" #. What means 'bad directory' ? Wrong directory or directory tree too deep? etc. #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Ordner nicht leer" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Der ausgewählte Ordner ist nicht leer.\n" "Wählen Sie einen anderen oder brechen Sie ab." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Virtuelle Umgebung erzeugen" #. alternative DE: "Terminal leeren" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Kommandozeile leeren" #: thonny/shell.py:185 msgid "Plotter" msgstr "Drucken" #: thonny/shell.py:317 msgid "Clear" msgstr "Leeren" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Drucker anzeigen" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Aus Performancegründen werden sehr lange Zeilen nicht vollständig gezeigt (siehe Extras > Optionen > Kommandozeile).\n" "Hier können Sie den originalen Textabschnitt beeinflussen." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Text einklappen (kann langsam sein)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Kopie in Zwischenablage" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "gekürzter Text (%d Zeichen)" #. What does this mean? #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Drucker visualisiert Anzahl von Nummern im Terminal." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Konsultieren Sie die Hilfe für Details." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Andere schließen" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Kopieren" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopiere\n" "%s\n" "nach\n" "%s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Abbrechen" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Alles auswählen" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Kommandozeile" #: thonny/workbench.py:608 msgid "Options..." msgstr "Optionen..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Schrift vergrößern" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Schriftgröße ändern" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Thonny schließen" #: thonny/workbench.py:692 msgid "Quit" msgstr "Beenden" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Theme überschreiben '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Programmargumente:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Standard-Modus" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Die Konfiguration wurde aktualisiert. Starten Sie Thonny starten erneut, um im Standard-Modus zu arbeiten.\n" "\n" "(siehe 'Extras → Optionen → Allgemeines' wenn Sie sich anders entscheiden.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Programmbaum" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Fortfahren" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Ausführen / fortfahren" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Aktuelles Skript debuggen" #. = Fehlersuche , but I think Debug is very common in Germany #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Debuggen" #. nice means better (besser) or only cosmetic (schöner)? #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Aktuelles Skript debuggen (besser)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Aktuelles Skript debuggen (schneller)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Einzelschritt" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Über" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Eintreten" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Into" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Verlassen" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Heraus" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Zurück schreiten" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Zurück" #. Stapelspeicher #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Stack" #. I (-> German) think "Exceptions" (in english) and "Ausnahmen" (in German) should be plural. #. #. Alternatively one could use "Ausnahmebehandlung" (= "exception handling") in German (singular, more precise, but considerably longer). #. #. What do you think? #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Ausnahme" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Programmereignisse protokollieren" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Debug-Modus (liefert detaillierteres Diagnoseprotokoll)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UI-Modus" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI-Skalierungsfaktor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "Hinweis: Thonny nach Änderung dieser Optionen neu starten!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Allgemeines" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "Installieren" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Pakete durchsuchen" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Mit dem aktuellen Interpreter können Sie nur die Pakete hier durchsuchen.\n" "Zum Installieren, Aktualisieren oder Deinstallieren nutzen Sie \"Extras → Systemterminal öffnen ...\"" #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Ordner für Pakete" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installiere vom PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Wenn Sie nicht wissen, woher Sie das Paket beziehen können, sollten Sie den Python-Paketindex durchsuchen. Geben Sie den Anfang des Paketnamens in das Suchfeld oben ein und drücken die EINGABETASTE." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "Finde die requirements.txt Datei zu finden und die in Ihr spezifizierten Pakete zu installieren." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Klick" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "Finde und installiere die Paketdatei (üblicherweise mit der Endung .whl, .tar.gz oder .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Aktualisierung oder Deinstallation" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Beginne mit der Auswahl mit dem Paket links." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Dieser Dialog führt alle verfügbaren Pakete auf, erlaubt die Aktualisierung oder Deinstallation von Paketen aber nur von" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Neue Pakete werden ebenso in diesen Ordner installiert. Andere Ordner müssen mit alternativen Verfahren verwaltet werden." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Installierte Version:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Installiert in:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Bitte überprüfen Sie Ihre Rechtschreibung!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Paketinformation kann nicht im PyPI gefunden werden." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Fehler-Code:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Paketname kann in der Liste nicht gefunden werden:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Das Paket '{}' wird für die Installation und Deinstallation weiterer Pakete benötigt." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Paket" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Verwalte Pakete für %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Bestätigung" #. instead of Plug-in could be used (Zusatzprogramm), but I think Plug-in is much better. #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Es scheint, Sie wollen ein Thonny zugehöriges Paket installieren.\n" "Falls es ein Thonny Plug-in ist, dann wählen Sie bitte\n" "'Extras → Verwalte Plug-ins...'\n" "\n" "Sind Sie sicher, dass Sie %s als Back-end installieren wollen?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Hinweis: Möglicherweise ist eine andere kompatible Version für Ihre Thonny-Version verfügbar. Klicken Sie den '...'-Button um die zu installierende Version auszuwählen." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Thonny-Plugin ohne Anforderungen" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Ungeeignete Anforderungen" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Dieses Paket erfordert eine andere Version von Thonny:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Falls Sie das trotzdem möchten, dann benutzen Sie bitte die Kommandozeile." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Hinweis: Sie müssen Thonny nach der Installation / Aktualisierung / Deinstallation eines Plugins neu starten." #. or "Zusatzmodule", but I thin Plug-in is more clear. #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Thonny-Plugins" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Erweitertes Installieren / Aktualisierung / Downgrade" #. Ploosible "Gewünschte Version", if this is required by the User. If it's required by Thonny then "Verlangte Version" is better. #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Gewünschte Version" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Abhängigkeiten bei Aktualisierung" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Benötigt:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Fehler:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Verwalte Pakete ..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Verwalte Plug-ins ..." #. What means "replayer"? Is this a kind of Macro recorder to repeat actions? #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Logdatei schreiben..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Ändern Sie das Arbeitsverzeichnis in das Skriptverzeichnis unter \"Ausführen / Debuggen\"" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Funktionsaufrufe in separaten Fenstern (Frames) anzeigen" #. "traditional experience" not clear? Is this for the behaviour or for the look and feel (Layout)? #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Kontrollkästchen deaktivieren, falls klassisches Verhalten erwünscht." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Stack View automatisch öffnen und schließen" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Stack View beim ersten Aufruf öffnen und bei Programmreturn schließen um zum Hauptfenster zurückzukehren." #. In German, "d.h." has to periods. The English (well, Latin "i.e." frequently read as "that is") currently misses a period here. #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Wechseln in Bibliotheken erlauben (d.h. außerhalb des Hauptskriptverzeichnisses)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Kann das Debuggen verzögern." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Bevorzugter Debugger" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(wird beim Klicken auf die Schaltfläche Debuggen in der Symbolleiste verwendet)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(Nach dieser Änderung Thonny neu starten)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Ausführen & Debuggen" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminal-Emulation" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "Unterstützt basis ANSI-Farben und -Stile" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maximale Anzahl der Zeilen, die beibehalten werden sollen." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Hinweis: Große Werte können zu Geschwindigkeitsverlust führen!" #. " Maximale Zeilenlänge bis zum ???" what means squeezing? Is this a kind of shorten by folding ? #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximal angezeigte Zeichenlänge bis zum Verschieben" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Aktuelles Skript in Terminal ausführen" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Zeige Python REPL nach Programmende" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Nach Programmende Terminal geöffnet lassen" #. @Aivar A search in the English GUI of Thonny 4.0.1 (including Tools -> Options, and Tools -> Manage Plug-ins) was not successful to retrieve this string. May you provide a hint, please? #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Hinweis: Das automatische Schließen muss in den Einstellungen des Terminals aktiviert sein (" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "UI Theme" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Syntax Theme" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Schriftart im Editor" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Schriftart im Terminal" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Vorschau" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Das ist ein Kommentar" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "Die Antwort ist" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "offene_Zeichenfolge" #. Do you realy mean Blah Blah ??? :-) #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Hinweis: Einige Einstellungen ändern sich erst nach einem Neustart von Thonny!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Ganzzahl eingeben" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Theme & Schriftart" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Installationsverzeichnis von Thonny öffnen ..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Arbeitsverzeichnis von Thonny öffnen ..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Home" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Hilfe Inhalt" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPython device" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPython device" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Verbinden Sie Ihr Gerät mit dem Computer und wählen Sie den relevanten Port unten aus" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "Suchen Sie nach Ihrer Geräteschnittstelle \"USB Serial\" oder \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Falls Sie es nicht finden, müssen Sie möglicherweise erst den richtigen USB-Treiber installieren." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Versuche den Port automatisch zu erkennen" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (generic)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Drucken ..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "System Terminal öffnen ..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Details" #. (requirements.txt) #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installieren mit requirements Datei" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installieren mit lokalen Dateien" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "In diesem Fenster werden Thonny Plug-ins und Ihre Korrespondierenden Pakete verwaltet.\n" "Falls Sie Pakete für Ihre eigenen Programme installieren möchten, wählen Sie \"Extras → Pakete verwalten ...\"." #. This text is used twice. #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generic)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Ausgewählte Zeilen einrücken" #. evt. "Einzug verkleinern" vs "Einzug vergrößern" wie bei LibreOffice. #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Entferne in den ausgewählten Zeilen führende Leerzeichen" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Wechsle zu\n" "Standard\n" "Mode" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Stellen Sie sicher, dass MicroPython auf Ihrem micro: bit installiert ist." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Vergessen Sie nicht, dass main.py nur ohne eingebettetes Hauptskript funktioniert." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Konnte Laufwerk '%s' nicht finden. Möchten Sie das Laufwerk selbst suchen?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Es wurden mehrere '%s' Laufwerke gefunden. Möchten Sie selbst eines auswählen?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Geeignetes Laufwerk kann nicht gefunden werden" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d Elemente" #. same as recycle bin ? #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "In den Papierkorb verschieben" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Löschen" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Neuer Ordner" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Eigenschaften" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Speicherplatz" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Pfad" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Eigenschaften des Ordners" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Eigenschaften der Datei" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "Bytes" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Größe" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Geändert" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "%s löschen" #: thonny/editors.py:262 msgid "Loading" msgstr "wird geladen" #: thonny/editors.py:395 msgid "Saving" msgstr "speichern läuft" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Upload nach %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Download von %s nach %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Download nach %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Im Systemdateimanager öffnen" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Verborgene Dateien ausblenden" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Verborgene Dateien anzeigen" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Öffnen in Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Öffnen in der Systemstandard-App" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Konfiguriere %s Dateien" #. The suggested revision now reads more like «what action is associated with a double click in Thonny's file browser?» #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Wie soll mit einer %s Datei umgegangen werden, wenn Sie in Thonnys Dateibrowser darauf doppelklicken?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Löschen" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Erstelle ein Verzeichnis" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Lade %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Speichern nach %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Speicher alle Dateien" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Konfiguriere den Interpreter ..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Gerät" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Abbrechen" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Beginnen" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Authentifizierung" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Geben sie Ihren persönlichen Passwort-Satz für\n" "{} ein" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "geben Sie hier Ihr Passwort für\n" "{} ein" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Der angezeigte Wert ist ein Schätzwert dieser Gleitkommazahl. Der genaue gespeicherte Wert ist %s, was ungefähr %s entspricht" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Suchergebnisse" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Suchen" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Installiere '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Aktualisieren von '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Deinstalliere '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Installiere" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "für diesen Interpreter ist kein Package-Manager verfügbar" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Nicht unterstützt" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Nicht verfügbar" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Sie müssen ihr Programm stoppen, bevor Sie den Paketmanager starten." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Sehen Sie den Wert des Ausdruckes im Objekt-Inspektor" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Ausführbares Python-Programm" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Hinweis: Die Dateiauswahl funktioniert möglicherweise nicht richtig, wenn Programme aus einer virtuellen Umgebung heraus aufgerufen werden. In diesem Fall ist das 'activate' Script anstelle des Interpreters zu wählen (oder der Pfad direkt in der Eingabebox einzugeben)." #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Nichtlokales Python 3 (über SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Nicht verbunden" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (lokal)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython(über SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "es gibt kein lib-Verzeichnis im sys.pfad" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Suche im PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "In Thonnys Texteditor öffnen" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Speicherplatz auf diesem Laufwerk oder Dateisystem" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "Speicherplatz total" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "benutzter Speicherplatz" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "freier Speicherplatz" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Speicherinformation" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Ersetze Tabulatoren durch Leerzeichen" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Hebe Tabulatorzeichen hervor" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Einrücken mit Tab (für Python nicht empfohlen)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Name" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Größe (Bytes)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Bestimmen Sie einen Namen für ein neues Verzeichnis unter\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Nichts ausgewählt" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Wählen Sie ein Item und versuchen Sie es erneut!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Öffnen von %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Speichern nach %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Dateiname:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "ID-Wert" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Wert" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Passwort speichern" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Funktionsaufruf bei %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Lokale Variablen" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Funktion" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Ort" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Falls das letzte Kommando eine Exception (interrupt) ausgelöst hat, dann wird in diesem Fenster der zugehörige Stack gezeigt." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Daten" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attribute" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Index" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Schlüssel-ID" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Schlüssel" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Zurück nach\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Port oder WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Passwort" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Quellcode" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Benutzen Sie die TK-Dateiauswahl anstelle von Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Auswählen, falls Dialoge hinter dem Hauptfenster verschwinden" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Umgebungs-Variablen (jeweils eine pro Zeile)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Neue Datei" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Umbenennen" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Benenne '%s' um" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Neuen Namen eingeben" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Einfügen gescheitert" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Es gibt sich widersprechende Ordner" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Datei existiert bereits" #. In the English GUI (Thonny 4.0.1), I did not identify an entry in lines of Configure -> Files #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Wenn es eine Textdatei ist, kannst Du sie in Thonny öffnen, indem Du rechts klickst und 'Konfiguriere ... Dateien' wählst." #: thonny/editors.py:38 msgid "Python files" msgstr "Python-Dateien" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "Datei ist verschwunden" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Willst Du auch den Editor schließen?" #: thonny/editors.py:169 msgid "External modification" msgstr "Externe Veränderung" #. Gibt es eine Konvention hier, wie man den Nutzer anspricht? Du, du, Sie, sie? Ich bevorzuge 'Du', weil ich 'Sie' altmodisch finde und den Großbuchstaben respektvoller. Manche finden die Großschreibung altmodisch, für mich ist es der schönste Kompromiss. Aber ich bin ja auch schon alt (Boomer ;-) ). #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Wollen Sie den jetzigen Editor-Inhalt verwerfen und die Datei von der Platte neu laden?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Python-Dateien haben üblicherweise die Endung .py." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Meinten Sie '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Verschieben / Umbenennen von ..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Gehe zu Zeile ..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Zeilennummer" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Wollen Sie die Dateien vor dem Schließen speichern?" #. Suggestion for the English pattern: "Do you want to save the file before closing?" (additional "the") #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Wollen Sie die Datei vor dem Schließen speichern?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Beim Schließen speichern" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Befehl nicht verfügbar" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Dieser Befehl ist nicht unter Flatpack verfügbar" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Unterstützen Sie die Ukraine" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Welche Art von Interpreter soll Thonny zur Ausführung Deines Codes benutzen?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Zeige Parameter-Info" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Zeige automatisch Parameter-Info nach Eingabe von '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Biete beim Tippen Auto-Vervollständigen an" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Zeige automatisch Dokumentation für Vervollständigungen" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Autovervollständigen mit Tab im Editor" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Autovervollständigen mit Tab in der Shell" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problem" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Definition nicht gefunden" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Leere das Terminal-Fenster vor dem Start des neuen Prozesses (ausführen, debuggen, Stop/Restart, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Thonnys Python" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Beim Verbinden laufendes Programm unterbrechen" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Synchronisiere die Echtzeituhr des Geräts" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Benutze lokale Zeit in Echtzeituhr" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Vor Start des Skript Interpreter neu starten" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Das scheint kein Micro-/CircuitPython-Paket zu sein.\n" "Wollen Sie es wirklich installieren?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "In den Papierkorb verschieben" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "%s in den Papierkorb verschieben?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Verschiebe %s in den Papierkorb" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Öffne in externer Standard-App" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "Remote-Dateien können nicht in externer App geöffnet werden." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Wenn die Datei von einer externen App geöffnet werden muss, dann speichere sie in einem lokalen Verzeichnis und öffne sie von dort!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Anscheinend wurde '%s' gelöscht oder verschoben." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Anscheinend wurde '%s' außerhalb des Editors geändert." #. German "Hinweis:" is more gentle (such as "hint") than imperative verb with exclamation mark. #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "Hinweis: Thonny unterstützt nur Python %s und neuer" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Gehe zu Zeile" #: thonny/workbench.py:703 msgid "Support" msgstr "Unterstützung" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Konnte nicht gespeichert werden" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Warnung" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Wenn der Wert einer Umgebungsvariable in Anführungszeichen gesetzt wird, werden die Anführungszeichen Teil des Werts.\n" "War das beabsichtigt?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "MicroPython installieren" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "CircuitPython installieren" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Hochgeladene Shebang-Skripte ausführbar machen" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Gespeicherte Shebang-Skripte ausführbar machen" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Virtuelle Umgebung aktivieren" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Ziel" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Aktuelles Skript im Python Tutor visualisieren" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Zeile" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Keine mit #todo markierte Zeile gefunden" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "ToDo" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "%s installieren oder aktualisieren" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Lokales Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Es kann eine vorhandene virtuelle Umgebung auch über das Rechtsklick-Kontextmenü in der Dateinavigation aktiviert werden, wenn ein virtueller Umgebungsordner oder die darin enthaltene Datei 'pyveng.cfg' ausgewählt wird." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Vorbereitungen (überspringe den VS-Code-Teil)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Standard-Passwort" #: thonny/running.py:392 msgid "Information" msgstr "Information" #. Would it be old-fashioned to add a comma before "muss"? I would prefer it. #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Um den Programmfehler zu korrigieren muss das Program zuerst gespeichert werden." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s sieht nicht wie eine Textdatei aus" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problem beim Laden der Datei" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Es ist ein Problem mit der Eingabecodierung aufgetreten.\n" "\n" "Stellen Sie sicher, dass die Datei entweder UTF-8 konform ist, oder explizit auf die Eingabekodierung hinweist." #: thonny/editors.py:295 msgid "File is open" msgstr "Datei ist geöffnet" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Die Datei ist bereits von Thonny geöffnet.\n" "\n" "Wenn Sie sie unter diesem Namen speichern wollen,\n" "sollten Sie den Editor zuerst schließen!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Berechtigungsfehler" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Es sieht so aus, als ob diese Datei oder dieser Ordner nicht beschreibbar ist." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Das Back-end ist noch nicht bereit" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Wohin soll gespeichert werden?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Mögliches Problem" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Wenn Sie Ihr Skript '%s' nennen, sind Sie nicht in der Lage das Bibliotheksmodul '%s' zu importieren" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Möchtest du diesen Namen weiterhin für dein Skript verwenden?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Zugangsfehler beim Versuch %s zu laden" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Versuche, sie mit Datei => Öffnen zu öffnen." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Berechtigungsfehler" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Ausführung unbenannter Programme erlauben" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Lizenz" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Warne wenn ein benutzerdefiniertes Modul ein Bibliotheksmodul unzugänglich macht" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Suche micropython-lib und PyPI" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9334464 thonny-4.1.7/thonny/locale/el_GR/0000755000076600000240000000000014730055627017164 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.089881 thonny-4.1.7/thonny/locale/el_GR/LC_MESSAGES/0000755000076600000240000000000014730055627020751 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/el_GR/LC_MESSAGES/thonny.mo0000644000076600000240000013037514670256721022637 0ustar00aivarannamaastaffD lm]v$)*#N ]&j+-!D7c&      !x/  & %, @KZ;k     G4 9 K S <h % *  !(!E!I!N!T!i!!!3!! "!"("8" A"M"]"e"l""!" """ "B #L#R#W#f#{## ##%##/#$.2$a$ g$s$z$ $$ $$$$ $$$$$$%% !% .% 9%E%W%,%/"&=R& &&&&&0&& & '6'S'm'''''''''L'F=((CL)))7))))*)*H* c*q* ** ***3***+++5+D+I+ Q+\+l+ u+++n,z!-;---. .1#. U.v........ //"/,/0$0<U00-&1UT1c122 2n%2!2 2 2 2 22233?3CW333'3)3 &434B4_4z4444T4 5$5(505 55@5W5H_5O555.6B6K6Q6V6j66 66:666 7&7C7K7[7d7v7 7 7 777777 7B8I8N8 V8c8 y8&88 88 8 889 999 9 ,999L9 k9"y999 9 9 9 99 999 : :#: 9: D:O:2m:/:8: ;:;W; n;; ;0;;;; ; <<3<-9<g< p< z<< <<< < <)<<< ="=9=M=U=^= q=>=n=0->!^> >> ~??b1@@@@/@A@AB!B"1BTBcB iBBBB0B BB BB C!C$C,CACVC eCrC2C%CCC CCDDL$DDqDD FEQEiE{ECE#EE F FF F)F1.F%`F F%FVFIG YGeG uGGGG/ICIW;JnJWK ZK{K[K)Ks!LLJ$MoMcNYzN NNNO%(ONOWO*uO-OOP&P'P2QL7QPQQ-QR.!R:PRR NSoSS$SS SSS" T0TEPT&U$UUUV*VV.VW;WfWK_K_e_)C`Wm` `"` `aa %a2a(RaC{a aa!a b b)#b'Mb ubb?bb$bFc7_cbd_dnZeee)e f +f6ff'f,gKg6g=h)Uh:h0h hhi%i%p fp.sppppp#pq)q`>qqPSstiu-v%=v*cvvZvEwOJwwwwwxx=+x*ix(xxqz|{{@|o`}}~ F%π$!6Xm/BEĂJ eUl(AK^_W *b5Å҅Άކ. )6և}`!ވ$$5DZ2%҉F`f--Ë.% FY k"ό*/ߍ%))S\mʎ#C M'n%ˏۏ-#+<OV0Nc3x,ɑ#9Nm+֒I3KRc^W|m%yk<3)Brl,ߖ. ;Ja? Y̗ &3N ]j38ǘ!["~7!ǙB<, iw+~՚Th9=%$b('\:^of~BOAaVap#/ )02Z%ƧDt¨,BQ;{Sի$)9NIbuŭ[̭^(%G6'T-|,%װ%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: el Language-Team: el Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d στοιχεία(Σε αυτήν την περίπτωση, το back-end του Thonny χρησιμοποιεί τον ίδιο διερμηνευτή, επομένως και τα δύο παράθυρα διαχειρίζονται τα ίδια πακέτα.)(επανεκιννήστε το Thonny μετά από αυτήν την αλλαγή)(χρησιμοποιείται όταν κάνετε κλικ στο κουμπί Αποσφαλμάτωση)Ένα ειδικό εικονικό περιβάλλον (προς κατάργηση)Σχετικά με τo BirdseyeΣχετικά με το ThonnyΠροχωρημένη εγκατάσταση / αναβάθμιση / υποβάθμισηΠροχωρημένες επιλογέςΝα επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στο κέλυφοςΝα επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στον επεξεργαστή κειμένουΝα επιτρέπεται μόνο μία εκτέλεση του ThonnyΝα επιτρέπεται η μετάβαση σε βιβλιοθήκες (π.χ. εκτός του καταλόγου του κύριου προγράμματος)Εναλλακτικός διερμηνευτής Python 3 ή εικονικό περιβάλλονΕίσαι σίγουρος ότι θέλεις να το απεγκαταστήσεις;ΒοηθόςΧαρακτηριστικάΤαυτοποίησηΣυντάκτηςΑυτόματη συμπλήρωσηΠίσωΕπιστροφή στο %sΠίσω στο τρέχoν πλαίσιοΠροβληματικός κατάλογοςΤο Birdseye είναι ένας εκσφαλματωτής της Python που πρέπει να εγκατασταθεί ξεχωριστά. Θέλεις να ανοίξω τη σελίδα βοήθειας? Θύρα BirdseyeΠεριήγηση στα πακέταΑνιχνευτής σφαλμάτωνΔεν μπορεί να κλείσει ακόμηΔεν βρέθηκε το όνομα πακέτου από τη λίστα:Δεν είναι δυνατή η εύρεση κατάλληλου δίσκουΑκύρωσηΑκύρωση της διαδικασίας;ΑκύρωσηΔιάκριση πεζών-κεφαλαίωνΑλλαγή μεγέθους γραμματοσειράςΑλλαγή από τον τρέχοντα κατάλογο εργασίας στον κατάλογο του προγράμματος κατά την Eκτέλεση/ΑποσφαλμάτωσηCircuitPython (γενόσημο)Συσκευή CircuitPythonΚαθάρισμαΚαθάρισε το κέλυφοςΚάντε κλικΚλικ ΚλείσιμοΚλείσιμο όλωνΚλείσε τα υπόλοιπαΠροσθήκη σχολίουΟι ρυθμίσεις έχουν ενημερωθεί. Κάντε επανεκκίνηση του Thonny για να αρχίσετε να εργάζεστε σε κανονική λειτουργία. (Δείτε 'Εργαλεία → Επιλογές → Γενικά' αν αλλάξετε γνώμη αργότερα.)Διαμόρφωση %s αρχείωνΡύθμιση διερμηνέα...ΕπιβεβαίωσηΣυνδέστε τη συσκευή σας στον υπολογιστή και επιλέξτε την αντίστοιχη θύρα παρακάτωΑντιγραφήΑντιγραφή στο πρόχειροΑντιγραφήΑντιγραφή από   %s στο   %sΔεν ήταν δυνατή η εύρεση του δίσκου '%s'. Θέλετε να τον εντοπίσετε μόνοι σας;Αδυναμία εύρεσης πακέτου από PyPl.Δεν ήταν δυνατή η εύρεση των πληροφοριών πακέτου από PyPI.Δημιουργία νέου εικονικού περιβάλλοντοςΔημιουργία φακέλουΔημιουργία εικονικού περιβάλλοντοςΑποκοπήΔεδομέναΑποσφαλμάτωσηΑποσφαλμάτωση τρέχοντος προγράμματοςΑποσφαλμάτωση τρέχοντος προγράμματος (birdseye)Αποσφαλμάτωση τρέχοντος προγράμματος (ταχύτερη)Αποσφαλμάτωση τρέχοντος προγράμματος (καλύτερη)Λειτουργία εντοπισμού σφαλμάτων (παρέχει πιο λεπτομερή καταγραφή διαγνωστικών)Μείωση μεγέθους γραμματοσειράςΜείωση εσοχής επιλεγμένων γραμμώνΔιαγραφήΕπιλέχθηκε ΔιαγραφήΔιαγραφήΔιαγραφή %sΕπιθυμητή έκδοσηΛεπτομέρειεςΣυσκευήΙδιότητες καταλόγουΑπενεργοποίηση ηχητικών ειδοποιήσεωνΑπενεργοποιημένοι έλεγχοι (μία ταυτότητα ανά γραμμή)ΑποσύνδεσηΘέλετε να αντικαταστήσετε το '%s';Ενσωμάτωση παραθύρων χρήστηΒιβλιογραφίαΜην ξεχνάτε ότι το main.py λειτουργεί μόνο χωρίς ενσωματωμένο κύριο πρόγραμμα.Ολοκληρώθηκε!ΚάτωΜεταφόρτωση στο %sΛήψη του %s στο %sΕπεξεργασίαΕπεξεργαστής κειμένουΓραμματοσειρά επεξεργαστή κειμένουΕισάγετε έναν ακέραιο αριθμόΕισαγωγή ονόματος για νέο ευρετήριο υπό το %sΕισάγετε συμβολοσειρά για αντικατάστασηΕισαγωγή συνθηματικού για τα προσωπικο κλειδί για το {}Εισαγωγή κωδικού για {}Παράμετροι περιβάλλοντος (ένα KEY=VALUE ανά γραμμή) ΣφάλμαΚωδικός σφάλματος:Σφάλμα:ΓεγονόταΕξαίρεσηΈξοδοςΈξοδος από το ThonnyΕπέκτεινε στο ΚέλυφοςΕξαγωγή αρχείων καταγραφής χρήσης ...ΑρχείοΌνομα αρχείου:Ιδιότητες αρχείουΑρχείαΕύρεσηΕύρεση & ΑντικατάστασηΕύρεση πακέτου από PyPlΕύρεση:YλικολογισμικόΕστίαση στον επεξεργαστή κειμένουΕστίαση σεΕστίαση στο κέλυφοςΛειτουργία κλιμάκωσης γραμματοσειρώνΓια λόγους απόδοσης, το κέλυφος αποφεύγει να εμφανίζει πλήρως τις μεγάλες γραμμές (βλ. Εργαλεία=> Επιλογές=> Κέλυφος). Εδώ μπορείτε να αλληλεπιδράσετε με το αρχικό κειμένο.Για απεγκατάσταση να διαγραφούν τα αντίστοιχα αρχείαΓια αναβάθμιση απλώς να εγκατασταθεί ξανά το πακέτοΒρέθηκαν διάφοροι δίσκοι '%s'. Θέλετε να επιλέξετε έναν εσείς;Πλήρης οθόνηΣυνάρτησηΚλήση συνάρτησης στο %sΓενικάΣωρόςΗ λειτουργία Σωρού είναι ενεργοποιημένη. Κλείστε την προβολή Σωρού για να την απενεργοποιήσετε.ΒοήθειαΠεριεχόμενα ΒοήθειαςΑπόκρυψη κρυφών αρχείωνΕπισήμανε την τρέχουσα γραμμή (απαιτεί εκ νέου άνοιγμα του επεξεργαστή κειμένου)Επισήμανε τοπικές μεταβλητέςΕπισήμανε ονόματα που ταιριάζουνΕπισήμανε παρανθέσειςΕπισήμανε στοιχεία συντακτικούΕπισήμανση στηλοθετών (tabs)ΑρχικήΑρχική σελίδαΤαυτότηταΕΓΚΑΤΑΣΤΑΣΗΓραμματοσειρά Ε/Ε (IO)Αν η τελευταία εντολή δημιούργησε εξαίρεση, τότε αυτή η προβολή θα δείξει πληροφορίες στοίβας (stacktrace)Αν δεν μπορείτε να το βρείτε, ίσως χρειαστεί να εγκαταστήσετε πρώτα τον κατάλληλο οδηγό USB.Εάν δεν γνωρίζετε από πού να κατεβάσετε το πακέτο, τότε κατά πάσα πιθανότητα πρέπει να κάνετε αναζήτηση στον κατάλογο πακέτων Python. Ξεκινήστε εισάγοντας το όνομα του πακέτου στο πλαίσιο αναζήτησης παραπάνω και πατώντας ENTER.Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών.Αύξηση μεγέθους γραμματοσειράςΑύξηση εσοχής επιλεγμένων γραμμώνΕσοχές με στηλοθέτες (tabs) (δεν συνίσταται για την Python)ΕυρετήριοΕγκατάστασηΕγκατάσταση από PyPIΕγκατάσταση από τοπικό αρχείοΕγκατάσταση από το αρχείο προδιαγραφώνΕγκατάσταση ή ενημέρωση υλικολογισμικούΕγκαταστήθηκε σε:Εγκατεστημένη έκδοση:ΕγκατάστασηΕγκατάσταση ‘%s’ΔιερμηνευτήςΔιακοπή εκτέλεσηςΠρόςΔιατήρησε το τερματικό ανοικτό μετά την ολοκλήρωση της διεργασίας PythonΚλειδίΤαυτότητα κλειδιούΓνωστοί διερμηνευτέςΓλώσσαΤελευταία σταθερή έκδοσηΤελευταία έκδοσηΦόρτωσηΦόρτωσηΦόρτωση %sΤοπικές μεταβλητέςΤοποθεσίαΤοποθεσία: Καταγραφή συμβάντων κατά την χρήση του προγράμματοςΦαίνεται ότι εγκαθιστάτε ένα πακέτο που σχετίζεται με το Thonny. Εάν σκοπεύατε να εγκαταστήσετε ένα πρόσθετο στο Thonny, τότε θα έπρεπε να επιλέξτε "Εργαλεία → Διαχείριση πρόσθετων ..." Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε το %s για το back-end;Φαίνεται ότι προσπαθείτε να εγκαταστήσετε ένα ξεπερασμένο πρόσθετο του Thonny (δεν καθορίζει την απαιτούμενη έκδοση Thonny). Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών.Δημιουργήθηκε στο Πανεπιστήμιο Tartu της Εσθονίας με την βοήθεια της κοινότητας λογισμικού ανοιχτού κώδικα, του Raspberry Pi Foundation και της Cybernetica ASΒεβαιωθείτε ότι το MicroPython έχει εγκατασταθεί στο micro:bit σας.Διαχείριση πακέτων για %sΔιαχείριση πακέτων..Διαχείριση προσθέτων...ΜεγιστοποίησηΜέγιστο μήκος τμήματων γραμμής πριν την συμπίεσηΜέγιστος αριθμός διατηρητέων γραμμώνΜπορεί να κάνει την αποσφαλμάτωση πιο αργή.MicroPython (SSH)MicroPython (γενόσημο)MicroPython (τοπική)Συσκευή MicroPythonΤροποποιήθηκεΕνότηταΜετακίνηση στον Κάδο ΑνακύκλωσηςΜετακίνηση στα ΆχρησταΜετακίνηση του %s στο %sΣημείωση! Το κουμπί επιλογής αρχείου μπορεί να μην λειτουργεί σωστά όταν επιλέγονται εκτελέσιμα από εικονικό περιβάλλον. Σε αυτή την περίπτωση να επιλεγεί το σενάριο "ενεργοποίησης" (activate script) αντί για το διερμηνέα (η καταχώρησε το μονοπάτι απευθείας στο πεδίο)! Υπενθύμιση! Μεγάλες τιμές μπορεί να προκαλέσουν αργή απόδοση!Yπενθύμιση! Επανεκκινήστε το Thonny μετά την αλλαγή αυτών των επιλογών!Υπενθύμιση! Ορισμένα στοιχεία στυλ αλλάζουν μόνο μετά την επανεκκίνηση του Thonny!Υπενθύμιση! Μπορεί να υπάρχει άλλη διαθέσιμη έκδοση που είναι συμβατή με την τρέχουσα έκδοση του Thonny. Κάντε κλικ στο κουμπί '...' για να επιλέξετε την έκδοση που θα εγκατασταθεί.Υπενθύμιση! Το Thonny υποστηρίζει μόνο Python 3.5 και νεότερη έκδοσηΥπενθύμιση! Πρέπει να κάνετε επανεκκίνηση του Thonny μετά την εγκατάσταση / αναβάθμιση / κατάργηση της εγκατάστασης ενός πρόσθετου.Σημείωση! Το micropython.org έχει δημοσιεύσει την έκδοση %s αυτού του πακέτου και αυτό θα εγκατασταθεί από προεπιλογή.ΌνομαΝέοΝέος κατάλογοςΝέα πακέτα θα εγκατασταθούν επίσης σε αυτόν τον κατάλογο. Οι άλλες τοποθεσίεςα διαχειρίζονται με εναλλακτικά μέσα.Τα Νέα πακέτα θα εγκατασταθούν στο/στηΕπόμενο αντικείμενοΔεν διατίθεταιΔεν υπάρχει σύνδεσηΔεν υποστηρίζεταιΣημειώσειςΚαμία επιλογήOKΕπιθεωρητής αντικειμένουΆνοιγμα του Βοηθού αυτόματα όταν υπάρχουν προειδοποιήσεις για τον κώδικαΆνοιγμα του Βοηθού αυτόματα όταν το πρόγραμμα τερματιστεί με εξαίρεσηΆνοιξε τον φάκελο δεδομένων του Thonny ...Άνοιξε τον φάκελο προγραμμάτων του Thonny...Αυτόματο άνοιγμα και κλείσιμο της προβολής της ΣτοίβαςΆνοιξε τις εκτιμημένες τιμές στον επιθεωρητή ΑντικειμένουΆνοιγμα από %sΆνοιγμα στο ThonnyΆνοιγμα στο επεξεργαστή κειμένου του ThonnyΆνοιγμα στην προεπιλεγμένη εφαρμογή του συστήματοςΆνοιγμα στο διαχειριστή αρχείων του συστήματοςΆνοιγμα αναπαραγωγής...Άνοιξε το κέλυφος συστήματοςΆνοιγμαΑνοίγει την προβολή στοίβας κατά την πρώτη κλήση και κλείνει όταν το πρόγραμμα επιστρέψει στο κυρίως πλαίσιο.Επιλογές...ΈξωΠεριεχόμεναπάνω απόΑντικατάσταση;Αντικατάσταση θέματος '%s'ΠακέτοΤο πακέτο '{}' είναι απαραίτητο για την εγκατάσταση και την απεγκατάσταση άλλων πακέτων.Το πακέτο δεν είναι διαθέσιμο στο micropython.org. Θα εγκατασταθεί η έκδοση στο PyPI.Ο διαχειριστής πακέτων δεν είναι διαθέσιμος για αυτόν τον διερμηνέαΚατάλογος πακέτωνΚωδικόςΕπικόλλησηΜονοπάτιΕκτέλεση ελέγχων MyPyΕκτέλεση των επιλεγμένων ελέγχων PylintΕλέγξτε την ορθογραφία σας!Παρακαλώ περιμένετεΣχεδιογράφοςΟ σχεδιαστής απεικονίζει μια σειρά από αριθμούς που εκτυπώνονται στο κέλυφος.ΘύραΘύρα η WebREPLΠροτιμώμενο πρόγραμμα αποσφαλμάτωσηςΠαρουσίαση του Python REPL μετά το τέλος του προγράμματοςΠροεπισκόπησηΠροηγούμενο αντικείμενοΕκτύπωση...Παράμετροι προγράμματοςΠαράμετροι προγράμματος:Δέντρο ΠρογράμματοςΙδιότητεςΣελίδα PyPlΛειτουργία Pygame ZeroΕκτελέσιμο της pythonΔιερμηνευτές PythonΤερματισμόςΣίγουρα απεγκατάσταση;Πρόσφατα αρχείαΣυνιστώμενο μέγιστο μήκος γραμμής (Ρυθμίστε στο 0 για να απενεργοποιήσετε τη γραμμή περιθωρίου)ΕπανάληψηΑνανέωσηΚανονική λειτουργίαΑπομακρυσμένη Python 2 (SSH)Μετονομασία...Άνοιγμα όλων των αρχείων από προηγούμενη συνεδρίαΑντικατάστασηΑντικατάσταση όλωνΑντικατάσταση στηλοθετών(tabs) με κενάΑντικατάσταση με:Αντικαταστάση+ΕύρεσηΑναφορά προβλήματοςΑπαιτείΑπαιτεί:ΣυνέχειαΕκτέλεσηΕκτέλεση & ΑποσφαλμάτωσηΕκτέλεση / ΣυνέχειαΕκτέλεση τρέχοντος προγράμματοςΕκτέλεση τρέχοντος προγράμματος στο τερματικόEκτέλεση μέχρι τον κέρσοραΤρέχον εκτελέσιμο πρόγραμμα στο τερματικόΑποθήκευσηΑποθήκευση Όλων των αρχείωνΑποθήκευση ως...Αποθήκευση αντιγράφου...Αποθήκευση κωδικούΑποθήκευση στο %sΑποθήκευσηΑποθήκευση στο %sΠεδίο εφαρμογήςΑναζήτηση στο PyPIΑναζήτησε αποτελέσματαΑναζήτησηΑνατρέξτε στη Βοήθεια για λεπτομέρειες.Επιλογή ΌλωνΕπιλογή όλωνΕπέλεξε ένα αντικείμενο και προσπάθησε ξανά!Επιλέξτε κενό κατάλογο για νέο εικονικό περιβάλλονΕπιλογή υπάρχοντος ή δημιουργία νέου καταλόγουΕπέλεξε αν ο διάλογος αρχείου καταλήγει πίσω από το κυρίως παράθυροΕπιλογή διερμηνευτήΟ επιλεγμένος κατάλογος δεν είναι κενός. Επιλέξτε άλλο ή ακυρώστε.Αποστολή Τέλους Αρχείου (EOF) / Επανεκκίνηση μέσω λογισμικούΣκιασμένα στοιχεία (με εισακτέα):ΚέλυφοςΕμφάνιση σχεδιογράφουΕμφάνιση κλήσεων συναρτήσεων (πλαισίων) σε ξεχωριστά παράθυραΕμφάνιση κρυφών αρχείωνΕμφάνιση αριθμού γραμμώνΜεγέθοςΜέγεθος (bytes)Πηγαίος κώδικαςΣυμπιεσμένο κείμενο (%d χαρακτήρες)ΣτοίβαΞεκινήστε επιλέγοντας το πακέτο από τα αριστερά.ΈναρξηΟπισθοδρόμησηΕίσοδοςΈξοδοςΠροσπέραση ΣταμάτημαΣταμάτημα/Επανεκκίνηση backendΠληροφορίες μέσων αποθήκευσηςΧώρος αποθήκευσηςΜέσα αποθήκευσης στον οδηγό ή στο σύστημα αρχείωνΠερίληψηΑλλαγή σε κανονική λειτουργίαΘεματικό σύνταξηςΣτόχευσε την τοποθεσία της συσκευήςΣτόχευσε το μοντέλο της συσκευήςΣτόχος:ΤερματικόΠροσομοίωση τερματικούΗ απάντηση είναιΗ διεργασία είναι σε εξέλιξη. Είσαι σίγουρος ότι θέλεις να ακυρώσεις;Η παραπάνω αναπαράσταση είναι μια κατά προσέγγιση τιμή αυτού του float. Η ακριβής αποθηκευμένη τιμή είναι %s που είναι περίπου %sΤον ίδιο διερμηνευτή που χρησιμοποιεί τοThonny (προεπιλογή)Το ζητούμενο κειμενο δεν βρέθηκε!Θέμα & ΓραμματοσειράΑυτό το πλαίσιο προορίζεται για τις σημειώσεις εργασίας σας - οδηγίες , αποσπάσματα κώδικα, οτιδήποτε άλλο. Όλα θα αποθηκευτούν αυτόματα και θα φορτωθούν όταν ανοίξετε το Thonny την επόμενη φορά. Διαγράψτε ελεύθερα αυτό το κείμενο για να δημιουργήσετε χώρο για τις σημειώσεις σας.Αυτός ο υπολογιστήςΑυτός ο διάλογος είναι για τη διαχείριση των πρόσθετων του Thonny και των εξαρτήσεων τους. Αν θέλετε να εγκαταστήσετε πακέτα για τα δικά σας προγράμματα, επιλέξτε "Εργαλεία → Διαχείριση πακέτων ..."Αυτό το παράθυρο διαλόγου εμφανίζει όλα τα διαθέσιμα πακέτα, αλλά επιτρέπει την αναβάθμιση και την απεγκατάσταση μόνο των πακέτων απόΑυτός ο διάλογος αναγράφει τις κορυφαίες ενότητες από τα ακόλουθα ευρετήρια: Αυτό είναι ένα σχόλιοΑυτό το πακέτο απαιτεί διαφορετική έκδοση του Thonny:Αυτό το πρόγραμμα δεν παρέχει ΑΠΟΛΥΤΩΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ! Είναι ελεύθερο λογισμικό και είστε ευπρόσδεκτοι να το αναδιανείμετε υπό ορισμένες προϋποθέσεις, βλ https://opensource.org/licenses/MIT για λεπτομέρειεςΑυτό το εικονικό περιβάλλον συντηρείται αυτόματα από το Thonny.Επιλογές ThonnyΠρόσθετα του ThonnyΠρόσθετο του Thonny χωρίς προδιαγραφέςΕναλλαγή σχολίουΕργαλείαΠροσπαθήστε να εντοπίσετε αυτόματα τη θύραΛειτουργία περιβάλλοντος χρήστη (UI)Παράγοντας κλιμάκωσης περιβάλλοντος χρήστη (UI)Θεματικό UIΑποεπιλέξτε εάν θέλετε μια πιο παραδοσιακή εμπειρία.Αφαίρεση σχολίουΑναίρεσηΑπεγκατάστασηΑπεγκατάσταση ‘%s’Ακατάλληλες προδιαγραφέςΕπάνωΑναβάθμισηΑναβάθμιση εξαρτήσεωνΑναβάθμιση ή απεγκατάστασηΑναβάθμιση ‘%s’Ανέβασμα στο %sΑνέβασμα του %s στο %sΧρησιμοποίηστε την εντολή "Stop" αν θέλετε να σταματήσετε την αποσφαλμάτωσηΧρήση διαλόγων αρχείου Tk αντί για ZenityΤιμήΤαυτότητα τιμήςΜεταβλητέςΙστορικό έκδοσηςΈκδοση προς εγκατάστασηΠροβολήΤι να κάνω με ένα %s αρχείο όταν γίνεται διπλό κλικ στον προβολέα αρχείων του Thonny?Ποιον διερμηνευτή ή συσκευή να χρησιμοποιήσει το Thonny για να τρέξει τον κώδικά σου;Με τον τρέχοντα διερμηνευή μπορείτε μόνο να περιηγηθείτε στα πακέτα. Μεταβείτε σε: 'Εργαλεία → Άνοιξε το κέλυφος συστήματος ...' για εγκατάσταση, αναβάθμιση ή απεγκατάσταση.Επεξεργάζεται...Αναδίπλωση κειμένου (ενδέχεται να είναι αργή)Πρέπει να εισέλθετεΠρέπει να επιλέξετε ενα αρχείο!Πρέπει να σταματήσει το πρόγραμμά σου πριν την έναρξη του διαχειριστή πακέτωνΟ διερμηνευτής σας δεν είναι στην λίστα;Μεγέθυνσηόλα τα αρχείαΜπλα, μπλαbytesελεύθερος χώροςΕδώαναζητήστε το όνομα της συσκευής σας, "USB Serial" ή "UART"δεν υπάρχει απόλυτη βιβλιοθήκη ευρετηρίου στο sys.pathΠαρακαλώ περιμένετευποστηρίζει βασικά χρώματα ANSI και στυλγια να εντοπίσετε και να εγκαταστήσετε το πακέτου(συνήθως με επέκταση .whl, .tar.gz ή .zip).για να εντοπίσετε το αρχείο requirements.txt και να εγκαταστήσετε τα πακέτα που ορίζονται από αυτό.συνολικός χώροςανοιχτή_συμβολοσειράχρησιμοποιούμενος χώροςπακέτα ιστότοπου χρήστηεικονικό περιβάλλον././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/el_GR/LC_MESSAGES/thonny.po0000644000076600000240000017605214417536743022650 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: el\n" #: thonny/workbench.py:357 msgid "File" msgstr "Αρχείο" #: thonny/workbench.py:358 msgid "Edit" msgstr "Επεξεργασία" #: thonny/workbench.py:359 msgid "View" msgstr "Προβολή" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "Εκτέλεση" #: thonny/workbench.py:361 msgid "Tools" msgstr "Εργαλεία" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "Βοήθεια" #. Ίσως ο διερμηνευτής να πρέπει να μείνει inerpreter σε παρένθεση #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "Εναλλακτικός διερμηνευτής Python 3 ή εικονικό περιβάλλον" #. Η έννοια του deprecated έχει να κάνει με στοιχεία / λειτουργικότητες που βαίνουν προς κατάργηση στις επόμενες εκδόσεις #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "Ένα ειδικό εικονικό περιβάλλον (προς κατάργηση)" #: thonny/workbench.py:582 msgid "Exit" msgstr "Έξοδος" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "Μείωση μεγέθους γραμματοσειράς" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "Εστίαση στον επεξεργαστή κειμένου" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "Εστίαση στο κέλυφος" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "Μεγιστοποίηση" #: thonny/workbench.py:653 msgid "Full screen" msgstr "Πλήρης οθόνη" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "Παράμετροι προγράμματος" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "Σχετικά με το Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Δημιουργήθηκε\n" "στο Πανεπιστήμιο Tartu της Εσθονίας\n" "με την βοήθεια της κοινότητας λογισμικού ανοιχτού κώδικα,\n" "του Raspberry Pi Foundation \n" "και της Cybernetica AS" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Αυτό το πρόγραμμα δεν παρέχει\n" "ΑΠΟΛΥΤΩΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ!\n" "Είναι ελεύθερο λογισμικό και είστε ευπρόσδεκτοι\n" "να το αναδιανείμετε υπό ορισμένες προϋποθέσεις, βλ\n" "https://opensource.org/licenses/MIT\n" "για λεπτομέρειες" #: thonny/plugins/about.py:152 msgid "Version history" msgstr "Ιστορικό έκδοσης" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "Αναφορά προβλήματος" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Άνοιγμα του Βοηθού αυτόματα όταν το πρόγραμμα τερματιστεί με εξαίρεση" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Άνοιγμα του Βοηθού αυτόματα όταν υπάρχουν προειδοποιήσεις για τον κώδικα" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Εκτέλεση των επιλεγμένων ελέγχων Pylint" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Εκτέλεση ελέγχων MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Απενεργοποιημένοι έλεγχοι (μία ταυτότητα ανά γραμμή)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "Βοηθός" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "Αυτόματη συμπλήρωση" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "Ποιον διερμηνευτή ή συσκευή να χρησιμοποιήσει το Thonny για να τρέξει τον κώδικά σου;" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "Διερμηνευτής" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "Σχετικά με τo Birdseye" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Το Birdseye είναι ένας εκσφαλματωτής της Python που πρέπει να εγκατασταθεί ξεχωριστά.\n" "Θέλεις να ανοίξω τη σελίδα βοήθειας? " #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Εναλλαγή σχολίου" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Προσθήκη σχολίου" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Αφαίρεση σχολίου" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Αναίρεση" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Επανάληψη" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "Αποκοπή" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "Αντιγραφή" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "Επικόλληση" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Επιλογή όλων" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "Eκτέλεση μέχρι τον κέρσορα" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "Δεν μπορεί να κλείσει ακόμη" #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Χρησιμοποίηστε την εντολή \"Stop\" αν θέλετε να σταματήσετε την αποσφαλμάτωση" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ενσωμάτωση παραθύρων χρήστη" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "Επισήμανε ονόματα που ταιριάζουν" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "Επισήμανε τοπικές μεταβλητές" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "Επισήμανε παρανθέσεις" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "Επισήμανε στοιχεία συντακτικού" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "Επισήμανε την τρέχουσα γραμμή (απαιτεί εκ νέου άνοιγμα του επεξεργαστή κειμένου)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "Να επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στον επεξεργαστή κειμένου" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "Να επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στο κέλυφος" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "Εμφάνιση αριθμού γραμμών" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Συνιστώμενο μέγιστο μήκος γραμμής\n" "(Ρυθμίστε στο 0 για να απενεργοποιήσετε τη γραμμή περιθωρίου)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "Επεξεργαστής κειμένου" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "Εξαγωγή αρχείων καταγραφής χρήσης ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Γεγονότα" #: thonny/plugins/files.py:551 msgid "Files" msgstr "Αρχεία" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "Εύρεση & Αντικατάσταση" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "Εύρεση:" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "Αντικατάσταση με:" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "Διάκριση πεζών-κεφαλαίων" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "Επάνω" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "Κάτω" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "Εύρεση" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "Αντικατάσταση" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "Αντικαταστάση+Εύρεση" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "Αντικατάσταση όλων" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "Εισάγετε συμβολοσειρά για αντικατάσταση" #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "Το ζητούμενο κειμενο δεν βρέθηκε!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Να επιτρέπεται μόνο μία εκτέλεση του Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Άνοιγμα όλων των αρχείων από προηγούμενη συνεδρία" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Απενεργοποίηση ηχητικών ειδοποιήσεων" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Λειτουργία κλιμάκωσης γραμματοσειρών" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Η λειτουργία Σωρού είναι ενεργοποιημένη.\n" "Κλείστε την προβολή Σωρού για να την απενεργοποιήσετε." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Σωρός" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Γλώσσα" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Αυτό το πλαίσιο προορίζεται για τις σημειώσεις εργασίας σας - οδηγίες , αποσπάσματα κώδικα, οτιδήποτε άλλο.\n" "\n" "Όλα θα αποθηκευτούν αυτόματα και θα φορτωθούν όταν ανοίξετε το Thonny την επόμενη φορά.\n" "\n" "Διαγράψτε ελεύθερα αυτό το κείμενο για να δημιουργήσετε χώρο για τις σημειώσεις σας." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Σημειώσεις" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "Προηγούμενο αντικείμενο" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "Επόμενο αντικείμενο" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "Επιθεωρητής αντικειμένου" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "Περιεχόμενα" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Λειτουργία Pygame Zero" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "Εύρεση πακέτου από PyPl" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "Απεγκατάσταση" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "Κλείσιμο" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "Κλικ " #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "Εδώ" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "Αναβάθμιση" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "Εγκατάσταση" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "Αδυναμία εύρεσης πακέτου από PyPl." #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "Τελευταία σταθερή έκδοση" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "Τελευταία έκδοση" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "Περίληψη" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "Συντάκτης" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "Αρχική σελίδα" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "Ανιχνευτής σφαλμάτων" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "Βιβλιογραφία" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "Σελίδα PyPl" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "Απαιτεί" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "Σίγουρα απεγκατάσταση;" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "Είσαι σίγουρος ότι θέλεις να το απεγκαταστήσεις;" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "Πίσω στο τρέχoν πλαίσιο" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "Μεταβλητές" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "Αυτός ο υπολογιστής" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "Ανανέωση" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "Εστίαση σε" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "Σφάλμα" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "Πρέπει να επιλέξετε ενα αρχείο!" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "Αντικατάσταση;" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "Θέλετε να αντικαταστήσετε το '%s';" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "Νέο" #: thonny/editors.py:565 msgid "Open..." msgstr "Άνοιγμα" #: thonny/editors.py:567 msgid "Load" msgstr "Φόρτωση" #: thonny/editors.py:576 msgid "Recent files" msgstr "Πρόσφατα αρχεία" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "Κλείσιμο όλων" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "Αποθήκευση" #: thonny/editors.py:633 msgid "Save as..." msgstr "Αποθήκευση ως..." #: thonny/editors.py:644 msgid "Save copy..." msgstr "Αποθήκευση αντιγράφου..." #: thonny/editors.py:653 msgid "Rename..." msgstr "Μετονομασία..." #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "Επιλογές Thonny" #: thonny/running.py:121 msgid "Run current script" msgstr "Εκτέλεση τρέχοντος προγράμματος" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "Εκτέλεση τρέχοντος προγράμματος στο τερματικό" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "Σταμάτημα/Επανεκκίνηση backend" #: thonny/running.py:166 msgid "Stop" msgstr "Σταμάτημα" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "Διακοπή εκτέλεσης" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "Αποστολή Τέλους Αρχείου (EOF) / Επανεκκίνηση μέσω λογισμικού" #: thonny/running.py:201 msgid "Disconnect" msgstr "Αποσύνδεση" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "Γνωστοί διερμηνευτές" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "Ο διερμηνευτής σας δεν είναι στην λίστα;" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "Υπενθύμιση! Το Thonny υποστηρίζει μόνο Python 3.5 και νεότερη έκδοση" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "Δημιουργία νέου εικονικού περιβάλλοντος" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "Επιλογή υπάρχοντος ή δημιουργία νέου καταλόγου" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "Διερμηνευτές Python" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "όλα τα αρχεία" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "Επιλέξτε κενό κατάλογο για νέο εικονικό περιβάλλον" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "Προβληματικός κατάλογος" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Ο επιλεγμένος κατάλογος δεν είναι κενός.\n" "Επιλέξτε άλλο ή ακυρώστε." #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "Δημιουργία εικονικού περιβάλλοντος" #: thonny/shell.py:83 msgid "Clear shell" msgstr "Καθάρισε το κέλυφος" #: thonny/shell.py:138 msgid "Plotter" msgstr "Σχεδιογράφος" #: thonny/shell.py:269 msgid "Clear" msgstr "Καθάρισμα" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "Εμφάνιση σχεδιογράφου" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Για λόγους απόδοσης, το κέλυφος αποφεύγει να εμφανίζει πλήρως τις μεγάλες γραμμές (βλ. Εργαλεία=> Επιλογές=> Κέλυφος).\n" "Εδώ μπορείτε να αλληλεπιδράσετε με το αρχικό κειμένο." #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "Αναδίπλωση κειμένου (ενδέχεται να είναι αργή)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "Επέκτεινε στο Κέλυφος" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "Συμπιεσμένο κείμενο (%d χαρακτήρες)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Ο σχεδιαστής απεικονίζει μια σειρά από\n" "αριθμούς που εκτυπώνονται στο κέλυφος." #: thonny/shell.py:1796 msgid "See Help for details." msgstr "Ανατρέξτε στη Βοήθεια για λεπτομέρειες." #: thonny/ui_utils.py:449 msgid "Close others" msgstr "Κλείσε τα υπόλοιπα" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "Αντιγραφή" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Αντιγραφή από\n" "  %s\n" "στο\n" "  %s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "Ακύρωση" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "Ακύρωση της διαδικασίας;" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "Η διεργασία είναι σε εξέλιξη.\n" "Είσαι σίγουρος ότι θέλεις να ακυρώσεις;" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "Επιλογή Όλων" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "Κέλυφος" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "Τον ίδιο διερμηνευτή που χρησιμοποιεί τοThonny (προεπιλογή)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "Αυτό το εικονικό περιβάλλον συντηρείται αυτόματα από το Thonny." #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "Τοποθεσία: " #: thonny/workbench.py:592 msgid "Options..." msgstr "Επιλογές..." #: thonny/workbench.py:599 msgid "Increase font size" msgstr "Αύξηση μεγέθους γραμματοσειράς" #: thonny/workbench.py:664 msgid "Change font size" msgstr "Αλλαγή μεγέθους γραμματοσειράς" #: thonny/workbench.py:665 msgid "Zoom" msgstr "Μεγέθυνση" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "Έξοδος από το Thonny" #: thonny/workbench.py:677 msgid "Quit" msgstr "Τερματισμός" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "Αντικατάσταση θέματος '%s'" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "Παράμετροι προγράμματος:" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "Κανονική λειτουργία" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Οι ρυθμίσεις έχουν ενημερωθεί. Κάντε επανεκκίνηση του Thonny για να αρχίσετε να εργάζεστε σε κανονική λειτουργία.\n" "\n" "(Δείτε 'Εργαλεία → Επιλογές → Γενικά' αν αλλάξετε γνώμη αργότερα.)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "Δέντρο Προγράμματος" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "Επιλογή διερμηνευτή" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "Συνέχεια" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "Εκτέλεση / Συνέχεια" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "Αποσφαλμάτωση" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (καλύτερη)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (ταχύτερη)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "Προσπέραση\n" "" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "πάνω από" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "Είσοδος" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "Πρός" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "Έξοδος" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "Έξω" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "Οπισθοδρόμηση" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "Πίσω" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "Στοίβα" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "Εξαίρεση" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Καταγραφή συμβάντων κατά την χρήση του προγράμματος" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Λειτουργία εντοπισμού σφαλμάτων (παρέχει πιο λεπτομερή καταγραφή διαγνωστικών)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Λειτουργία περιβάλλοντος χρήστη (UI)" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Παράγοντας κλιμάκωσης περιβάλλοντος χρήστη (UI)" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "Yπενθύμιση! Επανεκκινήστε το Thonny μετά την αλλαγή αυτών των επιλογών!" #. αλλαγή 1/11 #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "Γενικά" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "ΕΓΚΑΤΑΣΤΑΣΗ" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "Περιήγηση στα πακέτα" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Με τον τρέχοντα διερμηνευή μπορείτε μόνο να περιηγηθείτε στα πακέτα.\n" "Μεταβείτε σε: 'Εργαλεία → Άνοιξε το κέλυφος συστήματος ...' για εγκατάσταση, αναβάθμιση ή απεγκατάσταση." #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "Κατάλογος πακέτων" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "Εγκατάσταση από PyPI" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Εάν δεν γνωρίζετε από πού να κατεβάσετε το πακέτο, τότε κατά πάσα πιθανότητα πρέπει να κάνετε αναζήτηση στον κατάλογο πακέτων Python. Ξεκινήστε εισάγοντας το όνομα του πακέτου στο πλαίσιο αναζήτησης παραπάνω και πατώντας ENTER." #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "για να εντοπίσετε το αρχείο requirements.txt και να εγκαταστήσετε τα πακέτα που ορίζονται από αυτό." #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "Κάντε κλικ" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "για να εντοπίσετε και να εγκαταστήσετε το πακέτου(συνήθως με επέκταση .whl, .tar.gz ή .zip)." #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "Αναβάθμιση ή απεγκατάσταση" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "Ξεκινήστε επιλέγοντας το πακέτο από τα αριστερά." #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "Στόχος:" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "εικονικό περιβάλλον" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "πακέτα ιστότοπου χρήστη" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Αυτό το παράθυρο διαλόγου εμφανίζει όλα τα διαθέσιμα πακέτα, αλλά επιτρέπει την αναβάθμιση και την απεγκατάσταση μόνο των πακέτων από" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Νέα πακέτα θα εγκατασταθούν επίσης σε αυτόν τον κατάλογο. Οι άλλες τοποθεσίεςα διαχειρίζονται με εναλλακτικά μέσα." #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "Εγκατεστημένη έκδοση:" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "Εγκαταστήθηκε σε:" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "Ελέγξτε την ορθογραφία σας!" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "Πρέπει να εισέλθετε" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "Δεν ήταν δυνατή η εύρεση των πληροφοριών πακέτου από PyPI." #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "Κωδικός σφάλματος:" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "Δεν βρέθηκε το όνομα πακέτου από τη λίστα:" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Το πακέτο '{}' είναι απαραίτητο για την εγκατάσταση και την απεγκατάσταση άλλων πακέτων." #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "Πακέτο" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "Διαχείριση πακέτων για %s" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "Επιβεβαίωση" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Φαίνεται ότι εγκαθιστάτε ένα πακέτο που σχετίζεται με το Thonny.\n" "Εάν σκοπεύατε να εγκαταστήσετε ένα πρόσθετο στο Thonny, τότε \n" "θα έπρεπε να επιλέξτε \"Εργαλεία → Διαχείριση πρόσθετων ...\"\n" "\n" "Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε το %s για το back-end;" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Υπενθύμιση! Μπορεί να υπάρχει άλλη διαθέσιμη έκδοση που είναι συμβατή με την τρέχουσα έκδοση του Thonny. Κάντε κλικ στο κουμπί '...' για να επιλέξετε την έκδοση που θα εγκατασταθεί." #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "Πρόσθετο του Thonny χωρίς προδιαγραφές" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "Φαίνεται ότι προσπαθείτε να εγκαταστήσετε ένα ξεπερασμένο πρόσθετο\n" "του Thonny (δεν καθορίζει την απαιτούμενη έκδοση Thonny).\n" "\n" "Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών." #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "Ακατάλληλες προδιαγραφές" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "Αυτό το πακέτο απαιτεί διαφορετική έκδοση του Thonny:" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών." #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "(Σε αυτήν την περίπτωση, το back-end του Thonny χρησιμοποιεί τον ίδιο διερμηνευτή, επομένως και τα δύο παράθυρα διαχειρίζονται τα ίδια πακέτα.)" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Υπενθύμιση! Πρέπει να κάνετε επανεκκίνηση του Thonny μετά την εγκατάσταση / αναβάθμιση / κατάργηση της εγκατάστασης ενός πρόσθετου." #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "Πρόσθετα του Thonny" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "Προχωρημένη εγκατάσταση / αναβάθμιση / υποβάθμιση" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "Επιθυμητή έκδοση" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "Αναβάθμιση εξαρτήσεων" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "Απαιτεί:" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "Σφάλμα:" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "Διαχείριση πακέτων.." #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "Διαχείριση προσθέτων..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Άνοιγμα αναπαραγωγής..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Αλλαγή από τον τρέχοντα κατάλογο εργασίας στον κατάλογο του προγράμματος κατά την Eκτέλεση/Αποσφαλμάτωση" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Εμφάνιση κλήσεων συναρτήσεων (πλαισίων) σε ξεχωριστά παράθυρα" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Αποεπιλέξτε εάν θέλετε μια πιο παραδοσιακή εμπειρία." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Αυτόματο άνοιγμα και κλείσιμο της προβολής της Στοίβας" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Ανοίγει την προβολή στοίβας κατά την πρώτη κλήση και κλείνει όταν το πρόγραμμα επιστρέψει στο κυρίως πλαίσιο." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Να επιτρέπεται η μετάβαση σε βιβλιοθήκες (π.χ. εκτός του καταλόγου του κύριου προγράμματος)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Μπορεί να κάνει την αποσφαλμάτωση πιο αργή." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Προτιμώμενο πρόγραμμα αποσφαλμάτωσης" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(χρησιμοποιείται όταν κάνετε κλικ στο κουμπί Αποσφαλμάτωση)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Θύρα Birdseye" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(επανεκιννήστε το Thonny μετά από αυτήν την αλλαγή)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Εκτέλεση & Αποσφαλμάτωση" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "Προσομοίωση τερματικού" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "υποστηρίζει βασικά χρώματα ANSI και στυλ" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "Μέγιστος αριθμός διατηρητέων γραμμών" #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "Υπενθύμιση! Μεγάλες τιμές μπορεί να προκαλέσουν αργή απόδοση!" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "Μέγιστο μήκος τμήματων γραμμής πριν την συμπίεση" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Τρέχον εκτελέσιμο πρόγραμμα στο τερματικό" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Παρουσίαση του Python REPL μετά το τέλος του προγράμματος" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Διατήρησε το τερματικό ανοικτό μετά την ολοκλήρωση της διεργασίας Python" #: thonny/plugins/terminal_config_page.py:31 #, fuzzy msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Υπενθύμιση! Το αυτόματο κλείσιμο πρέπει να ενεργοποιηθεί στις ρυθμίσεις του τερματικού\n" "(Τερματικό → Προτιμήσεις → Προφίλ → Κέλυφος → Όταν το κέλυφος εξέρχεται)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Τερματικό" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Θεματικό UI" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Θεματικό σύνταξης" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Γραμματοσειρά επεξεργαστή κειμένου" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Γραμματοσειρά Ε/Ε (IO)" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Προεπισκόπηση" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "Αυτό είναι ένα σχόλιο" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "Η απάντηση είναι" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "ανοιχτή_συμβολοσειρά" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "Μπλα, μπλα" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Υπενθύμιση! Ορισμένα στοιχεία στυλ αλλάζουν μόνο μετά την επανεκκίνηση του Thonny!" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "Εισάγετε έναν ακέραιο αριθμό" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "Θέμα & Γραμματοσειρά" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Άνοιξε τον φάκελο προγραμμάτων του Thonny..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Άνοιξε τον φάκελο δεδομένων του Thonny ..." #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "Αρχική" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "Περιεχόμενα Βοήθειας" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "Συσκευή CircuitPython" #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "Συσκευή MicroPython" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "Συνδέστε τη συσκευή σας στον υπολογιστή και επιλέξτε την αντίστοιχη θύρα παρακάτω" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "αναζητήστε το όνομα της συσκευής σας, \"USB Serial\" ή \"UART\"" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Αν δεν μπορείτε να το βρείτε, ίσως χρειαστεί να εγκαταστήσετε πρώτα τον κατάλληλο οδηγό USB." #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "Θύρα" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "Προσπαθήστε να εντοπίσετε αυτόματα τη θύρα" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "MicroPython (γενόσημο)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "Εκτύπωση..." #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "Άνοιξε το κέλυφος συστήματος" #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "Λεπτομέρειες" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "Εγκατάσταση από το αρχείο προδιαγραφών" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "Εγκατάσταση από τοπικό αρχείο" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Αυτός ο διάλογος είναι για τη διαχείριση των πρόσθετων του Thonny και των εξαρτήσεων τους.\n" "Αν θέλετε να εγκαταστήσετε πακέτα για τα δικά σας προγράμματα, επιλέξτε \"Εργαλεία → Διαχείριση πακέτων ...\"" #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "CircuitPython (γενόσημο)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Αύξηση εσοχής επιλεγμένων γραμμών" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Μείωση εσοχής επιλεγμένων γραμμών" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "Αλλαγή σε\n" "κανονική\n" "λειτουργία" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Βεβαιωθείτε ότι το MicroPython έχει εγκατασταθεί στο micro:bit σας." #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "Μην ξεχνάτε ότι το main.py λειτουργεί μόνο χωρίς ενσωματωμένο κύριο πρόγραμμα." #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "Παρακαλώ περιμένετε" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "Ολοκληρώθηκε!" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "Yλικολογισμικό" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Δεν ήταν δυνατή η εύρεση του δίσκου '%s'. Θέλετε να τον εντοπίσετε μόνοι σας;" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Βρέθηκαν διάφοροι δίσκοι '%s'. Θέλετε να επιλέξετε έναν εσείς;" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "Δεν είναι δυνατή η εύρεση κατάλληλου δίσκου" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "%d στοιχεία" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "Μετακίνηση στον Κάδο Ανακύκλωσης" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "Μετακίνηση στα Άχρηστα" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "Διαγραφή" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "Νέος κατάλογος" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "Ιδιότητες" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "Χώρος αποθήκευσης" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "Μονοπάτι" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "Ιδιότητες καταλόγου" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "Ιδιότητες αρχείου" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "Μεγέθος" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "Τροποποιήθηκε" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "Διαγραφή %s" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "Μετακίνηση του %s στο %s" #: thonny/editors.py:219 msgid "Loading" msgstr "Φόρτωση" #: thonny/editors.py:335 msgid "Saving" msgstr "Αποθήκευση" #: thonny/running.py:1408 msgid "Working..." msgstr "Επεξεργάζεται..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "Ανέβασμα του %s στο %s" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "Ανέβασμα στο %s" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "Λήψη του %s στο %s" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "Μεταφόρτωση στο %s" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "Άνοιγμα στο διαχειριστή αρχείων του συστήματος" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "Απόκρυψη κρυφών αρχείων" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "Εμφάνιση κρυφών αρχείων" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "Άνοιγμα στο Thonny" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "Άνοιγμα στην προεπιλεγμένη εφαρμογή του συστήματος" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "Διαμόρφωση %s αρχείων" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Τι να κάνω με ένα %s αρχείο όταν γίνεται διπλό κλικ στον προβολέα αρχείων του Thonny?" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "Διαγραφή" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "Δημιουργία φακέλου" #: thonny/editors.py:217 msgid "Loading %s" msgstr "Φόρτωση %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "Αποθήκευση στο %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "Αποθήκευση Όλων των αρχείων" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "Ρύθμιση διερμηνέα..." #: thonny/workbench.py:1501 msgid "Device" msgstr "Συσκευή" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "Ακύρωση" #: thonny/workdlg.py:212 msgid "Starting" msgstr "Έναρξη" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "Ταυτοποίηση" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Εισαγωγή συνθηματικού για τα προσωπικο κλειδί για το \n" "{}" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "Εισαγωγή κωδικού για\n" "{}" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Η παραπάνω αναπαράσταση είναι μια κατά προσέγγιση τιμή αυτού του float. Η ακριβής αποθηκευμένη τιμή είναι %s που είναι περίπου %s" #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "Αναζήτησε αποτελέσματα" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "Αναζήτηση" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "Εγκατάσταση ‘%s’" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "Αναβάθμιση ‘%s’" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "Απεγκατάσταση ‘%s’" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "Εγκατάσταση" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "Ο διαχειριστής πακέτων δεν είναι διαθέσιμος για αυτόν τον διερμηνέα" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "Δεν υποστηρίζεται" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "Δεν διατίθεται" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "Πρέπει να σταματήσει το πρόγραμμά σου πριν την έναρξη του διαχειριστή πακέτων" #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "Άνοιξε τις εκτιμημένες τιμές στον επιθεωρητή Αντικειμένου" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "Εκτελέσιμο της python" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Σημείωση! Το κουμπί επιλογής αρχείου μπορεί να μην λειτουργεί σωστά όταν επιλέγονται εκτελέσιμα\n" "από εικονικό περιβάλλον. Σε αυτή την περίπτωση να επιλεγεί το σενάριο \"ενεργοποίησης\" (activate script)\n" "αντί για το διερμηνέα (η καταχώρησε το μονοπάτι απευθείας στο πεδίο)! " #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "Απομακρυσμένη Python 2 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "Δεν υπάρχει σύνδεση" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "Προχωρημένες επιλογές" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "Εγκατάσταση ή ενημέρωση υλικολογισμικού" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "MicroPython (τοπική)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #. Module μεταφράζεται επίσημα δομοστοιχείο αλλά φοβάμαι κανένας δεν καταλαβαίνει τι σημαίνει αυτή η λέξη. Νομίζω ενότητα είναι πιο κατανοητό σαν λέξη #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "Ενότητα" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "Σκιασμένα στοιχεία (με εισακτέα):" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "Το πακέτο δεν είναι διαθέσιμο στο micropython.org. Θα εγκατασταθεί η έκδοση στο PyPI." #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "Σημείωση! Το micropython.org έχει δημοσιεύσει την έκδοση %s αυτού του πακέτου και αυτό θα εγκατασταθεί από προεπιλογή." #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "Για αναβάθμιση απλώς να εγκατασταθεί ξανά το πακέτο" #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "Για απεγκατάσταση να διαγραφούν τα αντίστοιχα αρχεία" #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "Πεδίο εφαρμογής" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Αυτός ο διάλογος αναγράφει τις κορυφαίες ενότητες από τα ακόλουθα ευρετήρια:\n" "\n" "" #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "Τα Νέα πακέτα θα εγκατασταθούν στο/στη" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "δεν υπάρχει απόλυτη βιβλιοθήκη ευρετηρίου στο sys.path" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "Έκδοση προς εγκατάσταση" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "Στόχευσε την τοποθεσία της συσκευής" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "Στόχευσε το μοντέλο της συσκευής" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "Παρακαλώ περιμένετε" #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "Αναζήτηση στο PyPI" #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "Επιλέχθηκε Διαγραφή" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "Άνοιγμα στο επεξεργαστή κειμένου του Thonny" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "Μέσα αποθήκευσης στον οδηγό ή στο σύστημα αρχείων" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "συνολικός χώρος" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "χρησιμοποιούμενος χώρος" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "ελεύθερος χώρος" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "Πληροφορίες μέσων αποθήκευσης" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Αντικατάσταση στηλοθετών(tabs) με κενά" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "Επισήμανση στηλοθετών (tabs)" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "Εσοχές με στηλοθέτες (tabs) (δεν συνίσταται για την Python)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "Όνομα" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "Μέγεθος (bytes)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "Εισαγωγή ονόματος για νέο ευρετήριο υπό το \n" "%s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "Καμία επιλογή" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "Επέλεξε ένα αντικείμενο και προσπάθησε ξανά!" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "Άνοιγμα από %s" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "Αποθήκευση στο %s" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "Όνομα αρχείου:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "Ταυτότητα τιμής" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "Τιμή" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "Αποθήκευση κωδικού" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Κλήση συνάρτησης στο %s" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "Τοπικές μεταβλητές" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "Συνάρτηση" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "Τοποθεσία" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Αν η τελευταία εντολή δημιούργησε εξαίρεση, τότε αυτή η προβολή θα δείξει πληροφορίες στοίβας (stacktrace)" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "Ταυτότητα" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "Δεδομένα" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "Χαρακτηριστικά" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "Ευρετήριο" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "Ταυτότητα κλειδιού" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "Κλειδί" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "Επιστροφή στο \n" "%s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "Θύρα η WebREPL" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "Κωδικός" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "Πηγαίος κώδικας" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Χρήση διαλόγων αρχείου Tk αντί για Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Επέλεξε αν ο διάλογος αρχείου καταλήγει πίσω από το κυρίως παράθυρο" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Παράμετροι περιβάλλοντος (ένα KEY=VALUE ανά γραμμή) " ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.933911 thonny-4.1.7/thonny/locale/en_GB/0000755000076600000240000000000014730055627017146 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0909142 thonny-4.1.7/thonny/locale/en_GB/LC_MESSAGES/0000755000076600000240000000000014730055627020733 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/en_GB/LC_MESSAGES/thonny.mo0000644000076600000240000010314014670256721022607 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4KAbout BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: en_gb Language-Team: en_gb Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenceLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to Rubbish BinMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualises series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogues end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialogue is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialogue lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogues instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colours and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused space././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/en_GB/LC_MESSAGES/thonny.po0000644000076600000240000015233714626075445022631 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: en-gb\n" #: thonny/workbench.py:375 msgid "File" msgstr "File" #: thonny/workbench.py:376 msgid "Edit" msgstr "Edit" #: thonny/workbench.py:377 msgid "View" msgstr "View" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Run" #: thonny/workbench.py:379 msgid "Tools" msgstr "Tools" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Help" #: thonny/workbench.py:598 msgid "Exit" msgstr "Exit" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Decrease font size" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Focus editor" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Focus shell" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Maximize view" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Full screen" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Program arguments" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "About Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Version history" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Report problems" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Open Assistant automatically when program crashes with an exception" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Open Assistant automatically when it has warnings for your code" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Perform selected Pylint checks" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Perform MyPy checks" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Disabled checks (one id per line)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistant" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Auto-complete" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Interpreter" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "About Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Debug current script (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Toggle comment" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Comment out" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Uncomment" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Undo" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Redo" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Cut" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Copy" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Paste" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Select all" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Run to cursor" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Can't close yet" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Use \"Stop\" command if you want to cancel debugging" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Dock user windows" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Highlight matching names" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Highlight local variables" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Highlight parentheses" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Highlight syntax elements" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Highlight current line (requires reopening the editor)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Show line numbers" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Export usage logs..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Events" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Files" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Find & Replace" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Find:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Replace with:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Case sensitive" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Up" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Down" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Find" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Replace" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Replace+Find" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Replace all" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Enter string to be replaced." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "The specified text was not found!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Allow only single Thonny instance" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Reopen all files from previous session" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Disable notification sound" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Font scaling mode" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Heap mode is on.\n" "Close Heap view to turn it off." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Language" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notes" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Previous object" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Next object" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Object inspector" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Outline" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero mode" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Uninstall" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Close" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Click " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "here" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Upgrade" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Install" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Could not find the package from PyPI." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Latest stable version" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Latest version" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Summary" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Author" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Homepage" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Bugtracker" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Documentation" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "PyPI page" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Requires" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Really uninstall?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Are you sure you want to uninstall it?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Back to\n" "current frame" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variables" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "This computer" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Refresh" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Focus into" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Error" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "You need to select a file!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Overwrite?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Do you want to overwrite '%s' ?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "New" #: thonny/editors.py:671 msgid "Open..." msgstr "Open..." #: thonny/editors.py:673 msgid "Load" msgstr "Load" #: thonny/editors.py:682 msgid "Recent files" msgstr "Recent files" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Close all" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Save" #: thonny/editors.py:739 msgid "Save as..." msgstr "Save as..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Save copy..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny options" #: thonny/running.py:160 msgid "Run current script" msgstr "Run current script" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Run current script in terminal" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Stop/Restart backend" #: thonny/running.py:205 msgid "Stop" msgstr "Stop" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Interrupt execution" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Send EOF / Soft reboot" #: thonny/running.py:240 msgid "Disconnect" msgstr "Disconnect" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Python interpreters" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "all files" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Select empty directory for new virtual environment" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Bad directory" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Selected directory is not empty.\n" "Select another or cancel." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Creating virtual environment" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Clear shell" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:317 msgid "Clear" msgstr "Clear" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Show Plotter" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Wrap text (may be slow)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Copy to clipboard" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Squeezed text (%d characters)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotter visualises series of\n" "numbers printed to the Shell." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "See Help for details." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Close others" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Copying" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Copying\n" " %s\n" "to\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Cancel" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Select All" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Shell" #: thonny/workbench.py:608 msgid "Options..." msgstr "Options..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Increase font size" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Change font size" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Exit Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Quit" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Overwriting theme '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Program arguments:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Regular mode" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Program tree" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Resume" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Run / resume" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Debug current script" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Debug" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Debug current script (nicer)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Debug current script (faster)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Step over" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Over" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Step into" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Into" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Step out" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Out" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Step back" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Back" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Stack" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Exception" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Log program usage events" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Debug mode (provides more detailed diagnostic logs)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UI mode" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI scaling factor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Restart Thonny after changing these options!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "General" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALL" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Browse the packages" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Packages' directory" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Install from PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "to locate requirements.txt file and install the packages specified in it." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Click" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Upgrade or uninstall" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Start by selecting the package from the left." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "This dialogue lists all available packages, but allows upgrading and uninstalling only packages from" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "New packages will be also installed into this directory. Other locations must be managed by alternative means." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Installed version:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Installed to:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Please check your spelling!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Could not find the package info from PyPI." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Error code:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Can't find package name from the list:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Package '{}' is required for installing and uninstalling other packages." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Package" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Manage packages for %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Confirmation" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Thonny plugin without requirements" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Unsuitable requirements" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "This package requires different Thonny version:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "If you still want it, then please install it from the command line." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Thonny plug-ins" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Advanced install / upgrade / downgrade" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Desired version" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Upgrade dependencies" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Requires:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Error:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Manage packages..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Manage plug-ins..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Open replayer..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Change working directory to script directory on Run / Debug" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Show function calls (frames) in separate windows" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Uncheck if you want more traditional experience." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Open and close Stack view automatically" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Opens the Stack view on first call and closes it when program returns to main frame." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Allow stepping into libraries (ie. outside of main script directory)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "May make debugging slower." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Preferred debugger" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(used when clicking Debug toolbar button)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(restart Thonny after changing this)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Run & Debug" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminal emulation" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "supports basic ANSI-colours and styles" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maximum number of lines to keep." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "NB! Large values may cause poor performance!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximum length of line fragments before squeezing" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Running current script in terminal" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Present Python REPL after program ends" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Keep terminal window open after Python process ends" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "UI theme" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Syntax theme" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Editor font" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "IO font" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Preview" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "This is a comment" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "The answer is" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "unclosed_string" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "blah, blah" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Some style elements change only after restarting Thonny!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Enter an integer" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Theme & Font" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Open Thonny program folder..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Open Thonny data folder..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Home" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Help contents" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPython device" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPython device" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Connect your device to the computer and select corresponding port below" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "look for your device name, \"USB Serial\" or \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "If you can't find it, you may need to install proper USB driver first." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Try to detect port automatically" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (generic)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Print..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Open system shell..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Details" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Install from requirements file" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Install from local file" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "This dialogue is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generic)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Indent selected lines" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Dedent selected lines" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Switch to\n" "regular\n" "mode" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Make sure MicroPython has been installed to your micro:bit." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Don't forget that main.py only works without embedded main script." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Could not find disk '%s'. Do you want to locate it yourself?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Found several '%s' disks. Do you want to choose one yourself?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Can't find suitable disk" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d items" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Move to Rubbish Bin" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Delete" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "New directory" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Properties" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Storage space" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Path" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Directory properties" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "File properties" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Size" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Modified" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Deleting %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Loading" #: thonny/editors.py:395 msgid "Saving" msgstr "Saving" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Upload to %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Downloading %s to %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Download to %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Open in system file manager" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Hide hidden files" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Show hidden files" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Open in Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Open in system default app" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Configure %s files" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "What to do with a %s file when you double-click it in Thonny's file browser?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Deleting" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Creating directory" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Loading %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Saving to %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Save All files" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Configure interpreter..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Device" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Cancelling" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Starting" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Authentication" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Enter the passphrase of your private key for\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Enter your password for\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Search results" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Searching" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Installing '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Upgrading '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Uninstalling '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Installing" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Package manager is not available for this interpreter" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Not supported" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Not available" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "You need to stop your program before launching the package manager." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Open evaluated values in Object inspector" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Python executable" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Remote Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Not connected" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "no absolute lib directory in sys.path" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Search on PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Open in Thonny's text editor" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Storage space on this drive or filesystem" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "total space" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "used space" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "free space" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Storage info" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Replace tabs with spaces" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Highlight tab characters" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Indent with tab characters (not recommended for Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Name" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Size (bytes)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Enter name for new directory under\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Nothing selected" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Select an item and try again!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Open from %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Save to %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "File name:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "Value ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Value" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Save password" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Function call at %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Local variables" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Function" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Location" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "If last command raised an exception then this view will show the stacktrace." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Data" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attributes" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Index" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Key ID" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Key" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Back to\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Port or WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Password" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Source code" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Use Tk file dialogues instead of Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Select if the file dialogues end up behind the main window" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Environment variables (one KEY=VALUE per line)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "New file" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Rename" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Rename '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Enter new name" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Paste failed" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "There are conflicting folders" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "File already exists" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." #: thonny/editors.py:38 msgid "Python files" msgstr "Python files" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "File is gone" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Do you want to also close the editor?" #: thonny/editors.py:169 msgid "External modification" msgstr "External modification" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Do you want to discard current editor content and reload the file from disk?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Python files usually have .py extension." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Did you mean '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Move / rename..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Go to line..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Line number" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Do you want to save files before closing?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Do you want to save file before closing?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Save On Close" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Command not available" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "This command is not available if Thonny is run via Flatpak" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Support Ukraine" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Which kind of interpreter should Thonny use for running your code?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Show parameter info" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Automatically show parameter info after typing '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Automatically propose completions while typing" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Automatically show documentation for completions" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Request completions with Tab-key in editors" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Request completions with Tab-key in Shell" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problem" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Could not find definition" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Thonny's Python" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Interrupt working program on connect" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Synchronize device's real time clock" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Use local time in real time clock" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Restart interpreter before running a script" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Moving to Trash" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Move %s to Trash?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Moving %s to Trash" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Open in default external app" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "Opening remote files in external app is not supported." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "If the file needs to be opened in external app, then download it to a local directory and open it from there!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Looks like '%s' was deleted or moved." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Looks like '%s' was modified outside of the editor." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "NB! Thonny only supports Python %s and later" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Go to line" #: thonny/workbench.py:703 msgid "Support" msgstr "Support" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Could not save" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Warning" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Install MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Install CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Make uploaded shebang scripts executable" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Make saved shebang scripts executable" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Activate virtual environment" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Target" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualize current script at Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Line" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "No line marked with #todo found" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Install or update %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Local Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Preparations (skip the VS Code part)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Default password" #: thonny/running.py:392 msgid "Information" msgstr "Information" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "For debugging the program must be saved first." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s doesn't look like a text file" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problem loading file" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." #: thonny/editors.py:295 msgid "File is open" msgstr "File is open" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Permission Error" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Looks like this file or folder is not writable." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Back-end is not ready" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Where to save to?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Potential problem" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "If you name your script '%s', you won't be able to import the library module named '%s'" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Do you still want to use this name for your script?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Got permission error when trying to load\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Try opening it with File => Open." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Permission error" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Allow running unnamed programs" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Licence" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Warn if a user module shadows a library module" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Search micropython-lib and PyPI" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9342964 thonny-4.1.7/thonny/locale/en_US/0000755000076600000240000000000014730055627017205 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1734368151.09188 thonny-4.1.7/thonny/locale/en_US/LC_MESSAGES/0000755000076600000240000000000014730055627020772 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/en_US/LC_MESSAGES/thonny.mo0000644000076600000240000000130514670256721022646 0ustar00aivarannamaastaff,<z=~FMade in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: en_us Language-Team: en_us Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 Made at the University of Tartu, Estonia, with help from the open-source community, Raspberry Pi Foundation and Cybernetica AS././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/en_US/LC_MESSAGES/thonny.po0000644000076600000240000007231714417536743022670 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: en-us\n" #: thonny/workbench.py:355 msgid "File" msgstr "" #: thonny/workbench.py:356 msgid "Edit" msgstr "" #: thonny/workbench.py:357 msgid "View" msgstr "" #: thonny/running.py:95 thonny/workbench.py:358 msgid "Run" msgstr "" #: thonny/workbench.py:360 msgid "Tools" msgstr "" #: thonny/plugins/help/__init__.py:68 thonny/workbench.py:361 msgid "Help" msgstr "" #: thonny/workbench.py:522 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "" #: thonny/workbench.py:530 msgid "A special virtual environment (deprecated)" msgstr "" #: thonny/workbench.py:568 msgid "Exit" msgstr "" #: thonny/workbench.py:595 msgid "Decrease font size" msgstr "" #: thonny/workbench.py:607 msgid "Focus editor" msgstr "" #: thonny/workbench.py:616 msgid "Focus shell" msgstr "" #: thonny/workbench.py:627 msgid "Maximize view" msgstr "" #: thonny/workbench.py:639 msgid "Full screen" msgstr "" #: thonny/workbench.py:1250 msgid "Program arguments" msgstr "" #: thonny/plugins/about.py:25 thonny/plugins/about.py:157 msgid "About Thonny" msgstr "" #: thonny/plugins/about.py:77 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Made at the\n" "University of Tartu, Estonia,\n" "with help from the\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" #: thonny/plugins/about.py:103 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "" #: thonny/plugins/about.py:146 msgid "Version history" msgstr "" #: thonny/plugins/about.py:153 msgid "Report problems" msgstr "" #: thonny/plugins/assistant_config_page.py:15 msgid "Open Assistant automatically when program crashes with an exception" msgstr "" #: thonny/plugins/assistant_config_page.py:21 msgid "Open Assistant automatically when it has warnings for your code" msgstr "" #: thonny/plugins/assistant_config_page.py:26 msgid "Perform selected Pylint checks" msgstr "" #: thonny/plugins/assistant_config_page.py:29 msgid "Perform MyPy checks" msgstr "" #: thonny/plugins/assistant_config_page.py:31 msgid "Disabled checks (one id per line)" msgstr "" #: thonny/assistance.py:962 thonny/plugins/assistant_config_page.py:68 msgid "Assistant" msgstr "" #: thonny/plugins/autocomplete.py:316 msgid "Auto-complete" msgstr "" #: thonny/plugins/backend_config_page.py:43 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "" #: thonny/plugins/backend_config_page.py:127 msgid "Interpreter" msgstr "" #: thonny/plugins/birdseye_frontend.py:32 msgid "About Birdseye" msgstr "" #: thonny/plugins/birdseye_frontend.py:33 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "" #: thonny/plugins/birdseye_frontend.py:60 msgid "Debug current script (birdseye)" msgstr "" #: thonny/plugins/commenting_indenting.py:143 msgid "Toggle comment" msgstr "" #: thonny/plugins/commenting_indenting.py:153 msgid "Comment out" msgstr "" #: thonny/plugins/commenting_indenting.py:163 msgid "Uncomment" msgstr "" #: thonny/plugins/common_editing_commands.py:20 msgid "Undo" msgstr "" #: thonny/plugins/common_editing_commands.py:32 msgid "Redo" msgstr "" #: thonny/plugins/common_editing_commands.py:48 thonny/ui_utils.py:2176 msgid "Cut" msgstr "" #: thonny/plugins/common_editing_commands.py:60 thonny/ui_utils.py:2177 msgid "Copy" msgstr "" #: thonny/plugins/common_editing_commands.py:72 thonny/ui_utils.py:2178 msgid "Paste" msgstr "" #: thonny/plugins/common_editing_commands.py:84 thonny/plugins/debugger.py:124 msgid "Select all" msgstr "" #: thonny/plugins/debugger.py:117 thonny/plugins/debugger.py:1276 msgid "Run to cursor" msgstr "" #: thonny/plugins/debugger.py:863 msgid "Can't close yet" msgstr "" #: thonny/plugins/debugger.py:864 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "" #: thonny/plugins/dock_user_windows_frontend.py:27 msgid "Dock user windows" msgstr "" #: thonny/plugins/editor_config_page.py:14 msgid "Highlight matching names" msgstr "" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight local variables" msgstr "" #: thonny/plugins/editor_config_page.py:25 msgid "Highlight parentheses" msgstr "" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight syntax elements" msgstr "" #: thonny/plugins/editor_config_page.py:29 msgid "Highlight current line (requires reopening the editor)" msgstr "" #: thonny/plugins/editor_config_page.py:34 msgid "Allow code completion with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:40 msgid "Allow code completion with Tab-key in Shell" msgstr "" #: thonny/plugins/editor_config_page.py:44 msgid "Show line numbers" msgstr "" #: thonny/plugins/editor_config_page.py:47 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "" #: thonny/plugins/editor_config_page.py:68 msgid "Editor" msgstr "" #: thonny/plugins/event_logging.py:197 msgid "Export usage logs..." msgstr "" #: thonny/plugins/event_view.py:38 msgid "Events" msgstr "" #: thonny/plugins/files.py:307 msgid "Files" msgstr "" #: thonny/plugins/find_replace.py:56 thonny/plugins/find_replace.py:412 msgid "Find & Replace" msgstr "" #: thonny/plugins/find_replace.py:62 msgid "Find:" msgstr "" #: thonny/plugins/find_replace.py:73 msgid "Replace with:" msgstr "" #: thonny/plugins/find_replace.py:91 msgid "Case sensitive" msgstr "" #: thonny/plugins/find_replace.py:98 msgid "Up" msgstr "" #: thonny/plugins/find_replace.py:102 msgid "Down" msgstr "" #: thonny/plugins/find_replace.py:111 msgid "Find" msgstr "" #: thonny/plugins/find_replace.py:121 msgid "Replace" msgstr "" #: thonny/plugins/find_replace.py:129 msgid "Replace+Find" msgstr "" #: thonny/plugins/find_replace.py:138 msgid "Replace all" msgstr "" #: thonny/plugins/find_replace.py:232 msgid "Enter string to be replaced." msgstr "" #: thonny/plugins/find_replace.py:316 msgid "The specified text was not found!" msgstr "" #: thonny/plugins/general_config_page.py:13 msgid "Allow only single Thonny instance" msgstr "" #: thonny/plugins/general_config_page.py:20 msgid "Reopen all files from previous session" msgstr "" #: thonny/plugins/general_config_page.py:26 msgid "Disable notification sound" msgstr "" #: thonny/plugins/general_config_page.py:75 msgid "Font scaling mode" msgstr "" #: thonny/plugins/heap.py:35 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "" #: thonny/plugins/heap.py:83 msgid "Heap" msgstr "" #: thonny/plugins/general_config_page.py:42 msgid "Language" msgstr "" #: thonny/plugins/notes.py:33 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "" #: thonny/plugins/notes.py:61 msgid "Notes" msgstr "" #: thonny/plugins/object_inspector.py:108 msgid "Previous object" msgstr "" #: thonny/plugins/object_inspector.py:111 msgid "Next object" msgstr "" #: thonny/plugins/object_inspector.py:601 msgid "Object inspector" msgstr "" #: thonny/plugins/outline.py:137 msgid "Outline" msgstr "" #: thonny/plugins/pgzero_frontend.py:26 msgid "Pygame Zero mode" msgstr "" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "" #: thonny/plugins/pip_gui.py:188 thonny/plugins/pip_gui.py:190 msgid "Uninstall" msgstr "" #: thonny/code.py:548 thonny/plugins/microbit/__init__.py:200 #: thonny/plugins/pip_gui.py:204 thonny/running.py:1457 thonny/ui_utils.py:367 #: thonny/ui_utils.py:1643 msgid "Close" msgstr "" #: thonny/plugins/pip_gui.py:382 msgid "Click " msgstr "" #: thonny/plugins/pip_gui.py:383 thonny/plugins/pip_gui.py:393 msgid "here" msgstr "" #: thonny/plugins/pip_gui.py:181 thonny/plugins/pip_gui.py:478 msgid "Upgrade" msgstr "" #: thonny/plugins/microbit/__init__.py:123 thonny/plugins/pip_gui.py:483 #: thonny/plugins/pip_gui.py:1064 msgid "Install" msgstr "" #: thonny/plugins/pip_gui.py:505 msgid "Could not find the package from PyPI." msgstr "" #: thonny/plugins/pip_gui.py:515 msgid "exact package name" msgstr "" #: thonny/plugins/pip_gui.py:533 msgid "Latest stable version" msgstr "" #: thonny/plugins/pip_gui.py:535 msgid "Latest version" msgstr "" #: thonny/plugins/pip_gui.py:536 msgid "Summary" msgstr "" #: thonny/plugins/pip_gui.py:537 msgid "Author" msgstr "" #: thonny/plugins/pip_gui.py:538 msgid "Homepage" msgstr "" #: thonny/plugins/pip_gui.py:540 msgid "Bugtracker" msgstr "" #: thonny/plugins/pip_gui.py:542 msgid "Documentation" msgstr "" #: thonny/plugins/pip_gui.py:544 msgid "PyPI page" msgstr "" #: thonny/plugins/pip_gui.py:548 msgid "Requires" msgstr "" #: thonny/plugins/pip_gui.py:614 msgid "Really uninstall?" msgstr "" #: thonny/plugins/pip_gui.py:619 msgid "Are you sure you want to uninstall it?" msgstr "" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "" #: thonny/plugins/variables.py:131 msgid "Variables" msgstr "" #: thonny/base_file_browser.py:30 msgid "This computer" msgstr "" #: thonny/base_file_browser.py:568 msgid "Refresh" msgstr "" #: thonny/base_file_browser.py:572 msgid "Focus into" msgstr "" #: thonny/base_file_browser.py:1001 msgid "Error" msgstr "" #: thonny/base_file_browser.py:1001 msgid "You need to select a file!" msgstr "" #: thonny/base_file_browser.py:1005 msgid "Overwrite?" msgstr "" #: thonny/base_file_browser.py:1005 msgid "Do you want to overwrite '%s' ?" msgstr "" #: thonny/code.py:513 thonny/code.py:515 msgid "New" msgstr "" #: thonny/code.py:526 msgid "Open..." msgstr "" #: thonny/code.py:528 msgid "Load" msgstr "" #: thonny/code.py:537 msgid "Recent files" msgstr "" #: thonny/code.py:559 thonny/ui_utils.py:369 msgid "Close all" msgstr "" #: thonny/code.py:569 thonny/code.py:571 msgid "Save" msgstr "" #: thonny/code.py:583 msgid "Save as..." msgstr "" #: thonny/code.py:594 msgid "Save copy..." msgstr "" #: thonny/code.py:603 msgid "Rename..." msgstr "" #: thonny/config_ui.py:17 msgid "Thonny options" msgstr "" #: thonny/running.py:94 msgid "Run current script" msgstr "" #: thonny/running.py:125 msgid "Run current script in terminal" msgstr "" #: thonny/running.py:138 msgid "Stop/Restart backend" msgstr "" #: thonny/running.py:139 msgid "Stop" msgstr "" #: thonny/running.py:150 msgid "Interrupt execution" msgstr "" #: thonny/running.py:161 msgid "Send EOF / Soft reboot" msgstr "" #: thonny/running.py:172 msgid "Disconnect" msgstr "" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "" #: thonny/running_config_page.py:43 msgid "Locate another" msgstr "" #: thonny/running_config_page.py:45 msgid "python executable" msgstr "" #: thonny/running_config_page.py:47 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "" #: thonny/running_config_page.py:74 msgid "Python interpreters" msgstr "" #: thonny/plugins/pip_gui.py:657 thonny/plugins/pip_gui.py:669 #: thonny/running_config_page.py:75 msgid "all files" msgstr "" #: thonny/running_config_page.py:89 msgid "Select empty directory for new virtual environment" msgstr "" #: thonny/running_config_page.py:96 msgid "Bad directory" msgstr "" #: thonny/running_config_page.py:97 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "" #: thonny/running_config_page.py:112 msgid "Creating virtual environment" msgstr "" #: thonny/shell.py:72 msgid "Clear shell" msgstr "" #: thonny/shell.py:126 msgid "Plotter" msgstr "" #: thonny/shell.py:245 msgid "Clear" msgstr "" #: thonny/shell.py:258 msgid "Show Plotter" msgstr "" #: thonny/shell.py:1389 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "" #: thonny/shell.py:1400 msgid "Wrap text (may be slow)" msgstr "" #: thonny/shell.py:1425 thonny/ui_utils.py:1639 msgid "Copy to clipboard" msgstr "" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "" #: thonny/shell.py:1442 msgid "Squeezed text (%d characters)" msgstr "" #: thonny/shell.py:1611 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "" #: thonny/shell.py:1613 msgid "See Help for details." msgstr "" #: thonny/ui_utils.py:368 msgid "Close others" msgstr "" #: thonny/ui_utils.py:1499 msgid "Copying" msgstr "" #: thonny/ui_utils.py:1502 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "" #: thonny/config_ui.py:31 thonny/plugins/microbit/__init__.py:127 #: thonny/plugins/pip_gui.py:1066 thonny/running.py:1424 #: thonny/ui_utils.py:1510 thonny/ui_utils.py:1712 msgid "Cancel" msgstr "" #: thonny/config_ui.py:30 thonny/ui_utils.py:1764 msgid "OK" msgstr "" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "" #: thonny/plugins/shell_config_page.py:61 thonny/workbench.py:162 msgid "Shell" msgstr "" #: thonny/workbench.py:512 msgid "The same interpreter which runs Thonny (default)" msgstr "" #: thonny/workbench.py:531 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "" #: thonny/workbench.py:532 msgid "Location: " msgstr "" #: thonny/workbench.py:578 msgid "Options..." msgstr "" #: thonny/workbench.py:585 msgid "Increase font size" msgstr "" #: thonny/workbench.py:650 msgid "Change font size" msgstr "" #: thonny/workbench.py:651 msgid "Zoom" msgstr "" #: thonny/workbench.py:660 msgid "Exit Thonny" msgstr "" #: thonny/workbench.py:663 msgid "Quit" msgstr "" #: thonny/workbench.py:1054 thonny/workbench.py:1062 msgid "Overwriting theme '%s'" msgstr "" #: thonny/workbench.py:1221 msgid "Program arguments:" msgstr "" #: thonny/workbench.py:1275 msgid "Regular mode" msgstr "" #: thonny/workbench.py:1276 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "" #: thonny/plugins/ast_view.py:209 msgid "Program tree" msgstr "" #: thonny/plugins/backend_config_page.py:130 msgid "Select interpreter" msgstr "" #: thonny/plugins/debugger.py:1162 msgid "Resume" msgstr "" #: thonny/plugins/debugger.py:1174 msgid "Run / resume" msgstr "" #: thonny/plugins/debugger.py:1189 msgid "Debug current script" msgstr "" #: thonny/plugins/debugger.py:1191 msgid "Debug" msgstr "" #: thonny/plugins/debugger.py:1202 msgid "Debug current script (nicer)" msgstr "" #: thonny/plugins/debugger.py:1214 msgid "Debug current script (faster)" msgstr "" #: thonny/plugins/debugger.py:1225 msgid "Step over" msgstr "" #: thonny/plugins/debugger.py:1227 msgid "Over" msgstr "" #: thonny/plugins/debugger.py:1238 msgid "Step into" msgstr "" #: thonny/plugins/debugger.py:1240 msgid "Into" msgstr "" #: thonny/plugins/debugger.py:1251 msgid "Step out" msgstr "" #: thonny/plugins/debugger.py:1253 msgid "Out" msgstr "" #: thonny/plugins/debugger.py:1288 msgid "Step back" msgstr "" #: thonny/plugins/debugger.py:1290 msgid "Back" msgstr "" #: thonny/plugins/debugger.py:1296 msgid "Stack" msgstr "" #: thonny/plugins/debugger.py:1297 msgid "Exception" msgstr "" #: thonny/plugins/general_config_page.py:16 msgid "Log program usage events" msgstr "" #: thonny/plugins/general_config_page.py:32 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "" #: thonny/plugins/general_config_page.py:56 msgid "UI mode" msgstr "" #: thonny/plugins/general_config_page.py:69 msgid "UI scaling factor" msgstr "" #: thonny/plugins/general_config_page.py:88 msgid "NB! Restart Thonny after changing these options!" msgstr "" #: thonny/plugins/general_config_page.py:102 msgid "General" msgstr "" #: thonny/plugins/pip_gui.py:108 msgid "INSTALL" msgstr "" #: thonny/plugins/pip_gui.py:352 msgid "Browse the packages" msgstr "" #: thonny/plugins/pip_gui.py:355 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "" #: thonny/plugins/pip_gui.py:363 msgid "Packages' directory" msgstr "" #: thonny/plugins/pip_gui.py:368 msgid "Install from PyPI" msgstr "" #: thonny/plugins/pip_gui.py:371 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "" #: thonny/plugins/pip_gui.py:387 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "" #: thonny/plugins/pip_gui.py:392 msgid "Click" msgstr "" #: thonny/plugins/pip_gui.py:397 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "" #: thonny/plugins/pip_gui.py:403 msgid "Upgrade or uninstall" msgstr "" #: thonny/plugins/pip_gui.py:405 msgid "Start by selecting the package from the left." msgstr "" #: thonny/plugins/pip_gui.py:409 msgid "Target:" msgstr "" #: thonny/plugins/pip_gui.py:412 msgid "virtual environment" msgstr "" #: thonny/plugins/pip_gui.py:416 msgid "user site packages" msgstr "" #: thonny/plugins/pip_gui.py:421 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "" #: thonny/plugins/pip_gui.py:431 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "" #: thonny/plugins/pip_gui.py:456 msgid "Installed version:" msgstr "" #: thonny/plugins/pip_gui.py:458 msgid "Installed to:" msgstr "" #: thonny/plugins/pip_gui.py:510 msgid "Please check your spelling!" msgstr "" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "" #: thonny/plugins/pip_gui.py:520 msgid "Could not find the package info from PyPI." msgstr "" #: thonny/plugins/pip_gui.py:522 thonny/plugins/pip_gui.py:1120 msgid "Error code:" msgstr "" #: thonny/plugins/pip_gui.py:581 msgid "Can't find package name from the list:" msgstr "" #: thonny/plugins/pip_gui.py:615 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "" #: thonny/plugins/pip_gui.py:657 msgid "Package" msgstr "" #: thonny/plugins/pip_gui.py:757 msgid "Manage packages for %s" msgstr "" #: thonny/plugins/pip_gui.py:813 msgid "Confirmation" msgstr "" #: thonny/plugins/pip_gui.py:814 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "" #: thonny/plugins/pip_gui.py:912 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "" #: thonny/plugins/pip_gui.py:920 msgid "Thonny plugin without requirements" msgstr "" #: thonny/plugins/pip_gui.py:921 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "" #: thonny/plugins/pip_gui.py:935 msgid "Unsuitable requirements" msgstr "" #: thonny/plugins/pip_gui.py:936 msgid "This package requires different Thonny version:" msgstr "" #: thonny/plugins/pip_gui.py:940 msgid "If you still want it, then please install it from the command line." msgstr "" #: thonny/plugins/pip_gui.py:984 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "" #: thonny/plugins/pip_gui.py:990 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "" #: thonny/plugins/pip_gui.py:1000 msgid "Thonny plug-ins" msgstr "" #: thonny/plugins/pip_gui.py:1013 msgid "Advanced install / upgrade / downgrade" msgstr "" #: thonny/plugins/pip_gui.py:1022 msgid "Desired version" msgstr "" #: thonny/plugins/pip_gui.py:1060 msgid "Upgrade dependencies" msgstr "" #: thonny/plugins/pip_gui.py:1118 msgid "Requires:" msgstr "" #: thonny/plugins/pip_gui.py:1122 msgid "Error:" msgstr "" #: thonny/plugins/pip_gui.py:1232 msgid "Manage packages..." msgstr "" #: thonny/plugins/pip_gui.py:1238 msgid "Manage plug-ins..." msgstr "" #: thonny/plugins/replayer.py:354 msgid "Open replayer..." msgstr "" #: thonny/plugins/run_debug_config_page.py:12 msgid "Change working directory to script directory on Run / Debug" msgstr "" #: thonny/plugins/run_debug_config_page.py:20 msgid "Show function calls (frames) in separate windows" msgstr "" #: thonny/plugins/run_debug_config_page.py:21 msgid "Uncheck if you want more traditional experience." msgstr "" #: thonny/plugins/run_debug_config_page.py:27 msgid "Open and close Stack view automatically" msgstr "" #: thonny/plugins/run_debug_config_page.py:28 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "" #: thonny/plugins/run_debug_config_page.py:37 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "" #: thonny/plugins/run_debug_config_page.py:38 msgid "May make debugging slower." msgstr "" #: thonny/plugins/run_debug_config_page.py:43 msgid "Preferred debugger" msgstr "" #: thonny/plugins/run_debug_config_page.py:55 msgid "(used when clicking Debug toolbar button)" msgstr "" #: thonny/plugins/run_debug_config_page.py:60 msgid "Birdseye port" msgstr "" #: thonny/plugins/run_debug_config_page.py:64 msgid "(restart Thonny after changing this)" msgstr "" #: thonny/plugins/run_debug_config_page.py:72 msgid "Run & Debug" msgstr "" #: thonny/plugins/shell_config_page.py:16 msgid "Terminal emulation" msgstr "" #: thonny/plugins/shell_config_page.py:18 msgid "supports basic ANSI-colors and styles" msgstr "" #: thonny/plugins/shell_config_page.py:30 msgid "Maximum number of lines to keep." msgstr "" #: thonny/plugins/shell_config_page.py:32 msgid "NB! Large values may cause poor performance!" msgstr "" #: thonny/plugins/shell_config_page.py:47 msgid "Maximum length of line fragments before squeezing" msgstr "" #: thonny/plugins/terminal_config_page.py:10 msgid "Running current script in terminal" msgstr "" #: thonny/plugins/terminal_config_page.py:15 msgid "Present Python REPL after program ends" msgstr "" #: thonny/plugins/terminal_config_page.py:22 msgid "Keep terminal window open after Python process ends" msgstr "" #: thonny/plugins/terminal_config_page.py:29 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "" #: thonny/plugins/terminal_config_page.py:38 msgid "Terminal" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:144 msgid "This is a comment" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:147 msgid "The answer is" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "unclosed_string" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "blah, blah" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:176 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:215 msgid "Enter an integer" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:228 msgid "Theme & Font" msgstr "" #: thonny/plugins/thonny_folders.py:18 msgid "Open Thonny program folder..." msgstr "" #: thonny/plugins/thonny_folders.py:23 msgid "Open Thonny data folder..." msgstr "" #: thonny/plugins/help/__init__.py:58 msgid "Home" msgstr "" #: thonny/plugins/help/__init__.py:69 msgid "Help contents" msgstr "" #: thonny/plugins/micropython/__init__.py:175 msgid "CircuitPython device" msgstr "" #: thonny/plugins/micropython/__init__.py:179 msgid "MicroPython device" msgstr "" #: thonny/plugins/micropython/__init__.py:191 msgid "Connect your device to the computer and select corresponding port below" msgstr "" #: thonny/plugins/micropython/__init__.py:194 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "" #: thonny/plugins/micropython/__init__.py:196 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "" #: thonny/plugins/micropython/__init__.py:220 msgid "Port" msgstr "" #: thonny/plugins/micropython/__init__.py:229 msgid "Try to detect port automatically" msgstr "" #: thonny/plugins/micropython/__init__.py:417 msgid "MicroPython (generic)" msgstr "" #: thonny/plugins/printing/__init__.py:79 msgid "Print..." msgstr "" #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "" #: thonny/plugins/backend_config_page.py:61 msgid "Details" msgstr "" #: thonny/plugins/pip_gui.py:380 msgid "Install from requirements file" msgstr "" #: thonny/plugins/pip_gui.py:391 msgid "Install from local file" msgstr "" #: thonny/plugins/pip_gui.py:970 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "" #: thonny/plugins/circuitpython/__init__.py:47 msgid "CircuitPython (generic)" msgstr "" #: thonny/plugins/commenting_indenting.py:123 msgid "Indent selected lines" msgstr "" #: thonny/plugins/commenting_indenting.py:133 msgid "Dedent selected lines" msgstr "" #: thonny/workbench.py:1264 msgid "Switch to\n" "regular\n" "mode" msgstr "" #: thonny/plugins/microbit/__init__.py:54 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "" #: thonny/plugins/microbit/__init__.py:56 msgid "Don't forget that main.py only works without embedded main script." msgstr "" #: thonny/plugins/microbit/__init__.py:102 msgid "Install latest MicroPython to BBC micro:bit" msgstr "" #: thonny/plugins/microbit/__init__.py:104 msgid "micro:bit location:" msgstr "" #: thonny/plugins/microbit/__init__.py:109 msgid "Version to be installed:" msgstr "" #: thonny/plugins/microbit/__init__.py:111 msgid "please wait" msgstr "" #: thonny/plugins/microbit/__init__.py:115 msgid "NB! All files on micro:bit will be deleted!" msgstr "" #: thonny/plugins/microbit/__init__.py:195 msgid "Installing ..." msgstr "" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "" #: thonny/plugins/microbit/__init__.py:199 msgid "You can now close this dialog." msgstr "" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "" #: thonny/plugins/micropython/__init__.py:301 msgid "Open the dialog for installing or upgrading MicroPython on your device" msgstr "" #: thonny/plugins/microbit/__init__.py:67 msgid "Could not find disk '%s'." msgstr "" #: thonny/plugins/microbit/__init__.py:69 msgid "Make sure you have micro:bit plugged in!" msgstr "" #: thonny/plugins/microbit/__init__.py:71 msgid "Do you want to continue and locate the disk yourself?" msgstr "" #: thonny/misc_utils.py:120 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "" #: thonny/misc_utils.py:123 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "" #: thonny/misc_utils.py:137 msgid "Can't find suitable disk" msgstr "" #: thonny/base_file_browser.py:259 msgid "%d items" msgstr "" #: thonny/base_file_browser.py:581 msgid "Move to Recycle Bin" msgstr "" #: thonny/base_file_browser.py:583 msgid "Move to Trash" msgstr "" #: thonny/base_file_browser.py:586 msgid "Delete" msgstr "" #: thonny/base_file_browser.py:589 msgid "New directory" msgstr "" #: thonny/base_file_browser.py:592 msgid "Properties" msgstr "" #: thonny/base_file_browser.py:593 msgid "Storage space" msgstr "" #: thonny/base_file_browser.py:603 msgid "Path" msgstr "" #: thonny/base_file_browser.py:605 msgid "Directory properties" msgstr "" #: thonny/base_file_browser.py:607 msgid "File properties" msgstr "" #: thonny/base_file_browser.py:609 msgid "bytes" msgstr "" #: thonny/base_file_browser.py:612 msgid "Size" msgstr "" #: thonny/base_file_browser.py:623 msgid "Modified" msgstr "" #: thonny/base_file_browser.py:679 msgid "Deleting %s" msgstr "" #: thonny/base_file_browser.py:701 msgid "Moving %s to %s" msgstr "" #: thonny/code.py:203 msgid "Loading" msgstr "" #: thonny/code.py:297 msgid "Saving" msgstr "" #: thonny/running.py:1408 msgid "Working..." msgstr "" #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "" #: thonny/plugins/files.py:206 msgid "Upload to %s" msgstr "" #: thonny/plugins/files.py:261 msgid "Downloading %s to %s" msgstr "" #: thonny/plugins/files.py:267 msgid "Download to %s" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9348638 thonny-4.1.7/thonny/locale/es_ES/0000755000076600000240000000000014730055627017172 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.093565 thonny-4.1.7/thonny/locale/es_ES/HELP_CONTENT/0000755000076600000240000000000014730055627021114 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/es_ES/HELP_CONTENT/debuggers.rst0000644000076600000240000001100214417536743023614 0ustar00aivarannamaastaffUso de depuradores ================== Si quieres ver cómo Python ejecuta tu programa paso a paso, entonces debes ejecutarlo en el "modo de depuración" o "más rápido". También puedes ejecutarlo con `Birdseye `_ y explorar los pasos de ejecución más tarde. Modo "mejor" ------------ Este modo se recomienda para los principiantes totales. Comience seleccionando *Depura el guión actual (mejor)* en el menú *Ejecutar* o pulsando Ctrl+F5 (`en XFCE necesitas usar Shift+Ctrl+F5 `__). Verás que la primera sentencia del programa se resalta y no ocurre nada más. En este modo necesita notificar a Thonny que está listo para dejar que Python haga el siguiente paso. Para ello tienes dos opciones principales: *Ejecutar → Saltando* (o F6) realiza pasos grandes, es decir, ejecuta el código resaltado y resalta la siguiente parte del código. *Ejecutar → Entrando* (o F7) intenta dar pasos más pequeños. Si el código resaltado está hecho de partes más pequeñas (declaraciones o expresiones), entonces la primera de ellas se resalta y Thonny espera el siguiente comando. Si ha llegado a un componente del programa que no tiene subpartes (por ejemplo, un nombre de variable) entonces *Paso a* funciona como *Paso a*, es decir, ejecuta (o evalúa) el código. Si ha entrado en las profundidades de una sentencia o expresión y quiere avanzar más rápido, entonces puede usar *Ejecutar → Saliendo*, que ejecuta el código actualmente resaltado y todas las partes siguientes del programa en el mismo nivel. Hay un comando un poco similar llamado *Reanudar*, que ejecutará el comando sin salirse hasta que se complete (o hasta el siguiente punto de interrupción, ver más abajo). Si accidentalmente hiciste un gran paso y pasaste por encima de una parte interesante del código, puede **retroceder el paso** seleccionando *Ejecutar → Volver atrás*. Thonny mostrará el estado del programa tal y como estaba antes del último paso. Ahora puede continuar con pequeños pasos y hacer zoom en este trozo de código. (¿Cómo funciona? Incluso cuando usted da un gran paso, Thonny guarda todos los estados intermedios del programa, que puede reproducir después de dar el paso atrás). Si quieres llegar a una parte específica del código, entonces puedes acelerar el proceso colocando el cursor en esa línea y seleccionando *Ejecutar → Ejecutar hasta el cursor*. Esto hace que Thonny se desplace automáticamente hasta esa línea. A partir de ahí puede tomar el comando. Si tiene activados los números de línea del editor (Herramientas → Opciones → Editor), entonces puede también usar **puntos de ruptura**. Cuando hace doble clic junto a una sentencia en el margen izquierdo del editor, un punto aparece. Cuando ahora inicie el depurador, no se detendrá antes de la primera sentencia, sino que correrá hasta la declaración marcada con el punto, también conocido como punto de interrupción. Puede colocar tantos puntos de interrupción en sus programas como necesarios. Los puntos de interrupción se pueden eliminar haciendo doble clic en los puntos. Modo "rápido" ------------- Cuando tus programas crecen, puedes notar que dar grandes pasos con el depurador más bonito lleva a veces mucho tiempo. Esto se debe a que las sutilezas (por ejemplo, la posibilidad de pasar por la evaluación de expresiones y dar pasos atrás) requieren una maquinaria pesada y lenta. Con *Depura el script actual (rápidamente)* se pierden las sutilezas pero se puede recorrer el programa mucho más rápido. Puede usar los mismos comandos (excepto "Paso atrás") que con un depurador más agradable. Este es el estilo de depuración al que la mayoría de los programadores programadores profesionales están acostumbrados. Diferentes estilos para mostrar la pila de llamadas --------------------------------------------------- Por defecto, Thonny utiliza ventanas apiladas para presentar la pila de llamadas. Esto da una buena intuición sobre el concepto, pero puede llegar a ser engorroso de usar. Por ello, desde la versión 3.0 se puede elegir entre dos estilos diferentes para presentar la pila de llamadas. En "Herramientas → Opciones → Ejecutar y Depura" se puede cambiar a un estilo más tradicional con una vista separada para presentar y cambiar los marcos de llamadas. Tenga en cuenta que ambos estilos se pueden utilizar con ambos modos de depuración. Birdseye -------- El comando *Depura el script actual (birdseye)* se explica en una `página separada `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/es_ES/HELP_CONTENT/debugging.rst0000644000076600000240000001251014417536743023605 0ustar00aivarannamaastaffTécnicas de depuración ====================== Si tu programa no funciona correctamente, no te asustes. Tienes varias posibilidades para arreglar la situación. Por ejemplo: * Dejar que otra persona lo arregle. * Cambiar *algo* en el código y volver a intentarlo. * Aborda el problema en dos fases: 1) diagnosticar el problema y 2) solucionarlo. Pedir ayuda puede ser una muy buena idea, pero no te dará esta dulce sensación de logro. De todos modos, es mejor no usar esto sin antes hacer un esfuerzo por tu cuenta. Si tus programas son pequeños, puede que te toque el premio gordo cambiando algo al azar e intentándolo de nuevo (repite muchas veces), pero perderás aunque ganes ya que no aprenderás nada. Si quieres llegar a ser bueno en la programación, entonces realmente necesitas abordar el problema de forma más sistemática. Esto significa, entre otras cosas, que tienes que identificar la razón por la que tu programa se comporta mal antes de intentar arreglarlo. El proceso de encontrar el origen del problema se llama *depuración*. Rastrear el flujo del programa / pensar con Python -------------------------------------------------- Lo más probable es que tu programa no esté del todo mal. Puede haber un error tipográfico en alguna parte o que hayas pasado por alto o malinterpretado algo. *¡NB! No te acostumbres a pensar que Python te ha malinterpretado -- es una máquina que ni siquiera intenta entenderte*. La clave de la depuración es encontrar precisamente dónde y cuándo tus suposiciones sobre el comportamiento del programa divergen del comportamiento real. Si su programa imprime una respuesta final incorrecta, esto le dice algo sobre el comportamiento del programa, pero normalmente no es suficiente para localizar el problema con precisión. También debe comprobar qué **pasos intermedios** se ajustan a sus suposiciones y cuáles no. Una técnica obvia (y muy útil) es añadir **sentencias de impresión adicionales** en el código, que te digan dónde está Python y qué ha logrado hasta ahora, por ejemplo .. code:: print("amigos antes del bucle for", amigos) NOTA. A veces es necesario introducir nuevas variables y dividir expresiones complejas en partes más pequeñas para imprimir información más detallada. Aunque la *depuración con prints* es utilizada incluso por los profesionales (pueden llamarlo *logging*), hay una alternativa, que es más cómoda en la mayoría de los casos. Se llama **recorrer el código** y es el pan de cada día de Thonny. Pasa al capítulo `Uso de depuradores `_ para saber más. Revisión de código ------------------ Otra técnica útil es la revisión del código. Es algo similar a trazar el flujo del programa, pero lo haces en tu cabeza y estás tratando de ver la imagen más grande en lugar de seguir pequeños pasos. Observa cada una de las sentencias de tu código e intenta comprender su propósito y cómo se relaciona con tu tarea. Para cada **variable**, pregúntate: * ¿El nombre de la variable revela su propósito? ¿Es mejor nombrarla en singular o en plural? * ¿Qué tipo de valores puede contener esta variable? ¿Cadenas, enteros, listas de cadenas, listas de flotantes, ...? * ¿Cuál es la función de la variable? ¿Está destinada a actualizarse repetidamente para que eventualmente contenga información útil? ¿Está pensada para utilizar la misma información en varios lugares y reducir el copiado? ¿Algo más? Para cada **bucle**, pregúntate: * ¿Cómo sabes que el bucle es necesario? * ¿Cuántas veces debe ejecutarse el cuerpo del bucle? ¿De qué depende esto? * ¿Qué código debe estar dentro del bucle y cuál fuera? * ¿Qué debe hacerse antes del bucle y qué debe hacerse después? Para cada **expresión** compleja pregúntese * ¿En qué orden deben estar los pasos de evaluación de esta expresión? ¿Está Python de acuerdo con esto? En caso de duda, utilice el depurador o introduzca variables de ayuda y divida la expresión en partes más pequeñas. * ¿Qué tipo de valor debería salir de esta expresión? ¿Cadenas? ¿Lista de cadenas? También es posible que te falten algunas partes importantes en tu programa: * ¿Su tarea requiere tratar diferentes situaciones de forma diferente? Si la respuesta es afirmativa, es probable que necesite una sentencia if. * ¿La tarea requiere hacer algo varias veces? En caso afirmativo, probablemente necesite un bucle. ¿Sigue perdiendo el hilo? ------------------------- "Encuentre el lugar donde se rompen sus suposiciones" - esto es definitivamente más fácil de decir que de hacer. En el caso de programas complejos es fácil llegar a la situación en la que ya no estás seguro de lo que asumes y de por qué empezaste con esto de la programación. En este caso es útil simplificar tu tarea tanto como sea posible y tratar de implementar el problema más simple primero. Toma un nuevo editor y empieza desde cero o copia el código existente y desecha todo lo que no sea esencial para el problema. Por ejemplo, puedes asumir que el usuario es cooperativo y que siempre introduce datos "buenos". Si la tarea requiere hacer algo repetidamente, entonces elimine la parte "repetidamente", si la tarea implica una condición compleja para hacer algo, haga la condición más simple, etc. Después de resolver el problema simplificado, estarás mucho mejor equipado para resolver también la tarea original. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/es_ES/HELP_CONTENT/errors.rst0000644000076600000240000000415414417536743023173 0ustar00aivarannamaastaffComprender los errores ====================== Si tu programa da errores o resultados erróneos, no intentes arreglar nada antes de entender el problema. Puedes leer una historia más larga en `otra página `__, aquí tienes una lista de comprobación rápida para poner en marcha tus ideas. ¿Tienes miedo? -------------- No lo tengas. Los mensajes de error están pensados para ayudar. Si recibes un error no significa que seas una mala persona. Y no, no has roto el ordenador. Aunque los mensajes de error pueden parecer un bloque de galimatías al principio, con la práctica es posible extraer información útil de ellos. ¿En qué parte del código se produjo el error? --------------------------------------------- Los mensajes de error en Thonny tienen enlaces que te llevan al lugar del código que causó el error. En el caso de varios enlaces, el último suele ser el más relevante. Si el error ocurrió dentro de una función, entonces el mensaje tiene varios enlaces. Intente hacer clic en ellos uno a uno de arriba a abajo y verá cómo Python llegó al lugar del error. Este conjunto de enlaces se llama *el seguimiento de la pila*. ¿Qué significa el error? ------------------------ La última línea del bloque de error dice cuál fue el problema para Python. Cuando intentes comprender el mensaje, no olvides el contexto y trata de relacionar algunas partes del mensaje con el lugar vinculado en el código. A veces el Asistente de Thonny puede explicar el error en términos más sencillos, a veces hay que hacer una búsqueda en internet del mensaje (no olvides añadir "Python" a la búsqueda). ¿Qué había dentro de las variables en el momento del error? ----------------------------------------------------------- ¡Abre la vista de variables y mira tú mismo! Si el error ocurrió dentro de una función, entonces puedes ver las variables locales haciendo clic en el seguimiento de la pila. ¿Cómo llegó el programa a este estado? -------------------------------------- Vea `la página sobre depuración `_ o `la página sobre el uso de los depuradores de Thonny `_. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0942376 thonny-4.1.7/thonny/locale/es_ES/LC_MESSAGES/0000755000076600000240000000000014730055627020757 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/es_ES/LC_MESSAGES/thonny.mo0000644000076600000240000011000314670256721022627 0ustar00aivarannamaastaff &$G)l  &!#DB&   .02Gz  x ' 5 I T &d     ; !*!?!GE! !!!! ! !! !!|"" "G""###1#<K#%#*####$$!$'$<$\$z$3$$$$% % %!%1%9%@%S%h%!% %3%%%L &W&(w&)&& &B&-'2'A'V'[' b'n'%'''/'(.(K( Q(](d( k(u( z((((( ( ( ((() )) ) ,) 7)C).U))="* `*l*u** * *+**0* + ++61+h++++++++++{,L,m,F<--WK.m.C/U/h/7~/// /////0)0H0 ]0k0 ~00 00$003011"1+1A1P1X1 ]1i1n1 v11111%131/2L2z!3%3;3(3'4>4Q4 d41r4 444455/585J5 [5i5|5n55,606<.7k7,7U,888 88n8 99 =9 K9 Y9g9m9~99?9C9:1:'O:)w: :::::;.;?;T;6\;T; ;;;; <<&<H.<5w<<<< <<<<=&=7=S=:[=====$=&=>$>4>=>E>Z>l> > > >>> >(>>?? %?B2?u?z? ??? ?&?? ?? @ @'@)7@+a@@ @+@@@ @ @@A "A"0ASAXA gA uA A A AA AAAA AB B #B.B2LB8B:BB C C0CNC`CrCC C CCC-CC C DD D&D+D @D MD)[DDDDD$D DDDDE En$E!E EEE:F GGbG^"HjHH/H.III"J*J:JIJ!OJ qJJJJ0J JJ JJK)K,K4KIK^K mK2zK%K!KKK LLL(#L.LL{LLLLBL%MMMNCNN N NO OO1O%JO%pOVOIO 7PCP SP^P Q%Q'RJ?R RRRR;R* S.5SHdS*S S SSS T>T>NTMTT TTUUUUUU7U*3V^V gVrVVQVVW)W]1WWWWW W WWWWXX X^XLYSYjYsYYDY-Y1ZIZaZtZZZZZ#Z'Z [=)[!g[&[[[[ [[[ \ \%\'@\,h\ \6\$\_\]]0{]0]]]G ^S^Y^h^|^^ ^^0^^!^;_X_1w_____ ____`$`,`A`U`m``` `` ` ` ```1aFaBa;bMbVbpbxbb9bbHb.c4cKc=gcc%cc#d!'dIdPdbded nd|djepeZeSfTgxUg9gh"#hCFhhh hhhhhh)i2i IiWi kivi ii:iiFi2j 8jDjKjdjuj~jjjj jjj j(j%k0.k?_kkl:m?Nm9mmmmn;!n&]n*nnnnn oo*o?oQokoXoo3p9 qKFqq11r[crrrr rxrms,~s s s sssssJtQNt%t(t(t2u KuWu%gu+u2uuvv6v@Gvcv vvvw ww5wH=wFww wwwx x0(xYxkx"}xx=xxxxy)%yFOy yy yyy&yz'z ;zGzWzhz}z7zzzzz[ {h{ p{ z{{ {{8{ {{' |2|B|W|4o|6|| |4|#},}5}H}\}%v}}*}}}~~%~:~ N~ [~e~ t~~~~~~~.>2ZqF/7BG* /1< n x܁>5=EU3lɂ)qǃJ΄)a`Oq"78p6I \}" %+.G5O ȉ߉   28=9v2  #!AE dJ UGLQdm s:)Ž,bV| ӏ%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: es Language-Team: es Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d ítemes%s no se parece a un archivo de texto(Reinicia Thonny luego de cambiar esto)(utilizado al hacer clic en el botón Depurar de la barra de herramientas)Sobre BirdseyeAcerca de ThonnyActiva entorno virtualInstalación / Actualización / Desactualización avanzadasPermitir solamente una instancia de ThonnyPermitir la ejecución de programas sin nombrePermitir entrar en librerías fuera del directorio principal del script.¿Está seguro de que desea desinstalarlo?AsistenteAtributosAutenticaciónAutorAutocompletarProponer automáticamente las compleciones mientras se escribeMostrar automáticamente la documentación de las complecionesMostrar automáticamente la información de parámetros luego de escribir '('AtrásVolver a %sVolver al marco actualDirectorio incorrectoBirdseye es un depurador de Python que debe instalarse por separado. ¿Desea abrir la página de ayuda y obtener más información?Puerto para BirdsyeNavegar por los paquetesRastreador de erroresAún no se puede cerrarNo se pudo encontrar el nombre del paquete en la lista:No es posible encontrar un disco apropiadoCancelarCancelandoSensible a mayúsculasCambiar tamaño de fuenteCambia directorio de trabajo a directorio del script en la Ejecución/DepuraciónCircuitPython (genérico)Dispositivo CircuitPythonLimpiarLimpiar Consola antes de iniciar un nuevo proceso (Ejecutar, Depurar, Detener/Reiniciar, ...)Limpiar consolaClickClic CerrarCerrar todosCerrar otrosComando no disponibleConvertir en comentarioLa configuración ha sido actualizada. Reinicia Thonny para empezar a trabajar de manera normal. (Ver 'Herramientas → Opciones → General' si cambias de opinión más tarde.)Configurando %s archivosConfigurar interprete...ConfirmaciónConecte su dispositivo a la computadora y seleccione el puerto correspondiente a continuaciónCopiarCopiar al portapapelesCopiandoCopiando %s a %sDefinición no encontradaNo se pudo encontrar el disco '%s'. ¿Quieres localizarlo tú mismo?No se ha podido encontrar el paquete en PyPI.No se encontró información del paquete en PyPI.No se ha podido guardarCreando directorioCreando ambiente virtual.CortarDatosDepurarDepurar el script actualDepurar el script actual (birdseye)Depurar el script actual (rápidamente)Depurar el script actual (mejor)Modo de depuración (con diagnóstico detallado de registros)Disminuir el tamaño de la fuenteDes-indentar las líneas seleccionadasContraseña por defectoEliminarBorrandoBorrando %sVersión deseadaDetallesDispositivo ¿Quisiste decir '%s'? Propiedades del directorioDesactivar los sonidos de notificaciónDesactivar comprobaciones (un id por línea)Desconectar¿Sigue queriendo utilizar este nombre para su script?¿Quieres cerrar también el editor?¿Quieres descartar el contenido actual del editor y volver a cargar el archivo desde el disco?¿Quieres sobreescribir '%s'?¿Desea guardar los archivos antes de cerrarlos?¿Desea guardar los archivos antes de cerrarlos?Anclar las ventanas de usuarioDocumentaciónNo olvide que main.py solo funciona sin un script principal incrustado.AbajoDescargar a %sDescargando %s a %sEditarEditorLetra editorIngresa un número enteroIngrese el nombre para el nuevo directorio en %sIngresa un nuevo nombreIntroducir la cadena a sustituir.Ingrese la frase de contraseña de su clave privada para {}Ingrese su contraseña para {}Variables de Entorno (una CLAVE=VALOR por línea)ErrorCódigo de error:Error:EventosExcepciónSalirSalir de ThonnyExportar registros de uso...Modificación externaFicheroEl archivo ya existeEl archivo no estáEl archivo esta abiertoNombre de archivo:Propiedades del archivoArchivosEncontrarEncontrar y reemplazar…Encontrar:Ir al editorCentrarse enIr al terminalModo de escalado de fuentePara depurar se debe guardar primero el programa.Por razones de rendimiento, la consola evita mostrar líneas muy largas (ver Herramientas → Opciones → Consola). Aquí puedes interactuar con el fragmento de texto original.Se encontraron varios discos '%s'. ¿Quieres elegir uno tú mismo?Pantalla completaFunciónLlamada de función en %sGeneralIr a la líneaIr a la línea...Se ha producido un error de permiso al intentar cargar %sMontículo (heap)Modo heap (montículo) activado. Seleccione "Vista heap" para cerrarlo. AyudaContenidos de la AyudaNo mostrar archivos ocultosResaltar la línea actual (requiere abrir de nuevo el editor)Resaltar las variables localesResaltar las coincidencias de nombresResaltar los paréntesisResaltar los elementos sintácticosResaltar los caracteres tabuladorInicioPágina principalIDINSTALARLetra Ent/SalSi se trata de un archivo de texto, puede configurarlo para que se abra en Thonny haciendo clic con el botón derecho y seleccionando "Configurar... archivos".Si el último comando generó una excepción, esta vista mostrará el seguimiento de la pila (stacktrace).Si el archivo debe abrirse en una aplicación externa, descárgalo en un directorio local y ábrelo desde allí.Si no puede encontrarlo, es posible que primero deba instalar el controlador USB adecuado.Si no sabes dónde está el paquete, probablemente querrás buscarlo en Python Package Index. Entonces introduce el nombre del paquete en la caja de búsqueda y pulsa ENTERSi nombras tu script '%s', no podrás importar el módulo de biblioteca llamado '%s'Si se entrecomilla el valor de una variable de entorno, las mismas formarán parte del valor. ¿Es esto lo que querías?Si aún lo desea, instálelo desde la línea de comandos.Aumentar tamaño de fuenteIndentar las líneas seleccionadasSangría con caracteres de tabulación (no recomendado para Python)ÍndiceInfoInformaciónInstalarInstala CircuitPythonInstala MicroPythonInstalar desde PyPIInstalar desde archivo localInstalar desde archivo "requirements.txt"Instala o actualiza %sInstalado en:Versión instalada:InstalandoInstalando '%s'IntérpreteInterrumpir ejecuciónInterrumpir el programa de en funcionamiento al conectarseDentroMantener la terminal abierta luego de que el proceso de Python termineLlaveID de LlaveIdiomaÚltima versión estableÚltima versiónLicenciaLíneaNúmero de líneaCargarCargandoCargando %sPython 3 localVariables localesUbicaciónRegistra los eventos de uso del programaParece que '%s' fue borrado o movido.Parece que '%s' fue modificado fuera del editor.Parece que el archivo o carpeta no tiene permisos de escritura.Parece que estás instalando un paquete relacionado con Thonny. Si lo que querías es instalar un plugin de Thonny, entonces deberías elegir 'Herramientas → Administrar plugins…' ¿Seguro que quieres instalar %s para el back-end?Hecho en la Universidad de Tartu, Estonia, con la ayuda de la comunidad de código abierto, la Raspberry Pi Foundation y Cybernetica ASConvierte los scripts con shebang guardados en ejecutablesAsegúrese de que MicroPython se haya instalado en su micro:bitConvierte los scripts con shebang cargados en ejecutablesAdministrar paquetes para %sGestionar paquetes...Administra plugins…Maximizar vistaMaxima longitud de un fragmento de texto antes de condensarNúmero máximo de líneas a mantener.Tal vez haga de la depuración más lenta.MicroPython (SSH)MicroPython (genérico)MicroPython (local)Dispositivo MicroPythonModificado¿Mover %s a la papelera?Mover / renombrar...Mover al basureroMoviendo %s a la papeleraMover a la papelera¡Aviso! El cierre automático debe estar habilitado en la configuración de la TerminalNB: El botón de selección de ficheros puede que no funcione bien cuando se seleccionen ejecutables de un entorno virtual. En este caso elegir el script 'activar' en vez del intérprete (o entrar el path –camino del fichero– directamente en la caja)¡Aviso! ¡Valores grandes degradan el rendimiento!NB! ¡Reinicia Thonny después de cambiar estas opciones!¡Aviso! ¡Algunos elementos de estilo cambiaran luego de reiniciar Thonny!¡NB! Debe haber otra versión disponible que sea compatible con la versión actual de Thonny. Click en el botón '…' para elegir la versión e instalarla.Nota: Thonny solo soporta Python %s y posteriores¡NB! Debe reiniciar Thonny después de instalar / actualizar / desinstalar un complemento.NombreNuevo programaNuevo DirectorioArchivo nuevoTambién se instalarán nuevos paquetes en este directorio. Otras ubicaciones deben gestionarse por medios alternativos.Objeto siguienteNo se encontraron líneas marcadas con #todoNo disponibleNo conectadoNo soportadoNotasNada seleccionadoOkInspector de objetosAbrir el asistente automáticamente cuando haya advertencias en tu códigoAbrir el asistente automáticamente cuando el programa falle y dé una excepciónAbre la carpeta de datos de Thonny…Abre la carpeta del código de Thonny…Abrir y cerrar el Stack automáticamenteAbrir valores evaluados en el inspector de objetosAbrir de %sAbrir en ThonnyAbrir en el editor de texto de ThonnyAbrir en la aplicación externa por defectoAbrir en la aplicación predeterminada del sistemaAbrir en gestor de archivosAbrir moviola…Abre el shell del sistema…Abrir fichero...No es posible abrir archivos remotos en una aplicación externa.Abre la vista Pila en la primera llamada y la cierra cuando el programa regresa al marco principal.Opciones...SalirEsquemaSaltar¿Sobreescribir?Sobrescribir tema '%s PaqueteEl paquete '{}' es requerido para instalar y desinstalar otros paquetes.El administrador de paquetes no está disponible para este intérpreteDirectorio de paquetesContraseñaPegarFallo de pegadoRutaRealizar comprobaciones MyPyRealizar las comprobaciones Pylint seleccionadasError de permisosError de permisos¡Por favor revisa tu ortografía!PlóterPlóter visualiza series de números mostradas en la consola.PuertoPuerto o WebREPLProblema potencialDepurador preferidoPreparaciones (salta la parte de VS Code)Continuar con el REPL de Python luego de la finalización del programaPrevisualizarObjeto anteriorImprimir...ProblemaProblema al cargar el archivoParámetros de ejecución del programaArgumentos del programa:Árbol del programaPropiedadesPágina de PyPIModo Pygame ZeroEjecutable de PythonArchivos PythonLos archivos de Python suelen llevar la extensión .py.Intérpretes de PythonSalir¿Desea desinstalarlo?Archivos recientesLongitud de línea máxima recomendada (establecer a 0 para desactivar el margen de línea)RehacerRefrescarModo regularPython 3 Remoto (SSH)RenombrarRenombrar '%s'Volver a abrir todos los archivos de la sesión anteriorReemplazarReemplazar todoReemplazar los tabuladores por espaciosReemplazar por:Reemplazar+EncontrarInformar de un problemaPedir que se complete con la tecla Tab en la consolaPedir que se complete con la tecla Tab en los editoresRequiereRequiere:Reiniciar el intérprete antes de ejecutar un scriptReanudarEjecutarEjecutar y DepurarEjecutar / reanudarEjecutar el script actualEjecutar el script actual en terminalEjecutar hasta el cursorEjecutando el script actual en la terminalGuardarGuardar todos los ficherosGuardar al cerrarGuardar como...Guardar una copia...Guardar contraseñaGuardar a %sGuardandoGuardando a %sBuscar en micropython-lib y PyPIBuscar en PyPIResultados de la búsquedaBuscandoVea Ayuda para detalles.Seleccionar todoSeleccionar todoSeleccione un artículo y vuelva a intentarlo.Seleccione un directorio vacío para el nuevo entorno virtual.Seleccione si los cuadros de diálogo del archivo terminan detrás de la ventana principalEl directorio seleccionado no está vacío. Seleccione otro o cancele.Envía EOF / Reinicio suaveConsolaMuestra PlotterMuestra en ventanas separadas los entornos cada llamada a funciónMostrar archivos ocultosMostrar números de líneaMostrar información sobre los parámetrosTamañoTamaño (bytes)Código fuenteTexto reducido (%d caracteres)Pila (stack)Comience seleccionando el paquete de la izquierdaIniciandoVolver atrásEntrarSalirSaltarDetenerDetener/Reiniciar back-endInformación de almacenamientoEspacio de almacenamientoEspacio de almacenamiento en esta unidad o sistema de archivosResumenSoporteApoya a UcraniaCambiar a modo regularSincronizar el reloj de tiempo real del dispositivoColor SintaxisPORHACERDestinoTerminalEmulación de terminalLa respuesta esLa representación de arriba es un valor aproximado de este 'float'. El valor almacenado exacto es %s, que es aproximadamente %sNo se ha encontrado el texto especificadoTemas y FuentesHay carpetas con conflictosEsta casilla es para sus notas de trabajo -- instrucciones de asignación, fragmentos de código, o similares. Todo se guardará automáticamente y se cargará cuando abra Thonny la próxima vez. Sírvase borrar este texto para hacer sitio a sus propias notas.Este comando no está disponible si Thonny se ejecuta a través de FlatpakEste computadorEste cuadro de diálogo es para administrar los complementos de Thonny y sus dependencias. Si desea instalar paquetes para sus propios programas, elija 'Herramientas → Administrar paquetes ...'Este diálogo lista todos los paquetes disponibles, pero sólo actualiza y desinstala paquetes deEsto no se parece al paquete MicroPython/CircuitPython. ¿Está seguro de que quiere instalarlo?Este archivo ya está abierto en Thonny. Si desea guardar con este nombre, ¡cierre primero el editor existente!Este es un comentarioEste paquete requiere una versión diferente de Thonny:Este programa viene completamente sin garantía. Es software libre, por lo que puede redistribuirse bajo unas determinadas condiciones: véase https://opensource.org/licenses/MIT para más detallesOpciones de ThonnyPlug-ins de ThonnyPlugin the Thonny sin requisitosEl Python de ThonnyActivar/desactivar como comentarioHerramientasIntente abrirlo con Archivo => Abrir.Intenta detectar el puerto automáticamenteModo Interfaz Usuario (IU)Factor de escalado de IUAspectoNo marcar si quiere una experiencia más tradicional.Desactivar como comentarioDeshacerDesinstalarDesinstalando '%s'Requisitos inadecuadosArribaActualizarActualizar dependenciasActualiza o desinstalaActualizando '%s'Subir a %sUtiliza la orden "Stop" si desea cancelar la depuraciónUse cuadros de diálogo de archivos Tk en lugar de ZenityUtilizar la hora local en el reloj de tiempo real ValorID de valorVariablesHistorial de versionesVisualizarVisualiza el script en Python TutorAdvertir si un módulo de usuario oculta un módulo de bibliotecaAdvertencia¿Qué hacer con un archivo %s cuando hace doble clic en él en el explorador de archivos de Thonny?¿Dónde guardar?¿Qué tipo de intérprete debe utilizar Thonny para ejecutar su código? Con el intérprete actual sólo puedes visualizar los paquetes aquí. Use 'Herramientas -> Abrir consola del sistema...' para instalar, actualizar o desinstalar.Ajustar texto (puede ser lento)Puedes activar un entorno virtual existente vía menú contextual haciendo click derecho en la navegación de ficheros cuando selecciones una carpeta de entorno virtual o el fichero 'pyveng.cfg' incluido.¡Debes seleccionar un archivo!Debe detener su programa antes de iniciar el administrador de paquetes.Zoomtodos los archivosbla, blabytesespacio libreaquíbuscar por un nombre de dispositivo, "USB Serial" o "UART"Sin directorio lib absoluto en 'sys.path'soporte para colores y estilos básicos ANSIpara localizar e instalar el fichero del paquete (usualmente con extensión .whl o .tar.gz o .zip)para localizar el fichero requirements.txt e instalar los paquetes allí especificadosespacio totalstring_sin_cerrarespacio ocupado././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/es_ES/LC_MESSAGES/thonny.po0000644000076600000240000015764214670256721022656 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: es\n" #: thonny/workbench.py:375 msgid "File" msgstr "Fichero" #: thonny/workbench.py:376 msgid "Edit" msgstr "Editar" #: thonny/workbench.py:377 msgid "View" msgstr "Visualizar" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Ejecutar" #: thonny/workbench.py:379 msgid "Tools" msgstr "Herramientas" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Ayuda" #: thonny/workbench.py:598 msgid "Exit" msgstr "Salir" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Disminuir el tamaño de la fuente" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Ir al editor" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Ir al terminal" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Maximizar vista" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Pantalla completa" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Parámetros de ejecución del programa" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Acerca de Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Hecho en la Universidad de Tartu, Estonia, con la ayuda de la comunidad de código abierto, la Raspberry Pi Foundation y Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Este programa viene completamente sin garantía. Es software libre, por lo que puede redistribuirse bajo unas determinadas condiciones: véase https://opensource.org/licenses/MIT para más detalles" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Historial de versiones" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Informar de un problema" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Abrir el asistente automáticamente cuando el programa falle y dé una excepción" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Abrir el asistente automáticamente cuando haya advertencias en tu código" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Realizar las comprobaciones Pylint seleccionadas" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Realizar comprobaciones MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Desactivar comprobaciones (un id por línea)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Asistente" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Autocompletar" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Intérprete" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Sobre Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye es un depurador de Python que debe instalarse por separado.\n" "\n" "¿Desea abrir la página de ayuda y obtener más información?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Depurar el script actual (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Activar/desactivar como comentario" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Convertir en comentario" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Desactivar como comentario" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Deshacer" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Rehacer" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Cortar" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Copiar" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Pegar" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Seleccionar todo" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Ejecutar hasta el cursor" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Aún no se puede cerrar" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Utiliza la orden \"Stop\" si desea cancelar la depuración" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Anclar las ventanas de usuario" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Resaltar las coincidencias de nombres" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Resaltar las variables locales" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Resaltar los paréntesis" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Resaltar los elementos sintácticos" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Resaltar la línea actual (requiere abrir de nuevo el editor)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Mostrar números de línea" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Longitud de línea máxima recomendada (establecer a 0 para desactivar el margen de línea)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exportar registros de uso..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Eventos" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Archivos" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Encontrar y reemplazar…" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Encontrar:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Reemplazar por:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Sensible a mayúsculas" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Arriba" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Abajo" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Encontrar" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Reemplazar" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Reemplazar+Encontrar" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Reemplazar todo" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Introducir la cadena a sustituir." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "No se ha encontrado el texto especificado" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Permitir solamente una instancia de Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Volver a abrir todos los archivos de la sesión anterior" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Desactivar los sonidos de notificación" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Modo de escalado de fuente" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Modo heap (montículo) activado. Seleccione \"Vista heap\" para cerrarlo.\n" "" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Montículo (heap)" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Idioma" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Esta casilla es para sus notas de trabajo -- instrucciones de asignación, fragmentos de código, o similares.\n" "\n" "Todo se guardará automáticamente y se cargará cuando abra Thonny la próxima vez.\n" "\n" "Sírvase borrar este texto para hacer sitio a sus propias notas." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notas" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Objeto anterior" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Objeto siguiente" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Inspector de objetos" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Esquema" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Modo Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Desinstalar" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Cerrar" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Clic " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "aquí" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Actualizar" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Instalar" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "No se ha podido encontrar el paquete en PyPI." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Última versión estable" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Última versión" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Resumen" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Página principal" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Rastreador de errores" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Documentación" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "Página de PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Requiere" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "¿Desea desinstalarlo?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "¿Está seguro de que desea desinstalarlo?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Volver al marco actual" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variables" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Este computador" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Refrescar" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Centrarse en" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Error" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "¡Debes seleccionar un archivo!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "¿Sobreescribir?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "¿Quieres sobreescribir '%s'?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Nuevo programa" #: thonny/editors.py:671 msgid "Open..." msgstr "Abrir fichero..." #: thonny/editors.py:673 msgid "Load" msgstr "Cargar" #: thonny/editors.py:682 msgid "Recent files" msgstr "Archivos recientes" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Cerrar todos" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Guardar" #: thonny/editors.py:739 msgid "Save as..." msgstr "Guardar como..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Guardar una copia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Opciones de Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "Ejecutar el script actual" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Ejecutar el script actual en terminal" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Detener/Reiniciar back-end" #: thonny/running.py:205 msgid "Stop" msgstr "Detener" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Interrumpir ejecución" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Envía EOF / Reinicio suave" #: thonny/running.py:240 msgid "Disconnect" msgstr "Desconectar" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Intérpretes de Python" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "todos los archivos" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Seleccione un directorio vacío para el nuevo entorno virtual." #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Directorio incorrecto" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "El directorio seleccionado no está vacío.\n" "Seleccione otro o cancele." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Creando ambiente virtual." #: thonny/shell.py:101 msgid "Clear shell" msgstr "Limpiar consola" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plóter" #: thonny/shell.py:317 msgid "Clear" msgstr "Limpiar" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Muestra Plotter" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Por razones de rendimiento, la consola evita mostrar líneas muy largas (ver Herramientas → Opciones → Consola).\n" "Aquí puedes interactuar con el fragmento de texto original." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Ajustar texto (puede ser lento)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Texto reducido (%d caracteres)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plóter visualiza series de números mostradas en la consola." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Vea Ayuda para detalles." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Cerrar otros" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Copiando" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Copiando\n" " %s\n" "a\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Cancelar" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "Ok" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Seleccionar todo" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Consola" #: thonny/workbench.py:608 msgid "Options..." msgstr "Opciones..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Aumentar tamaño de fuente" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Cambiar tamaño de fuente" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Salir de Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Salir" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Sobrescribir tema '%s " #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Argumentos del programa:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Modo regular" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "La configuración ha sido actualizada. Reinicia Thonny para empezar a trabajar de manera normal.\n" "\n" "(Ver 'Herramientas → Opciones → General' si cambias de opinión más tarde.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Árbol del programa" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Reanudar" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Ejecutar / reanudar" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Depurar el script actual" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Depurar" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Depurar el script actual (mejor)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Depurar el script actual (rápidamente)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Saltar" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Saltar" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Entrar" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Dentro" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Salir" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Salir" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Volver atrás" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Atrás" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Pila (stack)" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Excepción" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Registra los eventos de uso del programa" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Modo de depuración (con diagnóstico detallado de registros)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Modo Interfaz Usuario (IU)" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Factor de escalado de IU" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! ¡Reinicia Thonny después de cambiar estas opciones!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "General" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALAR" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Navegar por los paquetes" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Con el intérprete actual sólo puedes visualizar los paquetes aquí.\n" "Use 'Herramientas -> Abrir consola del sistema...' para instalar, actualizar o desinstalar." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Directorio de paquetes" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instalar desde PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Si no sabes dónde está el paquete, probablemente querrás buscarlo en Python Package Index. Entonces introduce el nombre del paquete en la caja de búsqueda y pulsa ENTER" #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "para localizar el fichero requirements.txt e instalar los paquetes allí especificados" #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Click" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "para localizar e instalar el fichero del paquete (usualmente con extensión .whl o .tar.gz o .zip)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Actualiza o desinstala" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Comience seleccionando el paquete de la izquierda" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Este diálogo lista todos los paquetes disponibles, pero sólo actualiza y desinstala paquetes de" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "También se instalarán nuevos paquetes en este directorio. Otras ubicaciones deben gestionarse por medios alternativos." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Versión instalada:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Instalado en:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "¡Por favor revisa tu ortografía!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "No se encontró información del paquete en PyPI." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Código de error:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "No se pudo encontrar el nombre del paquete en la lista:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "El paquete '{}' es requerido para instalar y desinstalar otros paquetes." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Paquete" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Administrar paquetes para %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Confirmación" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Parece que estás instalando un paquete relacionado con Thonny. Si lo que querías es instalar un plugin de Thonny, entonces deberías elegir 'Herramientas → Administrar plugins…'\n" "\n" "¿Seguro que quieres instalar %s para el back-end?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "¡NB! Debe haber otra versión disponible que sea compatible con la versión actual de Thonny. Click en el botón '…' para elegir la versión e instalarla." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Plugin the Thonny sin requisitos" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Requisitos inadecuados" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Este paquete requiere una versión diferente de Thonny:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Si aún lo desea, instálelo desde la línea de comandos." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "¡NB! Debe reiniciar Thonny después de instalar / actualizar / desinstalar un complemento." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Plug-ins de Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Instalación / Actualización / Desactualización avanzadas" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Versión deseada" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Actualizar dependencias" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Requiere:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Error:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Gestionar paquetes..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Administra plugins…" #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Abrir moviola…" #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Cambia directorio de trabajo a directorio del script en la Ejecución/Depuración" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Muestra en ventanas separadas los entornos cada llamada a función" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "No marcar si quiere una experiencia más tradicional." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Abrir y cerrar el Stack automáticamente" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Abre la vista Pila en la primera llamada y la cierra cuando el programa regresa al marco principal." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Permitir entrar en librerías fuera del directorio principal del script." #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Tal vez haga de la depuración más lenta." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Depurador preferido" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(utilizado al hacer clic en el botón Depurar de la barra de herramientas)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Puerto para Birdsye" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(Reinicia Thonny luego de cambiar esto)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Ejecutar y Depurar" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Emulación de terminal" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "soporte para colores y estilos básicos ANSI" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Número máximo de líneas a mantener." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "¡Aviso! ¡Valores grandes degradan el rendimiento!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maxima longitud de un fragmento de texto antes de condensar" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Ejecutando el script actual en la terminal" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Continuar con el REPL de Python luego de la finalización del programa" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Mantener la terminal abierta luego de que el proceso de Python termine" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "¡Aviso! El cierre automático debe estar habilitado en la configuración de la Terminal" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Aspecto" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Color Sintaxis" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Letra editor" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Letra Ent/Sal" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Previsualizar" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Este es un comentario" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "La respuesta es" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "string_sin_cerrar" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "¡Aviso! ¡Algunos elementos de estilo cambiaran luego de reiniciar Thonny!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Ingresa un número entero" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Temas y Fuentes" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Abre la carpeta del código de Thonny…" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Abre la carpeta de datos de Thonny…" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Inicio" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Contenidos de la Ayuda" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "Dispositivo CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "Dispositivo MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Conecte su dispositivo a la computadora y seleccione el puerto correspondiente a continuación" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "buscar por un nombre de dispositivo, \"USB Serial\" o \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Si no puede encontrarlo, es posible que primero deba instalar el controlador USB adecuado." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Puerto" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Intenta detectar el puerto automáticamente" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (genérico)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Imprimir..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Abre el shell del sistema…" #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Detalles" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instalar desde archivo \"requirements.txt\"" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instalar desde archivo local" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Este cuadro de diálogo es para administrar los complementos de Thonny y sus dependencias.\n" "Si desea instalar paquetes para sus propios programas, elija 'Herramientas → Administrar paquetes ...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (genérico)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Indentar las líneas seleccionadas" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Des-indentar las líneas seleccionadas" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Cambiar a modo regular" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Asegúrese de que MicroPython se haya instalado en su micro:bit" #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "No olvide que main.py solo funciona sin un script principal incrustado." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "No se pudo encontrar el disco '%s'. ¿Quieres localizarlo tú mismo?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Se encontraron varios discos '%s'. ¿Quieres elegir uno tú mismo?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "No es posible encontrar un disco apropiado" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d ítemes" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Mover al basurero" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Eliminar" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Nuevo Directorio" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Propiedades" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Espacio de almacenamiento" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Ruta" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Propiedades del directorio" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Propiedades del archivo" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Tamaño" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Modificado" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Borrando %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Cargando" #: thonny/editors.py:395 msgid "Saving" msgstr "Guardando" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Subir a %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Descargando %s a %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Descargar a %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Abrir en gestor de archivos" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "No mostrar archivos ocultos" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Mostrar archivos ocultos" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Abrir en Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Abrir en la aplicación predeterminada del sistema" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Configurando %s archivos" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "¿Qué hacer con un archivo %s cuando hace doble clic en él en el explorador de archivos de Thonny?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Borrando" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Creando directorio" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Cargando %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Guardando a %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Guardar todos los ficheros" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Configurar interprete..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Dispositivo" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Cancelando" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Iniciando" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Autenticación" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Ingrese la frase de contraseña de su clave privada para\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Ingrese su contraseña para\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "La representación de arriba es un valor aproximado de este 'float'. El valor almacenado exacto es %s, que es aproximadamente %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Resultados de la búsqueda" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Buscando" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Instalando '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Actualizando '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Desinstalando '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Instalando" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "El administrador de paquetes no está disponible para este intérprete" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "No soportado" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "No disponible" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Debe detener su programa antes de iniciar el administrador de paquetes." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Abrir valores evaluados en el inspector de objetos" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Ejecutable de Python" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB: El botón de selección de ficheros puede que no funcione bien cuando se seleccionen ejecutables de un entorno virtual. En este caso elegir el script 'activar' en vez del intérprete (o entrar el path –camino del fichero– directamente en la caja)" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 Remoto (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "No conectado" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "Sin directorio lib absoluto en 'sys.path'" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Buscar en PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Abrir en el editor de texto de Thonny" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Espacio de almacenamiento en esta unidad o sistema de archivos" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "espacio total" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "espacio ocupado" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "espacio libre" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Información de almacenamiento" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Reemplazar los tabuladores por espacios" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Resaltar los caracteres tabulador" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Sangría con caracteres de tabulación (no recomendado para Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Nombre" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Tamaño (bytes)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Ingrese el nombre para el nuevo directorio en\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Nada seleccionado" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Seleccione un artículo y vuelva a intentarlo." #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Abrir de %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Guardar a %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Nombre de archivo:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "ID de valor" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Valor" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Guardar contraseña" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Llamada de función en %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Variables locales" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Función" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Ubicación" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Si el último comando generó una excepción, esta vista mostrará el seguimiento de la pila (stacktrace)." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Datos" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atributos" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Índice" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "ID de Llave" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Llave" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Volver a\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Puerto o WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Contraseña" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Código fuente" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Use cuadros de diálogo de archivos Tk en lugar de Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Seleccione si los cuadros de diálogo del archivo terminan detrás de la ventana principal" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Variables de Entorno (una CLAVE=VALOR por línea)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Archivo nuevo" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Renombrar" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Renombrar '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Ingresa un nuevo nombre" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Fallo de pegado" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Hay carpetas con conflictos" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "El archivo ya existe" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Si se trata de un archivo de texto, puede configurarlo para que se abra en Thonny haciendo clic con el botón derecho y seleccionando \"Configurar... archivos\"." #: thonny/editors.py:38 msgid "Python files" msgstr "Archivos Python" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "El archivo no está" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "¿Quieres cerrar también el editor?" #: thonny/editors.py:169 msgid "External modification" msgstr "Modificación externa" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "¿Quieres descartar el contenido actual del editor y volver a cargar el archivo desde el disco?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Los archivos de Python suelen llevar la extensión .py." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr " ¿Quisiste decir '%s'? " #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Mover / renombrar..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Ir a la línea..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Número de línea" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "¿Desea guardar los archivos antes de cerrarlos?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "¿Desea guardar los archivos antes de cerrarlos?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Guardar al cerrar" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Comando no disponible" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Este comando no está disponible si Thonny se ejecuta a través de Flatpak" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Apoya a Ucrania" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "¿Qué tipo de intérprete debe utilizar Thonny para ejecutar su código? " #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Mostrar información sobre los parámetros" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Mostrar automáticamente la información de parámetros luego de escribir '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Proponer automáticamente las compleciones mientras se escribe" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Mostrar automáticamente la documentación de las compleciones" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Pedir que se complete con la tecla Tab en los editores" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Pedir que se complete con la tecla Tab en la consola" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problema" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Definición no encontrada" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Limpiar Consola antes de iniciar un nuevo proceso (Ejecutar, Depurar, Detener/Reiniciar, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "El Python de Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Interrumpir el programa de en funcionamiento al conectarse" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Sincronizar el reloj de tiempo real del dispositivo" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Utilizar la hora local en el reloj de tiempo real " #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Reiniciar el intérprete antes de ejecutar un script" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Esto no se parece al paquete MicroPython/CircuitPython.\n" "¿Está seguro de que quiere instalarlo?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Mover a la papelera" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "¿Mover %s a la papelera?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Moviendo %s a la papelera" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Abrir en la aplicación externa por defecto" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "No es posible abrir archivos remotos en una aplicación externa." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Si el archivo debe abrirse en una aplicación externa, descárgalo en un directorio local y ábrelo desde allí." #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Parece que '%s' fue borrado o movido." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Parece que '%s' fue modificado fuera del editor." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "Nota: Thonny solo soporta Python %s y posteriores" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Ir a la línea" #: thonny/workbench.py:703 msgid "Support" msgstr "Soporte" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "No se ha podido guardar" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Advertencia" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Si se entrecomilla el valor de una variable de entorno, las mismas formarán parte del valor.\n" "¿Es esto lo que querías?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Instala MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Instala CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Convierte los scripts con shebang cargados en ejecutables" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Convierte los scripts con shebang guardados en ejecutables" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Activa entorno virtual" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Destino" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualiza el script en Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Línea" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "No se encontraron líneas marcadas con #todo" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "PORHACER" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Instala o actualiza %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Python 3 local" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Puedes activar un entorno virtual existente vía menú contextual haciendo click derecho en la navegación de ficheros cuando selecciones una carpeta de entorno virtual o el fichero 'pyveng.cfg' incluido." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Preparaciones (salta la parte de VS Code)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Contraseña por defecto" #: thonny/running.py:392 msgid "Information" msgstr "Información" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Para depurar se debe guardar primero el programa." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s no se parece a un archivo de texto" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problema al cargar el archivo" #: thonny/editors.py:220 #, fuzzy msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Este archivo parece tener problemas con la codificación.\n" "\n" "Asegúrese de que se encuentra en UTF-8 o contiene la pista de codificación adecuada." #: thonny/editors.py:295 msgid "File is open" msgstr "El archivo esta abierto" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Este archivo ya está abierto en Thonny.\n" "\n" "Si desea guardar con este nombre,\n" "¡cierre primero el editor existente!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Error de permisos" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Parece que el archivo o carpeta no tiene permisos de escritura." #: thonny/editors.py:414 #, fuzzy msgid "Back-end is not ready" msgstr "La infraestructura no esta lista" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "¿Dónde guardar?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Problema potencial" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Si nombras tu script '%s', no podrás importar el módulo de biblioteca llamado '%s'" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "¿Sigue queriendo utilizar este nombre para su script?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Se ha producido un error de permiso al intentar cargar\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Intente abrirlo con Archivo => Abrir." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Error de permisos" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Permitir la ejecución de programas sin nombre" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Licencia" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Advertir si un módulo de usuario oculta un módulo de biblioteca" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Buscar en micropython-lib y PyPI" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9352891 thonny-4.1.7/thonny/locale/et_EE/0000755000076600000240000000000014730055627017155 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0951462 thonny-4.1.7/thonny/locale/et_EE/LC_MESSAGES/0000755000076600000240000000000014730055627020742 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/et_EE/LC_MESSAGES/thonny.mo0000644000076600000240000010413714670256721022625 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4Knnn nn\n oo8oJo Zohoqoo o@o2op(p$Epjpp pppppq".qQq7Xq`q qq r rr !rBrAGr8r rrrrrrs(s9s,Jsws9sssss's/ tPtYt htrt{ttt tt ttt u*uCu[ubuquEu%u u uv $v2v0Evvv }v vvvv7v8wGwNw5Vwww www$ww x+x4xJxbxuxxx x xx xxxy y *y5y,Ty,y7yy y z7zLzbzuzzz z#zz(z{ { { ${ 0{:{!@{b{ v{0{ {{{{{|||&|/| F|sP|| ||}A} '~2~i~c?j,Ӏ ( ց %"7ZrD 0GMTg 8%ڃ# $ .<EY-`4ÄN˄C+ol;݆   9*K+vOC6?P%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: et Language-Team: et Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d üksust%s ei paista olevat tekstifail(taaskäivita Thonny peale selle muutmist)(rakendatakse "Silur" tööriistariba nupu klõpsamisel)Birdseye kohtaInfo Thonny kohtaAktiveeri virtuaalkeskkondTäpsem install / versiooni valikLuba korraga ainult üks ThonnyLuba jooksutada nimetuid programmeLuba teegifunktsioonide sisse astumine (väljaspool skripti kausta)Kas oled kindel, et soovid seda desinstallida?JuhendajaAtribuudidAutentimineAutorLõpeta sõna automaatseltPaku sõnade lõpetamist tippimisel automaatseltNäita pakkumiste dokumentatsiooni automaatseltNäita parameetrite infot automaatselt peale '(' tippimistTagasiTagasi %sTagasi aktiivsesse raamiTagasüsteem pole valmisHalb kaustBirdseye on Pythoni silur, mis tuleb eraldi paigaldada. Kas soovid avada vastava abiinfo lehe, et rohkem teada saada?Birdseye portVaata pakkeVigade registerEi saa veel sulgedaEi leia paki nime nimekirjast:Ei leia sobivat draivi.TühistaTühistanTõstutundlikMuuda kirja suurustMuuda jooksutamisel / silumisel automaatselt jooksvat kaustaCircuitPython (üldine)CircuitPythoni seadePuhastaTühjenda Käsurida enne uue protsessi käivitamist (Jooksuta, Silu, Peata/taaskäivita, ...)Puhasta käsuridaKlõpsaKlõpsa SulgeSulge kõikSulge ülejäänudKäsk pole saadavalKommenteeriSeaded on muudetud. Tavarežiimis alustamiseks taaskäivita Thonny. (Vaata 'Tööriistad → Seaded → Üldine', kui Sa mõtled hiljem ümber.)Seadista %s failidSeadista interpretaator...KinnitusÜhenda seade arvutiga ja vali allpoolt selle portKopeeriKopeeri lõikepuhvrisseKopeerinKopeerin %s => %sEi leidnud definitsiooniEi leia draivi nimega '%s'. Kas soovid selle ise valida?Ei leidnud PyPI-st sellist pakkiEi leidnud sellist pakki PyPI-stSalvestamine ei õnnestunudLoon kaustaLoon virtuaalkeskkondaLõikaAndmedSiluSilu käesolevat skriptiSilu käesolevat skripti (birdseye)Silu käesolevat skripti (kiirem)Silu käesolevat skripti (ägedam)Arendusrežiim (annab detailsemat diagnostilised logid)Vähenda fondi suurustVähenda ridade taanetVaikeparoolKustutaKustutanKustutan %sSoovitud versioonDetailidSeadeKas mõtlesid '%s'?Kausta omadusedKeela teavitushelidTühistatud kontrollid (üks identifikaator rea kohta)Ühenda lahtiKas soovid siiski kasutada oma skripti jaoks seda nime?Kas soovid redaktorit sulgeda?Kas soovid redaktori praeguse sisu tühistada ja laadida faili kettalt uuesti?Kas soovid '%s' üle kirjutada?Kas soovid enne sulgemist faili salvestada?Kas soovid enne sulgemist failid salvestada?Kinnita kasutaja aknadDokumentatsioonÄra unusta, et main.py toimib ainult siis kui MicroPython on ilma peaskriptita.AllaLaadi alla kausta %sLaadi %s alla kausta %sRedigeeriRedaktorRedaktori fontSisesta täisarvSisesta uue kausta nimi (%s all)Sisesta uus nimiSisesta asendatav sõneSisesta oma privaatvõtme parool {} jaoksSisesta parool {} jaoksKeskkonnamuutujad (üks VÕTI=VÄÄRTUS ühel real)VigaVeakood:Viga:SündmusedErindVäljuVälju ThonnystEkspordi kasutuslogiVäline muudatusFailFail juba eksisteeribFaili ei leitudFail on avatudFaili nimi:Faili omadusedFailidOtsiOtsi ja asendaOtsi:Mine redaktorisseMine sisseMine käsurealeFondi suuruse režiimSilumiseks tuleb programm enne salvestada.Parema jõudluse nimel ei näidata Käsureal väga pikki ridu (vaata Tööriistad => Seaded => Käsurida). Siin saad Sa algset tekstifragmenti täielikult näha.Leidsin mitu draivi nimega '%s'. Kas soovid ühe neist ise valida?TäisekraanFunktsioonFunktsiooni väljakutse (%s)ÜldineMine realeMine reale...Sain ligipääsu vea, kui proovisin laadida %sKuhiKuhja režiim on sees. Väljalülitamiseks sulge Kuhja vaadeAbiinfoAbiinfo sisukordPeida varjatud failidToo esile jooksev ridaToo esile lokaalsed muutujadToo esile samad nimedToo esile sulupaaridTee kood värviliseksToo tab-sümbolid esileAvalehtKodulehtIDINSTALLISisend/väljund fontKui tegemist on tekstifailiga, siis Sa saad seadistada Thonny seda avama kui teed paremklõpsu ja valid 'Seadista ... failid'.Kui viimane käsk tekitas erindi, siis siin näidatakse selle pinujälge.Kui faili on vaja avada välises rakenduses, siis lae see kõigepealt alla lokaalsesse kausta ja ava sealt!Kui sa ei leia seda, siis pead võibolla installima sobiva USB draiveri.Kui Sa ei tea, kust pakki saada, siis on mõistlik otsida seda Pythoni pakiregistrist (PyPI), Alustuseks sisest paki nimi otsingukasti ja vajuta ENTER.Kui Sa paned oma skripti nimeks '%s', siis ei saa sa importida teegi moodulit '%s'Kui Sa paned keskkonnamuutuja väärtuse jutumärkidesse, siis jutumärgid saavad väärtuse osaks. Kas soovisid nii?Kui sa ikkagi tahad seda, siis installi see süsteemi käsurealt..Suurenda kirja suurustSuurenda ridade taanetTaanda tab-sümbolitega (mittesoovitav Pythoni koodis)IndeksInfoInformatsioonInstalliInstalli CircuitPythonInstalli MicroPythonInstalli PyPI-stInstalli lokaalsest failistInstalli sõltuvusfaili järgiInstalli või uuenda %sInstallimise asukoht:Installitud versioon:InstallinInstallin '%s'InterpretaatorKatkesta programmKatkesta ühendumisel töötav programmSisseHoia terminali aken avatuna ka peale Pythoni protsessi lõppemistVõtiVõtme IDKeelViimane stabiilne versioonViimane versioonLitsentsRidaRea numberLaeLaadinLaadin %sKohalik Python 3Lokaalsed muutujadAsukohtLogi kasutussündmusiNäib, et '%s' on kustutatud või ümberpaigutatud.Näib, et '%s' on muudetud väljaspool redaktorit.Paistab, et see fail või kaust ei ole muudetav.Paistab, et soovid installida Thonny pistikprogrammi. Õige oleks seda teha 'Tööriistad → Halda pistikprogramme' alt. Oled sa kindel, et tahad installida %s siin?Loodud Tartu Ülikoolis, Eestis. Abiks on olnud avatud tarkvara kogukond, Raspberry Pi Foundation ja Cybernetica ASTee salvestatud shebang-skriptid käivitatavaksVeendu, et MicroPython oleks su micro:bit-ile installitud.Tee üleslaetud shebang-skriptid käivitatavaksHalda %s pakkeHalda lisapakke...Halda pistikprogramme...Suurenda vaadeMaksimaalne realõigu pikkus enne "kokkupigistamist"Maksimaalne ridade arv.Võib teha silumise aeglasemaks.MicroPython (SSH)MicroPython (üldine)MicroPython (lokaalne)MicroPythoni seadeMuudetudKas liigutan %s Prügikasti?Liiguta / nimeta ümber...Liiguta PrügikastiLiigutan %s PrügikastiLiigutan PrügikastiNB! Automaatset sulgemist tuleb lubada Terminali seadetes (Profiles → Shell → When the shell exits)NB! Faili valimise nupp ei pruugi korralikult toimida, kui valida käivitusfaile virtuaalkeskkonnas. Sel juhul vali hoopis 'activate' skript (või sisesta failitee sisestuskasti käsitsi)!NB! Suurte väärtustega võib jõudlus halveneda!NB! Need seaded rakenduvad peale Thonny taaskäivitamistNB! Mõned stiilielemendid muutuvad alles peale Thonny taaskäivitamist!NB! Mõni muu versioon võib selle Thonny versiooniga klappida. Klõpsa '...' nupule versiooni valimiseks.NB! Thonny toetab ainult Python %s ja sellest uuemaidNB! Äsja installitud pistikprogramm rakendub alles peale Thonny taaskäivitamist.NimiUusUus kaustUus failUued pakid installitakse ka sellesse kausta. Teisi asukohti tuleb hallata teiste vahenditegaJärgmine objektEi leidnud ühtki #todo ridaPole kättesaadavPole ühendatudPole toetatudMärkmedMidagi pole märgitudSobibObjektivaaturAva Juhendaja automaatselt, kui tal on hoiatusi Sinu koodi kohtaAva Juhendaja automaatselt, kui programm annab veaAva Thonny andmekaust...Ava Thonny programmikaust...Ava ja sulge Pinu vaade automaatseltAva väärtused ObjektivaaturisAva asukohast %sAva ThonnysAva Thonny tekstiredaktorisAva välises vaikerakendusesAva süsteemi vaikerakendusegaAva süsteemi failihaldurisAva Taasesitaja...Ava süsteemi käsurida / terminalAva...Välises rakenduses ei saa avada mittelokaalseid faile.Avab Pinu vaate esimesel funktsiooni väljakutsel ja sulgeb, kui programm jõuab tagasi pearaamiSeaded...VäljaStruktuurÜleKirjutada üle?Kirjutan üle teemat nimega '%s'PakkPakk '{}' on vajalik teiste pakkide installimiseks ja uuendamisksPakihaldur pole selle interpretaatori jaoks kättesaadavPakkide kaustParoolKleebiKleepimine ebaõnnestusTeeTeosta MyPy kontrolleTeosta Pylint kontrolleLigipääsu vigaLigipääsu vigaKontrolli kas kirjutasid paki nime õigesti!PlotterPlotter visualiseerib käsureale prinditud numbrijadasid.PortPort või WebREPLPotentsiaalne probleemEelistatud silurEttevalmistused (ignoreeri VS Code osa)Näita peale programmi lõppu Pythoni käsuridaEelvaadeEelmine objektPrindi...ProbleemFaili laadimise probleemProgrammi argumendidProgrammi argumendid:ProgrammipuuOmadusedPyPI lehtPygame Zero režiimPythoni käivitusfailPythoni failidPythoni failidel on tavaliselt .py laiend.Pythoni interpretaatordVäljuDesinstallida?Hiljutised failidSoovitatav maksimaalne reapikkus (0 lülitab serva näitamise välja)Rakenda tagasivõetud muudatus uuestiVärskendaTavarežiimPython 3 teises masinas (SSH)Nimeta ümberNimeta '%s' ümberAva käivitumisel kõik eelmise sessiooni failidAsendaAsenda kõikAsenda tab-sümbolid tühikutegaAsenda:Otsi ja asendaTeata probleemidestLuba küsida sõnade lõpetamisi Tab-klahviga KäsurealLuba küsida sõnade lõpetamisi Tab-klahviga redaktorisNõuabNõuab:Taaskäivita interpretaator enne skripti jooksutamistNaaseKäivitaKäivitamineJooksuta / naaseJooksuta käesolev skriptJooksuta käesolev skript terminalisJooksuta kursoriniSkripti käivitamine terminalisSalvestaSalvesta kõik failidSulgemisel salvestamineSalvesta nimega...Salvesta koopia...Salvesta paroolSalvesta %s allaSalvestanSalvestan %sOtsi (micropython-lib ja PyPI)Otsi PyPI-stOtsingutulemusedOtsinTäpsemalt vaata abiinfost.Vali kõikVali kõikMärgi midagi ja proovi uuestiVali uue virtuaalkeskkonna jaoks tühi kaustVali kui failidialoogid satuvad peaakna tahaValitud kaust pole tühi. Vali mõni muu või tühista.Saada EOF / Soft rebootKäsuridaAva PlotterNäita funktsiooni väljakutseid (raame) eraldi akendesNäita varjatud faileNäita reanumbreidNäita parameetrite infotSuurusSuurus (baitides)LähtekoodKokkupressitud tekst (%d sümbolit)PinuAlustuseks vali vasakult huvipakkuv pakkAlustanAstu tagasiAstu sisseAstu väljaAstu ülePeataPeata/taaskäivita interpretaatorSalvestusruumi infoSalvestusruumSalvestusruum sellel kettal või failisüsteemisKokkuvõteToetaToeta UkrainatMine tavalisse režiimiSünkroniseeri seadme kellSüntaksi stiilTODOSihtkohtTerminalTerminali emuleerimineVastus onÜlaltoodud esitus on antud ujukomaarvu ligikaudne väärtus. Täpne mälus hoitav väärtus on %s, mis on umbes %sOtsitavat teksti ei leitud!Stiil & fontKaustades on konflikteSee kast on mõeldud Sinu märkmeteks -- tööjuhenditeks, koodijuppideks, ... Tekst salvestub automaatselt ja laetakse uuesti kui Sa avad Thonny uuesti. Võid vabalt selle teksti kustutada, et enda märkmetele ruumi teha.See käsk pole saadaval, kui Thonny jooksutatakse Flatpak-i kauduSee arvutiSee dialoog on mõeldud Thonny pistiprogrammide haldamiseks. Kui soovid installida pakke enda programmide jaoks, siis kasuta 'Tööriistad → Halda lisapakke...'Selles dialoogis näidatakse kõiki pakke, aga uuendada ja desinstallida lubatakse ainult pakke asukohastSee ei paista olevat MicroPythoni või CircuitPythoni pakk. Oled kindel, et soovid seda installida?See fail on juba Thonnys avatud. Kui soovid salvestada sellise nimega, siis sulge esmalt vastav redaktor!Sellel failil paistab olevat probleem kodeeringuga. Veendu, et see oleks UTF-8 kodeeringus või et tal oleks sobiv kodeeringumarker.See on kommentaarSee pakk vajab teistsugust Thonny versiooni:Selle programmi toimimise kohta ei anta mingeid garantiisid. See on avatud tarkvara ja seda võib teatud tingimustel levitada. Vaata täpsemalt https://opensource.org/licenses/MITThonny seadedThonny pistikprogrammidThonny pistikprogramm ilma sõltuvustetaThonny PyhtonLülita kommentaar sisse/väljaTööriistadProovi seda avada "Fail => Ava" abil.Proovi tuvastada port automaatseltKasutajaliidese režiimKasutajaliidese suurendamineKasutajaliidese stiilÄra vali, kui soovid tavapärast (vähem intuitiivset) esitusviisi.Eemalda kommentaarVõta muudatus tagasiDesinstalliDeinstallin '%s'Ebasobivad sõltuvusedÜlesUuendaUuenda sõltuvusedUuenda või desinstalliUendan '%s'Laadi üles kausta %sKui soovid silumist lõpetada, siis kasuta "Stop" käskuKasuta Tk failidialooge Zenity asemelKasuta seadme kellas lokaalset aegaVäärtusVäärtuse IDMuutujadVersioonide ajaluguVaatedVisualiseeri käesolev skript Python Tutor-isHoiata, kui kasutajamoodul varjab mõne teegimooduliHoiatusMida tuleks teha %s failiga, kui sa topeltklõpsad seda Thonny failibrauseris?Kuhu salvestada?Millist tüüpi interpretaatoriga peaks Thonny Su koodi jooksutama?Käesoleva interpretaatoriga saad Sa siin pakke ainult vaadata. Installimiseks, kustutamiseks ja uuendamiseks on vaja kasutada muid vahendeidMurra rida (võib olla aeglane)Virtuaalkeskkonna saab aktiveerida ka paremklõpsuga failibrauseris keskkonna kaustal või pyvenv.cfg faililSa peand valima faili!Enne pakihalduri avamist pead oma programmi töö lõpetamaSuuruskõik failidblaa, blaabaitivaba ruumsiiaotsi oma seadme nime või fraase "USB Serial" või "UART"sys.path ei sisalda absoluutset lib kaustatoetab põhilisi ANSI värvikoode ja stiileet valida ja installida pakifail (harilikult .whl, .tar.gz või .zip laiendiga)et valida requirements.txt fail ja installida seal näidatud pakid.koguruumsulgemata_stringkasutatud ruum././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/et_EE/LC_MESSAGES/thonny.po0000644000076600000240000015336314626075445022640 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: et\n" #: thonny/workbench.py:375 msgid "File" msgstr "Fail" #: thonny/workbench.py:376 msgid "Edit" msgstr "Redigeeri" #: thonny/workbench.py:377 msgid "View" msgstr "Vaated" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Käivita" #: thonny/workbench.py:379 msgid "Tools" msgstr "Tööriistad" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Abiinfo" #: thonny/workbench.py:598 msgid "Exit" msgstr "Välju" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Vähenda fondi suurust" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Mine redaktorisse" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Mine käsureale" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Suurenda vaade" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Täisekraan" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Programmi argumendid" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Info Thonny kohta" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Loodud\n" "Tartu Ülikoolis, Eestis.\n" "Abiks on olnud\n" "avatud tarkvara kogukond,\n" "Raspberry Pi Foundation\n" "ja Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Selle programmi toimimise\n" "kohta ei anta mingeid garantiisid.\n" "See on avatud tarkvara ja seda\n" "võib teatud tingimustel levitada.\n" "Vaata täpsemalt\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Versioonide ajalugu" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Teata probleemidest" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Ava Juhendaja automaatselt, kui programm annab vea" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Ava Juhendaja automaatselt, kui tal on hoiatusi Sinu koodi kohta" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Teosta Pylint kontrolle" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Teosta MyPy kontrolle" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Tühistatud kontrollid (üks identifikaator rea kohta)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Juhendaja" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Lõpeta sõna automaatselt" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Interpretaator" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Birdseye kohta" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye on Pythoni silur, mis tuleb eraldi paigaldada.\n" "\n" "Kas soovid avada vastava abiinfo lehe, et rohkem teada saada?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Silu käesolevat skripti (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Lülita kommentaar sisse/välja" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Kommenteeri" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Eemalda kommentaar" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Võta muudatus tagasi" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Rakenda tagasivõetud muudatus uuesti" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Lõika" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Kopeeri" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Kleebi" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Vali kõik" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Jooksuta kursorini" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Ei saa veel sulgeda" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Kui soovid silumist lõpetada, siis kasuta \"Stop\" käsku" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Kinnita kasutaja aknad" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Too esile samad nimed" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Too esile lokaalsed muutujad" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Too esile sulupaarid" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Tee kood värviliseks" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Too esile jooksev rida" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Näita reanumbreid" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Soovitatav maksimaalne reapikkus\n" "(0 lülitab serva näitamise välja)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Redaktor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Ekspordi kasutuslogi" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Sündmused" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Failid" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Otsi ja asenda" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Otsi:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Asenda:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Tõstutundlik" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Üles" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Alla" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Otsi" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Asenda" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Otsi ja asenda" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Asenda kõik" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Sisesta asendatav sõne" #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Otsitavat teksti ei leitud!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Luba korraga ainult üks Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Ava käivitumisel kõik eelmise sessiooni failid" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Keela teavitushelid" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Fondi suuruse režiim" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Kuhja režiim on sees.\n" "Väljalülitamiseks sulge Kuhja vaade" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Kuhi" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Keel" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "See kast on mõeldud Sinu märkmeteks -- tööjuhenditeks, koodijuppideks, ...\n" "\n" "Tekst salvestub automaatselt ja laetakse uuesti kui Sa avad Thonny uuesti.\n" "\n" "Võid vabalt selle teksti kustutada, et enda märkmetele ruumi teha." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Märkmed" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Eelmine objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Järgmine objekt" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Objektivaatur" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Struktuur" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero režiim" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Desinstalli" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Sulge" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klõpsa " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "siia" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Uuenda" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Installi" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Ei leidnud PyPI-st sellist pakki" #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Viimane stabiilne versioon" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Viimane versioon" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Kokkuvõte" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Koduleht" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Vigade register" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Dokumentatsioon" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "PyPI leht" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Nõuab" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Desinstallida?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Kas oled kindel, et soovid seda desinstallida?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Tagasi\n" "aktiivsesse raami" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Muutujad" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "See arvuti" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Värskenda" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Mine sisse" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Viga" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Sa peand valima faili!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Kirjutada üle?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Kas soovid '%s' üle kirjutada?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Uus" #: thonny/editors.py:671 msgid "Open..." msgstr "Ava..." #: thonny/editors.py:673 msgid "Load" msgstr "Lae" #: thonny/editors.py:682 msgid "Recent files" msgstr "Hiljutised failid" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Sulge kõik" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Salvesta" #: thonny/editors.py:739 msgid "Save as..." msgstr "Salvesta nimega..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Salvesta koopia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny seaded" #: thonny/running.py:160 msgid "Run current script" msgstr "Jooksuta käesolev skript" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Jooksuta käesolev skript terminalis" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Peata/taaskäivita interpretaator" #: thonny/running.py:205 msgid "Stop" msgstr "Peata" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Katkesta programm" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Saada EOF / Soft reboot" #: thonny/running.py:240 msgid "Disconnect" msgstr "Ühenda lahti" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Pythoni interpretaatord" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "kõik failid" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Vali uue virtuaalkeskkonna jaoks tühi kaust" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Halb kaust" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Valitud kaust pole tühi.\n" "Vali mõni muu või tühista." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Loon virtuaalkeskkonda" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Puhasta käsurida" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:317 msgid "Clear" msgstr "Puhasta" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Ava Plotter" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Parema jõudluse nimel ei näidata Käsureal väga pikki ridu\n" "(vaata Tööriistad => Seaded => Käsurida).\n" "Siin saad Sa algset tekstifragmenti täielikult näha." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Murra rida (võib olla aeglane)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Kopeeri lõikepuhvrisse" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Kokkupressitud tekst (%d sümbolit)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotter visualiseerib käsureale\n" "prinditud numbrijadasid." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Täpsemalt vaata abiinfost." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Sulge ülejäänud" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Kopeerin" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopeerin\n" " %s\n" "=> \n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Tühista" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "Sobib" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Vali kõik" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Käsurida" #: thonny/workbench.py:608 msgid "Options..." msgstr "Seaded..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Suurenda kirja suurust" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Muuda kirja suurust" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Suurus" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Välju Thonnyst" #: thonny/workbench.py:692 msgid "Quit" msgstr "Välju" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Kirjutan üle teemat nimega '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Programmi argumendid:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Tavarežiim" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Seaded on muudetud. Tavarežiimis alustamiseks taaskäivita Thonny.\n" "\n" "(Vaata 'Tööriistad → Seaded → Üldine', kui Sa mõtled hiljem ümber.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Programmipuu" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Naase" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Jooksuta / naase" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Silu käesolevat skripti" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Silu" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Silu käesolevat skripti (ägedam)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Silu käesolevat skripti (kiirem)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Astu üle" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Üle" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Astu sisse" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Sisse" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Astu välja" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Välja" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Astu tagasi" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Tagasi" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Pinu" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Erind" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Logi kasutussündmusi" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Arendusrežiim (annab detailsemat diagnostilised logid)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Kasutajaliidese režiim" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Kasutajaliidese suurendamine" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Need seaded rakenduvad peale Thonny taaskäivitamist" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Üldine" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALLI" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Vaata pakke" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Käesoleva interpretaatoriga saad Sa siin pakke ainult vaadata.\n" "Installimiseks, kustutamiseks ja uuendamiseks on vaja kasutada\n" "muid vahendeid" #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Pakkide kaust" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installi PyPI-st" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Kui Sa ei tea, kust pakki saada, siis on mõistlik otsida\n" "seda Pythoni pakiregistrist (PyPI), Alustuseks sisest\n" "paki nimi otsingukasti ja vajuta ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "et valida requirements.txt fail ja installida seal näidatud pakid." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Klõpsa" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "et valida ja installida pakifail (harilikult .whl, .tar.gz või .zip laiendiga)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Uuenda või desinstalli" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Alustuseks vali vasakult huvipakkuv pakk" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Selles dialoogis näidatakse kõiki pakke, aga uuendada ja desinstallida\n" "lubatakse ainult pakke asukohast" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Uued pakid installitakse ka sellesse kausta. Teisi asukohti\n" "tuleb hallata teiste vahenditega" #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Installitud versioon:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Installimise asukoht:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Kontrolli kas kirjutasid paki nime õigesti!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Ei leidnud sellist pakki PyPI-st" #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Veakood:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Ei leia paki nime nimekirjast:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Pakk '{}' on vajalik teiste pakkide installimiseks ja uuendamisks" #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Pakk" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Halda %s pakke" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Kinnitus" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Paistab, et soovid installida Thonny pistikprogrammi.\n" "Õige oleks seda teha 'Tööriistad → Halda pistikprogramme' alt.\n" "\n" "Oled sa kindel, et tahad installida %s siin?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! Mõni muu versioon võib selle Thonny versiooniga klappida. \n" "Klõpsa '...' nupule versiooni valimiseks." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Thonny pistikprogramm ilma sõltuvusteta" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Ebasobivad sõltuvused" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "See pakk vajab teistsugust Thonny versiooni:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Kui sa ikkagi tahad seda, siis installi see süsteemi käsurealt.." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! Äsja installitud pistikprogramm rakendub alles peale Thonny taaskäivitamist." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Thonny pistikprogrammid" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Täpsem install / versiooni valik" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Soovitud versioon" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Uuenda sõltuvused" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Nõuab:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Viga:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Halda lisapakke..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Halda pistikprogramme..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Ava Taasesitaja..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Muuda jooksutamisel / silumisel automaatselt jooksvat kausta" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Näita funktsiooni väljakutseid (raame) eraldi akendes" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Ära vali, kui soovid tavapärast (vähem intuitiivset) esitusviisi." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Ava ja sulge Pinu vaade automaatselt" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Avab Pinu vaate esimesel funktsiooni väljakutsel ja sulgeb, kui programm jõuab tagasi pearaami" #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Luba teegifunktsioonide sisse astumine (väljaspool skripti kausta)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Võib teha silumise aeglasemaks." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Eelistatud silur" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(rakendatakse \"Silur\" tööriistariba nupu klõpsamisel)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(taaskäivita Thonny peale selle muutmist)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Käivitamine" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminali emuleerimine" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "toetab põhilisi ANSI värvikoode ja stiile" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maksimaalne ridade arv." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "NB! Suurte väärtustega võib jõudlus halveneda!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maksimaalne realõigu pikkus enne \"kokkupigistamist\"" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Skripti käivitamine terminalis" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Näita peale programmi lõppu Pythoni käsurida" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Hoia terminali aken avatuna ka peale Pythoni protsessi lõppemist" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! Automaatset sulgemist tuleb lubada Terminali seadetes\n" "(Profiles → Shell → When the shell exits)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Kasutajaliidese stiil" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Süntaksi stiil" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Redaktori font" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Sisend/väljund font" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Eelvaade" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "See on kommentaar" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "Vastus on" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "sulgemata_string" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "blaa, blaa" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Mõned stiilielemendid muutuvad alles peale Thonny taaskäivitamist!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Sisesta täisarv" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Stiil & font" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Ava Thonny programmikaust..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Ava Thonny andmekaust..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Avaleht" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Abiinfo sisukord" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPythoni seade" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPythoni seade" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Ühenda seade arvutiga ja vali allpoolt selle port" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "otsi oma seadme nime või fraase \"USB Serial\" või \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Kui sa ei leia seda, siis pead võibolla installima sobiva USB draiveri." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Proovi tuvastada port automaatselt" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (üldine)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Prindi..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Ava süsteemi käsurida / terminal" #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Detailid" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installi sõltuvusfaili järgi" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installi lokaalsest failist" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "See dialoog on mõeldud Thonny pistiprogrammide haldamiseks.\n" "Kui soovid installida pakke enda programmide jaoks, siis kasuta 'Tööriistad → Halda lisapakke...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (üldine)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Suurenda ridade taanet" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Vähenda ridade taanet" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Mine\n" "tavalisse\n" "režiimi" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Veendu, et MicroPython oleks su micro:bit-ile installitud." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Ära unusta, et main.py toimib ainult siis kui MicroPython on ilma peaskriptita." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Ei leia draivi nimega '%s'. Kas soovid selle ise valida?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Leidsin mitu draivi nimega '%s'. Kas soovid ühe neist ise valida?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Ei leia sobivat draivi." #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d üksust" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Liiguta Prügikasti" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Kustuta" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Uus kaust" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Omadused" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Salvestusruum" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Tee" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Kausta omadused" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Faili omadused" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "baiti" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Suurus" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Muudetud" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Kustutan %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Laadin" #: thonny/editors.py:395 msgid "Saving" msgstr "Salvestan" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Laadi üles kausta %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Laadi %s alla kausta %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Laadi alla kausta %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Ava süsteemi failihalduris" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Peida varjatud failid" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Näita varjatud faile" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Ava Thonnys" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Ava süsteemi vaikerakendusega" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Seadista %s failid" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Mida tuleks teha %s failiga, kui sa topeltklõpsad seda Thonny failibrauseris?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Kustutan" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Loon kausta" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Laadin %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Salvestan %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Salvesta kõik failid" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Seadista interpretaator..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Seade" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Tühistan" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Alustan" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Autentimine" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Sisesta oma privaatvõtme parool {} jaoks" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Sisesta parool {} jaoks" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Ülaltoodud esitus on antud ujukomaarvu ligikaudne väärtus. Täpne mälus hoitav väärtus on %s, mis on umbes %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Otsingutulemused" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Otsin" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Installin '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Uendan '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Deinstallin '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Installin" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Pakihaldur pole selle interpretaatori jaoks kättesaadav" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Pole toetatud" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Pole kättesaadav" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Enne pakihalduri avamist pead oma programmi töö lõpetama" #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Ava väärtused Objektivaaturis" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Pythoni käivitusfail" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! Faili valimise nupp ei pruugi korralikult toimida, kui valida\n" "käivitusfaile virtuaalkeskkonnas. Sel juhul vali hoopis 'activate' \n" "skript (või sisesta failitee sisestuskasti käsitsi)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 teises masinas (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Pole ühendatud" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (lokaalne)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "sys.path ei sisalda absoluutset lib kausta" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Otsi PyPI-st" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Ava Thonny tekstiredaktoris" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Salvestusruum sellel kettal või failisüsteemis" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "koguruum" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "kasutatud ruum" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "vaba ruum" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Salvestusruumi info" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Asenda tab-sümbolid tühikutega" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Too tab-sümbolid esile" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Taanda tab-sümbolitega (mittesoovitav Pythoni koodis)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Nimi" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Suurus (baitides)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Sisesta uue kausta nimi \n" "(%s all)" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Midagi pole märgitud" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Märgi midagi ja proovi uuesti" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Ava asukohast %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Salvesta %s alla" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Faili nimi:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "Väärtuse ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Väärtus" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Salvesta parool" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Funktsiooni väljakutse (%s)" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Lokaalsed muutujad" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Funktsioon" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Asukoht" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Kui viimane käsk tekitas erindi, siis siin näidatakse selle pinujälge." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Andmed" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atribuudid" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Indeks" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Võtme ID" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Võti" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Tagasi\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Port või WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Parool" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Lähtekood" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Kasuta Tk failidialooge Zenity asemel" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Vali kui failidialoogid satuvad peaakna taha" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Keskkonnamuutujad (üks VÕTI=VÄÄRTUS ühel real)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Uus fail" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Nimeta ümber" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Nimeta '%s' ümber" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Sisesta uus nimi" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Kleepimine ebaõnnestus" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Kaustades on konflikte" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Fail juba eksisteerib" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Kui tegemist on tekstifailiga, siis Sa saad seadistada Thonny seda avama kui teed paremklõpsu ja valid 'Seadista ... failid'." #: thonny/editors.py:38 msgid "Python files" msgstr "Pythoni failid" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "Faili ei leitud" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Kas soovid redaktorit sulgeda?" #: thonny/editors.py:169 msgid "External modification" msgstr "Väline muudatus" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Kas soovid redaktori praeguse sisu tühistada ja laadida faili kettalt uuesti?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Pythoni failidel on tavaliselt .py laiend." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Kas mõtlesid '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Liiguta / nimeta ümber..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Mine reale..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Rea number" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Kas soovid enne sulgemist failid salvestada?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Kas soovid enne sulgemist faili salvestada?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Sulgemisel salvestamine" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Käsk pole saadaval" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "See käsk pole saadaval, kui Thonny jooksutatakse Flatpak-i kaudu" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Toeta Ukrainat" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Millist tüüpi interpretaatoriga peaks Thonny Su koodi jooksutama?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Näita parameetrite infot" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Näita parameetrite infot automaatselt peale '(' tippimist" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Paku sõnade lõpetamist tippimisel automaatselt" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Näita pakkumiste dokumentatsiooni automaatselt" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Luba küsida sõnade lõpetamisi Tab-klahviga redaktoris" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Luba küsida sõnade lõpetamisi Tab-klahviga Käsureal" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Probleem" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Ei leidnud definitsiooni" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Tühjenda Käsurida enne uue protsessi käivitamist (Jooksuta, Silu, Peata/taaskäivita, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Thonny Pyhton" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Katkesta ühendumisel töötav programm" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Sünkroniseeri seadme kell" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Kasuta seadme kellas lokaalset aega" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Taaskäivita interpretaator enne skripti jooksutamist" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "See ei paista olevat MicroPythoni või CircuitPythoni pakk. Oled kindel, et soovid seda installida?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Liigutan Prügikasti" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Kas liigutan %s Prügikasti?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Liigutan %s Prügikasti" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Ava välises vaikerakenduses" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "Välises rakenduses ei saa avada mittelokaalseid faile." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Kui faili on vaja avada välises rakenduses, siis lae see kõigepealt alla lokaalsesse kausta ja ava sealt!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Näib, et '%s' on kustutatud või ümberpaigutatud." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Näib, et '%s' on muudetud väljaspool redaktorit." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "NB! Thonny toetab ainult Python %s ja sellest uuemaid" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Mine reale" #: thonny/workbench.py:703 msgid "Support" msgstr "Toeta" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Salvestamine ei õnnestunud" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Hoiatus" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Kui Sa paned keskkonnamuutuja väärtuse jutumärkidesse, siis jutumärgid saavad väärtuse osaks.\n" "Kas soovisid nii?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Installi MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Installi CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Tee üleslaetud shebang-skriptid käivitatavaks" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Tee salvestatud shebang-skriptid käivitatavaks" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Aktiveeri virtuaalkeskkond" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Sihtkoht" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualiseeri käesolev skript Python Tutor-is" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Rida" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Ei leidnud ühtki #todo rida" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Installi või uuenda %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Kohalik Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Virtuaalkeskkonna saab aktiveerida ka paremklõpsuga failibrauseris keskkonna kaustal või pyvenv.cfg failil" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Ettevalmistused (ignoreeri VS Code osa)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Vaikeparool" #: thonny/running.py:392 msgid "Information" msgstr "Informatsioon" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Silumiseks tuleb programm enne salvestada." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s ei paista olevat tekstifail" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Faili laadimise probleem" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Sellel failil paistab olevat probleem kodeeringuga.\n" "\n" "Veendu, et see oleks UTF-8 kodeeringus või et tal oleks sobiv kodeeringumarker." #: thonny/editors.py:295 msgid "File is open" msgstr "Fail on avatud" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "See fail on juba Thonnys avatud.\n" "\n" "Kui soovid salvestada sellise nimega,\n" "siis sulge esmalt vastav redaktor!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Ligipääsu viga" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Paistab, et see fail või kaust ei ole muudetav." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Tagasüsteem pole valmis" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Kuhu salvestada?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Potentsiaalne probleem" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Kui Sa paned oma skripti nimeks '%s', siis ei saa sa importida teegi moodulit '%s'" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Kas soovid siiski kasutada oma skripti jaoks seda nime?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Sain ligipääsu vea, kui proovisin laadida\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Proovi seda avada \"Fail => Ava\" abil." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Ligipääsu viga" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Luba jooksutada nimetuid programme" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Litsents" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Hoiata, kui kasutajamoodul varjab mõne teegimooduli" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Otsi (micropython-lib ja PyPI)" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9356606 thonny-4.1.7/thonny/locale/eu_ES/0000755000076600000240000000000014730055627017174 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0965874 thonny-4.1.7/thonny/locale/eu_ES/LC_MESSAGES/0000755000076600000240000000000014730055627020761 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/eu_ES/LC_MESSAGES/thonny.mo0000644000076600000240000010762414670256721022650 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4KbKb4[bbTbbb c9(cbc}ccccc cc d ddjdreQeeafsfCcggg4gh h #h /h9hQhgh}h"hhhh i i i*i)9ici@kiii iii iiijj j*j:j Jj,Tj*j,j6jk l0l:l3m6mUmim}m3m,mm nn5nJn]nen~nnnnqnOo:p7UpBppAwqcqr#r*r7߉1IP Yc v)OceNyȋ'o"mG؍ލ  4<D2[U fq%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: eu Language-Team: eu Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d elementu«%s»(e)k ez dirudi testu fitxategia(berrabiatu Thonny hori aldatu ondoren)(Tresna-barrako Araztu botoiari klik egitean erabilia)«Birdseye»ri buruz«Thonny»ri buruzAktibatu alegiazko inguruneaInstalatze / bertsio-berritze / bertsio-zahartze aurreratuaBaimendu «Thonny»ren instantzia bakunaBaimendu izengabeko programak exekutatzeaLiburutegietan sartzen utzi (adib. gidoia nagusiaren direktoriotik kanpo)Ziur zaude desinstalatu nahi duzula?LaguntzaileaAtributuakAutentifikazioaEgileaOsatze automatikoaTekleatu bitartean osatzea automatikoki proposatuOsatzeen dokumentazioa automatikoki erakutsiParametroen informazioa automatikoki erakutsi '(' tekleatu ondorenAtzeraAtzera %s(e)raAtzera uneko markoraBizkarraldekoa ez dago prestDirektorio okerra«Birdseye» bereizita instalatu behar den Python araztaile bat da. Laguntza-orria ireki eta gehiago ezagutu nahi duzu?«Birdseye» atakaPaketeak arakatuAkats aztarnariaOraindik ezin da itxiEzin du aurkitu zerrendako pakete-izena:Ezin da aurkitu disko egokiaUtziBertan behera uztenBereizi maiuskulakAldatu letra-tipoaAldatu laneko direktorioa gidoi direktorioa exekutatzean / arazteanCircuitPython (generikoa)CircuitPython gailuaGarbituGarbitu oskola prozesu berria hasi aurretik (Exekutatu, araztu, Gelditu/Berrabiatu, ...)Garbitu oskolaEgin klikEgin klikItxiItxi guztiakItxi besteakKomando ez dago erabilgarriIruzkinduKonfigurazioa eguneratu egin da. Berrabiarazi Thonny modu arruntean lanean hasteko. (Begiratu 'Tresnak → Aukerak → Orokorra' aurrerago iritzia aldatzen baduzu)Konfiguratu %s fitxategiakKonfiguratu interpretea...BaieztapenaKonektatu zure gailua ordenagailura eta hautatu dagokion ataka beheanKopiatuKopiatu arbeleraKopiatzen %s hona %s kopiatzenEzin izan du definizioa aurkituEzin izan du '%s' diskoa aurkitu. Zuk zeuk aurkitu nahi duzu?Ezin du aurkitu «PyPI»ko paketea.Ezin du aurkitu «PyPI»ko informazio paketea.Ezin izan du gordeDirektorioa sortzenAlegiazko ingurunea sortzenEbakiDatuakAraztuAraztu uneko gidoiaAraztu uneko gidoia («Birdseye»)Araztu uneko gidoia (azkarrago)Araztu uneko gidoia (atseginagoa)Arazte modua (diagnostiko egunkari zehatzagoak ematen ditu)Txikiagotu letra-tipoaKendu koska hautatutako lerroeiPasahitz lehenetsiaEzabatuEzabatzen%s ezabatzeaNahi den bertsioaXehetasunakGailua'%s' esan nahi zenuen?Direktorioaren propietateakEzgaitu jakinarazpen soinuaEzgaitu egiaztapenak (ID bat lerroko)DeskonektatuHala ere zure gidoiarentzako izen hori erabili nahi duzu?Editorea ere itxi nahi duzu?Editorearen uneko edukia baztertu eta fitxategia diskotik birzamatu nahi duzu?'%s' gainidatzi nahi duzu?Itxi aurretik fitxategia gorde nahi duzu?Itxi aurretik fitxategiak gorde nahi dituzu?Atrakatu erabiltzailearen leihoakDokumentazioaEz ahaztu, «main.py», txertatutako gidoi nagusia gabe bakarrik dabilela.BeheraZama-jaitsi '%s'(e)ra%s '%s'(e)ra zama-jaistenEditatuEditoreaEditorearen letra-tipoa:Sartu zenbaki oso batSartu honen barruko direktorio berriaren izena %sSartu izen berriaSartu ordezkatu beharreko katea.Sartu zure gako pribatuaren pasahitza ondokorako {}Sartu zure pasahitza ondokorako {}Ingurune aldagaiak (GAKOA=BALIO bakarra lerroko)ErroreaErrore kodea:Errorea:GertaerakSalbuespenaIrtenIrten «Thonny»tikEsportatu erabilera egunkariak...Kanpoko aldaketaFitxategiaFitxategia badago lehendik ereFitxategia desagertu daFitxategia irekita dagoFitxategi izena:Fitxategiaren propietateakFitxategiakAurkituAurkitu eta ordeztuAurkitu:Arreta editoreanArreta honetanArreta oskoleanLetra-tipoa eskalatzeko moduaPrograma arazteko, aurrena, gorde egin behar da.Errendimendu arrazoiengatik, Oskolak lerro oso luzeak osorik erakustea saihesten du (begiratu Tresnak => Aukerak => Oskola). Hemen jatorrizko testu puskarekin elkarreragin dezakezu.Hainbat '%s' disko aurkitu ditu. Zuk zeuk bat hautatu nahi duzu?Pantaila-beteaFuntzioaFuntzio-deia %s(e)anOrokorraJoan lerroraJoan... lerroraBaimen errorea jaso da ondokoa zamatzen saiatzean %s«Heap»«Heap», memoria dinamikoko modua piztuta. Itxi «Heap» ikuspegia hura itzaltzeko.LaguntzaLaguntzaren edukiaEzkutatu ezkutuko fitxategiakNabarmendu uneko lerroa (editorea berrireki beharra dago)Nabarmendu aldagai lokalakNabarmendu bat datozen izenakNabarmendu parentesiakNabarmendu sintaxi elementuakNabarmendu tab karaktereakEtxeaOrri nagusiaIDINSTALATUSI letra-tipoaTestu-fitxategi bat bada, «Thonny»n irekitzeko konfigura dezakezu, haren gainean eskuineko klik eginez eta 'Konfiguratu ... fitxategiak' hautatuz.Azken komandoak salbuespen bat eragin badu, ikuspegi honek pilaren aztarna erakutsiko du («stacktrace»).Fitxategia kanpoko aplikazioan ireki beharra badago, zama-jaitsi ezazu direktorio lokal batera eta bertatik ireki!Ezin baduzu aurkitu, aurrena USB gidari egokia instalatu beharrean egon zaitezke.Paketea nondik eskuratu ez badakizu, ziurrenik, Python-en paketeen indizean bilatu nahiko duzu. Has zaitez paketearen izena goiko bilaketa laukian sartzen, eta sakatu SARTU.Zure gidoia '%s' izendatzen baduzu, ez duzu '%s' izeneko liburutegi-modulua inportatzerik izango.Ingurune aldagai baten balioa kakotxen artean biltzen baduzu, kakotxak balioaren zati izango dira. Ori nahi zenuen?Oraindik hura nahi baduzu, orduan instalatu ezazu komando-lerrotik.Handiagotu letra-tipoaKoskatu hautatutako lerroakKoskatu tab karaktereekin (Pyhon-ekin ez gomendatua)IndizeaInformazioaInformazioaInstalatuInstalatu CircuitPythonInstalatu MicroPythonInstalatu «PyPI»tikInstalatu fitxategi lokaletikInstalatu eskakizunen fitxategitik%s instalatu edo eguneratuNon instalatua:Instalatutako bertsioa:Instalatzen'%s' instalatzeninterpreteaEten exekuzioaEten lanean ari den programa konektatzeanBarruraMantendu terminal-leihoa irekita Python prozesua amaitzen deneanGakoaGako IDHizkuntzaBertsio egonkor berrienaBertsio berrienaLizentziaLerroaLerro-zenbakiaZamatuZamatzen%s zamatzenPython 3 lokalaAldagai lokalakKokalekuaErregistratu programa erabileraren gertaerak'%s' ezabatu edo lekuz aldatu dela dirudi.'%s' editore kanpotik aldatu dela ematen du.Ematen du fitxategi edo karpeta hori ezin dela idatzi.«Thonny»rekin lotura duen pakete bat instalatzen ari zarela dirudi. Zure asmoa «Thonny»ren plugin bat instalatzea bada, horren ordez 'Tresnak → Kudeatu pluginak...' aukeratu beharko zenuke. Ziur zaude bizkarraldekorako %s instalatu nahi duzula?Tartu-ko Unibertsitatean, Estonian, ondokoen laguntzarekin sorburu-irekiko komunitatea, Raspberry Pi Fundazioa, eta Cybernetica AS, eginaEgin exekutagarri, gordetako «shebang» gidoiakZiurtatu MicroPython zure «micro:bit»ean instalatu dela.Egin exekutagarri, zama-igotako «shebang» gidoiakKudeatu %s(e)rentzako paketeakKudeatu paketeak...Kudeatu pluginak...Maximizatu ikuspegiaLerro-zatien luzera maximoa, estutzen hasi aurretikMantendu beharreko gehienezko lerro-kopurua.Araztea moteldu lezake.MicroPython (SSH)MicroPython (generikoa)MicroPython (lokala)MicroPython gailuaAldatua%s zakarrontzira eraman?Mugitu / berrizendatu...Eraman zakarrontzira%s zakarrontzira eramatenZakarrontzira eramateaN.B.! Ixte automatikoa terminalaren ezarpenetan gaitu behar da (Profilak → Oskola → Oskola existitzen denean)NB! Alegiazko ingurune bateko exekutagarriak hautatzean, baliteke botoia behar bezala ez ibiltzea. Kasu horretan, interpretearen ordez, aukeratu 'aktibatu' gidoia (edo sartu bide-izena laukian zuzenean)N.B.! Balio handiek errendimendu arazoak eragin litzakete!N.B.! Berrabiarazi Thonny aukera horiek aldatu ondoren!N.B.! Estilo-elementu batzuk aldatzeko Thonny berrabiatu behar da!N.B.! Egungo «Thonny»ren bertsioarekin bateragarria den beste bertsio bat erabilgarri egon liteke. Egin klil '...' botoian instalatu beharreko bertsioa aukeratzeko.N.B.! «Thonny»k Python %s eta berriagoak bakarrik onartzen dituN.B.! Plugin bat instalatu / bertsio-berritu / desinstalatu ondoren Thonny berrabiarazi behar duzu.IzenaBerriaDirektorio berriaFitxategi berriaPakete berriak ere direktorio horretan instalatuko dira. Beste kokaleku batzuk ordezko bideak erabiliz kudeatu behar dira.Hurrengo objektuaEz da #todo gisa markatutako lerrorik aurkituEz erabilgarriKonektatu gabeEuskarririk gabeOharrakEz da ezer hautatuAdosObjektu ikuskariaIreki laguntzailea automatikoki zure koderako abisuak ditueneanIreki laguntzailea automatikoki programa salbuespen batekin kraskatzen deneanIreki «Thonny»ren datuen karpeta Ireki «Thonny»ren programaren karpeta...Ireki eta itxi Pila ikuspegia automatikokiIreki ebaluatutako balioak Objektu ikuskarianIreki %s(e)tikIreki «Thonny»rekinIreki «Thonny»ren testu editoreanIreki kanpoko aplikazio lehenetsianIreki sistemaren aplikazio lehenetsianIreki sistemaren fitxategi kudeatzaileanIreki berrexekutatzailea...Ireki sistemaren oskola...Ireki...Urrutiko fitxategiak kanpoko aplikazioan irekitzeko euskarririk ez dago.Pilaren ikuspegia lehenengo deian irekitzen du eta programa marko nagusira itzultzen denean ixten du.Aukerak...KanporaZirriborroaGainetikGainidatzi?'%s' gaia gainidazteaPaketea'{}' paketea beste pakete batzuk instalatzeko eta desinstalatzeko behar da.Pakete-kudeatzailea ez dago erabilgarri interprete honetarakoPaketeen direktorioaPasahitzaItsatsiItsastea huts egin duBide-izenaMyPy egiaztapenak eginHautatutako Pylint egiaztapenak eginBaimen erroreaBaimen erroreaMesedez, egiaztatu zure ortografia!PlotterraPlotterrek oskolean inprimatutako zenbaki segidak irudikatzen ditu.AtakaAtaka edo WebREPLArazo potentzialaHobetsitako araztaileaPrestaketa (saihestu «VS Code» atala)Aurkeztu Python REPL, programa bukatu ondorenAurreikusiAurreko objektuaInprimatu...ArazoaArazoa fitxategia zamatzeanProgramaren argumentuakProgramaren argumentuak:Programaren zuhaitzaPropietateakPyPI orriaPygame Zero modua«Python»en exekutagarriaPython fitxategiakPython fitxategiak .py luzapena izan ohi dute.«Python»en interpreteakIrtenBenetan desinstalatu?Azkenaldiko fitxategiakGomendatutako gehieneko lerro luzera (Ezarri 0 marjina -lerroa kentzeko)BerreginFreskatuModu arruntaUrrutiko Python 3 (SSH)BerrizendatuBerrizendatu '%s'Berrireki aurreko saioko fitxategi guztiakOrdeztuOrdeztu guztiakOrdeztu tabulazioak zuriuneekinOrdeztu honekin:Ordeztu+aurkituEman arazoen berriOsatzea eskatu oskolean Tab teklarekinOsatzea eskatu editorean Tab teklarekinEskakizunakEskakizunak:Berrabiarazi interpretea gidoia exekutatu aurretikBerrekinExekutatuExekutatu eta araztuExekutatu / berrekinExekutatu uneko gidoiaExekutatu uneko gidoia terminaleanExekutatu kurtsorera arteUneko gidoia terminalean exekutatzenGordeGorde fitxategi guztiakGorde ixterakoanGorde honela...Gorde kopia...Gorde pasahitzaGorde %s(e)anGordetzen«%s»(e)an gordetzenBilatu micropython-lib eta PyPIBilatu «PyPI»nBilaketaren emaitzakBilatzenBegiratu Laguntza xehetasun bila.Hautatu denakHautatu denaHautatu elementu bat eta saiatu berriz!Aukeratu direktorio hutsa alegiazko ingurune berrirakoHautatu fitxategien elkarrizketa-koadroak leiho nagusiaren atzera buka dezakeenAukeratutako direktorioa ez dago hutsik. Aukeratu beste bat edo bertan behera utzi.Bidali EOF / Berrabiarazte leunaOskolaErakutsi plotterraErakutsi funtzioen deiak (markoak) leiho bereizietanErakutsi ezkutuko fitxategiakErakutsi lerro-zenbakiakErakutsi parametroei buruzko informazioaNeurriaNeurria (byte)Sorburu kodeaEstututako testua (%d karaktere)PilaHasi ezkerreko paketea aukeratuz.AbiaraztenUrratsa atzeraBarrura sartuKarpora irtenUrratsa gainetikGeldituGelditu/Berrabiarazi bizkarraldekoaBiltegiratze informazioaBiltegiratze lekuaBiltegiratze lekua gailu edo fitxategi-sistema honetanLaburpenaBabesaBabestu UkrainaAldatu modu arrunteraSinkronizatu gailuaren denbora errealeko ordulariaSintaxi gaiaZEREGINAJomugaTerminalaTerminal emulazioaErantzuna da,Goran irudikatutakoa «float» (koma higikorreko balio) horren balioaren hurbilketa bat da. Gordetako balio zehatza %s da, %s gutxi gorabehera.Adierazitako testua ez da aurkitu1Gaia eta letra-tipoaGatazka duten karpetak daudeLauki hau zure laneko oharretarako da -- zereginaren jarraibideak, kode-zatiak, dena delakoa. Dena automatikoki gordeko da eta Thonny irekitzen duzun hurrengo aldian zamatuko da. Ezabatu testu hau, hala nahi baduzu, zure oharretarako lekua egiteko.Komando hori ez dago erabilgarri Thonny Flatpak bidez exekutatzen badaOrdenagailu honetanElkarrizketa-koadro hori «Thonny»ren pluginak eta haien mendekotasunak kudeatzeko da. Zure programa propioetarako paketeak instalatu nahi badituzu, aukeratu 'Tresnak → Kudeatu paketeak...'Elkarrizketa honek pakete erabilgarri denak zerrendatzen ditu, baina paketeak eguneratzen eta desinstalatzen uzten du bakarrik hemendikHorrek ez du MicroPython/CircuitPython pakete itxurarik. Ziur zaude instalatu nahi duzula?Fitxategi hori jada «Thonny»n irekita dago. Izen horrekin gorde nahi baduzu, aurretik, itxi irekita dagoen editorea!Fitxategi horrek kodeketarekin arazoak dituela ematen du. Ziurtatu UTF-8 erabiltzen duela edo kodeketaren argibide egokia duela.Hau iruzkin bat daPakete horrek «Thonny»ren beste bertsio bat behar du:Programa hau INOLAKO BERMERIK GABE dator! Software askea da, eta baldintza jakin batzuk betez gero hura bana dezakezu, begiratu https://opensource.org/licenses/MIT xehetasunetarako«Thonny»ren aukerak«Thonny»ren pluginakBetekizunik gabeko «Thonny»ren plugina«Thonny»ren PythonTxandakatu iruzkinaTresnakSaiatu hura irekitzen Fitxategia => Ireki erabiliz.Saiatu ataka automatikoki hautematenErabiltzaile interfaze (EI) moduaEI eskalatze faktoreaEI gaiaKendu marka esperientzia tradizionalagoa nahi baduzu.Kendu iruzkin izaeraDeseginDesinstalatu'%s' desinstalatzenBetekizun ezegokiakGoraBertsio-berrituBertsio-berritu mendekotasunakBertsio-berritu edo desinstalatu'%s' bertsio-berritzenZama-igo '%s'(e)raErabili "Stop" komandoa araztea bertan behera utzi nahi baduzuErabili Tk fitxategi elkarrizketak Zenity erabili ordezErabili tokiko ordua denbora errealeko ordularianBalioaBalio IDAldagaiakBertsioen historiaIkuspegiaIrudikatu uneko gidoia Python-en tutoreanAbisatu erabiltzailearen modulu batek liburutegi-modulu bati itzal egiten badioAbisuaZer egin %s fitxategi batekin «Thonny»ren fitxategi-arakatzailean klik bikoitza egiten diozunean?Non gorde behar da?«Thonny»k zure kodea exekutatzeko zein interprete mota erabili beharko luke?Oraingo interpretearekin hemengo paketeak bakarrik arakatu ditzakezu. Erabili 'Tresnak → Ireki sistemaren oskola...' instalatzeko, eguneratzeko edo desinstalatzeko.Testua itzulbiratu (motela izan liteke)Existitzen den alegiazko ingurune bat ere aktibatu dezakezu, alegiazko ingurunearen karpeta bat, edo barruko 'pyveng.cfg' fitxategia aukeratzean, fitxategi nabigazioan eskuin-klikaren testuinguruko menuaren bidez.Fitxategi bat aukeratu behar duzu!Zure programa gelditu behar duzu pakete-kudeatzailea abiarazi aurretik.Zoomafitxategi guztiakbla, blabyteleku hutsahemenbilatu zure gailuaren izena, "USB Serial" edo "UART"ez dago liburutegi (lib) direktorio absoluturik 'sys.path"enOinarriko ANSI-koloreak eta estiloak onartzen ditupakete fitxategia aurkitu eta instalatzeko (normalean .whl, .tar.gz edo .zip luzapenekin).«requirements.txt» fitxategia aurkitu eta hartan zehaztutako paketeak instalatzeko.Lekua osoaitxigabeko_kateaerabilitako lekua././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/eu_ES/LC_MESSAGES/thonny.po0000644000076600000240000015702714670256721022655 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: eu\n" #: thonny/workbench.py:375 msgid "File" msgstr "Fitxategia" #: thonny/workbench.py:376 msgid "Edit" msgstr "Editatu" #: thonny/workbench.py:377 msgid "View" msgstr "Ikuspegia" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Exekutatu" #: thonny/workbench.py:379 msgid "Tools" msgstr "Tresnak" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Laguntza" #: thonny/workbench.py:598 msgid "Exit" msgstr "Irten" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Txikiagotu letra-tipoa" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Arreta editorean" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Arreta oskolean" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Maximizatu ikuspegia" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Pantaila-betea" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Programaren argumentuak" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "«Thonny»ri buruz" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Tartu-ko Unibertsitatean, Estonian,\n" "ondokoen laguntzarekin\n" "sorburu-irekiko komunitatea,\n" "Raspberry Pi Fundazioa,\n" "eta Cybernetica AS,\n" "egina" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Programa hau\n" "INOLAKO BERMERIK GABE dator!\n" "Software askea da, eta baldintza jakin batzuk\n" "betez gero hura bana dezakezu, begiratu\n" "https://opensource.org/licenses/MIT\n" "xehetasunetarako" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Bertsioen historia" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Eman arazoen berri" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Ireki laguntzailea automatikoki programa salbuespen batekin kraskatzen denean" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Ireki laguntzailea automatikoki zure koderako abisuak dituenean" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Hautatutako Pylint egiaztapenak egin" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy egiaztapenak egin" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Ezgaitu egiaztapenak (ID bat lerroko)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Laguntzailea" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Osatze automatikoa" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "interpretea" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "«Birdseye»ri buruz" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "«Birdseye» bereizita instalatu behar den Python araztaile bat da.\n" "\n" "Laguntza-orria ireki eta gehiago ezagutu nahi duzu?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Araztu uneko gidoia («Birdseye»)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Txandakatu iruzkina" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Iruzkindu" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Kendu iruzkin izaera" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Desegin" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Berregin" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Ebaki" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Kopiatu" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Itsatsi" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Hautatu dena" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Exekutatu kurtsorera arte" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Oraindik ezin da itxi" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Erabili \"Stop\" komandoa araztea bertan behera utzi nahi baduzu" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Atrakatu erabiltzailearen leihoak" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Nabarmendu bat datozen izenak" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Nabarmendu aldagai lokalak" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Nabarmendu parentesiak" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Nabarmendu sintaxi elementuak" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Nabarmendu uneko lerroa (editorea berrireki beharra dago)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Erakutsi lerro-zenbakiak" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Gomendatutako gehieneko lerro luzera\n" "(Ezarri 0 marjina -lerroa kentzeko)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editorea" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Esportatu erabilera egunkariak..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Gertaerak" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Fitxategiak" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Aurkitu eta ordeztu" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Aurkitu:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Ordeztu honekin:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Bereizi maiuskulak" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Gora" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Behera" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Aurkitu" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Ordeztu" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Ordeztu+aurkitu" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Ordeztu guztiak" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Sartu ordezkatu beharreko katea." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Adierazitako testua ez da aurkitu1" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Baimendu «Thonny»ren instantzia bakuna" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Berrireki aurreko saioko fitxategi guztiak" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Ezgaitu jakinarazpen soinua" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Letra-tipoa eskalatzeko modua" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "«Heap», memoria dinamikoko modua piztuta.\n" "Itxi «Heap» ikuspegia hura itzaltzeko." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "«Heap»" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Hizkuntza" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Lauki hau zure laneko oharretarako da -- zereginaren jarraibideak, kode-zatiak, dena delakoa.\n" "\n" "Dena automatikoki gordeko da eta Thonny irekitzen duzun hurrengo aldian zamatuko da.\n" "\n" "Ezabatu testu hau, hala nahi baduzu, zure oharretarako lekua egiteko." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Oharrak" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Aurreko objektua" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Hurrengo objektua" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Objektu ikuskaria" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Zirriborroa" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero modua" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Desinstalatu" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Itxi" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Egin klik" #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "hemen" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Bertsio-berritu" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Instalatu" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Ezin du aurkitu «PyPI»ko paketea." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Bertsio egonkor berriena" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Bertsio berriena" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Laburpena" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Egilea" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Orri nagusia" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Akats aztarnaria" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Dokumentazioa" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "PyPI orria" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Eskakizunak" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Benetan desinstalatu?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Ziur zaude desinstalatu nahi duzula?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Atzera\n" "uneko markora" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Aldagaiak" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Ordenagailu honetan" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Freskatu" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Arreta honetan" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Errorea" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Fitxategi bat aukeratu behar duzu!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Gainidatzi?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "'%s' gainidatzi nahi duzu?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Berria" #: thonny/editors.py:671 msgid "Open..." msgstr "Ireki..." #: thonny/editors.py:673 msgid "Load" msgstr "Zamatu" #: thonny/editors.py:682 msgid "Recent files" msgstr "Azkenaldiko fitxategiak" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Itxi guztiak" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Gorde" #: thonny/editors.py:739 msgid "Save as..." msgstr "Gorde honela..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Gorde kopia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "«Thonny»ren aukerak" #: thonny/running.py:160 msgid "Run current script" msgstr "Exekutatu uneko gidoia" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Exekutatu uneko gidoia terminalean" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Gelditu/Berrabiarazi bizkarraldekoa" #: thonny/running.py:205 msgid "Stop" msgstr "Gelditu" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Eten exekuzioa" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Bidali EOF / Berrabiarazte leuna" #: thonny/running.py:240 msgid "Disconnect" msgstr "Deskonektatu" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "«Python»en interpreteak" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "fitxategi guztiak" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Aukeratu direktorio hutsa alegiazko ingurune berrirako" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Direktorio okerra" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Aukeratutako direktorioa ez dago hutsik.\n" "Aukeratu beste bat edo bertan behera utzi." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Alegiazko ingurunea sortzen" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Garbitu oskola" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plotterra" #: thonny/shell.py:317 msgid "Clear" msgstr "Garbitu" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Erakutsi plotterra" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Errendimendu arrazoiengatik, Oskolak lerro oso luzeak osorik erakustea saihesten du (begiratu Tresnak => Aukerak => Oskola).\n" "Hemen jatorrizko testu puskarekin elkarreragin dezakezu." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Testua itzulbiratu (motela izan liteke)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Kopiatu arbelera" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Estututako testua (%d karaktere)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotterrek oskolean inprimatutako\n" "zenbaki segidak irudikatzen ditu." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Begiratu Laguntza xehetasun bila." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Itxi besteak" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Kopiatzen" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr " %s\n" "hona\n" " %s\n" "kopiatzen" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Utzi" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "Ados" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Hautatu denak" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Oskola" #: thonny/workbench.py:608 msgid "Options..." msgstr "Aukerak..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Handiagotu letra-tipoa" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Aldatu letra-tipoa" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zooma" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Irten «Thonny»tik" #: thonny/workbench.py:692 msgid "Quit" msgstr "Irten" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "'%s' gaia gainidaztea" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Programaren argumentuak:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Modu arrunta" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Konfigurazioa eguneratu egin da. Berrabiarazi Thonny modu arruntean lanean hasteko.\n" "\n" "(Begiratu 'Tresnak → Aukerak → Orokorra' aurrerago iritzia aldatzen baduzu)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Programaren zuhaitza" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Berrekin" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Exekutatu / berrekin" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Araztu uneko gidoia" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Araztu" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Araztu uneko gidoia (atseginagoa)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Araztu uneko gidoia (azkarrago)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Urratsa gainetik" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Gainetik" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Barrura sartu" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Barrura" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Karpora irten" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Kanpora" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Urratsa atzera" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Atzera" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Pila" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Salbuespena" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Erregistratu programa erabileraren gertaerak" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Arazte modua (diagnostiko egunkari zehatzagoak ematen ditu)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Erabiltzaile interfaze (EI) modua" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "EI eskalatze faktorea" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "N.B.! Berrabiarazi Thonny aukera horiek aldatu ondoren!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Orokorra" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALATU" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Paketeak arakatu" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Oraingo interpretearekin hemengo paketeak bakarrik arakatu ditzakezu.\n" "Erabili 'Tresnak → Ireki sistemaren oskola...' instalatzeko, eguneratzeko edo desinstalatzeko." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Paketeen direktorioa" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instalatu «PyPI»tik" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Paketea nondik eskuratu ez badakizu, ziurrenik, Python-en paketeen indizean bilatu nahiko duzu. Has zaitez paketearen izena goiko bilaketa laukian sartzen, eta sakatu SARTU." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "«requirements.txt» fitxategia aurkitu eta hartan zehaztutako paketeak instalatzeko." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Egin klik" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "pakete fitxategia aurkitu eta instalatzeko (normalean .whl, .tar.gz edo .zip luzapenekin)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Bertsio-berritu edo desinstalatu" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Hasi ezkerreko paketea aukeratuz." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Elkarrizketa honek pakete erabilgarri denak zerrendatzen ditu, baina paketeak eguneratzen eta desinstalatzen uzten du bakarrik hemendik" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Pakete berriak ere direktorio horretan instalatuko dira. Beste kokaleku batzuk ordezko bideak erabiliz kudeatu behar dira." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Instalatutako bertsioa:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Non instalatua:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Mesedez, egiaztatu zure ortografia!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Ezin du aurkitu «PyPI»ko informazio paketea." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Errore kodea:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Ezin du aurkitu zerrendako pakete-izena:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "'{}' paketea beste pakete batzuk instalatzeko eta desinstalatzeko behar da." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Paketea" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Kudeatu %s(e)rentzako paketeak" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Baieztapena" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "«Thonny»rekin lotura duen pakete bat instalatzen ari zarela dirudi.\n" "Zure asmoa «Thonny»ren plugin bat instalatzea bada, horren ordez\n" "'Tresnak → Kudeatu pluginak...' aukeratu beharko zenuke.\n" "\n" "Ziur zaude bizkarraldekorako %s instalatu nahi duzula?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "N.B.! Egungo «Thonny»ren bertsioarekin bateragarria den beste bertsio bat erabilgarri egon liteke. Egin klil '...' botoian instalatu beharreko bertsioa aukeratzeko." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Betekizunik gabeko «Thonny»ren plugina" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Betekizun ezegokiak" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Pakete horrek «Thonny»ren beste bertsio bat behar du:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Oraindik hura nahi baduzu, orduan instalatu ezazu komando-lerrotik." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "N.B.! Plugin bat instalatu / bertsio-berritu / desinstalatu ondoren Thonny berrabiarazi behar duzu." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "«Thonny»ren pluginak" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Instalatze / bertsio-berritze / bertsio-zahartze aurreratua" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Nahi den bertsioa" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Bertsio-berritu mendekotasunak" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Eskakizunak:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Errorea:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Kudeatu paketeak..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Kudeatu pluginak..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Ireki berrexekutatzailea..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Aldatu laneko direktorioa gidoi direktorioa exekutatzean / araztean" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Erakutsi funtzioen deiak (markoak) leiho bereizietan" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Kendu marka esperientzia tradizionalagoa nahi baduzu." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Ireki eta itxi Pila ikuspegia automatikoki" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Pilaren ikuspegia lehenengo deian irekitzen du eta programa marko nagusira itzultzen denean ixten du." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Liburutegietan sartzen utzi (adib. gidoia nagusiaren direktoriotik kanpo)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Araztea moteldu lezake." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Hobetsitako araztailea" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(Tresna-barrako Araztu botoiari klik egitean erabilia)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "«Birdseye» ataka" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(berrabiatu Thonny hori aldatu ondoren)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Exekutatu eta araztu" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminal emulazioa" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "Oinarriko ANSI-koloreak eta estiloak onartzen ditu" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Mantendu beharreko gehienezko lerro-kopurua." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "N.B.! Balio handiek errendimendu arazoak eragin litzakete!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Lerro-zatien luzera maximoa, estutzen hasi aurretik" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Uneko gidoia terminalean exekutatzen" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Aurkeztu Python REPL, programa bukatu ondoren" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Mantendu terminal-leihoa irekita Python prozesua amaitzen denean" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "N.B.! Ixte automatikoa terminalaren ezarpenetan gaitu behar da\n" "(Profilak → Oskola → Oskola existitzen denean)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminala" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "EI gaia" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Sintaxi gaia" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Editorearen letra-tipoa:" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "SI letra-tipoa" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Aurreikusi" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Hau iruzkin bat da" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "Erantzuna da," #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "itxigabeko_katea" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "N.B.! Estilo-elementu batzuk aldatzeko Thonny berrabiatu behar da!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Sartu zenbaki oso bat" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Gaia eta letra-tipoa" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr " Ireki «Thonny»ren programaren karpeta..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Ireki «Thonny»ren datuen karpeta" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Etxea" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Laguntzaren edukia" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPython gailua" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPython gailua" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Konektatu zure gailua ordenagailura eta hautatu dagokion ataka behean" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "bilatu zure gailuaren izena, \"USB Serial\" edo \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Ezin baduzu aurkitu, aurrena USB gidari egokia instalatu beharrean egon zaitezke." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Ataka" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Saiatu ataka automatikoki hautematen" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (generikoa)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Inprimatu..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Ireki sistemaren oskola..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Xehetasunak" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instalatu eskakizunen fitxategitik" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instalatu fitxategi lokaletik" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Elkarrizketa-koadro hori «Thonny»ren pluginak eta haien mendekotasunak kudeatzeko da.\n" "Zure programa propioetarako paketeak instalatu nahi badituzu, aukeratu 'Tresnak → Kudeatu paketeak...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generikoa)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Koskatu hautatutako lerroak" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Kendu koska hautatutako lerroei" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Aldatu\n" "modu\n" "arruntera" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Ziurtatu MicroPython zure «micro:bit»ean instalatu dela." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Ez ahaztu, «main.py», txertatutako gidoi nagusia gabe bakarrik dabilela." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Ezin izan du '%s' diskoa aurkitu. Zuk zeuk aurkitu nahi duzu?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Hainbat '%s' disko aurkitu ditu. Zuk zeuk bat hautatu nahi duzu?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Ezin da aurkitu disko egokia" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d elementu" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Eraman zakarrontzira" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Ezabatu" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Direktorio berria" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Propietateak" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Biltegiratze lekua" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Bide-izena" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Direktorioaren propietateak" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Fitxategiaren propietateak" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "byte" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Neurria" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Aldatua" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "%s ezabatzea" #: thonny/editors.py:262 msgid "Loading" msgstr "Zamatzen" #: thonny/editors.py:395 msgid "Saving" msgstr "Gordetzen" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Zama-igo '%s'(e)ra" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "%s '%s'(e)ra zama-jaisten" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Zama-jaitsi '%s'(e)ra" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Ireki sistemaren fitxategi kudeatzailean" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Ezkutatu ezkutuko fitxategiak" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Erakutsi ezkutuko fitxategiak" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Ireki «Thonny»rekin" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Ireki sistemaren aplikazio lehenetsian" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Konfiguratu %s fitxategiak" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Zer egin %s fitxategi batekin «Thonny»ren fitxategi-arakatzailean klik bikoitza egiten diozunean?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Ezabatzen" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Direktorioa sortzen" #: thonny/editors.py:260 msgid "Loading %s" msgstr "%s zamatzen" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "«%s»(e)an gordetzen" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Gorde fitxategi guztiak" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Konfiguratu interpretea..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Gailua" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Bertan behera uzten" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Abiarazten" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Autentifikazioa" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Sartu zure gako pribatuaren pasahitza ondokorako\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Sartu zure pasahitza ondokorako\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Goran irudikatutakoa «float» (koma higikorreko balio) horren balioaren hurbilketa bat da. Gordetako balio zehatza %s da, %s gutxi gorabehera." #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Bilaketaren emaitzak" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Bilatzen" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "'%s' instalatzen" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "'%s' bertsio-berritzen" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "'%s' desinstalatzen" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Instalatzen" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Pakete-kudeatzailea ez dago erabilgarri interprete honetarako" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Euskarririk gabe" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Ez erabilgarri" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Zure programa gelditu behar duzu pakete-kudeatzailea abiarazi aurretik." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Ireki ebaluatutako balioak Objektu ikuskarian" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "«Python»en exekutagarria" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! Alegiazko ingurune bateko exekutagarriak hautatzean, baliteke\n" "botoia behar bezala ez ibiltzea. Kasu horretan, interpretearen ordez,\n" "aukeratu 'aktibatu' gidoia (edo sartu bide-izena laukian zuzenean)" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Urrutiko Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Konektatu gabe" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (lokala)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "ez dago liburutegi (lib) direktorio absoluturik 'sys.path\"en" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Bilatu «PyPI»n" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Ireki «Thonny»ren testu editorean" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Biltegiratze lekua gailu edo fitxategi-sistema honetan" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "Lekua osoa" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "erabilitako lekua" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "leku hutsa" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Biltegiratze informazioa" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Ordeztu tabulazioak zuriuneekin" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Nabarmendu tab karaktereak" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Koskatu tab karaktereekin (Pyhon-ekin ez gomendatua)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Izena" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Neurria (byte)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Sartu honen barruko direktorio berriaren izena\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Ez da ezer hautatu" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Hautatu elementu bat eta saiatu berriz!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Ireki %s(e)tik" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Gorde %s(e)an" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Fitxategi izena:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "Balio ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Balioa" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Gorde pasahitza" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Funtzio-deia %s(e)an" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Aldagai lokalak" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Funtzioa" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Kokalekua" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Azken komandoak salbuespen bat eragin badu, ikuspegi honek pilaren aztarna erakutsiko du («stacktrace»)." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Datuak" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atributuak" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Indizea" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Gako ID" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Gakoa" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Atzera\n" "%s(e)ra" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Ataka edo WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Pasahitza" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Sorburu kodea" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Erabili Tk fitxategi elkarrizketak Zenity erabili ordez" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Hautatu fitxategien elkarrizketa-koadroak leiho nagusiaren atzera buka dezakeen" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Ingurune aldagaiak (GAKOA=BALIO bakarra lerroko)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Fitxategi berria" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Berrizendatu" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Berrizendatu '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Sartu izen berria" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Itsastea huts egin du" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Gatazka duten karpetak daude" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Fitxategia badago lehendik ere" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Testu-fitxategi bat bada, «Thonny»n irekitzeko konfigura dezakezu, haren gainean eskuineko klik eginez eta 'Konfiguratu ... fitxategiak' hautatuz." #: thonny/editors.py:38 msgid "Python files" msgstr "Python fitxategiak" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "Fitxategia desagertu da" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Editorea ere itxi nahi duzu?" #: thonny/editors.py:169 msgid "External modification" msgstr "Kanpoko aldaketa" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Editorearen uneko edukia baztertu eta fitxategia diskotik birzamatu nahi duzu?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Python fitxategiak .py luzapena izan ohi dute." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "'%s' esan nahi zenuen?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Mugitu / berrizendatu..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Joan... lerrora" #: thonny/editors.py:1010 msgid "Line number" msgstr "Lerro-zenbakia" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Itxi aurretik fitxategiak gorde nahi dituzu?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Itxi aurretik fitxategia gorde nahi duzu?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Gorde ixterakoan" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Komando ez dago erabilgarri" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Komando hori ez dago erabilgarri Thonny Flatpak bidez exekutatzen bada" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Babestu Ukraina" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "«Thonny»k zure kodea exekutatzeko zein interprete mota erabili beharko luke?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Erakutsi parametroei buruzko informazioa" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Parametroen informazioa automatikoki erakutsi '(' tekleatu ondoren" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Tekleatu bitartean osatzea automatikoki proposatu" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Osatzeen dokumentazioa automatikoki erakutsi" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Osatzea eskatu editorean Tab teklarekin" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Osatzea eskatu oskolean Tab teklarekin" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Arazoa" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Ezin izan du definizioa aurkitu" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Garbitu oskola prozesu berria hasi aurretik (Exekutatu, araztu, Gelditu/Berrabiatu, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "«Thonny»ren Python" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Eten lanean ari den programa konektatzean" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Sinkronizatu gailuaren denbora errealeko ordularia" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Erabili tokiko ordua denbora errealeko ordularian" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Berrabiarazi interpretea gidoia exekutatu aurretik" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Horrek ez du MicroPython/CircuitPython pakete itxurarik.\n" "Ziur zaude instalatu nahi duzula?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Zakarrontzira eramatea" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "%s zakarrontzira eraman?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "%s zakarrontzira eramaten" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Ireki kanpoko aplikazio lehenetsian" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "Urrutiko fitxategiak kanpoko aplikazioan irekitzeko euskarririk ez dago." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Fitxategia kanpoko aplikazioan ireki beharra badago, zama-jaitsi ezazu direktorio lokal batera eta bertatik ireki!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "'%s' ezabatu edo lekuz aldatu dela dirudi." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "'%s' editore kanpotik aldatu dela ematen du." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "N.B.! «Thonny»k Python %s eta berriagoak bakarrik onartzen ditu" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Joan lerrora" #: thonny/workbench.py:703 msgid "Support" msgstr "Babesa" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Ezin izan du gorde" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Abisua" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Ingurune aldagai baten balioa kakotxen artean biltzen baduzu, kakotxak balioaren zati izango dira.\n" "Ori nahi zenuen?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Instalatu MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Instalatu CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Egin exekutagarri, zama-igotako «shebang» gidoiak" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Egin exekutagarri, gordetako «shebang» gidoiak" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Aktibatu alegiazko ingurunea" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Jomuga" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Irudikatu uneko gidoia Python-en tutorean" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Lerroa" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Informazioa" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Ez da #todo gisa markatutako lerrorik aurkitu" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "ZEREGINA" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "%s instalatu edo eguneratu" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Python 3 lokala" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Existitzen den alegiazko ingurune bat ere aktibatu dezakezu, alegiazko ingurunearen karpeta bat, edo barruko 'pyveng.cfg' fitxategia aukeratzean, fitxategi nabigazioan eskuin-klikaren testuinguruko menuaren bidez." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Prestaketa (saihestu «VS Code» atala)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Pasahitz lehenetsia" #: thonny/running.py:392 msgid "Information" msgstr "Informazioa" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Programa arazteko, aurrena, gorde egin behar da." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "«%s»(e)k ez dirudi testu fitxategia" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Arazoa fitxategia zamatzean" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Fitxategi horrek kodeketarekin arazoak dituela ematen du.\n" "\n" "Ziurtatu UTF-8 erabiltzen duela edo kodeketaren argibide egokia duela." #: thonny/editors.py:295 msgid "File is open" msgstr "Fitxategia irekita dago" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Fitxategi hori jada «Thonny»n irekita dago.\n" "\n" "Izen horrekin gorde nahi baduzu, aurretik,\n" "itxi irekita dagoen editorea!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Baimen errorea" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Ematen du fitxategi edo karpeta hori ezin dela idatzi." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Bizkarraldekoa ez dago prest" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Non gorde behar da?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Arazo potentziala" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Zure gidoia '%s' izendatzen baduzu, ez duzu '%s' izeneko liburutegi-modulua inportatzerik izango." #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Hala ere zure gidoiarentzako izen hori erabili nahi duzu?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Baimen errorea jaso da ondokoa zamatzen saiatzean\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Saiatu hura irekitzen Fitxategia => Ireki erabiliz." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Baimen errorea" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Baimendu izengabeko programak exekutatzea" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Lizentzia" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Abisatu erabiltzailearen modulu batek liburutegi-modulu bati itzal egiten badio" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Bilatu micropython-lib eta PyPI" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.936003 thonny-4.1.7/thonny/locale/fa_IR/0000755000076600000240000000000014730055627017154 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.097807 thonny-4.1.7/thonny/locale/fa_IR/LC_MESSAGES/0000755000076600000240000000000014730055627020741 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/fa_IR/LC_MESSAGES/thonny.mo0000644000076600000240000012615414670256721022627 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4Ku Ru_udutuuuuuu=uT9vYvSvV<V/Gww %5 GQR7Jܪ~'r %'M%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: fa Language-Team: fa Plural-Forms: nplurals=1; plural=0; MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 تعداد %d مورد%s شبیه فایل متنی نیست(بعد از تغییر این گزینه باید مجدد Thonny را اجرا کنید)(هنگام کلیک کردن روی دکمه خطایابی استفاده می شود)<بدون عنوان>درباره Birdseyeدرباره Thonnyفعال کردن محیط مجازینصب، ارتقاء یا نصب نسخه‌ قدیمی پیشرفتهفقط یکبار اجرای تانی مجاز استاجازه اجرای برنامه های بدون ناماجازه قدم گذاشتن به داخل کتابخانه‌ها (مانند مواقعی که خارج از پوشه اسکریپت هستید)آیا از اینکه می‌خواهید آن برنامه را حذف کنید، مطمئن هستید؟دستیارخواصاحراز هویتسازندهتکمیل خودکارپیشنهاد خودکار در هنگام تایپ نمایش خودکار داکیومنت برای تکمیلنمایش خودکار اطلاعات پارامترها بعد از تایپ ')'عقببرگرد به %sبازگشت به فریم فعلیبک‌اند آماده نیستپوشه نامناسبBirdseye یک خطایاب پایتون است و بایستی جداگانه نصب شود. آیا می‌خواهید صفحه راهنمای را باز کنید و بیشتر بدانید؟پورت Birdseyeمرور بسته‌هاخطایابهنوز قابل بستن نیستبسته در فهرست زیر یافت نشد:دیسک مناسب یافت نشدلغودرحال لغوحساس به حروف کوچک و بزرگ انگلیسیتغییر اندازه فونتپوشه فعلی را به پوشه اسکریپت در اجرا / خطایابی تغییر دهیدCircuitPython (عمومی)دستگاه CircuitPythonپاک کنقبل از شروع پراسس جدید شِل را پاک کن (اجرا، خطایابی، توقف/ بازنشانی)پاک کردن شِلکلیککلیکبستنبستن همهبستن بقیهدستور در دسترس نیستکد به توضیحتنظیمات بروز رسانی شد. برای شروع کار در محیط عادی، تانی را مجدد اجرا کنید. (اگر نظرتان عوض شد، از «ابزارها ← تنظیمات ← عمومی» را انتخاب کنید)%s فایل تنظیم شدپیکره‌بندی مفسر...تاییددستگاه خود را به رایانه متصل کرده و پورت مربوط را از زیر انتخاب کنیدکپیکپی در حافظه موقتدرحال کپیکپی %s در %sتعریف پیدا نشددیسک %s پیدا نشد. آیا مایلید که محل آن را خودتان مشخص کنید؟بسته مورد نظر در PyPI پیدا نشد.این بسته در PyPI یافت نشد.ذخیره نشدساخت پوشهساخت یک محیط مجازیبرشدادهخطایابیخطایابی این اسکریپتخطایابی همین اسکریپت (birdseye)خطایابی همین اسکریپت (سریع)خطایابی همین اسکریپت (مبتدی)حالت خطایابی (ثبت خطایابی‌ها با جزئیات بیشتر)فونت کوچک‌تر شودحذف تورفتگی خطوط انتخابیگذرواژه پیش فرضحذفدر حال حذفحذف %sنسخه دلخواهجزئیاتدستگاهآیا منظورتان %s بود؟مشخصات پوشههشدارهای صوتی غیرفعال شودلغو بررسی (یک شناسه در هر خط)قطع اتصالآیا هنوز می خواهید از این نام برای اسکریپت خود استفاده کنید؟آیا می خواهید ویرایشگر را هم ببندید؟آیا می خواهید محتوای فعلی را کنار بگذارید و فایل را از دیسک بارگیری مجدد کنید؟آیا می‌خواهید بر روی «%s» جایگزین شود؟آیا می خواهید فایل را قبل از بسته شدن ذخیره کنید؟آیا می خواهید فایل ها را قبل از بسته شدن ذخیره کنید؟ثابت‌ کردن محل پنجره‌های شمامستنداتدقت کنید که main.py در صورتی کار می‌کند که بدون اسکریپ main باشد.پاییندانلود در %sدرحال دانلود %s در %sویرایشویرایشگرفونت ویرایشگرعددی صحیح را وارد کنیدنام پوشه جدید که در زیر مجموعه پوشه زیر ساخته خواهد شد را وارد کنید. %sنام جدیدی را وارد کنیدمتنی را جهت جایگزینی وارد کنید.برای {} عبارت کلید خصوصی خود را وارد کنیدبرای {} گذرواژه خود را وارد کنیدمتغیرهای محیطی (در هر سطر یک مقدار=کلید)خطاکد خطا:خطا:رویدادهااستثناءخروجخروج از Thonnyذخیره وقایع ثبت شده...اصلاح خارجیفایلفایل از قبل موجود میباشدفایل از بین رفته استفایل باز استنام فایل:مشخصات فایلفایل‌هایافتنیافتن و جایگزینییافتنبرو به ویرایشگربرو بهبرو به شِلمقیاس اندازه فونتبرای رفع اشکال، ابتدا باید برنامه ذخیره شود.برای بهبود کارآیی، شِل از نمایش خطوط بلند به صورت کامل خودداری می‌کند (به ابزارها ← تنظیمات ← شِل بروید). از اینجا می توانید با قسمتی از متن اصلی کار کنید.چندین دیسک %s پیدا شد. آیا مایلید که خودتان یکی از آنها را انتخاب کنید؟تمام صفحهتابعفراخوانی تابع در %sعمومیبرو به خطبرو به خط...هنگام تلاش برای بارگیری خطای مجوز دریافت کردم %sهیپحالت هیپ فعال است. برای بستن آن باید نمای هیپ را ببندید.راهنمامحتوای راهنماعدم نمایش فایل‌های مخفینمایان کردن خط فعلی (باید دوباره ویرایشگر را باز کنید)نمایان کردن متغیرهای محلینمایان کردن نام‌های یکساننمایان کردن پرانتزهانمایان کردن اجزای دستورنمایش Tabهاخانهصفحه اصلی سایتشناسهنصب برنامهفونت IOاگر یک فایل متنی است، می‌توانید با کلیک راست روی آن و انتخاب «پیکربندی فایل‌ها»، آن را طوری پیکربندی کنید که در Thonny باز شود.اگر آخرین دستور یک خطا را ایجاد کند این نما، stacktrace (ردیاب اِستک) را نمایش می‌دهد.اگر فایل باید در برنامه خارجی باز شود، آن را در یک دایرکتوری محلی دانلود کنید و از آنجا باز کنید!اگر آن را پیدا نکردید،احتمالا لازم است که ابتدا درایور USB مناسب را نصب کنید.اگر نمی دانید بسته را باید از کجا بگیرید، به احتمال زیاد بخواهید تا فهرست بسته‌های پایتون را جستجو کنید. ابتدا نام بسته را در قسمت جستجو وارد کنید و سپس کلید Enter را بزنید.اگر اسکریپت خود را "%s" نام گذاری کنید، نمی توانید ماژول کتابخانه با نام "%s" را وارد کنیداگر مقدار یک متغیر مجازی را نقل قول کنید، نقل قول ها بخشی از مقدار خواهند بود. آیا شما این را میخواهید؟اگر کماکان آن را می‌خواهید ، لطفاً آن را از خط فرمان نصب کنید.فونت درشت‌تر شودتورفتگی خطوط انتخابیایجاد تورفتگی با Tab (در پایتون این کار توصیه نمی‌شود)اندیساطلاعاتاطلاعاتنصب برنامهنصب CircuitPythonنصب MicroPythonنصب برنامه از PyPIنصب با فایل‌های موجودنصب از فایل‌های مورد نیازنصب یا بروزرسانی %sنصب در:نسخه نصب شده:در حال نصبدر حال نصب «%s»مفسرقطع اجرابرنامه درحال اجرا را در هنگام اتصال قطع کنیدداخلپنجره ترمینال را بعد از اتمام پردازش پایتون باز نگه دارکلیدشناسه کلیدزبانآخرین نسخه پایدارآخرین نسخهلایسنسخطشماره خطبارگذاریدر حال بازگذاریدر حال بارگذاری %sپایتون محلی 3متغیرهای محلیمحلثبت رویداد‌های استفاده از برنامهبه نظر %s حذف شده و یا به جای جدیدی انتقال یافته.به نظر می‌رسد «%s» خارج از ویرایشگر اصلاح شده است.به نظر می رسد این فایل یا پوشه قابل نوشتن نیست.به نظر می رسد شما در حال نصب یکی از بسته‌های تانی هستنید. اگر قصد نصب پلاگینی برای Thonny را دارید باید از «ابزارهای ← مدیریت افزونه‌ها...» اقدام کنید. آیا از نصب %s برای هسته کاملا مطمئن هستید؟ساخته شده در دانشگاه Tartu، کشور استونی با کمک از جامعه متن باز، بنیاد رزبری پای و Cybernetica ASاسکریپت های ذخیره شده shebang را قابل اجرا کنمطمئن شوید که MicroPython بر روی micro:bit شما نصب است...اسکریپت های shebang آپلود شده را قابل اجرا کنمدیریت بسته‌های %sمدیریت بسته‌ها...مدیریت افزودنی‌ها...نمای کاملحداکثر طول یک قطعه از خط قبل از فشرده شدننگهداری حداکثر تعداد سطر ممکن.ممکن است خطایابی را کندتر کند.میکروپایتون (SSH)MicroPython (عمومی)میکروپایتون (محلی)دستگاه MicroPythonویرایش شده%s به سطل زباله انتقال یابد؟انتقال / تغییر نامانتقال به سطل زبالهانتقال %s به سطل زبالهانتقال به سطل زبالهتوجه مهم! بستن خودکار نیاز به فعال سازی تنظیمات ترمینال دارد (پروفایل ← شِل ← هنگام خروج از شِل)توجه مهم! دکمه انتخاب فایل در هنگام انتخاب فایل‌های اجرایی در محیط مجازی ممکن است به درستی کار نکند. در این صورت اسکریپت «activate» را به جای مفسر انتخاب کنید (و یا مسیر را در قسمت مسیر مستقیما وارد کنید)!توجه مهم! مقادیر بزرگ ممکن است باعث کاهش کارآیی شوند!توجه مهم! بعد از تغییر این گزینه‌ها باید Thonny را دوباره باز کنید!توجه مهم! برخی از تغییرات ظاهری موارد نیاز به اجرای دوباره تانی دارد!توجه مهم! ممکن است نسخه دیگری موجود باشد که با نسخه فعلی تانی سازگار باشد. برای انتخاب نسخه مورد نظرتان برای نصب، بر روی دکمه «...» کلیک کنید.توجه! Thonny فقط پایتون %s و بالاتر را پشتیبانی می‌کند توجه مهم! بعد از نصب / ارتقاء / حذف افزونه‌ای، باید Thonny را دوباره باز کنید.نامجدیدپوشه جدیدفایل جدیدبسته‌های جدید در این پوشه نصب خواهند شد. مسیرهای دیگر باید با سایر روش‌ها مدیریت شود.شیء بعدیهیچ خطی به صورت todo# علامت گذاری نشده است.موجود نیستوصل نیستپشتیبانی نمی‌شودیادداشت‌هاچیزی انتخاب نشده استتاییدبازرس اشیاءاجرای خودکار دستیار در هنگام داشتن هشدارهایی در برنامهاجرای خودکار دستیار در هنگام بسته شدن برنامه همراه با خطانمایش فولدر داده‌های Thonnyنمایش فولدر برنامه Thonnyباز و بسته شدن خودکار نمای اِستکنمایش مقدار محاسبه شده را در بازرس اشیاءباز کردن از %sبازکردن در Thonnyدر ویرایشگر متنی Thonny باز شوددر برنامه خارجی پیش فرض باز کنیدبازکردن با نرم افزار پیش‌فرض سیستمبازکردن در برنامه مدیریت فایل سیستمباز کردن «بازپخش کننده»بازکردن شِل سیستمباز کردن...باز کردن فایل های ریموت در برنامه خارجی پشتیبانی نمی شود.نمای اِستک را در اولین فراخوانی نمایش داده و بعد از بازگشت برنامه به فریم اصلی آن را خواهد بست.تنظیمات...بیرونطرح کلیبعدیجایگزین شود؟در حال بازنویسی قالب «%s»بستهبسته «{}» برای نصب و یا حذف سایر بسته‌ها مورد نیاز است.مدیریت بسته برای این مفسر موجود نیستپوشه‌ی بسته‌هاگذرواژهجای‌گذاریجایگذاری ناموفق بودمسیربررسی MyPyبررسی Pylint انتخابیخطای مجوزخطای مجوزلطفا غلط املائی را بررسی کنید!نمودارنموداری به صورت گرافیکی اعدادی که در شِل چاپ می‌شوند را نمایش می‌دهد.پورتپورت WebREPLمشکل احتمالیخطایاب انتخابیآماده سازی (بخش VS Code را رد کنید)نمایش Python REPL بعد از اتمام برنامهپیش‌نمایششیء قبلیچاپ...مشکلمشکل در بارگذاری فایلورودی‌های برنامهورودی‌های برنامه:درخت برنامهویژگی‌هاصفحه PyPIحالت Pygame Zeroفایل اجرایی پایتونفایل های پایتونفایل های پایتون معمولا دارای پسوند .py هستند.مفسرهای پایتونخروجواقعا برنامه را حذف می‌کنید؟آخرین فایل‌هاحداکثر طول خط پیشنهادی (برای خاموش کردن خط حاشیه روی 0 تنظیم کنید)بازانجامتازه سازیحالت عادیدسترسی از راه‌ دور پایتون 3 (SSH)تغییرنامتغییر نام '%s'تمام فایلها‌ی اجرای قبلی برنامه را دوباره باز شودجایگزینیجایگزینی همهجایگزینی Tabها با فاصلهجایگزین شود با:جایگزین و یافتن بعدیگزارش مشکلاتدرخواست تکمیل با کلید Tab در شِلدرخواست تکمیل با کلید Tab در ویرایشگرهاالزاماتمورد نیاز:بازنشانی مفسر قبل از اجرای یک برنامهادامهاجرااجرا و خطایابیاجرا / ادامهاجرای این اسکریپتاجرای این اسکریپت در ترمینالاجرا تا نشانگراجرای این اسکریپ در شِلذخیرهذخیره تمامی فایل‌هاذخیره در زمان بستنذخیره با نام...ذخیره یک کپی ..ذخیره گذرواژهذخیره در %sدر حال ذخیرهدر حال ذخیره %smicropython-lib و PyPI را جستجو کنیدجستجو در PyPIنتایج جستجودر حال جستجوبرای جزئیات، راهنما را ببینید.انتخاب همهانتخاب همهموردی را انتخاب کنید و دوباره امتحان کنید!برای محیط مجازی جدید بایستی پوشه‌ای خالی را انتخاب کنیداگر پنجره‌ها پشت پنجره اصلی برنامه قرار می‌گیرد، این گزینه را انتخاب کنیدپوشه انتخاب شده خالی نیست. یکی دیگر را انتخاب کنید و یا لغو کنید.ارسال EOF/ ریبوت نرمشِلنمایش نمودارفراخوانی توابع را در پنجره‌های جداگانه (فریم‌ها) نمایش بدهنمایش فایل‌های مخفینمایش شماره خطوطنمایش اطلاعات پارامترهااندازهاندازه (بایت)کد اصلیمتن فشرده شده (شامل %d کاراکتر)اِستکبا انتخاب بسته‌ای از سمت چپ شروع کنید.درحال شروعگامی به عقبگامی به داخلگامی به خارجگام بعدیتوقفتوقف/ اجرای دوباره هستهاطلاعات فضای ذخیره سازیفضای ذخیرهفضای ذخیره سازی در این درایوخلاصهپشتیبانی حمایت از اوکراینبرگشت به حالت عادیهمگام سازی ساعت دستگاهقالب نوشتارانجام دادنهدفترمینالشبیه‌ ساز ترمینالپاسخمقدار نمایش داده شده در بالا، مقدار تقریبی این عدد اعشاری است. مقدار دقیق ذخیره شده در %s تقریبا %s است.متن تعیین شده یافت نشد!قالب و فونتپوشه های متناقضی وجود دارداین قسمت برای یادداشت‌های کاری شما، مقداردهی‌ها ، قطعه کد و یا هر یادداشت دلخواه دیگری است. هر چیزی در آن به صورت خودکار ذخیره خواهد شد و در اجرای بعدی Thonny نمایش داده می‌شود. می‌توانید همین متن را برای داشتن فضای بیشتر، پاک کنید.اگر Thonny از طریق Flatpak اجرا شود، این دستور در دسترس نیستاین کامپیوتراین پنجره برای مدیریت افزونه‌های تانی و وابستگی‌های آنها است. اگر می‌خواهید که یک بسته را برای برنامه‌تان نصب کنید باید اینکار را «ابزارها ← مدیریت بسته‌ها» انجام دهید.این پنجره تمام بسته های موجود را لیست می کند، اما فقط اجازه می‌دهد تا ارتقا و حذف بسته از مسیر زیر انجام شوداین شبیه بسته MicroPython/CircuitPython نیست. آیا مطمئن هستید که می خواهید آن را نصب کنید؟این فایل قبلاً در Thonny باز است. اگر می خواهید با این نام ذخیره کنید، ابتدا ویرایشگر موجود را ببندید!به نظر می رسد این فایل با رمزگذاری مشکل دارد. مطمئن شوید که UTF-8 است یا حاوی راهنمایی رمزگذاری مناسب است.این یک توضیح استاین بسته به نسخه دیگری از Thonny نیاز دارد:این برنامه بدون هیچگونه ضمانتی است! این نرم افزار رایگان است و می‌توانید آن را تحت شرایط تعیین شده، باز توزیع نمایید. برای جزئیات بیشتر به آدرس زیر مراجعه کنید: https://opensource.org/licenses/MITتنظیمات Thonnyپلاگین های Thonnyافزودنی‌های Thonny بدون پیش‌نیازپایتونه Thonnyتغییر وضعیت توضیحاتابزارهاسعی کنید آن را با File => Open باز کنیدشروع تشخیص خودکار پورتحالت ظاهری برنامهضریب اندازه ظاهر برنامهقالب محیط نرم افزاراگر می خواهید تجربه سنتی‌تری داشته باشید، غیر فعالش کنید.توضیح به کدواگردحذف برنامهدر حال حذف «%s»پیش‌نیازهای نامناسببالابه روز رسانیبه‌روزرسانی پیش‌نیازهاارتقاء یا حذف برنامهدر حال ارتقای «%s»آپلود به %sبرای لغو خطایابی از دستور «Stop» استفاده کنیدبه جای پنجره فایل Zenity از Tk استفاده کنیداز زمان محلی استفاده کنیدمقدارشناسه مقدارمتغیرهاتغییرات نسخه‌‌هانمامصورسازی این برنامه در Python Tutorاگر یک ماژول کاربر یک ماژول کتابخانه را مورد تاثیر قرار میدهد، هشدار دهیدهشداروقتی که فایل %s را در مرورگر فایل Thonny دوبار کلیک شد، چه شود؟کجا ذخیره کنم؟از چه نوع مفسری تانی باید برای اجرای کد شما استفاده کند؟با مفسر فعلی فقط می توانید بسته‌ها را در اینجا ببینید. برای نصب، ارتقاء و یا حذف به «ابزارها ← باز کردن شِل سیستم» بروید.شکستن خطوط (ممکن است کمی کند باشد)هنگام انتخاب پوشه محیط مجازی یا فایل 'pyveng.cfg'، می‌توانید یک محیط مجازی موجود را نیز از طریق منوی کلیک راست در مسیریابی فایل فعال کنید.باید فایلی را انتخاب کنید!قبل از راه‌اندازی مدیریت بسته‌ها، باید برنامه خود را متوقف کنید.بزرگنماییهمه فایل‌هاو غیرهبایت‌هافضای آزاداینجانام دستگاه خود، «USB Serial» یا «UART» را مشخص کنیدبدون پوشه مشخص (مطلق) lib در sys.pathپشتیبانی از استایل‌ها و رنگ‌های ANSI سادهبرای مشخص کردن و نصب بسته از فایل (معمولا با پسوندهای whl. یا tar.gz و یا zip.)برای مشخص کردن محل فایل requirements.txt و نصب بسته‌های مشخص شده در آن.فضای کلانتهای متن بسته نیستفضای استفاده شده././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/fa_IR/LC_MESSAGES/thonny.po0000644000076600000240000017532714626075445022643 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: fa\n" #: thonny/workbench.py:375 msgid "File" msgstr "فایل" #: thonny/workbench.py:376 msgid "Edit" msgstr "ویرایش" #: thonny/workbench.py:377 msgid "View" msgstr "نما" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "اجرا" #: thonny/workbench.py:379 msgid "Tools" msgstr "ابزارها" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "راهنما" #: thonny/workbench.py:598 msgid "Exit" msgstr "خروج" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "فونت کوچک‌تر شود" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "برو به ویرایشگر" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "برو به شِل" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "نمای کامل" #: thonny/workbench.py:668 msgid "Full screen" msgstr "تمام صفحه" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "ورودی‌های برنامه" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "درباره Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "ساخته شده در\n" " دانشگاه Tartu، کشور استونی\n" " با کمک از جامعه متن باز،\n" " بنیاد رزبری پای \n" "و Cybernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "این برنامه بدون \n" "هیچگونه ضمانتی است!\n" "این نرم افزار رایگان است و می‌توانید آن را تحت شرایط تعیین شده،\n" "باز توزیع نمایید. برای جزئیات بیشتر به آدرس زیر مراجعه کنید:\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "تغییرات نسخه‌‌ها" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "گزارش مشکلات" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "اجرای خودکار دستیار در هنگام بسته شدن برنامه همراه با خطا" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "اجرای خودکار دستیار در هنگام داشتن هشدارهایی در برنامه" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "بررسی Pylint انتخابی" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "بررسی MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "لغو بررسی (یک شناسه در هر خط)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "دستیار" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "تکمیل خودکار" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "مفسر" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "درباره Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye یک خطایاب پایتون است و بایستی جداگانه نصب شود.\n" "\n" "آیا می‌خواهید صفحه راهنمای را باز کنید و بیشتر بدانید؟" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "خطایابی همین اسکریپت (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "تغییر وضعیت توضیحات" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "کد به توضیح" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "توضیح به کد" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "واگرد" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "بازانجام" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "برش" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "کپی" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "جای‌گذاری" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "انتخاب همه" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "اجرا تا نشانگر" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "هنوز قابل بستن نیست" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "برای لغو خطایابی از دستور «Stop» استفاده کنید" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "ثابت‌ کردن محل پنجره‌های شما" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "نمایان کردن نام‌های یکسان" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "نمایان کردن متغیرهای محلی" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "نمایان کردن پرانتزها" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "نمایان کردن اجزای دستور" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "نمایان کردن خط فعلی (باید دوباره ویرایشگر را باز کنید)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "نمایش شماره خطوط" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "حداکثر طول خط پیشنهادی\n" "(برای خاموش کردن خط حاشیه روی 0 تنظیم کنید)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "ویرایشگر" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "ذخیره وقایع ثبت شده..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "رویدادها" #: thonny/plugins/files.py:609 msgid "Files" msgstr "فایل‌ها" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "یافتن و جایگزینی" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "یافتن" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "جایگزین شود با:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "حساس به حروف کوچک و بزرگ انگلیسی" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "بالا" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "پایین" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "یافتن" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "جایگزینی" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "جایگزین و یافتن بعدی" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "جایگزینی همه" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "متنی را جهت جایگزینی وارد کنید." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "متن تعیین شده یافت نشد!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "فقط یکبار اجرای تانی مجاز است" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "تمام فایلها‌ی اجرای قبلی برنامه را دوباره باز شود" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "هشدارهای صوتی غیرفعال شود" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "مقیاس اندازه فونت" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "حالت هیپ فعال است.\n" "برای بستن آن باید نمای هیپ را ببندید." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "هیپ" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "زبان" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "این قسمت برای یادداشت‌های کاری شما، مقداردهی‌ها ، قطعه کد و یا هر یادداشت دلخواه دیگری است.\n" "\n" "هر چیزی در آن به صورت خودکار ذخیره خواهد شد و در اجرای بعدی Thonny نمایش داده می‌شود.\n" "\n" "می‌توانید همین متن را برای داشتن فضای بیشتر، پاک کنید." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "یادداشت‌ها" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "شیء قبلی" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "شیء بعدی" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "بازرس اشیاء" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "طرح کلی" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "حالت Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "حذف برنامه" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "بستن" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "کلیک" #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "اینجا" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "به روز رسانی" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "نصب برنامه" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "بسته مورد نظر در PyPI پیدا نشد." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "آخرین نسخه پایدار" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "آخرین نسخه" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "خلاصه" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "سازنده" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "صفحه اصلی سایت" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "خطایاب" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "مستندات" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "صفحه PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "الزامات" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "واقعا برنامه را حذف می‌کنید؟" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "آیا از اینکه می‌خواهید آن برنامه را حذف کنید، مطمئن هستید؟" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "بازگشت به فریم فعلی" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "متغیرها" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "این کامپیوتر" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "تازه سازی" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "برو به" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "خطا" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "باید فایلی را انتخاب کنید!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "جایگزین شود؟" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "آیا می‌خواهید بر روی «%s» جایگزین شود؟" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "جدید" #: thonny/editors.py:671 msgid "Open..." msgstr "باز کردن..." #: thonny/editors.py:673 msgid "Load" msgstr "بارگذاری" #: thonny/editors.py:682 msgid "Recent files" msgstr "آخرین فایل‌ها" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "بستن همه" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "ذخیره" #: thonny/editors.py:739 msgid "Save as..." msgstr "ذخیره با نام..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "ذخیره یک کپی .." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "تنظیمات Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "اجرای این اسکریپت" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "اجرای این اسکریپت در ترمینال" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "توقف/ اجرای دوباره هسته" #: thonny/running.py:205 msgid "Stop" msgstr "توقف" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "قطع اجرا" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "ارسال EOF/ ریبوت نرم" #: thonny/running.py:240 msgid "Disconnect" msgstr "قطع اتصال" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "مفسرهای پایتون" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "همه فایل‌ها" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "برای محیط مجازی جدید بایستی پوشه‌ای خالی را انتخاب کنید" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "پوشه نامناسب" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "پوشه انتخاب شده خالی نیست.\n" "یکی دیگر را انتخاب کنید و یا لغو کنید." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "ساخت یک محیط مجازی" #: thonny/shell.py:101 msgid "Clear shell" msgstr "پاک کردن شِل" #: thonny/shell.py:185 msgid "Plotter" msgstr "نمودار" #: thonny/shell.py:317 msgid "Clear" msgstr "پاک کن" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "نمایش نمودار" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "برای بهبود کارآیی، شِل از نمایش خطوط بلند به صورت کامل خودداری می‌کند \n" "(به ابزارها ← تنظیمات ← شِل بروید).\n" "از اینجا می توانید با قسمتی از متن اصلی کار کنید." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "شکستن خطوط (ممکن است کمی کند باشد)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "کپی در حافظه موقت" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "متن فشرده شده (شامل %d کاراکتر)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "نموداری به صورت گرافیکی اعدادی که در شِل چاپ می‌شوند را نمایش می‌دهد." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "برای جزئیات، راهنما را ببینید." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "بستن بقیه" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "درحال کپی" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "کپی\n" " %s\n" "در\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "لغو" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "تایید" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "انتخاب همه" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "شِل" #: thonny/workbench.py:608 msgid "Options..." msgstr "تنظیمات..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "فونت درشت‌تر شود" #: thonny/workbench.py:679 msgid "Change font size" msgstr "تغییر اندازه فونت" #: thonny/workbench.py:680 msgid "Zoom" msgstr "بزرگنمایی" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "خروج از Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "خروج" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "در حال بازنویسی قالب «%s»" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "ورودی‌های برنامه:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "حالت عادی" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "تنظیمات بروز رسانی شد. برای شروع کار در محیط عادی، تانی را مجدد اجرا کنید.\n" "\n" "(اگر نظرتان عوض شد، از «ابزارها ← تنظیمات ← عمومی» را انتخاب کنید)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "درخت برنامه" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "ادامه" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "اجرا / ادامه" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "خطایابی این اسکریپت" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "خطایابی" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "خطایابی همین اسکریپت (مبتدی)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "خطایابی همین اسکریپت (سریع)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "گام بعدی" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "بعدی" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "گامی به داخل" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "داخل" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "گامی به خارج" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "بیرون" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "گامی به عقب" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "عقب" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "اِستک" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "استثناء" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "ثبت رویداد‌های استفاده از برنامه" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "حالت خطایابی (ثبت خطایابی‌ها با جزئیات بیشتر)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "حالت ظاهری برنامه" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "ضریب اندازه ظاهر برنامه" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "توجه مهم! بعد از تغییر این گزینه‌ها باید Thonny را دوباره باز کنید!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "عمومی" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "نصب برنامه" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "مرور بسته‌ها" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "با مفسر فعلی فقط می توانید بسته‌ها را در اینجا ببینید.\n" "برای نصب، ارتقاء و یا حذف به «ابزارها ← باز کردن شِل سیستم» بروید." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "پوشه‌ی بسته‌ها" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "نصب برنامه از PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "اگر نمی دانید بسته را باید از کجا بگیرید، به احتمال زیاد بخواهید تا فهرست بسته‌های پایتون را جستجو کنید. ابتدا نام بسته را در قسمت جستجو وارد کنید و سپس کلید Enter را بزنید." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "برای مشخص کردن محل فایل requirements.txt و نصب بسته‌های مشخص شده در آن." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "کلیک" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "برای مشخص کردن و نصب بسته از فایل (معمولا با پسوندهای whl. یا tar.gz و یا zip.)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "ارتقاء یا حذف برنامه" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "با انتخاب بسته‌ای از سمت چپ شروع کنید." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "این پنجره تمام بسته های موجود را لیست می کند، اما فقط اجازه می‌دهد تا ارتقا و حذف بسته از مسیر زیر انجام شود" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "بسته‌های جدید در این پوشه نصب خواهند شد. مسیرهای دیگر باید با سایر روش‌ها مدیریت شود." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "نسخه نصب شده:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "نصب در:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "لطفا غلط املائی را بررسی کنید!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "این بسته در PyPI یافت نشد." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "کد خطا:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "بسته در فهرست زیر یافت نشد:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "بسته «{}» برای نصب و یا حذف سایر بسته‌ها مورد نیاز است." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "بسته" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "مدیریت بسته‌های %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "تایید" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "به نظر می رسد شما در حال نصب یکی از بسته‌های تانی هستنید.\n" "اگر قصد نصب پلاگینی برای Thonny را دارید باید از «ابزارهای ← مدیریت افزونه‌ها...» اقدام کنید.\n" "\n" "آیا از نصب %s برای هسته کاملا مطمئن هستید؟" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "توجه مهم! ممکن است نسخه دیگری موجود باشد که با نسخه فعلی تانی سازگار باشد. برای انتخاب نسخه مورد نظرتان برای نصب، بر روی دکمه «...» کلیک کنید." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "افزودنی‌های Thonny بدون پیش‌نیاز" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "پیش‌نیازهای نامناسب" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "این بسته به نسخه دیگری از Thonny نیاز دارد:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "اگر کماکان آن را می‌خواهید ، لطفاً آن را از خط فرمان نصب کنید." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "توجه مهم! بعد از نصب / ارتقاء / حذف افزونه‌ای، باید Thonny را دوباره باز کنید." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "پلاگین های Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "نصب، ارتقاء یا نصب نسخه‌ قدیمی پیشرفته" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "نسخه دلخواه" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "به‌روزرسانی پیش‌نیازها" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "مورد نیاز:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "خطا:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "مدیریت بسته‌ها..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "مدیریت افزودنی‌ها..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "باز کردن «بازپخش کننده»" #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "پوشه فعلی را به پوشه اسکریپت در اجرا / خطایابی تغییر دهید" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "فراخوانی توابع را در پنجره‌های جداگانه (فریم‌ها) نمایش بده" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "اگر می خواهید تجربه سنتی‌تری داشته باشید، غیر فعالش کنید." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "باز و بسته شدن خودکار نمای اِستک" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "نمای اِستک را در اولین فراخوانی نمایش داده و بعد از بازگشت\n" "برنامه به فریم اصلی آن را خواهد بست." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "اجازه قدم گذاشتن به داخل کتابخانه‌ها (مانند مواقعی که خارج از پوشه اسکریپت هستید)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "ممکن است خطایابی را کندتر کند." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "خطایاب انتخابی" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(هنگام کلیک کردن روی دکمه خطایابی استفاده می شود)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "پورت Birdseye" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(بعد از تغییر این گزینه باید مجدد Thonny را اجرا کنید)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "اجرا و خطایابی" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "شبیه‌ ساز ترمینال" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "پشتیبانی از استایل‌ها و رنگ‌های ANSI ساده" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "نگهداری حداکثر تعداد سطر ممکن." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "توجه مهم! مقادیر بزرگ ممکن است باعث کاهش کارآیی شوند!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "حداکثر طول یک قطعه از خط قبل از فشرده شدن" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "اجرای این اسکریپ در شِل" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "نمایش Python REPL بعد از اتمام برنامه" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "پنجره ترمینال را بعد از اتمام پردازش پایتون باز نگه دار" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "توجه مهم! بستن خودکار نیاز به فعال سازی تنظیمات ترمینال دارد\n" "(پروفایل ← شِل ← هنگام خروج از شِل)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "ترمینال" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "قالب محیط نرم افزار" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "قالب نوشتار" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "فونت ویرایشگر" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "فونت IO" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "پیش‌نمایش" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "این یک توضیح است" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "پاسخ" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "انتهای متن بسته نیست" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "و غیره" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "توجه مهم! برخی از تغییرات ظاهری موارد نیاز به اجرای دوباره تانی دارد!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "عددی صحیح را وارد کنید" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "قالب و فونت" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "نمایش فولدر برنامه Thonny" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "نمایش فولدر داده‌های Thonny" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "خانه" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "محتوای راهنما" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "دستگاه CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "دستگاه MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "دستگاه خود را به رایانه متصل کرده و پورت مربوط را از زیر انتخاب کنید" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "نام دستگاه خود، «USB Serial» یا «UART» را مشخص کنید" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "اگر آن را پیدا نکردید،احتمالا لازم است که ابتدا درایور USB مناسب را نصب کنید." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "پورت" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "شروع تشخیص خودکار پورت" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (عمومی)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "چاپ..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "بازکردن شِل سیستم" #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "جزئیات" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "نصب از فایل‌های مورد نیاز" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "نصب با فایل‌های موجود" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "این پنجره برای مدیریت افزونه‌های تانی و وابستگی‌های آنها است.\n" "اگر می‌خواهید که یک بسته را برای برنامه‌تان نصب کنید\n" " باید اینکار را «ابزارها ← مدیریت بسته‌ها» انجام دهید." #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (عمومی)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "تورفتگی خطوط انتخابی" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "حذف تورفتگی خطوط انتخابی" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "برگشت\n" " به حالت\n" "عادی" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "مطمئن شوید که MicroPython بر روی micro:bit شما نصب است..." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "دقت کنید که main.py در صورتی کار می‌کند که بدون اسکریپ main باشد." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "دیسک %s پیدا نشد. آیا مایلید که محل آن را خودتان مشخص کنید؟" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "چندین دیسک %s پیدا شد. آیا مایلید که خودتان یکی از آنها را انتخاب کنید؟" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "دیسک مناسب یافت نشد" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "تعداد %d مورد" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "انتقال به سطل زباله" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "حذف" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "پوشه جدید" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "ویژگی‌ها" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "فضای ذخیره" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "مسیر" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "مشخصات پوشه" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "مشخصات فایل" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "بایت‌ها" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "اندازه" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "ویرایش شده" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "حذف %s" #: thonny/editors.py:262 msgid "Loading" msgstr "در حال بازگذاری" #: thonny/editors.py:395 msgid "Saving" msgstr "در حال ذخیره" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "آپلود به %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "درحال دانلود %s در %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "دانلود در %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "بازکردن در برنامه مدیریت فایل سیستم" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "عدم نمایش فایل‌های مخفی" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "نمایش فایل‌های مخفی" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "بازکردن در Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "بازکردن با نرم افزار پیش‌فرض سیستم" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "%s فایل تنظیم شد" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "وقتی که فایل %s را در مرورگر فایل Thonny دوبار کلیک شد، چه شود؟" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "در حال حذف" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "ساخت پوشه" #: thonny/editors.py:260 msgid "Loading %s" msgstr "در حال بارگذاری %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "در حال ذخیره %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "ذخیره تمامی فایل‌ها" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "پیکره‌بندی مفسر..." #: thonny/workbench.py:1591 msgid "Device" msgstr "دستگاه" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "درحال لغو" #: thonny/workdlg.py:270 msgid "Starting" msgstr "درحال شروع" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "احراز هویت" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "برای {} عبارت کلید خصوصی خود را وارد کنید" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "برای {} گذرواژه خود را وارد کنید" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "مقدار نمایش داده شده در بالا، مقدار تقریبی این عدد اعشاری است. مقدار دقیق ذخیره شده در %s تقریبا %s است." #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "نتایج جستجو" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "در حال جستجو" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "در حال نصب «%s»" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "در حال ارتقای «%s»" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "در حال حذف «%s»" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "در حال نصب" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "مدیریت بسته برای این مفسر موجود نیست" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "پشتیبانی نمی‌شود" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "موجود نیست" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "قبل از راه‌اندازی مدیریت بسته‌ها، باید برنامه خود را متوقف کنید." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "نمایش مقدار محاسبه شده را در بازرس اشیاء" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "فایل اجرایی پایتون" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "توجه مهم! دکمه انتخاب فایل در هنگام انتخاب فایل‌های اجرایی در محیط مجازی ممکن است به درستی کار نکند. در این صورت اسکریپت «activate» را به جای مفسر انتخاب کنید (و یا مسیر را در قسمت مسیر مستقیما وارد کنید)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "دسترسی از راه‌ دور پایتون 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "وصل نیست" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "میکروپایتون (محلی)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "میکروپایتون (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "بدون پوشه مشخص (مطلق) lib در sys.path" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "جستجو در PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "در ویرایشگر متنی Thonny باز شود" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "فضای ذخیره سازی در این درایو" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "فضای کل" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "فضای استفاده شده" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "فضای آزاد" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "اطلاعات فضای ذخیره سازی" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "جایگزینی Tabها با فاصله" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "نمایش Tabها" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "ایجاد تورفتگی با Tab (در پایتون این کار توصیه نمی‌شود)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "نام" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "اندازه (بایت)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "نام پوشه جدید که در زیر مجموعه پوشه زیر ساخته خواهد شد را وارد کنید.\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "چیزی انتخاب نشده است" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "موردی را انتخاب کنید و دوباره امتحان کنید!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "باز کردن از %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "ذخیره در %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "نام فایل:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "شناسه مقدار" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "مقدار" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "ذخیره گذرواژه" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "فراخوانی تابع در %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "متغیرهای محلی" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "تابع" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "محل" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "اگر آخرین دستور یک خطا را ایجاد کند این نما، stacktrace (ردیاب اِستک) را نمایش می‌دهد." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "شناسه" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "داده" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "خواص" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "اندیس" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "شناسه کلید" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "کلید" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "برگرد به %s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "پورت WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "گذرواژه" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "کد اصلی" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "به جای پنجره فایل Zenity از Tk استفاده کنید" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "اگر پنجره‌ها پشت پنجره اصلی برنامه قرار می‌گیرد، این گزینه را انتخاب کنید" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "متغیرهای محیطی (در هر سطر یک مقدار=کلید)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "فایل جدید" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "تغییرنام" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "تغییر نام '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "نام جدیدی را وارد کنید" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "جایگذاری ناموفق بود" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "پوشه های متناقضی وجود دارد" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "فایل از قبل موجود میباشد" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "اگر یک فایل متنی است، می‌توانید با کلیک راست روی آن و انتخاب «پیکربندی فایل‌ها»، آن را طوری پیکربندی کنید که در Thonny باز شود." #: thonny/editors.py:38 msgid "Python files" msgstr "فایل های پایتون" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "<بدون عنوان>" #: thonny/editors.py:150 msgid "File is gone" msgstr "فایل از بین رفته است" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "آیا می خواهید ویرایشگر را هم ببندید؟" #: thonny/editors.py:169 msgid "External modification" msgstr "اصلاح خارجی" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "آیا می خواهید محتوای فعلی را کنار بگذارید و فایل را از دیسک بارگیری مجدد کنید؟" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "فایل های پایتون معمولا دارای پسوند .py هستند." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "آیا منظورتان %s بود؟" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "انتقال / تغییر نام" #: thonny/editors.py:768 msgid "Go to line..." msgstr "برو به خط..." #: thonny/editors.py:1010 msgid "Line number" msgstr "شماره خط" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "آیا می خواهید فایل ها را قبل از بسته شدن ذخیره کنید؟" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "آیا می خواهید فایل را قبل از بسته شدن ذخیره کنید؟" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "ذخیره در زمان بستن" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "دستور در دسترس نیست" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "اگر Thonny از طریق Flatpak اجرا شود، این دستور در دسترس نیست" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "حمایت از اوکراین" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "از چه نوع مفسری تانی باید برای اجرای کد شما استفاده کند؟" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "نمایش اطلاعات پارامترها" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "نمایش خودکار اطلاعات پارامترها بعد از تایپ ')'" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "پیشنهاد خودکار در هنگام تایپ " #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "نمایش خودکار داکیومنت برای تکمیل" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "درخواست تکمیل با کلید Tab در ویرایشگرها" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "درخواست تکمیل با کلید Tab در شِل" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "مشکل" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "تعریف پیدا نشد" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "قبل از شروع پراسس جدید شِل را پاک کن (اجرا، خطایابی، توقف/ بازنشانی)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "پایتونه Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "برنامه درحال اجرا را در هنگام اتصال قطع کنید" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "همگام سازی ساعت دستگاه" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "از زمان محلی استفاده کنید" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "بازنشانی مفسر قبل از اجرای یک برنامه" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "این شبیه بسته MicroPython/CircuitPython نیست.\n" " آیا مطمئن هستید که می خواهید آن را نصب کنید؟" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "انتقال به سطل زباله" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "%s به سطل زباله انتقال یابد؟" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "انتقال %s به سطل زباله" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "در برنامه خارجی پیش فرض باز کنید" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "باز کردن فایل های ریموت در برنامه خارجی پشتیبانی نمی شود." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "اگر فایل باید در برنامه خارجی باز شود، آن را در یک دایرکتوری محلی دانلود کنید و از آنجا باز کنید!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "به نظر %s حذف شده و یا به جای جدیدی انتقال یافته." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "به نظر می‌رسد «%s» خارج از ویرایشگر اصلاح شده است." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "توجه! Thonny فقط پایتون %s و بالاتر را پشتیبانی می‌کند " #: thonny/editors.py:1010 msgid "Go to line" msgstr "برو به خط" #: thonny/workbench.py:703 msgid "Support" msgstr "پشتیبانی " #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "ذخیره نشد" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "هشدار" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "اگر مقدار یک متغیر مجازی را نقل قول کنید، نقل قول ها بخشی از مقدار خواهند بود.\n" " آیا شما این را میخواهید؟" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "نصب MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "نصب CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "اسکریپت های shebang آپلود شده را قابل اجرا کن" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "اسکریپت های ذخیره شده shebang را قابل اجرا کن" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "فعال کردن محیط مجازی" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "هدف" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "مصورسازی این برنامه در Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "خط" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "اطلاعات" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "هیچ خطی به صورت todo# علامت گذاری نشده است." #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "انجام دادن" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "نصب یا بروزرسانی %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "پایتون محلی 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "هنگام انتخاب پوشه محیط مجازی یا فایل 'pyveng.cfg'، می‌توانید یک محیط مجازی موجود را نیز از طریق منوی کلیک راست در مسیریابی فایل فعال کنید." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "آماده سازی (بخش VS Code را رد کنید)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "گذرواژه پیش فرض" #: thonny/running.py:392 msgid "Information" msgstr "اطلاعات" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "برای رفع اشکال، ابتدا باید برنامه ذخیره شود." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s شبیه فایل متنی نیست" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "مشکل در بارگذاری فایل" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "به نظر می رسد این فایل با رمزگذاری مشکل دارد.\n" "\n" " مطمئن شوید که UTF-8 است یا حاوی راهنمایی رمزگذاری مناسب است." #: thonny/editors.py:295 msgid "File is open" msgstr "فایل باز است" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "این فایل قبلاً در Thonny باز است.\n" "\n" " اگر می خواهید با این نام ذخیره کنید،\n" " ابتدا ویرایشگر موجود را ببندید!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "خطای مجوز" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "به نظر می رسد این فایل یا پوشه قابل نوشتن نیست." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "بک‌اند آماده نیست" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "کجا ذخیره کنم؟" #: thonny/editors.py:490 msgid "Potential problem" msgstr "مشکل احتمالی" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "اگر اسکریپت خود را \"%s\" نام گذاری کنید، نمی توانید ماژول کتابخانه با نام \"%s\" را وارد کنید" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "آیا هنوز می خواهید از این نام برای اسکریپت خود استفاده کنید؟" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "هنگام تلاش برای بارگیری خطای مجوز دریافت کردم\n" " %s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "سعی کنید آن را با File => Open باز کنید" #: thonny/editors.py:1057 msgid "Permission error" msgstr "خطای مجوز" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "اجازه اجرای برنامه های بدون نام" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "لایسنس" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "اگر یک ماژول کاربر یک ماژول کتابخانه را مورد تاثیر قرار میدهد، هشدار دهید" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "micropython-lib و PyPI را جستجو کنید" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9363472 thonny-4.1.7/thonny/locale/fi_FI/0000755000076600000240000000000014730055627017150 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.0996006 thonny-4.1.7/thonny/locale/fi_FI/LC_MESSAGES/0000755000076600000240000000000014730055627020735 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/fi_FI/LC_MESSAGES/thonny.mo0000644000076600000240000006517714670256721022632 0ustar00aivarannamaastaff LM$V { !&  #.= D.R02 x q  & ,8>E K Ub x 4GA<%*%P_r3BUfm v!  % L7  ( )  !B!Z!_!d! k!w!%!!!/! ".%"T" Z"f"m" t"~" """"" " """### # (# 3#?# Q#]#f#z# # ##0## ##6#-$G$`$v$$$$$$$L$F%^%C&&j&}&7&&&&&''-'L'a' |'' '' '''3'(((%(;(J( O([(`( h(s((((%(3(z);)))) * *1*L*^*t***** ***,*0%+<V+++ ++!+ + + + + ,,",%,?6,Cv,,,',)- E-R-a-~-----T- D.O.S.[. `.k..H.5. //&/ ,/9/>/R/q/ ////////// 0 0 0&070 I0(V0000 0B000 11*1 11&=1d1 l1x1 1 111 1+112 2 2222 Q2_2d2 s2 2 2 2 22 222 22 3 332838k3:333 30 4:4L4^4r4 w4 444-44 4 44 555 ,5 95)G5q5y555$5 5556 66 )6n76!6 66:7 88@8^8T9/f99P:_:o::: ::::0: ;; ;";4;7;?;T;i;2x;%;!;;; < <<4<9<BA<<<C<< = == =&=1+= ]=Vi=I= >> &>1>E>?1? @@3@F@c@r@@@ @@@@5@7(A@`A AAzAKYKnKKKKKKKMKLL/L:ELLLLLLLM M MMR/MCMM0}NNNHN$O,O3OHO[O lOOOOOO PP&P-PIP6RPP PPPPP PPP PPQQ!&Q9HQ>Q}Q8?RxRRRR.R$ S.S@SXSrSSSSSSS8TAMTaTTTT U#U UV5V+SV"V VVV.V' W(3W$\WWlW WXXX X"X7XF?X2XXXXXXX#Y;Y UYaYjYqY YY YYYYY Y YZZ/Z1@Z rZZZZXZ [ ['[7[K[\[(r[[ [#[ [ [[[\9\B\H\P\h\x\$\\\\\]]-]?] O]\]w] ]]]]]#]<]C7^F{^)^^^8_=_T_h___ _"__'__` ` `*`3`!8` Z` h`<v` `` ``'`a#a:aNaUa]a oa`zaaa$ bB2cuccC5dVydd,deeee0f 9f'Cfkf"ff fffff g gg4gQg=eg-g3gh h hh,h?hGhEPhhh=hii i/i5i=i3Ei yieiVi BjLj `jjj%d items(restart Thonny after changing this)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced optionsAllow only single Thonny instanceAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find suitable diskCancelCancellingCase sensitiveChange font sizeCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFull screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NameNewNew directoryNew fileNew packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPortPort or WebREPLPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists top-level modules from following directories: This doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'UpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Use "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyVersion to be installedViewWarningWhich kind of interpreter should Thonny use for running your code?Wrap text (may be slow)You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"please waitto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spacevirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: fi Language-Team: fi Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d valittua kohdetta(käynnistä Thonny uudelleen muutettuasi tätä)Tietoa BirdseyestäTietoja ThonnystäAktivoi virtuaaliympäristöLisäasetuksetAja yhtä Thonnyä kerrallaanHaluatko varmasti poistaa sen?AvustajaAttribuutitTunnistautuminenTekijäAutomaattitäydennysEhdota automaattisesti täydentämisiä kirjoittaessaNäytä automaattisesti dokumentaatio täydentämisilleNäytä automaattisesti parametritiedot, kun '(' on kirjoitettuTaaksepäinHakemisto ei kelpaaBirdseye on Python-virheenjäljitin, joka pitää asentaa erikseen. Haluatko avata apusivun ja tietää asiasta enemmän?Birdseyen porttiSelaa pakettejaVirheidenseurantaEi voi sulkeaSopivaa levyä ei löydyPeruutaPerutaanKirjainkoolla on väliäMuuta fontin kokoaCircuitPython (yleisesti)CircuitPython-laiteTyhjennäTyhjennä komentorivi-ikkunaNapsautaNapsauta SuljeSulje kaikkiSulje muutKomento ei ole käytettävissäLisää kommenttimerkintäAsetuksia on muutettu. Käynnistä Thonny uudelleen saadaksesi tavallisen tilan käyttöön. (Katso 'Työkalut → Asetukset → Yleistä', jos muutat mieltäsi myöhemmin.)Määritä tulkki...VahvistusYhdistä laite tietokoneeseesi ja valitse vastaava portti alapuoleltaKopioiKopioi leikepöydälleKopioidaanMääritelmää ei löytynytLevyä '%s' ei löydy. Haluatko paikantaa sen itse?Pakettia ei löytynyt PyPI:stä.Paketin tietoja ei löytynyt PyPI:stä.Tallentaminen ei onnistunutLuodaan hakemistoLuodaan virtuaaliympäristöäLeikkaaDataVianselvitäVianselvitä nykyinen skriptiSuorita nykyinen skripti virheenjäljittäjässä (birdseye)Vianselvitä nykyinen skripti (nopeampi)Vianselvitä nykyinen skripti (kivempi)Virheenjäljitystila (diagnostiikkalogeissa on enemmän tietoa)Pienennä tekstin kokoaOletussalasanaPoistaPoistetaan%s poistetaanToivottu versioTiedotLaiteTarkoititko '%s'?Hakemiston ominaisuudetPoista ilmoitusääni käytöstäÄlä käytä seuraavia tarkistuksia (yksi tunnus riviä kohti)Katkaise yhteysHaluatko sulkea myös editorin?Haluatko hylätä editorin nykyisen sisällön ja ladata tiedoston uudelleen levyltä?Haluatko ylikirjoittaa '%s':n?Haluatko tallentaa tiedoston ennen sulkemista?Haluatko tallentaa tiedostot ennen sulkemista?Telakoi käyttäjän ikkunatDokumentaatioÄlä unohda, että main.py toimii vain upottamatta pääskriptiä.AlasMuokkaaEditoriEditorin kirjasinlajiSyötä kokonaislukuAnna uuden hakemiston nimi %sKirjoita uusi nimiSyötä korvattava merkkijono.Anna yksityisen avaimen salalause kohteelle {}Anna salasana kohteelle {}Ympäristömuuttujat (yksi NIMI=ARVO per rivi)VirheVirhekoodi:Virhe:TapahtumatPoikkeusLopetaLopeta ThonnyVie käyttötiedot...Ulkoinen muokkausTiedostoTiedosto on jo olemassaTiedosto on poissaTiedostonimi:Tiedoston ominaisuudetTiedostotEtsiEtsi & korvaaEtsittävä:Vie kursori editoriinKohdista kohtaanVie kursori komentorivilleTekstin skaalaustilaKoko näytön tilaFunktioFunktiokutsu %s:ssaYleisetSiirry rivilleSiirry riville...PinoPinotila on käytössä. Sulje Pino-näkymä kytkeäksesi sen pois päältä.OhjeOhjeen sisältöKätke piilotiedostotKorosta nykyinen rivi (vaatii editorin uudelleenavaamisen)Korosta paikallasia muuttujiaKorosta vastaavat muuttujanimetKorosta sulkujaKorosta syntaksirakenteitaKorosta tab-merkitKotiKotisivuIDASENNASyötteen/tulosteen fonttiJos edellinen komento aiheutti poikkeuksen, tämä näkymä näyttää kutsupinon.Jos et löydä sitä, sinun täytyy ehkä asentaa sopiva USB-ajuri.Jos et tiedä mistä noutaa paketti, haluat mitä luultavimmin etsiä sitä Python Package Indexistä (PyPI). Aloita kirjoittamalla paketin nimeä hakukenttään ja painamalla ENTER.Jos haluat sen silti, asenna se komentoriviltä.Suurenna fontin kokoaSisennä valitut rivitSisennä tab-merkeillä (ei suositella Pythonin kanssa käytettäväksi)IndeksiAsennaAsenna CircuitPythonAsenna MicroPythonAsenna PyPI:stäAsenna paikallisesta tiedostostaAsenna requirements-tiedostostaAsenna tai päivitä %sAsenna tai päivitä firmwareAsennettu sijaintiin:Asennettu versio:AsennetaanAsennetaan '%s'TulkkiKeskeytä ohjelman suoritusSisäänPidä pääteikkuna avoinna Python-prosessin loppuessaAvainAvaimen IDKieliViimeisin vakaa versioViimeisin versioRiviRivinumeroAvaaLadataanLadataan %sPaikallinen Python 3Paikalliset muuttujatSijaintiPidä kirjaa käyttötapahtumistaVaikuttaa siltä, että '%s' poistettiin tai siirrettiin.Vaikuttaa siltä, että '%s' muokattiin editorin ulkopuolelta.Tehty Tarton yliopistossa Virossa, avoimen lähdekoodin yhteisön, Raspberry Pi Foundationin ja Cybernetica AS:n avustuksellaVarmista, että MicroPython on asennettu micro:bittiisi.Hallitse kohteen %s pakettejaHallitse paketteja...Hallitse liitännäisiä...Suurenna näkymäMuistissa pidettävien rivien maksimimäärä.Saattaa hidastaa virheenjäljitystäMicroPython (SSH)MicroPython (yleisesti)MicroPython (paikallinen)MicroPython-laiteMuokattuSiirretäänkö %s roskakoriin?Siirrä / nimeä uudelleen...Siirrä roskakoriinSiirretään %s roskakoriinSiirretään roskakoriinHuom! Suuret arvot saattavat heikentää suorituskykyä!HUOM! Käynnistä Thonny uudelleen muutettuasi näitä asetuksia!Huom! Jotkin tyyliasetukset otetaan käyttöön vasta Thonnyn uudelleenkäynnistämisen jälkeen!NimiUusiUusi hakemistoUusi tiedostoUudet paketit asennetaan sijaintiinSeuraava olioEi saatavillaEi yhteyttäEi tuettuMuistiinpanotEi valintojaOKOliotutkaAvaa Avustaja automaattisesti, kun sillä on varoituksia koodistasiAvaa Avustaja automaattisesti, kun ohjelma kaatuu poikkeukseenAvaa Thonnyn datakansio...Avaa Thonnyn ohjelmakansio...Avaa ja sulje Pino-näkymä automaattisestiAvaa evaluoidut arvot OliotutkassaAvaa %s:staAvaa ThonnyssäAvaa Thonnyn tekstieditorissaAvaa oletusarvoisessa ulkoisessa sovelluksessaAvaa järjestelmän oletussovelluksessaAvaa järjestelmän tiedostonhallinnassaAvaa järjestelmän komentotulkki...Avaa...Pino-näkymä avataan ensimmäisen funktiokutsun yhteydessä ja suljetaan, kun ohjelma palaa pääkehykseen.Asetukset...UlosRakenneYliKirjoita yli?Korvataan teema '%s'PakettiPakettia '{}' tarvitaan muiden pakettien asentamiseen ja poistamiseen.Tälle tulkille ei ole saatavissa paketinhallintaaPakettien hakemistoSalasanaLiitäLiittäminen epäonnistuiPolkuSuorita MyPy-tarkistuksetSuorita valitut Pylint-tarkistuksetTarkista oikeinkirjoitus!Odota hetkiPiirturiPorttiPortti tai WebREPLEsikatseluEdellinen olioTulosta...OngelmaOhjelman argumentitOhjelman argumentit:Ohjelman puurakenneOminaisuudetPyPI-sivuPygame Zero -tilaPython-suoritustiedostoPython-tiedostotPython-tiedostoilla on usein .py-tiedostopääte.Python-tulkitLopetaPoistetaanko varmasti?Viimeisimmät tiedostotSuositeltu maksimirivinpituus (aseta 0:aan kytkeäksesi marginaaliviivan pois päältä)Tee uudelleenPäivitäTavallinen tilaEtä-Python 3 (SSH)Nimeä uudelleenNimeä uudelleen '%s'Avaa kaikki edellisen istunnon tiedostotKorvaaKorvaa kaikkiKorvaa tab-merkit välilyönneilläKorvaava:Korvaa+etsiRaportoi virheVaatiiVaatii:Käynnistä tulkki uudelleen ennen skriptin suorittamistaJatkaSuoritaSuorita & vianjäljitäSuorita / jatkaSuorita nykyinen skriptiSuora nykyinen skripti päätteessäSuorita kursoriin astiTallennaTallenna kaikki tiedostotTallenna suljettaessaTallenna nimellä...Tallenna kopio...Tallenna salasanaTallenna %s:aanTallennetaanTallennetaan sijaintiin %sEtsi PyPI:stäHakutuloksetHaetaanKatso lisätietoja ohjeesta.Valitse kaikkiValitse kaikkiValitse jotain ja yritä uudelleen!Valitse tyhjä hakemisto uutta virtuaaliympäristöä vartenValitse tämä, jos tiedostoikkunat päätyvät pääikkunan taakseValittu hakemisto ei ole tyhjä. Valitse toinen hakemisto tai peruuta.Lähetä EOF / kevyt uudelleenkäynnistysTulkkiNäytä PiirturiNäytä funktiokutsut (kehykset) erillisissä ikkunoissaNäytä piilotiedostotNäytä rivinumerotNäytä parametritiedotKokoKoko (tavuina)LähdekoodiTekstiä tiivistetty (%d merkkiä)PinoAloita valitsemalla paketti vasemmalta.KäynnistetäänAstu taaksepäinAstu sisäänAstu ulosAstu yliSeisSeis/käynnistä tulkki uudelleenTallennustilaTallennustilaTallennustila tällä levyllä tai tiedostojärjestelmässäTiivistelmäTueTue UkrainaaVaihda tavalliseen tilaanSynkronoi laitteen reaaliaikainen kelloSyntaksin teemaKohdelaitteen sijaintiKohdelaitteen malliKohde:PäätePääte-emulaatioVastaus onEsitysmuoto yllä on tämän liukuluvun likiarvo. Tarkka muistissa oleva arvo on %s, eli noin %sAnnettua tekstiä ei löytynyt!Ulkoasu ja fonttiTämä laatikko on tarkoitettu muistiinpanoja varten -- tehtävänannot, koodinpätkät, mitä ikinä. Muistiinpanot tallennetaan automaattisesti ja ladataan kun käynnistät Thonnyn seuraavan kerran. Voit vapaasti poistaa tämän tekstin saadaksesi lisää tilaa omille muistiinpanoillesi.Komento ei ole käytettävissä, jos Thonny suoritetaan FlatpakinaTämä tietokoneTämä ikkuna on vain Thonnyn liitännäisen ja niiden riippuvuuksien hallintaan. Jos haluat asentaa paketteja omiin ohjelmiisi, valitse 'Työkalut → Hallitse paketteja...'Tämä ikkuna listaa päätason moduulit seuraavista hakemistoista:Tämä ei vaikuta MicroPython-/CircuitPython-paketilta. Haluatko varmasti asentaa sen?Tämä on kommenttiTämä paketti vaatii toisen Thonny-version:Tällä ohjelmalla EI OLE MINKÄÄNLAISTA TAKUUTA! Se on vapaa ohjelma, ja saat levittää sitä tiettyjen ehtojen vallitessa, katso https://opensource.org/licenses/MIT -sivulta lisätietojaThonnyn asetuksetThonnyn liitännäisetThonnyn PythonMerkitse kommentiksi / poista kommenttimerkintäTyökalutYritä tunnistaa portti automaattisestiKäyttöliittymän teemaKäyttöliittymän skaalauskerroinKäyttöliittymän teemaPoista tämäPoista kommenttimerkintäKumoaPoista asennusPoistetaan '%s'YlösPäivitäPäivitä riippuvuudetPäivitä tai poista asennusPäivitetään '%s'Käytä "Seis"-komentoa jos haluat peruuttaa vianjäljityksenKäytä Tk:n tiedostoikkunoita Zenityn sijaanKäytä paikallista aikaa reaaliaikaisessa kellossaArvoArvon IDMuuttujatVersiohistoriaAsennettava versioNäytäVaroitusMinkälaista tulkkia Thonnyn tulisi käyttää koodin suorittamiseen?Rivitä teksti (voi olla hidas)Valitse tiedosto!Pysäytä ohjelmasi ennen paketinhallinnan käynnistämistä.Suurennakaikki tiedostotpälä, pälätavuavapaanatästäetsi laitteesi nimeä, "USB-sarjaportti" tai "UART"odota hetkipaikantaaksesi ja asentaaksesi pakettitiedoston (usein tiedostopäätteellä .whl, .tar.gz tai .zip).paikantaaksesi requirements.txt-tiedoston ja asentaaksesi siinä määritetyt paketit.yhteensäloppumerkki_puuttuukäytettyvirtuaaliympäristö././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/fi_FI/LC_MESSAGES/thonny.po0000644000076600000240000014451214626075445022627 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: fi\n" #: thonny/workbench.py:369 msgid "File" msgstr "Tiedosto" #: thonny/workbench.py:370 msgid "Edit" msgstr "Muokkaa" #: thonny/workbench.py:371 msgid "View" msgstr "Näytä" #: thonny/running.py:116 thonny/workbench.py:372 msgid "Run" msgstr "Suorita" #: thonny/workbench.py:373 msgid "Tools" msgstr "Työkalut" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:374 msgid "Help" msgstr "Ohje" #: thonny/workbench.py:591 msgid "Exit" msgstr "Lopeta" #: thonny/workbench.py:618 msgid "Decrease font size" msgstr "Pienennä tekstin kokoa" #: thonny/workbench.py:630 msgid "Focus editor" msgstr "Vie kursori editoriin" #: thonny/workbench.py:639 msgid "Focus shell" msgstr "Vie kursori komentoriville" #: thonny/workbench.py:650 msgid "Maximize view" msgstr "Suurenna näkymä" #: thonny/workbench.py:662 msgid "Full screen" msgstr "Koko näytön tila" #: thonny/workbench.py:1465 msgid "Program arguments" msgstr "Ohjelman argumentit" #: thonny/plugins/about.py:24 thonny/plugins/about.py:151 msgid "About Thonny" msgstr "Tietoja Thonnystä" #: thonny/plugins/about.py:77 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Tehty\n" "Tarton yliopistossa Virossa,\n" "avoimen lähdekoodin yhteisön,\n" "Raspberry Pi Foundationin\n" "ja Cybernetica AS:n\n" "avustuksella" #: thonny/plugins/about.py:97 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Tällä ohjelmalla\n" "EI OLE MINKÄÄNLAISTA TAKUUTA!\n" "Se on vapaa ohjelma, ja saat levittää\n" "sitä tiettyjen ehtojen vallitessa, katso\n" "https://opensource.org/licenses/MIT\n" "-sivulta lisätietoja" #: thonny/plugins/about.py:140 msgid "Version history" msgstr "Versiohistoria" #: thonny/plugins/about.py:147 msgid "Report problems" msgstr "Raportoi virhe" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Avaa Avustaja automaattisesti, kun ohjelma kaatuu poikkeukseen" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Avaa Avustaja automaattisesti, kun sillä on varoituksia koodistasi" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Suorita valitut Pylint-tarkistukset" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Suorita MyPy-tarkistukset" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Älä käytä seuraavia tarkistuksia (yksi tunnus riviä kohti)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Avustaja" #: thonny/plugins/autocomplete.py:522 msgid "Auto-complete" msgstr "Automaattitäydennys" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Tulkki" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Tietoa Birdseyestä" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye on Python-virheenjäljitin, joka pitää asentaa erikseen.\n" "\n" "Haluatko avata apusivun ja tietää asiasta enemmän?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Suorita nykyinen skripti virheenjäljittäjässä (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Merkitse kommentiksi / poista kommenttimerkintä" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Lisää kommenttimerkintä" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Poista kommenttimerkintä" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Kumoa" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Tee uudelleen" #: thonny/base_file_browser.py:724 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2295 msgid "Cut" msgstr "Leikkaa" #: thonny/base_file_browser.py:725 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2296 msgid "Copy" msgstr "Kopioi" #: thonny/base_file_browser.py:727 thonny/base_file_browser.py:733 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2297 msgid "Paste" msgstr "Liitä" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Valitse kaikki" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Suorita kursoriin asti" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "Ei voi sulkea" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Käytä \"Seis\"-komentoa jos haluat peruuttaa vianjäljityksen" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Telakoi käyttäjän ikkunat" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Korosta vastaavat muuttujanimet" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Korosta paikallasia muuttujia" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Korosta sulkuja" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Korosta syntaksirakenteita" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Korosta nykyinen rivi (vaatii editorin uudelleenavaamisen)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Näytä rivinumerot" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Suositeltu maksimirivinpituus\n" "(aseta 0:aan kytkeäksesi marginaaliviivan pois päältä)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editori" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Vie käyttötiedot..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Tapahtumat" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Tiedostot" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:437 msgid "Find & Replace" msgstr "Etsi & korvaa" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Etsittävä:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Korvaava:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Kirjainkoolla on väliä" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Ylös" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Alas" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Etsi" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Korvaa" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Korvaa+etsi" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Korvaa kaikki" #: thonny/plugins/find_replace.py:253 msgid "Enter string to be replaced." msgstr "Syötä korvattava merkkijono." #: thonny/plugins/find_replace.py:338 msgid "The specified text was not found!" msgstr "Annettua tekstiä ei löytynyt!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Aja yhtä Thonnyä kerrallaan" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Avaa kaikki edellisen istunnon tiedostot" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Poista ilmoitusääni käytöstä" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Tekstin skaalaustila" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Pinotila on käytössä.\n" "Sulje Pino-näkymä kytkeäksesi sen pois päältä." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Pino" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Kieli" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Tämä laatikko on tarkoitettu muistiinpanoja varten -- tehtävänannot, koodinpätkät, mitä ikinä.\n" "\n" "Muistiinpanot tallennetaan automaattisesti ja ladataan kun käynnistät Thonnyn seuraavan kerran.\n" "\n" "Voit vapaasti poistaa tämän tekstin saadaksesi lisää tilaa omille muistiinpanoillesi." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Muistiinpanot" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Edellinen olio" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Seuraava olio" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Oliotutka" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Rakenne" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero -tila" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Poista asennus" #: thonny/editors.py:685 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1872 thonny/workdlg.py:162 msgid "Close" msgstr "Sulje" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Napsauta " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "tästä" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Päivitä" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:410 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Asenna" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Pakettia ei löytynyt PyPI:stä." #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Viimeisin vakaa versio" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Viimeisin versio" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Tiivistelmä" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Tekijä" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Kotisivu" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Virheidenseuranta" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentaatio" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPI-sivu" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Vaatii" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Poistetaanko varmasti?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Haluatko varmasti poistaa sen?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Muuttujat" #: thonny/base_file_browser.py:1572 msgid "This computer" msgstr "Tämä tietokone" #: thonny/base_file_browser.py:644 msgid "Refresh" msgstr "Päivitä" #: thonny/base_file_browser.py:653 msgid "Focus into" msgstr "Kohdista kohtaan" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Virhe" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 msgid "You need to select a file!" msgstr "Valitse tiedosto!" #: thonny/base_file_browser.py:1423 msgid "Overwrite?" msgstr "Kirjoita yli?" #: thonny/base_file_browser.py:1423 msgid "Do you want to overwrite '%s' ?" msgstr "Haluatko ylikirjoittaa '%s':n?" #: thonny/editors.py:650 thonny/editors.py:652 msgid "New" msgstr "Uusi" #: thonny/editors.py:663 msgid "Open..." msgstr "Avaa..." #: thonny/editors.py:665 msgid "Load" msgstr "Avaa" #: thonny/editors.py:674 msgid "Recent files" msgstr "Viimeisimmät tiedostot" #: thonny/editors.py:696 thonny/ui_utils.py:493 msgid "Close all" msgstr "Sulje kaikki" #: thonny/editors.py:706 thonny/editors.py:708 msgid "Save" msgstr "Tallenna" #: thonny/editors.py:731 msgid "Save as..." msgstr "Tallenna nimellä..." #: thonny/editors.py:742 msgid "Save copy..." msgstr "Tallenna kopio..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonnyn asetukset" #: thonny/running.py:115 msgid "Run current script" msgstr "Suorita nykyinen skripti" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Suora nykyinen skripti päätteessä" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Seis/käynnistä tulkki uudelleen" #: thonny/running.py:160 msgid "Stop" msgstr "Seis" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Keskeytä ohjelman suoritus" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "Lähetä EOF / kevyt uudelleenkäynnistys" #: thonny/running.py:195 msgid "Disconnect" msgstr "Katkaise yhteys" #: thonny/plugins/cpython_frontend/cp_front.py:269 msgid "Python interpreters" msgstr "Python-tulkit" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:270 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "kaikki tiedostot" #: thonny/plugins/cpython_frontend/cp_front.py:298 msgid "Select empty directory for new virtual environment" msgstr "Valitse tyhjä hakemisto uutta virtuaaliympäristöä varten" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Bad directory" msgstr "Hakemisto ei kelpaa" #: thonny/plugins/cpython_frontend/cp_front.py:306 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Valittu hakemisto ei ole tyhjä.\n" "Valitse toinen hakemisto tai peruuta." #: thonny/plugins/cpython_frontend/cp_front.py:323 msgid "Creating virtual environment" msgstr "Luodaan virtuaaliympäristöä" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Tyhjennä komentorivi-ikkuna" #: thonny/shell.py:185 msgid "Plotter" msgstr "Piirturi" #: thonny/shell.py:317 msgid "Clear" msgstr "Tyhjennä" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Näytä Piirturi" #: thonny/shell.py:1659 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "" #: thonny/shell.py:1670 msgid "Wrap text (may be slow)" msgstr "Rivitä teksti (voi olla hidas)" #: thonny/ui_utils.py:1867 msgid "Copy to clipboard" msgstr "Kopioi leikepöydälle" #: thonny/shell.py:1712 msgid "Squeezed text (%d characters)" msgstr "Tekstiä tiivistetty (%d merkkiä)" #: thonny/shell.py:1882 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "" #: thonny/shell.py:1884 msgid "See Help for details." msgstr "Katso lisätietoja ohjeesta." #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Sulje muut" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Kopioidaan" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "" #: thonny/base_file_browser.py:1378 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1819 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Peruuta" #: thonny/base_file_browser.py:1369 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:111 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1816 thonny/workdlg.py:206 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2301 msgid "Select All" msgstr "Valitse kaikki" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:162 msgid "Shell" msgstr "Tulkki" #: thonny/workbench.py:601 msgid "Options..." msgstr "Asetukset..." #: thonny/workbench.py:608 msgid "Increase font size" msgstr "Suurenna fontin kokoa" #: thonny/workbench.py:673 msgid "Change font size" msgstr "Muuta fontin kokoa" #: thonny/workbench.py:674 msgid "Zoom" msgstr "Suurenna" #: thonny/workbench.py:683 msgid "Exit Thonny" msgstr "Lopeta Thonny" #: thonny/workbench.py:686 msgid "Quit" msgstr "Lopeta" #: thonny/workbench.py:1244 thonny/workbench.py:1252 msgid "Overwriting theme '%s'" msgstr "Korvataan teema '%s'" #: thonny/workbench.py:1436 msgid "Program arguments:" msgstr "Ohjelman argumentit:" #: thonny/workbench.py:1490 msgid "Regular mode" msgstr "Tavallinen tila" #: thonny/workbench.py:1491 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Asetuksia on muutettu. Käynnistä Thonny uudelleen saadaksesi tavallisen tilan käyttöön.\n" "\n" "(Katso 'Työkalut → Asetukset → Yleistä', jos muutat mieltäsi myöhemmin.)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Ohjelman puurakenne" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Jatka" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Suorita / jatka" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Vianselvitä nykyinen skripti" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Vianselvitä" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Vianselvitä nykyinen skripti (kivempi)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Vianselvitä nykyinen skripti (nopeampi)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Astu yli" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Yli" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Astu sisään" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Sisään" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Astu ulos" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Ulos" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Astu taaksepäin" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Taaksepäin" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Pino" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Poikkeus" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Pidä kirjaa käyttötapahtumista" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Virheenjäljitystila (diagnostiikkalogeissa on enemmän tietoa)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Käyttöliittymän teema" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Käyttöliittymän skaalauskerroin" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "HUOM! Käynnistä Thonny uudelleen muutettuasi näitä asetuksia!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Yleiset" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "ASENNA" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Selaa paketteja" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "" #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Pakettien hakemisto" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Asenna PyPI:stä" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Jos et tiedä mistä noutaa paketti, haluat mitä luultavimmin etsiä sitä Python Package Indexistä (PyPI). Aloita kirjoittamalla paketin nimeä hakukenttään ja painamalla ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "paikantaaksesi requirements.txt-tiedoston ja asentaaksesi siinä määritetyt paketit." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Napsauta" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "paikantaaksesi ja asentaaksesi pakettitiedoston (usein tiedostopäätteellä .whl, .tar.gz tai .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Päivitä tai poista asennus" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Aloita valitsemalla paketti vasemmalta." #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Kohde:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "virtuaaliympäristö" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "" #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Asennettu versio:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Asennettu sijaintiin:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Tarkista oikeinkirjoitus!" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Paketin tietoja ei löytynyt PyPI:stä." #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Virhekoodi:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Pakettia '{}' tarvitaan muiden pakettien asentamiseen ja poistamiseen." #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Paketti" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Hallitse kohteen %s paketteja" #: thonny/editors.py:579 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Vahvistus" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "" #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Tämä paketti vaatii toisen Thonny-version:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Jos haluat sen silti, asenna se komentoriviltä." #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "" #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonnyn liitännäiset" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Toivottu versio" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Päivitä riippuvuudet" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Vaatii:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Virhe:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Hallitse paketteja..." #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Hallitse liitännäisiä..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Näytä funktiokutsut (kehykset) erillisissä ikkunoissa" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Poista tämä" #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Avaa ja sulje Pino-näkymä automaattisesti" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Pino-näkymä avataan ensimmäisen funktiokutsun yhteydessä ja suljetaan, kun ohjelma palaa pääkehykseen." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Saattaa hidastaa virheenjäljitystä" #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseyen portti" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(käynnistä Thonny uudelleen muutettuasi tätä)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Suorita & vianjäljitä" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Pääte-emulaatio" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Muistissa pidettävien rivien maksimimäärä." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Huom! Suuret arvot saattavat heikentää suorituskykyä!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Pidä pääteikkuna avoinna Python-prosessin loppuessa" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Pääte" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Käyttöliittymän teema" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Syntaksin teema" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Editorin kirjasinlaji" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Syötteen/tulosteen fontti" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Esikatselu" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Tämä on kommentti" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "Vastaus on" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "loppumerkki_puuttuu" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "pälä, pälä" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Huom! Jotkin tyyliasetukset otetaan käyttöön vasta Thonnyn uudelleenkäynnistämisen jälkeen!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Syötä kokonaisluku" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Ulkoasu ja fontti" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Avaa Thonnyn ohjelmakansio..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Avaa Thonnyn datakansio..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Koti" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Ohjeen sisältö" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPython-laite" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPython-laite" #: thonny/plugins/micropython/mp_front.py:547 msgid "Connect your device to the computer and select corresponding port below" msgstr "Yhdistä laite tietokoneeseesi ja valitse vastaava portti alapuolelta" #: thonny/plugins/micropython/mp_front.py:550 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "etsi laitteesi nimeä, \"USB-sarjaportti\" tai \"UART\"" #: thonny/plugins/micropython/mp_front.py:552 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Jos et löydä sitä, sinun täytyy ehkä asentaa sopiva USB-ajuri." #: thonny/plugins/micropython/mp_front.py:444 msgid "Port" msgstr "Portti" #: thonny/plugins/micropython/mp_front.py:454 msgid "Try to detect port automatically" msgstr "Yritä tunnistaa portti automaattisesti" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (yleisesti)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Tulosta..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Avaa järjestelmän komentotulkki..." #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Tiedot" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Asenna requirements-tiedostosta" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Asenna paikallisesta tiedostosta" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Tämä ikkuna on vain Thonnyn liitännäisen ja niiden riippuvuuksien hallintaan.\n" "Jos haluat asentaa paketteja omiin ohjelmiisi, valitse 'Työkalut → Hallitse paketteja...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (yleisesti)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Sisennä valitut rivit" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "" #: thonny/workbench.py:1479 msgid "Switch to\n" "regular\n" "mode" msgstr "Vaihda\n" "tavalliseen\n" "tilaan" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Varmista, että MicroPython on asennettu micro:bittiisi." #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Älä unohda, että main.py toimii vain upottamatta pääskriptiä." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "odota hetki" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Levyä '%s' ei löydy. Haluatko paikantaa sen itse?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Sopivaa levyä ei löydy" #: thonny/base_file_browser.py:290 msgid "%d items" msgstr "%d valittua kohdetta" #: thonny/base_file_browser.py:739 msgid "Move to Trash" msgstr "Siirrä roskakoriin" #: thonny/base_file_browser.py:742 msgid "Delete" msgstr "Poista" #: thonny/base_file_browser.py:721 thonny/base_file_browser.py:874 msgid "New directory" msgstr "Uusi hakemisto" #: thonny/base_file_browser.py:745 msgid "Properties" msgstr "Ominaisuudet" #: thonny/base_file_browser.py:747 msgid "Storage space" msgstr "Tallennustila" #: thonny/base_file_browser.py:757 msgid "Path" msgstr "Polku" #: thonny/base_file_browser.py:759 msgid "Directory properties" msgstr "Hakemiston ominaisuudet" #: thonny/base_file_browser.py:761 msgid "File properties" msgstr "Tiedoston ominaisuudet" #: thonny/base_file_browser.py:763 msgid "bytes" msgstr "tavua" #: thonny/base_file_browser.py:766 msgid "Size" msgstr "Koko" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:777 msgid "Modified" msgstr "Muokattu" #: thonny/base_file_browser.py:838 msgid "Deleting %s" msgstr "%s poistetaan" #: thonny/editors.py:260 msgid "Loading" msgstr "Ladataan" #: thonny/editors.py:389 msgid "Saving" msgstr "Tallennetaan" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "" #: thonny/base_file_browser.py:646 msgid "Open in system file manager" msgstr "Avaa järjestelmän tiedostonhallinnassa" #: thonny/base_file_browser.py:674 msgid "Hide hidden files" msgstr "Kätke piilotiedostot" #: thonny/base_file_browser.py:674 msgid "Show hidden files" msgstr "Näytä piilotiedostot" #: thonny/base_file_browser.py:657 msgid "Open in Thonny" msgstr "Avaa Thonnyssä" #: thonny/base_file_browser.py:688 msgid "Open in system default app" msgstr "Avaa järjestelmän oletussovelluksessa" #: thonny/base_file_browser.py:669 thonny/base_file_browser.py:696 msgid "Configure %s files" msgstr "" #: thonny/base_file_browser.py:697 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "" #: thonny/base_file_browser.py:1254 thonny/editors.py:979 thonny/editors.py:981 msgid "Deleting" msgstr "Poistetaan" #: thonny/base_file_browser.py:1261 msgid "Creating directory" msgstr "Luodaan hakemisto" #: thonny/editors.py:258 msgid "Loading %s" msgstr "Ladataan %s" #: thonny/editors.py:384 msgid "Saving to %s" msgstr "Tallennetaan sijaintiin %s" #: thonny/editors.py:720 thonny/editors.py:722 msgid "Save All files" msgstr "Tallenna kaikki tiedostot" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:877 msgid "Configure interpreter..." msgstr "Määritä tulkki..." #: thonny/workbench.py:1589 msgid "Device" msgstr "Laite" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "Perutaan" #: thonny/workdlg.py:220 msgid "Starting" msgstr "Käynnistetään" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "Tunnistautuminen" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Anna yksityisen avaimen salalause kohteelle\n" "{}" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Anna salasana kohteelle\n" "{}" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Esitysmuoto yllä on tämän liukuluvun likiarvo. Tarkka muistissa oleva arvo on %s, eli noin %s" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Hakutulokset" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Haetaan" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Asennetaan '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "Päivitetään '%s'" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Poistetaan '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "Asennetaan" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "Tälle tulkille ei ole saatavissa paketinhallintaa" #: thonny/base_file_browser.py:1205 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "Ei tuettu" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "Ei saatavilla" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "Pysäytä ohjelmasi ennen paketinhallinnan käynnistämistä." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Avaa evaluoidut arvot Oliotutkassa" #: thonny/plugins/cpython_frontend/cp_front.py:209 msgid "Python executable" msgstr "Python-suoritustiedosto" #: thonny/plugins/cpython_frontend/cp_front.py:232 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Etä-Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Ei yhteyttä" #: thonny/plugins/micropython/mp_front.py:521 msgid "Advanced options" msgstr "Lisäasetukset" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Asenna tai päivitä firmware" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (paikallinen)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Tämä ikkuna listaa päätason moduulit seuraavista hakemistoista:" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Uudet paketit asennetaan sijaintiin" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Asennettava versio" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "Kohdelaitteen sijainti" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "Kohdelaitteen malli" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Odota hetki" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "Etsi PyPI:stä" #: thonny/base_file_browser.py:689 msgid "Open in Thonny's text editor" msgstr "Avaa Thonnyn tekstieditorissa" #: thonny/base_file_browser.py:342 msgid "Storage space on this drive or filesystem" msgstr "Tallennustila tällä levyllä tai tiedostojärjestelmässä" #: thonny/base_file_browser.py:343 msgid "total space" msgstr "yhteensä" #: thonny/base_file_browser.py:345 msgid "used space" msgstr "käytetty" #: thonny/base_file_browser.py:346 msgid "free space" msgstr "vapaana" #: thonny/base_file_browser.py:353 msgid "Storage info" msgstr "Tallennustila" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Korvaa tab-merkit välilyönneillä" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Korosta tab-merkit" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Sisennä tab-merkeillä (ei suositella Pythonin kanssa käytettäväksi)" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Nimi" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Koko (tavuina)" #: thonny/base_file_browser.py:875 msgid "Enter name for new directory under\n" "%s" msgstr "Anna uuden hakemiston nimi\n" "%s" #: thonny/base_file_browser.py:898 msgid "Nothing selected" msgstr "Ei valintoja" #: thonny/base_file_browser.py:898 msgid "Select an item and try again!" msgstr "Valitse jotain ja yritä uudelleen!" #: thonny/base_file_browser.py:1325 msgid "Open from %s" msgstr "Avaa %s:sta" #: thonny/base_file_browser.py:1328 msgid "Save to %s" msgstr "Tallenna %s:aan" #: thonny/base_file_browser.py:1347 msgid "File name:" msgstr "Tiedostonimi:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "Arvon ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Arvo" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Tallenna salasana" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Funktiokutsu %s:ssa" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Paikalliset muuttujat" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Funktio" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "Sijainti" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Jos edellinen komento aiheutti poikkeuksen, tämä näkymä näyttää kutsupinon." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Data" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attribuutit" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "Indeksi" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "Avaimen ID" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Avain" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "" #: thonny/plugins/micropython/mp_front.py:444 msgid "Port or WebREPL" msgstr "Portti tai WebREPL" #: thonny/plugins/micropython/mp_front.py:589 msgid "Password" msgstr "Salasana" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Lähdekoodi" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Käytä Tk:n tiedostoikkunoita Zenityn sijaan" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Valitse tämä, jos tiedostoikkunat päätyvät pääikkunan taakse" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Ympäristömuuttujat (yksi NIMI=ARVO per rivi)" #: thonny/base_file_browser.py:718 msgid "New file" msgstr "Uusi tiedosto" #: thonny/base_file_browser.py:736 msgid "Rename" msgstr "Nimeä uudelleen" #: thonny/base_file_browser.py:924 msgid "Rename '%s'" msgstr "Nimeä uudelleen '%s'" #: thonny/base_file_browser.py:924 msgid "Enter new name" msgstr "Kirjoita uusi nimi" #: thonny/base_file_browser.py:1012 msgid "Paste failed" msgstr "Liittäminen epäonnistui" #: thonny/base_file_browser.py:1012 msgid "There are conflicting folders" msgstr "" #: thonny/base_file_browser.py:1140 msgid "File already exists" msgstr "Tiedosto on jo olemassa" #: thonny/base_file_browser.py:1208 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "" #: thonny/editors.py:35 msgid "Python files" msgstr "Python-tiedostot" #: thonny/editors.py:122 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:149 msgid "File is gone" msgstr "Tiedosto on poissa" #: thonny/editors.py:152 msgid "Do you want to also close the editor?" msgstr "Haluatko sulkea myös editorin?" #: thonny/editors.py:168 msgid "External modification" msgstr "Ulkoinen muokkaus" #: thonny/editors.py:171 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Haluatko hylätä editorin nykyisen sisällön ja ladata tiedoston uudelleen levyltä?" #: thonny/editors.py:580 msgid "Python files usually have .py extension." msgstr "Python-tiedostoilla on usein .py-tiedostopääte." #: thonny/editors.py:582 msgid "Did you mean '%s'?" msgstr "Tarkoititko '%s'?" #: thonny/editors.py:751 msgid "Move / rename..." msgstr "Siirrä / nimeä uudelleen..." #: thonny/editors.py:760 msgid "Go to line..." msgstr "Siirry riville..." #: thonny/editors.py:1003 msgid "Line number" msgstr "Rivinumero" #: thonny/editors.py:1149 msgid "Do you want to save files before closing?" msgstr "Haluatko tallentaa tiedostot ennen sulkemista?" #: thonny/editors.py:1151 msgid "Do you want to save file before closing?" msgstr "Haluatko tallentaa tiedoston ennen sulkemista?" #: thonny/editors.py:1154 msgid "Save On Close" msgstr "Tallenna suljettaessa" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Komento ei ole käytettävissä" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Komento ei ole käytettävissä, jos Thonny suoritetaan Flatpakina" #: thonny/workbench.py:694 thonny/workbench.py:794 msgid "Support Ukraine" msgstr "Tue Ukrainaa" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Minkälaista tulkkia Thonnyn tulisi käyttää koodin suorittamiseen?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Näytä parametritiedot" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Näytä automaattisesti parametritiedot, kun '(' on kirjoitettu" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Ehdota automaattisesti täydentämisiä kirjoittaessa" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Näytä automaattisesti dokumentaatio täydentämisille" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Ongelma" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Määritelmää ei löytynyt" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:171 msgid "Thonny's Python" msgstr "Thonnyn Python" #: thonny/plugins/micropython/mp_front.py:492 msgid "Interrupt working program on connect" msgstr "" #: thonny/plugins/micropython/mp_front.py:500 msgid "Synchronize device's real time clock" msgstr "Synkronoi laitteen reaaliaikainen kello" #: thonny/plugins/micropython/mp_front.py:506 msgid "Use local time in real time clock" msgstr "Käytä paikallista aikaa reaaliaikaisessa kellossa" #: thonny/plugins/micropython/mp_front.py:512 msgid "Restart interpreter before running a script" msgstr "Käynnistä tulkki uudelleen ennen skriptin suorittamista" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Tämä ei vaikuta MicroPython-/CircuitPython-paketilta.\n" "Haluatko varmasti asentaa sen?" #: thonny/base_file_browser.py:849 msgid "Moving to Trash" msgstr "Siirretään roskakoriin" #: thonny/base_file_browser.py:850 msgid "Move %s to Trash?" msgstr "Siirretäänkö %s roskakoriin?" #: thonny/base_file_browser.py:857 msgid "Moving %s to Trash" msgstr "Siirretään %s roskakoriin" #: thonny/base_file_browser.py:662 msgid "Open in default external app" msgstr "Avaa oletusarvoisessa ulkoisessa sovelluksessa" #: thonny/base_file_browser.py:1206 msgid "Opening remote files in external app is not supported." msgstr "" #: thonny/base_file_browser.py:1213 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "" #: thonny/editors.py:150 msgid "Looks like '%s' was deleted or moved." msgstr "Vaikuttaa siltä, että '%s' poistettiin tai siirrettiin." #: thonny/editors.py:169 msgid "Looks like '%s' was modified outside of the editor." msgstr "Vaikuttaa siltä, että '%s' muokattiin editorin ulkopuolelta." #: thonny/plugins/cpython_frontend/cp_front.py:230 msgid "NB! Thonny only supports Python %s and later" msgstr "" #: thonny/editors.py:1003 msgid "Go to line" msgstr "Siirry riville" #: thonny/workbench.py:697 msgid "Support" msgstr "Tue" #: thonny/editors.py:393 thonny/editors.py:408 msgid "Could not save" msgstr "Tallentaminen ei onnistunut" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Varoitus" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "" #: thonny/workbench.py:867 msgid "Install MicroPython" msgstr "Asenna MicroPython" #: thonny/workbench.py:871 msgid "Install CircuitPython" msgstr "Asenna CircuitPython" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Aktivoi virtuaaliympäristö" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "" #: thonny/plugins/todo_view.py:44 msgid "Line" msgstr "Rivi" #: thonny/plugins/todo_view.py:45 msgid "Info" msgstr "" #: thonny/plugins/todo_view.py:123 msgid "No line marked with #todo found" msgstr "" #: thonny/plugins/todo_view.py:143 msgid "TODO" msgstr "" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:536 msgid "Install or update %s" msgstr "Asenna tai päivitä %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Paikallinen Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:240 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Oletussalasana" #: thonny/running.py:338 msgid "Information" msgstr "" #: thonny/running.py:339 msgid "For debugging the program must be saved first." msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9369965 thonny-4.1.7/thonny/locale/fr_FR/0000755000076600000240000000000014730055627017172 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.105282 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/0000755000076600000240000000000014730055627021114 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/birdseye.rst0000644000076600000240000000331314417536743023461 0ustar00aivarannamaastaffL'œil d'oiseau (Birdseye) ========================= L'Œil d'oiseau est un débogueur Python vraiment *cool* créé par Alex Hall, qui enregistre les valeurs des expressions quand le programme fonctionne et vous laisse les explorer quand le programme se termine. Voir `https://birdseye.readthedocs.io `_ pour en savoir plus. L'Œil d'oiseau n'est pas installé par défaut, mais il est facile de l'installer via *Outils → Gérer les greffons*. Il faut installer la paquet nommé ``birdseye``. L'Œil d'oiseau fonctionne d'une façon différente des `débogueurs intégrés à Thonny `_. Quand on exécute son programme avec *Lancer → Débogage du script courant (Œil d'oiseau)*, l'exécution est un peut plus longue qu'à l'habitude, mais autrement le programme fonctionne exactement comme si on l'avait exécuté avec *Lancer le script courant*. Ça signifie que les points d'arrêt sont ignorés et qu'on ne peut pas se déplacer pas-à-pas dans le programme. Mais quand le programme se termine, Thonny ouvre une page web (servie localement par Œil d'oiseau), qui vous permet de creuser le processus d'exécution et d'apprendre comment ils résultats finaux ont été composés à partir des valeurs intermédiaires. N.B. ! Quand vous utilisez Œil d'oiseau dans Thonny il n'y a pas besoin d'importer ``birdseye.eye`` ou de l'utiliser pour décorer vos fonctions. Thonny exécute Œil d'oiseau d'une façon telle qu'il enregistre des informations pour toutes les fonctions. Le serveur local utilise le port 7777 par défaut. Si celui-ci est utilisé par une autre application, alors on peut configurer un autre port (Outils → Options → Débogueur) et redémarrer Thonny. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/debuggers.rst0000644000076600000240000001142514417536743023625 0ustar00aivarannamaastaffUtilisation des débogueurs ========================== Si vous voulez voir comment Python exécute votre programme pas-à-pas alors il faut le lancer en *mode de débogage* « joli » ou « vite fait ». On peut aussi le faire à l'aide d'`Œil d'oiseau (Birdseye) `_ et examiner les étapes d'exécution plus tard. Le mode « joli » ---------------- Ce mode est recommandé pour les néophytes. Commencez par sélectionner *Déboguer le script courant (joli)* depuis le menu *Lancer* ou en appuyant sur les touches Ctrl+F5 (`sous XFCE il faut utiliser Shift+Ctrl+F5 `__). Vous verrez que la première instruction du programme est mise en valeur et que rien d'autre ne se passe. Dans ce mode il faut notifier Thonny qu'on est prêt à laisser Python faire le pas suivant. Pour cela, vous avez deux option principales : * *Lancer → Sauter par dessus* (ou F6) pour faire de grands pas, c'est à dire qu'il exécute le code en évidence puis met en évidence la suite du code. * *Lancer → Sauter dedans* (ou F7) pour essayer de faire des pas plus petits. Si le code en évidence est composé de morceaux plus petits (déclaration ou instruction), alors la première est mis en valeur et Thonny attend votre commande suivante. Si on est arrivé à un composant du programme qui ne se décompose pas, (p. ex. un nom de variable), alors *Sauter dedans* se comporte comme *Sauter par dessus* c'est à dire qu'il exécute (ou évalue) le code. Si on a avancé pas-à-pas dans les profondeurs d'une fonction ou d'une expression et qu'on veut avancer plus vite, on peut alors utiliser *Lancer → Ressortir* qui exécute le code couramment mis en valeur et toutes les parties du programme sur le même niveau. Il y a une commande un peu similaire nommée *Reprendre*, qui lancera la commande sans s'arrêter à chaque pas jusqu'à ce qu'elle se termine (ou jusqu'au nouveau point d'arrêt, vois ci-dessous). Si par accident vous avez fait un trop grand pas et survolé une partie intéressante du code, on peut **défaire cette étape** en sélectionnant *Lancer → Un pas en arrière*. Thonny montrera l'état du programme tel qu'il était avant le dernier pas. Ensuite on peut continuer avec de petits pas et zoomer ce morceau de code. (Comment ça marche ? Même quand on réalise un grand pas, Thonny enregistre tous les états intermédiaires du programme, qu'il peut rejouer si on fait un pas en arrière.) Si on veut atteindre une portion spécifique du code, on peut aller plus vite en plaçant le curseur sur cette ligne et en sélectionnant *Lancer → Exécuter jusqu'au curseur*. Cela fait avancer Thonny automatiquement en mode pas-à-pas jusqu'à cette ligne. Vous pouvez reprendre la main à partir de là. Si vous avez activé les numéros de ligne dans l'éditeur (Outils → Options → Éditeur), alors on peut aussi utiliser des **points d'arrêt**. Quand on double-clique dans la marque gauche de l'éditeur près d'une ligne, un point apparaît. Alors, quand on lance le débogueur, il ne s'arrête pas avant la première ligne mais va jusqu'à la ligne marquée d'un point, qu'on nomme aussi un point d'arrêt. On peut placer autant de points d'arrêt dans le programme qu'il en faut. Les points d'arrêt peuvent être retirés en cliquant-double dessus. Le mode « vite fait » --------------------- Quand votre programme devient plus gros, on observe que le parcours en mode « joli » prend beaucoup de temps. C'est parce que les ornements (p. ex. la possibilité de faire de petits pas durant l'évaluation d'expressions et de revenir en arrière) nécessitent une machinerie lourde et lente. Avec *Débogage du script courant (vite)* on perd les ornements mais on peut avancer dans le programme beaucoup plus vite. On peut utiliser les mêmes commandes (sauf « Un pas en arrière » comme avec le débogueur en mode joli. C'est le style de débogage que la plupart des programmeurs professionnels utilisent d'habitude. Des styles différents pour la présentation de la pile d'appel ------------------------------------------------------------- Par défaut Thonny utilise des fenêtres empilées pour représenter la pile d'appels. Cela donne une bonne intuition du concept, mais ça devient encombrant à l'usage. C'est pourquoi, depuis la version 3.0 on peut choisir entre deux styles différents pour présenter la pile d'appels. Dans « Outils → Options → Débogueur » on peut passer à un style plus traditionnel avec une vue séparée pour présenter les trames d'appels. Notez que les deux styles sont utilisables, avec chacun des deux modes de débogage. L'œil d'oiseau (Birdseye) ------------------------- La commande *Débogage du script courant (Œil d'oiseau)* est expliquée dans une `page séparée `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/debugging.rst0000644000076600000240000001355714417536743023621 0ustar00aivarannamaastaffLes techniques de débogage ========================== Si votre programme ne fonctionne pas, pas de panique ! Vous avez plusieurs possibilités pour corriger la situation. Par exemple : * La faire corriger par quelqu'un d'autre ; * Changer *quelque chose* dans le code et réessayer ; * Approcher le problème en deux phases : 1) diagnostiquer le problème et 2) le réparer. Demander de l'aide peut être une très bonne idée, mais elle ne vous procurera pas cette douce sensation de réussite. De toute façon, c'est mieux de ne pas y recourir sans avoir d'abord tenté quelque chose vous-même. Si vos programmes sont petits, vous pourriez toucher le jackpot en changeant quelque chose au hasard et en recommençant (plusieurs fois), mais vous allez perdre même si vous gagnez, comme vous n'en aurez rien appris. Si vous voulez devenir bon en programmation, il vous faut vraiment approcher le problème de façon plus systématique. Entre autres choses, ça signifie que vous devez trouver la raison pour laquelle votre programme dysfonctionne avant d'essayer de le corriger. Le processus consistant à trouver la source du problème se nomme *débogage*. Tracer le flux du programme / penser en même temps que Python ------------------------------------------------------------- Le plus souvent votre programme n'est pas entièrement mauvais. Il peut y avoir une faute de frappe quelque part ou vous avez manqué ou mal compris quelque chose. *N.B. ! Ne prenez pas l'habitude de penser que Python vous a mal compris -- c'est une machine qui ne cherche pas à vous comprendre*. La clé du débogage c'est de trouver précisément où et quand vos conceptions du comportement du programme divergent du comportement réel. Si votre programme affiche une réponse finale fausse cela vous dit quelque chose au sujet du comportement du programme, mais ce n'est généralement pas assez pour localiser le problème précisément. Il faut aussi vérifier lesquelles des **étapes intermédiaires** sont en accord avec vos conceptions et lesquelles non. Une technique évidente (et très utile) est d'ajouter des **directives d'affichage en plus** dans le code, qui vous diront où en est Python et ce qu'il a fait jusque-là, par exemple : .. code:: print("amis avant la boucle-for", amis) N.B. ! Quelquefois il faut introduire de nouvelles variables et décomposer des expressions complexes en parties plus simples afin d'afficher des informations plus détaillées. Bien que le débogage à base d'affichages soit utilisé aussi par des professionnels (il leur arrive de l'appeler *logging*, journalisation), il y a une alternative, qui est plus confortable dans la plupart des cas. Elle s'appelle **avancer pas-à-pas dans le code** et c'est le pain béni de Thonny. Allez au chapitre `Utilisation des débogueurs `_ pour en apprendre plus. Revue du code ------------- Une autre technique utile est la revue de code. Cela revient à peu près à tracer le flux du programme, mais on le fait dans sa tête et on essaie de visualiser une figure plus grande au lieu de suivre des petits pas. Voyez chacune des expressions de votre code et essayez de comprendre son rôle et comment elle est reliée à votre tâche. Pour chaque **variable** demandez-vous : * Est-ce que le nom de la variable dit ce qu'elle fait ? Vaut-il mieux utiliser un nom au singulier ou au pluriel ? * Quel type de valeurs peut se trouver dans cette variable ? Chaînes, entiers, listes de chaînes, liste de flottants, ... ? * Quel est le rôle de cette variable ? est-elle prévue pour être mise à jour de façon répétée de façon à contenir quelque information utile ? est-elle prévue pour utiliser la même information à plusieurs endroits et éviter le copier-coller ? Quoi d'autre ? Pour chaque **boucle** demandez-vous : * Comment savez-vous que la boucle est nécessaire ? * Combien de fois le corps de la boucle doit-il être exécuté ? De quoi cela dépend-il ? * Quel code devrait être dans la boucle et quel code devrait être dehors ? * Que faut-il faire avant la boucle et que faut-il faire après ? Pour chaque **expression** complexe demandez-vous : * Dans quel ordre devraient se faire les étapes d'évaluation de cette expression ? Est-ce que Python fait ainsi ? En cas de doute, utilisez le débogueur ou introduisez des variables auxiliaires et décomposez l'expression en morceaux plus petits. * Quel type de valeur est censé sortir de cette expression ? Chaîne ? Liste de chaînes ? Il vous manque peut-être des parties importantes dans votre programme : * Votre tâche nécessite-t-elle de traiter des situations différente différemment ? Si oui, vous avez probablement besoin d'une construction conditionnelle (**if**) ; * Votre tâche nécessite-t-elle de faire quelque chose plusieurs fois ? Si oui, il vous faut probablement une boucle. Encore perdu ? -------------- « Trouvez-vous l'emplacement ou vos suppositions deviennent fausses » -- ceci est plus simple à dire qu'à faire. Dans le cas de programmes complexes c'est facile d'arriver à la situation où vous n'êtes plus du tout sûr de savoir ce que vous supposez ni pourquoi vous avez commencé ce fichu programme. Dans ce cas c'est utile de simplifier votre tâche autant que possible et d'essayer d'implémenter les problèmes plus simples en premier. Prenez un autre éditeur, et soit recommencez depuis le début, soit copiez le code existant en jetant tout ce qui n'est pas essentiel à votre problème. Par exemple, vous pouvez supposer que l'utilisateur est coopératif et saisit toujours de « bonnes » données. Si la tâche implique de faire quelque chose de façon répétitive, alors jetez la partie « répétitive », si la tâche implique une condition complexe pour faire quelque chose, rendez la condition plus simple, etc. Après avoir résolu le problème plus simple vous serez bien mieux équipé pour résoudre aussi la tâche d'origine aussi bien. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/dock.rst0000644000076600000240000000237014417536743022575 0ustar00aivarannamaastaffAncrer les fenêtres utilisateur =============================== Quand on développe son programme Turtle (ou utilisant Tkinter), on peut vouloir regarder la fenêtre de l'essai précédent tout en réparant quelques lignes de code. Si on a des écrans de grande taille ou nombreux, ce n'est pas difficile de placer cette fenêtre près de celle de Thonny, mais au lancement suivant, le gestionnaire de fenêtre peut la replacer n'importe où et il faut remettre en place à nouveau les fenêtres. **Ancrer les fenêtres utilisateur** dans le **menu Lancer** est prévu pour vous aider dans cette situation. Si vous cochez cette option et que vous lancez votre programme Tkinter, Thonny réaliser la magie suivante : * Il se souvient des emplacements de vos fenêtres. Les fois suivantes il place les fenêtres à la même position. * Il fait en sorte que votre fenêtre reste au-dessus même si on clique sur la fenêtre Thonny pour commencer à modifier le code. En fait, après que la fenêtre Tkinter est apparue, Thonny met automatiquement le focus sur sa propre fenêtre si bien que vous pouvez continuer à éditer le code sans utiliser la souris. Quand on a fini, il suffit d'appuyer à nouveau sur F5 et l'ancienne fenêtre est remplacée par la nouvelle. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/errors.rst0000644000076600000240000000447414417536743023200 0ustar00aivarannamaastaffComprendre les erreurs ====================== Si votre programme provoque des erreurs ou des résultats inadéquats ne tentez pas de réparer quoi que ce soit avant d'avoir compris le problème. On peut en lire plus dans `une autre page `__, ici vous ne trouverez qu'un rapide revue pour faciliter la mise en place des idées. Êtes-vous effaré ? ------------------ Il ne faut pas ! Les messages d'erreur sont faits pour aider. Si vous recevez un message d'erreur, ça ne veut pas dire que vous êtes mauvais. Et non, vous n'avez pas cassé l'ordinateur. Bien que les messages d'erreur puissent ressembler à un sac de nœuds à première vue, avec de la pratique il est possible d'en tirer des informations utiles. À quel emplacement du code a eu lieu l'erreur ? ----------------------------------------------- Les messages d'erreur dans Thonny ont des liens qui vous amènent à l'emplacement du code qui a causé l'erreur. Dans le cas de plusieurs liens, le dernier est généralement le plus pertinent. Si l'erreur est arrivée dans une fonction, alors le message a plusieurs liens. Essayez de cliquer sur ceux-ci un par une, du haut vers le bas, et vous verrez comment Python est arrivé à l'emplacement de l'erreur. Un tel ensemble de liens se nomme *la trace de la pile*. Que signifie l'erreur ? ----------------------- La dernière ligne du bloc d'erreur dit quel a été le problème pour Python. Quand vous essayez de comprendre le message, n'oubliez pas le contexte et essayez d'associer certaines parties du message avec l'emplacement lié dans le code. De temps en temps l'Assistant de Thonny peut expliquer l'erreur en termes plus simples, et parfois il faut effectuer une recherche sur Internet pour ce message (n'oubliez pas d'ajouter le mot-clé "Python" pour la recherche). Qu'y avait-il dans les variables au moment de l'erreur ? -------------------------------------------------------- Ouvrez la vue des variables et voyez par vous-même ! Si l'erreur s'est produite dans une fonction on peut voir les variables locales en cliquant les liens dans la trace de la pile. Comment le programme est-il arrivé dans cet état ? -------------------------------------------------- Voir `la page au sujet du débogage `_ or `la page au sujet de l'utilisation des débogueurs de Thonny `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/flask.rst0000644000076600000240000000302614417536743022754 0ustar00aivarannamaastaffDéveloppement Web avec Flask ============================ `Flask `__ est une infrastructure populaire pour créer des applications web avec Python. Les tutoriels Flask indiquent de lancer les programmes Flask en tapant certaines commandes dans un Terminal, mais ça peut intimider certains débutants. Thonny essaie de rendre les choses plus faciles et permet de lancer les programmes Flask comme n'importe quel autre programme (avec un simple F5). S'il détecte que vous lancez un programme Flask, il le lance avec quelques lignes de code en plus, qui démarrent le serveur de développement avec les réglages qui vont bien. Détails ------- Thonny lancera le serveur de développement approximativement comme ceci : .. code:: os.environ["FLASK_ENV"] = "development" app.run(threaded=False, use_reloader=False, debug=False) ``threaded=False`` est utilisé car le débogueur de Thonny ne supporte que les programmes à un seul fil (thread), ``use_reloader=False`` est utilisé car `le rechargement automatique n'est pas fiable quand Flask est lancé ainsi `_ et ``debug=False`` est utilisé car cela semble causer moins d'erreurs "Address already in use". Si vous voulez un plus grand contrôle sur les réglages, alors il vous faut lancer la méthode ``run`` par vous-même, comme ceci, par exemple : .. code:: ... if __name__ == "__main__": app.run(port=5005, threaded=False, use_reloader=True, debug=True) Dans ce cas Thonny n'ajoutera rien à votre code. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/index.rst0000644000076600000240000000141514730022736022751 0ustar00aivarannamaastaffSujets spécifiques ================== * `Utilisation des débogueurs `_ * `Utilisation des paquets de tierces parties `_ * `Ancrer les fenêtres utilisateurs `_ * `Support spécial pour les programmes Turtle `_ * `Spécifier des arguments de programme `_ * `Mode simple et mode expert `_ * `Le Shell `_ * `Le Grapheur `_ * `L'Œil d'oiseau (Birdseye) `_ * `Le développement web avec Flask `_ Sujets généraux =============== * `Gérer les erreurs `_ * `Conseils généraux pour le débogage `_ En Ligne ======== Vous trouverez plus d'information sur le wiki de Thonny : https://github.com/thonny/thonny/wiki. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/modes.rst0000644000076600000240000000176114730022736022755 0ustar00aivarannamaastaffDifférents modes ================ *Outils → Options → Général* permet de régler l'interface utilisateur de Thonny selon un des trois modes différents. Mode ordinaire -------------- C'est le mode par défaut. Il n'y a pas grand-chose à en dire. Mode simple ----------- Dans ce mode les menus sont cachés et la vue des Variables est automatiquement ouverte. On peut utiliser un petit lien dans le coin en haut à droite pour revenir au mode ordinaire. Mode expert ----------- Ce mode ressemble beaucoup au mode ordinaire, mais offre quelques fonctionnalités de plus, utiles pour enseigner. * Le menu Afficher dispose d'un item *Plein écran* pour mettre Thonny en mode plein écran. * Quand on double-clique sur l'onglet d'un éditeur ou d'une vue, cela permet de la maximiser ; on peut revenir à la taille d'origine en double-cliquant l'onglet à nouveau. * Le menu des Outils gagne un item de plus *Ouvrir et rejouer ...* qui permet de rejouer les journaux d'action de l'utilisateur. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/packages.rst0000644000076600000240000000561314417536743023436 0ustar00aivarannamaastaffInstallation de paquets de tierces parties ========================================== Thonny a deux options pour l'installation de paquets de tierces parties. Avec pip dans l'interface graphique ----------------------------------- Depuis le menu « Outils », sélectionnez « Gérer les paquets ... » et suivez les instructions. Avec pip en ligne de commande ----------------------------- #. Depuis le menu « Outils », sélectionnez « Ouvrir un Shell système ... ». Vous devriez avoir un nouveau terminal, qui présente le nom correct de la commande *pip* (normalement ``pip`` ou ``pip3``). Par la suite on supposera que le nom de la commande est ``pip``. #. Entrez ``pip install `` (p. ex. ``pip install pygame``) et tapez Entrée. Vous devriez voir *pip* qui télécharge et installe le paquet puis affiche son message de succès. #. Fermez le terminal (facultatif) #. Revenez à Thonny #. Réinitialisez l'interpréteur en sélectionnant « Arrêter/relancer » depuis le menu « Lancer » (ceci est nécessaire la première fois que vous faite l'installation pip) #. Commencez à utiliser la paquet. Utiliser des paquets Python scientifiques ========================================= La distribution Python qui vient avec Thonny ne contient pas de bibliothèques de programmation scientifique (p. ex. `NumPy `_ et `Matplotlib `_). Les versions récentes de la plupart des paquets Python scientifiques (p. ex. numpy, pandas et matplotlib) sont outillés pour les plate-formes populaires si bien que vous pouvez la plupart du temps les installer avec pip mais au cas où il y a des problèmes, vous pouvez utiliser Thonny avec une distribution Python séparée prévue pour le calcul scientifique (p. ex. `Anaconda `_, `Canopy `_ ou `Pyzo `_). Exemple: Utilisation d'Anaconda ------------------------------- Allez à https://www.continuum.io/downloads et téléchargez une distribution binaire appropriée pour votre plate-forme. La plupart du temps vous voudrez un installeur graphique et une version 64-bits (on peut avoir besoin d'une version 32-bits avec un très vieux système). **Notez que Thonny ne supporte que Python3, assurez-vous bien de choisir la version pour Python 3 d'Ananconda**. Installez-la et trouvez où il installe l'exécutable Python (*pythonw.exe* sous Windows et *python3* ou *python* sous Linux et Mac). Dans Thonny ouvrez « Outils » et sélectionnez « Options ... ». Dans le dialogue d'options ouvrez l'onglet « Interpréteur », cliquez « Sélectionner l'exécutable » et désignez l'emplacement de l'exécutable Python d'Anaconda. Après avoir fait ça, la prochaine fois que vous relancerez votre programme, il utilisera le Python d'Anaconda et toutes les bibliothèques installées là sont disponibles. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/plotter.rst0000644000076600000240000000477414417536743023360 0ustar00aivarannamaastaffLe grapheur =========== Le grapheur est un greffon pour le Shell, qui en extrait les nombres venus du programme et les affiche comme une courbe. Il peut être utile pour observer des données de capteurs en direct venant de périphériques ou même pour analyser des données statiques (si vous hésitez à utiliser des outils plus sérieux). Il est inspiré du `Mu Python editor `__. Vous pouvez l'ouvrir depuis le menu « Afficher » ou depuis le menu contextuel du Shell. Par exemple essayez le programme suivant (on peut l'arrêter avec Ctrl+C ou avec le bouton Arrêter/Relancer de la barre d'outils) : .. code:: from time import sleep from random import randint p1 = 0 while True: p1 += randint(-1, 1) p2 = randint(-10, 10) print("Marche aléatoire :", p1, " juste aléatoire:", p2) sleep(0.05) Quand on le lance avec le Grapheur ouvert, on voir un graphique en ligne avec deux courbes qui défilent. Chaque colonne du graphique correspond à une ligne dans le Shell. La colonne le plus à droite dans le graphique correspond toujours à la ligne visible en bas du Shell, même quand on arrête le programme et qu'on se déplace dans le texte du Shell. Le grapheur commence à tracer des courbes dès qu'il détecte au moins deux lignes consécutives contenant le même motif de nombres et de texte d'accompagnement. Les nombres sont représentés sous forme de courbes et le texte d'accompagnement devient la légende dans le coin en bas à droite du Grapheur. La vitesse de l'animation ------------------------- À moins que vous ne produisiez un nombre fixe de lignes, c'est une bonne idée d'éviter de noyer le Shell et le Grapheur sous les données. C'est pourquoi l'exemple ci-dessus fait une petite pause (``sleep(0.05)``) avant d'afficher la ligne suivante. Intervalle de l'axe-Y --------------------- Le Grapheur tente de détecter un intervalle adapté pour votre courbe sans qu'il soit nécessaire de le changer trop souvent. Pour cette raison, il augmente l'intervalle si besoin est, mais ne le diminue qu'au début d'une nouvelle série. Si certaines données extraordinaires rendent l'intervalle trop grand, on peut le rétrécir manuellement en attendant que les données trop grande sortent de la figure et en cliquant sur le Grapheur. Si vous voulez rendre l'intervalle plus grand (ou juste comparer vos valeurs à d'autres), il suffit simplement d'inclure une ou des constantes adéquates dans vos lignes de données, p.ex. : ``print(0, measure1, measure2, 100)``. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/program_arguments.rst0000644000076600000240000000241514417536743025411 0ustar00aivarannamaastaffLancer les programmes avec des arguments en ligne de commande ============================================================= Quand nous éditez *mon_programme.py* et pressez la touche F5, Thonny construit une commande magique ``%Run mon_program.py`` et l'envoie au shell, qui demande à la tâche de fond de Thonny de lancer ce script. Quand on utilise le shell et qu'on récupère la commande ``%Run`` (avec la flèche vers le haut), on peut y ajouter *des arguments en ligne de commande*. Par exemple on peut remplacer cette commande par ``%Run mon_programme.py argument1 argument2`` et appuyer sur Entrée. Quand on lance le programme ainsi, il est possible d'accéder aux arguments à l'aide de ``sys.argv``: .. code:: import sys print(sys.argv) Modifier les arguments en ligne de commande ------------------------------------------- S'il faut utiliser le même ensemble d'arguments plusieurs fois, ça peut devenir ennuyeux de reconstruire le ``%Run`` à la main. Dans ce cas, vous pouvez cocher **Arguments du programme** dans le **menu Afficher**. Cela ouvre un petit champ de saisie près des boutons de la barre d'outils. Ensuite, tout ce qu'on tape dans cette zone de saisie est ajouté au bout du ``%Run `` à chaque fois qu'on presse la touche F5. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/shell.rst0000644000076600000240000000767214417536743022776 0ustar00aivarannamaastaffLe Shell ======== Le Shell est le moyen principal pour lancer et communiquer avec votre programme. Il ressemble pour l'essentiel à la boucle REPL (Read-Evaluate-Print Loop) officielle de Python, mais il y a quelques différences et propriétés supplémentaires. Les commandes Python -------------------- Tout comme l'invite REPL officielle de Python, le Shell de Thonny accepte des expressions et des commandes Python, qu'elles soient sur une seule ligne ou sur plusieurs. Si on presse la touche Entrée, Thonny utilise quelques heuristiques pour prédire si on veut lancer la commande ou continuer à taper la commande sur la ligne suivante. Si vous voulez lancer la commande mais que Thonny vous offre une nouvelle ligne, vérifiez si vous avez oublié de refermer quelques parenthèses. Les commandes magiques ---------------------- Si on sélectionne "Lancer => Lancer le script courant" ou qu'on presse la touche F5, on voit que Thonny insère une commande commençant par ``%Run`` dans le Shell. Les commandes qui commencent par ``%`` sont appelées *commandes magiques* (tout comme dans `IPython `_ et elles réalisent certaines actionnes, qui ne peuvent pas (facilement) s'exprimer par des commandes Python. Les commandes magiques de Thonny ont d'habitude des commandes correspondantes dans le menu si bien qu'il est inutile de les écrire à la main. Les commandes système --------------------- Si on doit rapidement lancer une simple commande système il n'est pas nécessaire de démarrer un Terminal. Il suffit de préfixer la commande par ``!`` (p. ex. ``!pytest mon-script.py``) et de la saisir dans le Shell de Thonny. L'historique des commandes -------------------------- Si on veut relancer la même commande ou presque plusieurs fois, il n'est pas nécessaire de la retaper à chaque fois -- on utilisera la flèche vers le haut pour récupérer la commande précédente dans l'historique. Une nouvelle action sur la même touche récupère le commande précédente et ainsi de suite. On utilise la touche flèche vers le bas pour se déplacer dans l'historique en sens opposé. Sortie colorisée ---------------- Si votre Shell est en mode émulation de Terminal (voir Outils => Options => Shell), on peut utiliser des `codes ANSI `_ pour produire une sortie colorisée. Essayez l'exemple suivant : .. code:: print("\033[31m" + "Red" + "\033[m") print("\033[1;3;33;46m" + "Texte brillant et gras, italique, en jaune sur fond cyan" + "\033[m") Vous pouvez avoir envie d'utiliser un paquet comme `colorama `_ pour produire Les codes couleur. Réécrire par-dessus les lignes de sortie ---------------------------------------- Les bons émulateurs de terminal supportent des codes ANSI autorisant l'écriture à une position arbitraire sur l'écran du terminal. Le Shell de Thonny ne peut pas en faire autant, mais il supporte cependant quelques trucs et astuces. Essayez le programme suivant : .. code:: from time import sleep for i in range(100): print(i, "%", end="") sleep(0.05) print("\r", end="") print("Terminé !") Le truc est d'utiliser le caractère ``"\r"``, qui fait revenir le curseur de sortie au début de la ligne courante, si bien que les caractères suivants seront affichés en écrasant le texte précédent. Notez bien l'usage de ``print(..., end="")`` pour éviter de créer une nouvelle ligne. Le cousin de ``"\r"`` est ``"\b"``, qui déplace le curseur de sortie à gauche d'un caractère. Cela ne fait rien s'il est déjà à la première position de la ligne. Émettre un son -------------- Quand le Shell est en mode émulation de terminal, on peut faire sonner (ou émettre un tintement) en sortant un caractère ``"\a"``. Mettre en graphique une série de nombres ---------------------------------------- On peut visualiser les séries de nombres envoyées vers le Shell à l'aide du `Grapheur `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/fr_FR/HELP_CONTENT/turtle.rst0000644000076600000240000000120614417536743023171 0ustar00aivarannamaastaffSupport spécial pour les programmes Turtle ========================================== Quand on développe des programmes avec le module ``turtle``, Thonny offre le support suivant : * On peut faire sans les appels de ``mainloop``, ``done`` ou ``exitonclick`` dans le script (Thonny s'occupera de garder la fenêtre Turtle interactive). Cela permet de créer des parts de son dessin à l'aide d'un script et de continuer à ajouter des propriétés à l'aide du shell. On peut aussi faire tout le dessin à partir du shell. * On peut `ancrer la fenêtre Turtle `_, afin qu'elle reste bien visibles tant qu'on travaille sur le script. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1060045 thonny-4.1.7/thonny/locale/fr_FR/LC_MESSAGES/0000755000076600000240000000000014730055627020757 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/fr_FR/LC_MESSAGES/thonny.mo0000644000076600000240000011312714670256721022641 0ustar00aivarannamaastaff,- 6$W)|  &!3DR&   .0&2W  x M [ o z &     ; 8!P!e!Gk! !!!! ! !! ! """ "G"##(#:#B#W#<q#%#*##$!$>$B$G$M$b$$$3$$%%+%2% ;%G%W%_%f%y%%!% %3%% &L0&}&(&)&& 'B'S'X'g'|'' ''%'''/''(.B(q( w((( (( ((((( ( ( ))%)+)0)?) E) R) ])i).{))=H* **** * *+**0+2+ 7+E+6W++++++ ,,,,#,{+,L,m,Fb--Wq.m.C7/{//7/// ///0%070O0n0 00 00 00$013 1=1A1H1Q1g1v1~1 111 11111%132/B2r2zG3%3;3($4M4d4w4 414 4455.5B5U5^5p5 555n5!6,60#7<T77,%8UR888 88n8 79C9 c9 q9 99999?9C9<:W:'u:): :::;;8;T;i;6q;T; ;< << <$<;<HC<5<<<< <<< =*=;=L=h=:p=====$=& >1>9>I>R>Z>o>> > > >>> >(>?#?(? :?BG??? ??? ?&?? ?@ !@ /@<@)L@+v@@ @+@@@ @ @AA 7A"EAhAmA |A A A A AA AAAA BB -B 8BCB2aB8B:BCC %C02CcCuCCC C CCC-C D D D(D 1D;D@D UD bD)pDDDDD$D DEEEE +En9E!E EEE:F !G/GbG^7HjHkImI/IIiJxJ"JJJJ!J JKK-K06K gKqK vKKKKKKKK K2K%.L!TLvL|L LLL(L.LLLMQMBcMM6NNN OC%OiO nO xOO OO1O%O%OVPInP PP PP fR)tR/RFR S S6SJS6jS+S4SpT,sT T TTTT;T?UTYU UUUUU{VVVV#V6V&WEWMWUWjWTWWWXgXXXXX XXX XXYY YZYCZJZhZnZ%ZIZ*Z)![K[i[$[[[ [[&[)\'*\GR\\'\\ \ ]]!]4]=]F]]]$u]7] ]I])^^I^^7^:^%8_ ^_Rl_____``&`->`l``7`!`;`9a@aPa Ya fapaxa(aaaaaab b8b AbLb db!qbb!b'b,b!cMc 'd4d=d Ud_dtd-ddMde"e4eCPee!ee#e&fmAmAnIo4oO p6[ppppp4p&qEqbqtqqq q qqq$r:rVr rAsA2tatttJuhuRvVv^vnv~v w%w8w Gw Uwcwiw{w~wUwTw*U~e+!1@Hrʉ~c 8ҍ)6+=,i!ɎIߎ )6 ?Mc }؏9@<5} ʐԐ +O pi~MG#& P4 B+7,gdY̕ &3G%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: fr Language-Team: fr Plural-Forms: nplurals=2; plural=(n > 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d éléments'%s' ne semble pas être un fichier texte(redémarrez Thonny après avoir modifié ceci)(utilisé lors du clic sur le bouton Déboguer dans la barre d'outils)À propos de BirdseyeÀ propos de Thonnyactiver l'environnement virtuelInstallation / Mise à jour / Rétrogradation avancéeN'autoriser qu'une seule instance de ThonnyAutoriser l'exécution de programme pas enregistré.Autoriser l'entrée dans les bibliothèques en mode débogage (par ex. en dehors du dossier du script principal)Êtes-vous sur de vouloir le désinstaller ?AssistantAttributsAuthentificationAuteurAuto-complétionProposer automatiquement des compléments pendant la saisieAfficher automatiquement la documentation pour les complémentsAfficher automatiquement les informations sur les paramètres après avoir tapé '('PrécédentRetour vers %sRevenir au cadre courantLa backend n'est pas prêteDossier invalideBirdseye est un débogueur Python qui doit être installé séparément. Voulez-vous ouvrir l’aide pour en savoir plus ?Port de BirdseyeParcourir les paquetsSuivi des boguesImpossible de fermer pour l'instantImpossible de trouver le nom du paquet dans la liste :Impossible de trouver un disque valideAnnulerAnnulerSensible à la casseModifier la taille de la policeModifier le dossier de travail en dossier de script lors de l'exécution / débogageCircuitPython (générique)appareil CircuitPythonEffacerVider la console avant de lancer un processus nouveau (exécuter, débouger, arrêter/redémarrer, ...)Vider la consoleCliquezCliquez FermerTout fermerFermer les autresCommande indisponibleCommenterLa configuration a été mise à jour. Redémarrez Thonny pour commencer à travailler en mode normal. (Voir « Outils → Options → Général » si vous changez d'avis plus tard.)Configurer les fichiers %s Configurer l'interpréteur...ConfirmationConnectez votre appareil à l'ordinateur et sélectionnez le port correspondant ci-dessousCopierCopier dans le presse-papiersCopieCopie de %s vers %sImpossible de trouver une définitionImpossible de trouver le disque '%s'. Voulez-vous le trouver vous-même ?Impossible de trouver le paquet dans PyPi.Impossible de trouver le paquet dans PyPIimpossible de l’enregistrerCréer le répertoireCréation de l'environnement virtuelCouperDonnéeDéboguerDéboguer le script courantDéboguer le script courant (birdseye)Déboguer le script courant (plus rapide)Déboguer le script courant (plus joli)Mode de débogage (fournit des journaux de diagnostic plus détaillés)Diminuer la taille de la policeDésindenter les lignes sélectionnéesMot de passe par défautSupprimerSupprimerSuppression de %sVersion souhaitéeDétailsAppareilVoulez-vous dire '%s'?Propriétés du dossierDésactiver les sons de notificationVérifications désactivées (un identifiant par ligne)DéconnecterÊtes-vous sûr de vouloir utiliser ce nom de fichier pour votre script ?Voulez-vous fermer l'éditeur ?Voulez-vous rejeter le contenu actuel de l'éditeur et relire le fichier à partir du disque ?Voulez-vous écraser '%s' ?Voulez-vous enregistrer le fichier avant de le fermer ?Voulez-vous enregistrer les fichiers avant de les fermer ?Ancrer les fenêtres de l'utilisateurDocumentationN'oubliez pas que main.py ne peut fonctionner que sans script principal intégré.SuivantTéléchargement vers %sTéléchargement de %s vers %sÉditionÉditeurPolice de l'éditeurEntrez un nombre entierEntrez un nom pour le nouveau dossier dans %sSaisissez un nouveau nomEntrez le texte à remplacer.Entrer la phrase de passe de votre clé privée pour {}Entrer votre mot de passe pour {}Variables d'environnement (une paire clé=valeur par ligne)ErreurCode d'erreur :Erreur :ÉvénementsExceptionQuitterQuitter ThonnyExporter les journaux d’utilisation…modification externeFichierFichier existe déjàLe fichier a disparu.Le fichier est ouvertNom de fichier :Propriétés du fichierFichiersRechercherRechercher et remplacerRechercher :Placer le curseur dans l'éditeurPlacer le curseur dansPlacer le curseur dans la consoleMode de mise à l'échelle de la policeEnregistrez le script avant de le déboguer.Pour des raisons de performance, la console évite d'afficher les très longues lignes en entier (voir Outils => Options => Console). Vous pouvez interagir ici avec le texte original.Plusieurs disques '%s' trouvés. Voulez-vous en sélectionner un vous-même ?Plein écranFonctionAppel de fonction à %sGénéralAccéder à la ligneAccéder à la ligne...Accès non autorisé pendant le chargement %sAllocations mémoireLe suivi des allocations mémoire est activé. Fermez-le pour le désactiver.AideContenu de l'aideCacher les fichiers cachésSurligner la ligne du curseur (nécessite de ré-ouvrir l'éditeur)Surligner les variables localesSurligner les noms correspondantsSurligner les parenthèsesSurligner les éléments de syntaxeMettre en surbrillance les tabulationsAccueilPage d'accueilIDINSTALLERPolice de la consoleS'il s'agit d'un fichier texte, vous pouvez le configurer pour qu'il s'ouvre dans Thonny en cliquant avec le bouton droit de la souris et en sélectionnant « Configurer ... fichiers ».Si la dernière commande lève une exception cette fenêtre affichera le stacktraceSi le fichier doit être ouvert dans une application externe, téléchargez-le dans un répertoire local et ouvrez-le de là !Si vous ne le trouvez pas, vous devriez d'abord installer un pilote USB correct.Si vous ne savez pas d'où vous pouvez obtenir le paquet, alors vous pouvez faire une recherche dans l'Index des Paquets Python. Commencez par entrer le nom du paquet dans le champ de recherche ci-dessus et appuyez sur ENTRÉE.Si vous nommez votre script '%s', vous ne serez pas en mesure d'importer le module '%s'Si vous citez la valeur d'une variable d'environnement, les guillemets feront partie de la valeur. C'était votre intention ?Si vous le voulez vraiment, veuillez l'installer en ligne de commande.Augmenter la taille de la policeIndenter les lignes sélectionnéesIndenter avec des tabulations (non recommandé pour Python)Index infoinformationInstallerinstaller CicuitPythoninstaller MicroPythonInstaller depuis PyPIInstaller depuis un fichier localInstaller depuis un fichier d'exigencesInstaller ou mettre à jour %sInstallée dans :Version installée :InstallationInstallation '%s'InterpréteurInterrompre l’exécutionInterrompre l'exécution du programme dès la connexionEntrerConserver la fenêtre du terminal ouverte après la fin du processus PythonCléIdentifiant de cléLangueDernière version stableDernière versionLicenceligneNuméro de ligneChargerChargementCharger %sPython 3 localVariables localesEmplacementJournaliser les évènements d'utilisation du programmeIl semble que '%s' ait été supprimé ou déplacé.Il semble que '%s' ait été modifié en dehors de l'éditeur.Impossible d'écrire dans le fichier ou le dossier sélectionné.Il semble que vous êtes en train d'installer un paquet lié à Thonny. Si vous vouliez installer un plugin de Thonny, alors vous devriez plutôt sélectionner « Outils → Gérer les plugins… » Êtes-vous sûr de vouloir installer %s pour l'interpréteur ?Programmé à l'Université de Tartu, Estonie, avec l'aide de la communauté open-source, de la Fondation Raspberry Pi et de Cybernetica SASRendre les scripts shebang sauvegardés exécutablesVeuillez vérifier que MicroPython a bien été installé dans votre micro:bit.Rendre les scripts shebang téléchargés exécutablesGérer les paquets pour %sGérer les paquets…Gérer les plugins…Agrandir la vueLongueur maximum de ligne avant de tronquer le texteNombre maximum de lignes à conserver.Peut ralentir le débogueur.MicroPython (SSH)MicroPython (générique)MicroPython (local)appareil MicroPythonModifié leDéplacer %s vers la corbeille ?déplacer / renommerDéplacer vers la corbeilleDéplacement de %s vers la corbeilleDéplacer vers la corbeilleRemarque : La fermeture automatique doit être activée dans les paramètres du terminal (Profils → Console → Lorsque la console se ferme)Nb! Le button de sélection de fichiers pourrait ne pas pas fonctionner correctement en choisissant un exécutable issue d'un environnement virtuel. Dans ce cas choisissez 'activer' le script au lieu de l'interpréteur (ou entrer directement le chemin dans le champ)Remarque : De grandes valeurs peuvent réduire les performances !Remarque : Redémarrez Thonny après avoir modifié ces options !Remarque : Certains éléments de style ne seront modifiés qu'après le redémarrage de Thonny !Remarque : Il est possible qu'il y ait une autre version disponible qui soit compatible avec la version actuelle de Thonny. Cliquez sur le bouton « … » pour sélectionner la version à installer.Note, Thonny ne prend en charge que Python %s et les versions ultérieuresRemarque : Vous devez redémarrer Thonny après avoir installé / mis à jour / désinstallé un plugin.NomNouveauNouveau dossierFichier nouveauLes nouveaux paquets seront également installés dans ce dossier. D'autres emplacements peuvent être gérés de façon différente.Objet suivantAucune ligne n'est marquée par #todoNon disponibleNon connectéNon supportéNotesPas de sélectionOKInspecteur d'objetOuvrir l’assistant automatiquement lorsqu'il y a des avertissements pour votre codeOuvrir automatiquement l’assistant lorsqu’un programme plante avec une exceptionOuvrir le dossier de données de Thonny…Ouvrir le dossier programme de Thonny…Ouvrir et fermer la vue de la pile automatiquementOuvrir les valeurs évalués dans l'inspecteur d'objetsOuvrir à partir de %sOuvrir dans ThonnyOuvrir dans l'éditeur de texte de ThonnyOuvrir dans l'application externe par défautOuvrir dans l'application système par défautOuvrir dans le gestionnaire de fichiersOuvrir la console du système…Ouvrir…L'ouverture de fichiers distants dans une application externe n'est pas prise en charge.Ouvre la vue de la pile au premier appel et la ferme lorsque le programme revient au cadre principal.Options…SortirStructureSuivantÉcraser ?Remplacement du thème '%s'PaquetLe paquet '{}' est nécessaire pour installer ou désinstaller d'autres paquets.Pas de gestionnaire de package disponible pour cet interpréteurDossier des paquetsmot de passeCollercoller échoueCheminEffectuer les vérifications MyPyEffectuer les vérifications Pylint sélectionnéesAccès non autoriséAccès non autoriséVeuillez vérifier la syntaxe !GrapheurLe Grapheur rend visuelles des séries de nombres affichées dans le Shell.PortPort ou WebREPLPotentiel problèmeDébogueur favoriLes préperations (omettre la partie VS Code)Afficher Python REPL après la fin du programmeAperçuObjet précédentImprimer…problèmeProblème de chargement de fichierArguments du programmeArguments du programme :Arbre du programmePropriétésPage PyPIMode Pygame ZeroExécutable PythonFichiers PythonHabituellement, les fichiers Python utilisent .py comme extension.Interpréteurs PythonQuitterVoulez-vous vraiment désinstaller ?Fichiers récentsLongueur maximale de ligne recommandée (définir à 0 pour désactiver la limite)RétablirActualiserMode normalPython3 distant (SSH)RenommerRenommer '%s'Réouvrir tous les fichiers de la session précédenteRemplacerRemplacer toutRemplacer les tabulations par des espacesRemplacer par :Remplacer et rechercherSignaler un problèmeDemander des compléments avec la touche Tab dans le shellDemander des compléments avec la touche Tab dans les éditeursNécessiteExigences :redémarrer l'interpréteur avant exécuter le scriptReprendreExécuterExécuter et déboguerExécuter / reprendreExécuter le script courantExécuter le script courant dans un terminalExécuter jusqu'au curseurExécution du script courant dans le terminalEnregistrerSauvegarder Tous les fichiersEnregistrer à la fermetureEnregistrer sous…Enregistrer une copie…Sauvegarder le mot de passeEnregistrer sous %sEnregistrementSauvegarder dans %sChercher micropython-lib et PyPIRechercher sur PyPIRésultats de la rechercheChercherVoir l'aide pour des détails.Sélectionner toutTout sélectionnerSélectionnez un élément et réessayez !Sélectionner un dossier vide pour le nouvel environnement virtuelBoîtes de dialogue de fichier derrière la fenêtre principaleLe dossier sélectionné n'est pas vide. Sélectionner un autre ou annuler.Envoyer le symbole EOF / RedémarrerConsoleAfficher le GrapheurAfficher les appels de fonction (cadres) dans des fenêtres séparéesMontrer les fichiers cachésAfficher les numéros de ligneAfficher l'information sur les paramètresTailleTaille (octets)Code sourceTexte tronqué (%d caractères)PileCommencez par sélectionner le paquet sur la gauche.DémarrerÉtape précédenteEntrer dans l'étape en coursSortir de l'étape en coursÉtape suivanteArrêterArrêter/redémarrer l’interpréteurInformations sur le stockageEspace de stockageEspace disque sur ce disque ou système de fichiersRésumésupport techniqueSoutenez l'UkrainePasser en mode normalSynchroniser l'horloge en temps réel d'outilThème de la syntaxeTODOcibleTerminalÉmulation du terminalLa réponse estLa représentation ci-dessus est une valeur approximative de ce décimal. La valeur exacte stockée est %s qui est environ %sLe texte spécifié n'a pas été trouvé !Thème et policeIl y a des dossiers en conflitCette section est prévue pour vos notes de travail : instructions d’affectation, fragments de code, ce que vous voulez. Tout sera sauvegardé automatiquement et chargé lorsque vous ouvrirez Thonny la prochaine fois. N’hésitez pas à effacer ce texte pour faire de la place pour vos propres notes.Cette commande n'est pas disponible si Thonny est exécuté via Flatpak.Cet ordinateurCette boîte de dialogue concerne la gestion des plugins de Thonny et leurs dépendances. Si vous souhaitez installer des paquets pour vos propres programmes, sélectionnez « Outils → Gérer les paquets… »Cette boîte de dialogue liste tous les paquets disponibles, mais n'autorise la mise à jour et la désinstallation que depuisCela ne ressemble pas au paquet MicroPython/CircuitPython. Êtes-vous sûr de vouloir l'installer ?Un fichier du même nom est déjà ouvert dans Thonny. Si vous voulez l'enregistrer avec ce nom, fermer d'abord l'éditeur correspondant !Le fichier semble être mal encodé. Vérifier qu'il est encodé en UTF-8 ou que l'encoding est clairement indiqué dans le fichier.Ceci est un commentaireCe paquet nécessite une version différente de Thonny :Ce programme n'est fourni SANS AUCUNE GARANTIE QUELLE QU'ELLE SOIT ! Il s'agit d'un logiciel libre et vous pouvez le redistribuer sous certaines conditions, voir https://opensource.org/licenses/MIT pour plus de détailsOptions de ThonnyPlugins de ThonnyPlugin pour Thonny sans aucun pré-requisPython de ThonnyCommenter/DécommenterOutilsEssayer de l'ouvrir avec Fichier => Ouvrir.Essayer de détecter le port automatiquementType d'interfaceFacteur d'échelle de l'interfaceThème de l'interfaceDécochez si vous souhaitez une expérience d'utilisation plus classique.DécommenterDéfaireDésinstallerDésinstallation '%s'Exigences non satisfaitesPrécédentMettre à jourMettre à jour les dépendancesMettre à jour ou désinstallerMise à jour '%s'Téléversement vers %sUtilisez la commande « Stop » pour annuler le débogageUtiliser les boîtes de dialogue fichier de Tk au lieu de ZenityUtiliser l'heure locale pour l'horloge en temps réelValeurID de la valeurVariablesHistorique de versionAffichagevisualizer le script curant au Python TutorAvertir si un module personnalisé rend un module de bibliothèque inaccessibleAvertissementQue faire avec un fichier %s quand vous double cliquez dessus dans le gestionnaire de fichier de Thonny ?Où enregister ?Quel type d'interpréteur Thonny doit-il utiliser pour exécuter votre code ?Avec l'interpréteur courant vous ne pouvez parcourir que ces paquets. Utilisez « Outils → Ouvrir la console du système… » pour installer, mettre à jour ou désinstaller.Enrouler le texte (peut être lent)Vous pouvez également activer un environnement virtuel existant via le menu contextuel du clic droit dans la navigation des fichiers lorsque vous sélectionnez un dossier d'environnement virtuel ou le fichier 'pyveng.cfg' qu'il contient.Vous devez sélectionner un fichier !Vous devez arrêter vôtre programme avant de lancer le gestionnaire de package.Zoomtous les fichiersbla, blaoctetsespace libreicirecherche du nom de votre appareil, « USB Serial » ou « UART »pas de répertoire lib absolu dans sys.pathprend en charge les styles et les couleurs ANSI simplespour trouver et installer le fichier du paquet (généralement avec l'extension .whl, .tar.gz ou .zip).pour trouver le fichier requirements.txt et installer les paquets qui y sont spécifiés.espace totalchaîne_non_ferméeespace utilisé././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/fr_FR/LC_MESSAGES/thonny.po0000644000076600000240000016462214626075445022655 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: fr\n" #: thonny/workbench.py:375 msgid "File" msgstr "Fichier" #: thonny/workbench.py:376 msgid "Edit" msgstr "Édition" #: thonny/workbench.py:377 msgid "View" msgstr "Affichage" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Exécuter" #: thonny/workbench.py:379 msgid "Tools" msgstr "Outils" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Aide" #: thonny/workbench.py:598 msgid "Exit" msgstr "Quitter" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Diminuer la taille de la police" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Placer le curseur dans l'éditeur" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Placer le curseur dans la console" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Agrandir la vue" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Plein écran" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Arguments du programme" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "À propos de Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Programmé à l'Université de Tartu, Estonie, avec l'aide de la communauté open-source, de la Fondation Raspberry Pi et de Cybernetica SAS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Ce programme n'est fourni\n" "SANS AUCUNE GARANTIE QUELLE QU'ELLE SOIT !\n" "Il s'agit d'un logiciel libre et vous pouvez le\n" "redistribuer sous certaines conditions,\n" "voir https://opensource.org/licenses/MIT\n" "pour plus de détails" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Historique de version" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Signaler un problème" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Ouvrir automatiquement l’assistant lorsqu’un programme plante avec une exception" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Ouvrir l’assistant automatiquement lorsqu'il y a des avertissements pour votre code" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Effectuer les vérifications Pylint sélectionnées" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Effectuer les vérifications MyPy" #. id ? code ? #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Vérifications désactivées (un identifiant par ligne)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistant" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Auto-complétion" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Interpréteur" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "À propos de Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye est un débogueur Python qui doit être installé séparément.\n" "\n" "Voulez-vous ouvrir l’aide pour en savoir plus ?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Déboguer le script courant (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Commenter/Décommenter" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Commenter" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Décommenter" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Défaire" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Rétablir" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Couper" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Copier" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Coller" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Tout sélectionner" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Exécuter jusqu'au curseur" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Impossible de fermer pour l'instant" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Utilisez la commande « Stop » pour annuler le débogage" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ancrer les fenêtres de l'utilisateur" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Surligner les noms correspondants" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Surligner les variables locales" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Surligner les parenthèses" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Surligner les éléments de syntaxe" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Surligner la ligne du curseur (nécessite de ré-ouvrir l'éditeur)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Afficher les numéros de ligne" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Longueur maximale de ligne recommandée\n" "(définir à 0 pour désactiver la limite)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Éditeur" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exporter les journaux d’utilisation…" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Événements" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Fichiers" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Rechercher et remplacer" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Rechercher :" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Remplacer par :" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "Sensible à la casse" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Précédent" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Suivant" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Rechercher" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Remplacer" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Remplacer et rechercher" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Remplacer tout" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Entrez le texte à remplacer." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Le texte spécifié n'a pas été trouvé !" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "N'autoriser qu'une seule instance de Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Réouvrir tous les fichiers de la session précédente" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Désactiver les sons de notification" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Mode de mise à l'échelle de la police" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Le suivi des allocations mémoire est activé.\n" "Fermez-le pour le désactiver." #. Pile ? #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Allocations mémoire" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Langue" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Cette section est prévue pour vos notes de travail : instructions d’affectation, fragments de code, ce que vous voulez.\n" "\n" "Tout sera sauvegardé automatiquement et chargé lorsque vous ouvrirez Thonny la prochaine fois.\n" "\n" "N’hésitez pas à effacer ce texte pour faire de la place pour vos propres notes." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notes" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Objet précédent" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Objet suivant" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Inspecteur d'objet" #. Vu qu'il s'agit d'une vue qui donne la structure du code (fonctions, classes etc), est-ce que "structure" ne serait pas mieux ? #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Structure" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Mode Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Désinstaller" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Fermer" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Cliquez " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "ici" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Mettre à jour" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Installer" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Impossible de trouver le paquet dans PyPi." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Dernière version stable" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Dernière version" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Résumé" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Auteur" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Page d'accueil" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Suivi des bogues" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Documentation" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "Page PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Nécessite" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Voulez-vous vraiment désinstaller ?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Êtes-vous sur de vouloir le désinstaller ?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Revenir au\n" "cadre courant" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variables" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Cet ordinateur" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Actualiser" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Placer le curseur dans" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Erreur" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Vous devez sélectionner un fichier !" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Écraser ?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Voulez-vous écraser '%s' ?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Nouveau" #: thonny/editors.py:671 msgid "Open..." msgstr "Ouvrir…" #: thonny/editors.py:673 msgid "Load" msgstr "Charger" #: thonny/editors.py:682 msgid "Recent files" msgstr "Fichiers récents" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Tout fermer" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Enregistrer" #: thonny/editors.py:739 msgid "Save as..." msgstr "Enregistrer sous…" #: thonny/editors.py:750 msgid "Save copy..." msgstr "Enregistrer une copie…" #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Options de Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "Exécuter le script courant" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Exécuter le script courant dans un terminal" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Arrêter/redémarrer l’interpréteur" #: thonny/running.py:205 msgid "Stop" msgstr "Arrêter" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Interrompre l’exécution" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Envoyer le symbole EOF / Redémarrer" #: thonny/running.py:240 msgid "Disconnect" msgstr "Déconnecter" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Interpréteurs Python" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "tous les fichiers" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Sélectionner un dossier vide pour le nouvel environnement virtuel" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Dossier invalide" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Le dossier sélectionné n'est pas vide. Sélectionner un autre ou annuler." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Création de l'environnement virtuel" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Vider la console" #: thonny/shell.py:185 msgid "Plotter" msgstr "Grapheur" #: thonny/shell.py:317 msgid "Clear" msgstr "Effacer" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Afficher le Grapheur" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Pour des raisons de performance, la console évite d'afficher les très longues lignes en entier (voir Outils => Options => Console).\n" "Vous pouvez interagir ici avec le texte original." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "Enrouler le texte (peut être lent)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Copier dans le presse-papiers" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Texte tronqué (%d caractères)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Le Grapheur rend visuelles des séries de\n" "nombres affichées dans le Shell." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Voir l'aide pour des détails." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Fermer les autres" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Copie" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Copie de\n" " %s\n" "vers\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Annuler" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Sélectionner tout" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Console" #: thonny/workbench.py:608 msgid "Options..." msgstr "Options…" #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Augmenter la taille de la police" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Modifier la taille de la police" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Quitter Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Quitter" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Remplacement du thème '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Arguments du programme :" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Mode normal" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "La configuration a été mise à jour. Redémarrez Thonny pour commencer à travailler en mode normal.\n" "\n" "(Voir « Outils → Options → Général » si vous changez d'avis plus tard.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Arbre du programme" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Reprendre" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Exécuter / reprendre" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Déboguer le script courant" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Déboguer" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Déboguer le script courant (plus joli)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Déboguer le script courant (plus rapide)" #. "Nœud" fait référence au Nœud de l'AST ce qui est difficile à expliquer aux débutants. "Étape" (de calcul) est compris des plus jeunes. #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Étape suivante" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Suivant" #. "Nœud" fait référence au Nœud de l'AST ce qui est difficile à expliquer aux débutants. "Étape" (de calcul) est compris des plus jeunes. #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Entrer dans l'étape en cours" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Entrer" #. "Nœud" fait référence au Nœud de l'AST ce qui est difficile à expliquer aux débutants. "Étape" (de calcul) est compris des plus jeunes. #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Sortir de l'étape en cours" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Sortir" #. "Nœud" fait référence au Nœud de l'AST ce qui est difficile à expliquer aux débutants. "Étape" (de calcul) est compris des plus jeunes. #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Étape précédente" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Précédent" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Pile" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Exception" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Journaliser les évènements d'utilisation du programme" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Mode de débogage (fournit des journaux de diagnostic plus détaillés)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Type d'interface" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Facteur d'échelle de l'interface" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "Remarque : Redémarrez Thonny après avoir modifié ces options !" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Général" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALLER" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Parcourir les paquets" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Avec l'interpréteur courant vous ne pouvez parcourir que ces paquets.\n" "Utilisez « Outils → Ouvrir la console du système… » pour installer, mettre à jour ou désinstaller." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Dossier des paquets" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installer depuis PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Si vous ne savez pas d'où vous pouvez obtenir le paquet, alors vous pouvez faire une recherche dans l'Index des Paquets Python. Commencez par entrer le nom du paquet dans le champ de recherche ci-dessus et appuyez sur ENTRÉE." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "pour trouver le fichier requirements.txt et installer les paquets qui y sont spécifiés." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Cliquez" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "pour trouver et installer le fichier du paquet (généralement avec l'extension .whl, .tar.gz ou .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Mettre à jour ou désinstaller" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Commencez par sélectionner le paquet sur la gauche." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Cette boîte de dialogue liste tous les paquets disponibles, mais n'autorise la mise à jour et la désinstallation que depuis" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Les nouveaux paquets seront également installés dans ce dossier. D'autres emplacements peuvent être gérés de façon différente." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Version installée :" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Installée dans :" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Veuillez vérifier la syntaxe !" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Impossible de trouver le paquet dans PyPI" #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Code d'erreur :" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Impossible de trouver le nom du paquet dans la liste :" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Le paquet '{}' est nécessaire pour installer ou désinstaller d'autres paquets." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Paquet" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Gérer les paquets pour %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Confirmation" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Il semble que vous êtes en train d'installer un paquet lié à Thonny. Si vous vouliez installer un plugin de Thonny, alors vous devriez plutôt sélectionner « Outils → Gérer les plugins… »\n" "\n" "Êtes-vous sûr de vouloir installer %s pour l'interpréteur ?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Remarque : Il est possible qu'il y ait une autre version disponible qui soit compatible avec la version actuelle de Thonny. Cliquez sur le bouton « … » pour sélectionner la version à installer." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Plugin pour Thonny sans aucun pré-requis" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Exigences non satisfaites" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Ce paquet nécessite une version différente de Thonny :" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Si vous le voulez vraiment, veuillez l'installer en ligne de commande." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Remarque : Vous devez redémarrer Thonny après avoir installé / mis à jour / désinstallé un plugin." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Plugins de Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Installation / Mise à jour / Rétrogradation avancée" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Version souhaitée" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Mettre à jour les dépendances" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Exigences :" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Erreur :" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Gérer les paquets…" #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Gérer les plugins…" #: thonny/plugins/replayer.py:364 #, fuzzy msgid "Open replayer..." msgstr "Ouvrir le relecteur…" #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Modifier le dossier de travail en dossier de script lors de l'exécution / débogage" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Afficher les appels de fonction (cadres) dans des fenêtres séparées" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Décochez si vous souhaitez une expérience d'utilisation plus classique." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Ouvrir et fermer la vue de la pile automatiquement" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Ouvre la vue de la pile au premier appel et la ferme lorsque le programme revient au cadre principal." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Autoriser l'entrée dans les bibliothèques en mode débogage (par ex. en dehors du dossier du script principal)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Peut ralentir le débogueur." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Débogueur favori" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(utilisé lors du clic sur le bouton Déboguer dans la barre d'outils)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Port de Birdseye" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(redémarrez Thonny après avoir modifié ceci)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Exécuter et déboguer" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Émulation du terminal" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "prend en charge les styles et les couleurs ANSI simples" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Nombre maximum de lignes à conserver." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Remarque : De grandes valeurs peuvent réduire les performances !" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Longueur maximum de ligne avant de tronquer le texte" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Exécution du script courant dans le terminal" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Afficher Python REPL après la fin du programme" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Conserver la fenêtre du terminal ouverte après la fin du processus Python" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Remarque : La fermeture automatique doit être activée dans les paramètres du terminal (Profils → Console → Lorsque la console se ferme)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Thème de l'interface" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Thème de la syntaxe" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Police de l'éditeur" #. Ici IO désigne Input/Output soit Entrée/Sortie. Cela correspond à la police de la console (Shell). Il est donc plus approprié de traduire par "Police de la console" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Police de la console" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Aperçu" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Ceci est un commentaire" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "La réponse est" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "chaîne_non_fermée" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Remarque : Certains éléments de style ne seront modifiés qu'après le redémarrage de Thonny !" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Entrez un nombre entier" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Thème et police" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Ouvrir le dossier programme de Thonny…" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Ouvrir le dossier de données de Thonny…" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Accueil" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Contenu de l'aide" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "appareil CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "appareil MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Connectez votre appareil à l'ordinateur et sélectionnez le port correspondant ci-dessous" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "recherche du nom de votre appareil, « USB Serial » ou « UART »" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Si vous ne le trouvez pas, vous devriez d'abord installer un pilote USB correct." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Essayer de détecter le port automatiquement" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (générique)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Imprimer…" #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Ouvrir la console du système…" #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Détails" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installer depuis un fichier d'exigences" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installer depuis un fichier local" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Cette boîte de dialogue concerne la gestion des plugins de Thonny et leurs dépendances.\n" "Si vous souhaitez installer des paquets pour vos propres programmes, sélectionnez « Outils → Gérer les paquets… »" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (générique)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Indenter les lignes sélectionnées" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Désindenter les lignes sélectionnées" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Passer en mode normal" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Veuillez vérifier que MicroPython a bien été installé dans votre micro:bit." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "N'oubliez pas que main.py ne peut fonctionner que sans script principal intégré." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Impossible de trouver le disque '%s'. Voulez-vous le trouver vous-même ?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Plusieurs disques '%s' trouvés. Voulez-vous en sélectionner un vous-même ?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Impossible de trouver un disque valide" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d éléments" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Déplacer vers la corbeille" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Supprimer" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Nouveau dossier" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Propriétés" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Espace de stockage" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Chemin" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Propriétés du dossier" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Propriétés du fichier" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "octets" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Taille" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Modifié le" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Suppression de %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Chargement" #: thonny/editors.py:395 msgid "Saving" msgstr "Enregistrement" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Téléversement vers %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Téléchargement de %s vers %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Téléchargement vers %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Ouvrir dans le gestionnaire de fichiers" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Cacher les fichiers cachés" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Montrer les fichiers cachés" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Ouvrir dans Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Ouvrir dans l'application système par défaut" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Configurer les fichiers %s " #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Que faire avec un fichier %s quand vous double cliquez dessus dans le gestionnaire de fichier de Thonny ?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Supprimer" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Créer le répertoire" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Charger %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Sauvegarder dans %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Sauvegarder Tous les fichiers" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Configurer l'interpréteur..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Appareil" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Annuler" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Démarrer" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Authentification" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Entrer la phrase de passe de votre clé privée pour {}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Entrer votre mot de passe pour {}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "La représentation ci-dessus est une valeur approximative de ce décimal. La valeur exacte stockée est %s qui est environ %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Résultats de la recherche" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Chercher" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Installation '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Mise à jour '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Désinstallation '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Installation" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Pas de gestionnaire de package disponible pour cet interpréteur" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Non supporté" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Non disponible" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "Vous devez arrêter vôtre programme avant de lancer le gestionnaire de package." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Ouvrir les valeurs évalués dans l'inspecteur d'objets" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Exécutable Python" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Nb! Le button de sélection de fichiers pourrait ne pas pas fonctionner correctement en choisissant un exécutable issue d'un environnement virtuel. Dans ce cas choisissez 'activer' le script au lieu de l'interpréteur (ou entrer directement le chemin dans le champ)" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python3 distant (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Non connecté" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "pas de répertoire lib absolu dans sys.path" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Rechercher sur PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Ouvrir dans l'éditeur de texte de Thonny" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Espace disque sur ce disque ou système de fichiers" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "espace total" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "espace utilisé" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "espace libre" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Informations sur le stockage" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Remplacer les tabulations par des espaces" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Mettre en surbrillance les tabulations" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Indenter avec des tabulations (non recommandé pour Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Nom" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Taille (octets)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Entrez un nom pour le nouveau dossier dans\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Pas de sélection" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Sélectionnez un élément et réessayez !" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Ouvrir à partir de %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Enregistrer sous %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Nom de fichier :" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "ID de la valeur" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Valeur" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Sauvegarder le mot de passe" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Appel de fonction à %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Variables locales" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Fonction" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Emplacement" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Si la dernière commande lève une exception cette fenêtre affichera le stacktrace" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Donnée" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attributs" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Index " #. I would need some context for this one #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "Identifiant de clé" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Clé" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Retour vers\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Port ou WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "mot de passe" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Code source" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Utiliser les boîtes de dialogue fichier de Tk au lieu de Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Boîtes de dialogue de fichier derrière la fenêtre principale" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Variables d'environnement (une paire clé=valeur par ligne)" #. However, it is not too rare to see only «Nouveau» #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Fichier nouveau" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Renommer" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Renommer '%s'" #. At present, the translation is like a "Enter (here) a new name" with "enter" already as conjugated verb. #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Saisissez un nouveau nom" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "coller échoue" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Il y a des dossiers en conflit" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Fichier existe déjà" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "S'il s'agit d'un fichier texte, vous pouvez le configurer pour qu'il s'ouvre dans Thonny en cliquant avec le bouton droit de la souris et en sélectionnant « Configurer ... fichiers »." #: thonny/editors.py:38 msgid "Python files" msgstr "Fichiers Python" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "Le fichier a disparu." #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Voulez-vous fermer l'éditeur ?" #: thonny/editors.py:169 msgid "External modification" msgstr "modification externe" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Voulez-vous rejeter le contenu actuel de l'éditeur et relire le fichier à partir du disque ?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "Habituellement, les fichiers Python utilisent .py comme extension." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Voulez-vous dire '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "déplacer / renommer" #: thonny/editors.py:768 msgid "Go to line..." msgstr "Accéder à la ligne..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Numéro de ligne" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Voulez-vous enregistrer les fichiers avant de les fermer ?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Voulez-vous enregistrer le fichier avant de le fermer ?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Enregistrer à la fermeture" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Commande indisponible" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Cette commande n'est pas disponible si Thonny est exécuté via Flatpak." #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Soutenez l'Ukraine" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Quel type d'interpréteur Thonny doit-il utiliser pour exécuter votre code ?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Afficher l'information sur les paramètres" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Afficher automatiquement les informations sur les paramètres après avoir tapé '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Proposer automatiquement des compléments pendant la saisie" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Afficher automatiquement la documentation pour les compléments" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Demander des compléments avec la touche Tab dans les éditeurs" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Demander des compléments avec la touche Tab dans le shell" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "problème" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Impossible de trouver une définition" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Vider la console avant de lancer un processus nouveau (exécuter, débouger, arrêter/redémarrer, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Python de Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Interrompre l'exécution du programme dès la connexion" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Synchroniser l'horloge en temps réel d'outil" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Utiliser l'heure locale pour l'horloge en temps réel" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "redémarrer l'interpréteur avant exécuter le script" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Cela ne ressemble pas au paquet MicroPython/CircuitPython.\n" "Êtes-vous sûr de vouloir l'installer ?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Déplacer vers la corbeille" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Déplacer %s vers la corbeille ?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Déplacement de %s vers la corbeille" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Ouvrir dans l'application externe par défaut" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "L'ouverture de fichiers distants dans une application externe n'est pas prise en charge." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Si le fichier doit être ouvert dans une application externe, téléchargez-le dans un répertoire local et ouvrez-le de là !" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Il semble que '%s' ait été supprimé ou déplacé." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Il semble que '%s' ait été modifié en dehors de l'éditeur." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "Note, Thonny ne prend en charge que Python %s et les versions ultérieures" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Accéder à la ligne" #: thonny/workbench.py:703 msgid "Support" msgstr "support technique" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "impossible de l’enregistrer" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Avertissement" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Si vous citez la valeur d'une variable d'environnement, les guillemets feront partie de la valeur.\n" "C'était votre intention ?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "installer MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "installer CicuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Rendre les scripts shebang téléchargés exécutables" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Rendre les scripts shebang sauvegardés exécutables" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "activer l'environnement virtuel" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "cible" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "visualizer le script curant au Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "ligne" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Aucune ligne n'est marquée par #todo" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Installer ou mettre à jour %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Python 3 local" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Vous pouvez également activer un environnement virtuel existant via le menu contextuel du clic droit dans la navigation des fichiers lorsque vous sélectionnez un dossier d'environnement virtuel ou le fichier 'pyveng.cfg' qu'il contient." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Les préperations (omettre la partie VS Code)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Mot de passe par défaut" #: thonny/running.py:392 msgid "Information" msgstr "information" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Enregistrez le script avant de le déboguer." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "'%s' ne semble pas être un fichier texte" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problème de chargement de fichier" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Le fichier semble être mal encodé.\n" "\n" "Vérifier qu'il est encodé en UTF-8 ou que l'encoding est clairement indiqué dans le fichier." #: thonny/editors.py:295 msgid "File is open" msgstr "Le fichier est ouvert" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Un fichier du même nom est déjà ouvert dans Thonny.\n" "\n" "Si vous voulez l'enregistrer avec ce nom,\n" "fermer d'abord l'éditeur correspondant !" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Accès non autorisé" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Impossible d'écrire dans le fichier ou le dossier sélectionné." #. La traduction de back-end ne me convient pas, mais je n'ai pas trouvé mieux pour le moment. #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "La backend n'est pas prête" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Où enregister ?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Potentiel problème" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Si vous nommez votre script '%s', vous ne serez pas en mesure d'importer le module '%s'" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Êtes-vous sûr de vouloir utiliser ce nom de fichier pour votre script ?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Accès non autorisé pendant le chargement %s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Essayer de l'ouvrir avec Fichier => Ouvrir." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Accès non autorisé" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Autoriser l'exécution de programme pas enregistré." #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Licence" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Avertir si un module personnalisé rend un module de bibliothèque inaccessible" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Chercher micropython-lib et PyPI" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9373772 thonny-4.1.7/thonny/locale/hu_HU/0000755000076600000240000000000014730055627017204 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1069016 thonny-4.1.7/thonny/locale/hu_HU/LC_MESSAGES/0000755000076600000240000000000014730055627020771 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/hu_HU/LC_MESSAGES/thonny.mo0000644000076600000240000007111114670256721022647 0ustar00aivarannamaastaff4 LM$V){ &!D&`     x m{ &  ;Xp    dw G<%V*|93V ! @Kk }B   % F /c  .    ! !!-! 2!=!M!S!X!g! m! z! !!!=A" """""0"" ""6 #B#\#u########L#F,$s$C;%%%7%%%%&&7& R&`& s&~& &&&3&&&&&' '%' -'8'H'Q'j'z?(;(( ) ) 3)1A) s))))))) *n**,Y+0+<++U,,, ,n,!d- - - - -----?-C'.k..'.). .////J/f/w//T/ ///0 00'0H/05x0000000 1 %111:91t1y11&111111 2 2 !2+2<2N2b2g2 y2B222 22&2 3 (343 M3 [3h3x3 333 3 333 3"344 &4 14 >4 L4W4 ^4k4q44 44 4 442485:O555 50555 6 6 6'6E6-K6y6 6 66 666 6 6)677 '747K7_7g7p7 7n7!8 "8/8 9.9b9@6:w:/::s;;";;; ;;;<0< ?<I< N<X<j<<<<<< <2<%=,=2= ;=E=U=m=Lr==O>g>C>> > >> >>1>%(? N?%Z?V?I? !@-@ =@H@[@o@ A/A1*B\BqB4BB*BMB/IC yC C CCCCCCCD DD DD)D E$E ,E9EREWpEEEEF F )F 3F=FPFbFqFGG;GVJG GG GG5G#H-?HmH#H HH H$H/H/I,JI3wIIIII II JJ J:J5XJJJ!JJVJEKHK[K rKKKK2K!K,LHL<eLL LL LL LL$LM M#M8M@MIM ZMfM MMMM>NN NN OOJO_OfOvOBOOO P'PFP XPbPiP lPxPIP]P/Q<Q R R*5R`R fRrRR#R'RRS S$S 6SBS_S<bSSSSSS S SSTT"!TDTBUHUV9VOVkV2V$VVV W%W9W MWYWkWW3XRYQeYYgOZZZZjZ#:[^[s[[[ [[[[N[D*\+o\.\.\0\*]?]%U]0{](]]] ^R^m^^^^ ^^^V^,_A_V_ ^_ k_"y_4_$_ _`G `U`Z`l`4` `` ``` aa 'a2aCaRa fapaaIa a a a b/ bPbVb&gbbbbbb b bbc+c)Hcrc)cccccc dd!d 1d;dNdddmddd#dFdK$e8pe%eee8e4fTfofvf f"ff/f f f g g g #g)0gZgig-rggggggg hh "hh,h#hhhiiujD kNk.akkRlgl-}ll lllll<m?m Nm[mjmmm mmmmm%n+5nan in tnnnnTno(oo? p Mp Xpeplprpp:p-p p'pT%qjzqqqrr3r%d items(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Creating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLog program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: hu Language-Team: hu Plural-Forms: nplurals=1; plural=0; MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d tétel(indítsd újra a Thonny-t ha megváltoztattad)(a Hibakeresés gombra klikkeléskor használjuk)A Birdseye névjegyeA Thonny névjegyeHaladó telepítés / frissítés / visszaléptetésHaladó beállításokEgyszerre csak egy Thonny példány futhatKönyvtárakba lépés engedélyezése (fő szkriptkönyvtáron kívüliekbe)Biztos vagy benne, hogy el akarod távolítani?AsszisztensJellemzőkAzonosításSzerzőAutomatikus kódkiegészítésVisszaVissza ide: %sVissza az aktuális keretreRossz könyvtárA Birdseye egy Python hibakereső, melyet külön kell telepíteni. Meg szeretnéd nyitni a súgó oldalt további információkért?Birdseye portCsomagok böngészéseHibakövetésNem lehet még bezárniA csomagnév nem található a listában:Nem található megfelelő lemezMégsemLeállításKis-nagybetű érzékenyBetűméret megváltoztatásaMunkakönyvtár módosítása a szkript könyvtárára Futtatás / Hibakeresés eseténCircuitPython (általános)CircuitPython eszközTörlésParancsértelmező törléseKlikkeljKlikkelj BezárásÖsszes bezárásaTöbbi bezárásaMegjegyzés beA beállítások megváltoztak. Indítsd újra a Thonny-t a Normál módhoz. (Ha meggondolnád magad: Eszközök → Beállítások → Általános)%s fájl beállításaÉrtelmező beállítása...MegerősítésCsatlakoztasd az eszközödet a számítógéphez és válaszd ki a megfelelő portot:MásolásVágólapra másolásMásolásMásolás: %s ide: %sNem található a '%s' lemez. Meg szeretnéd keresni?Nem található a csomag a PyPI-on.Nem található csomaginformáció a PyPI-on.Könyvtár készítéseVirtuális környezet létrehozásaKivágásAdatHibakeresésHibakeresés az aktuális szkriptbenHibakeresés az aktuális szkriptben (Birdseye)Hibakeresés az aktuális szkriptben (gyorsabb)Hibakeresés az aktuális szkriptben (szebb)Hibakereső mód (részletesebb naplózással jár)Betűméret csökkentéseBehúzás csökkentéseTörlésTörlésTörlés: %sKívánt verzióRészletekEszközKönyvtár tulajdonságaiÉrtesítési hang letiltásaLetiltott ellenőrzések (soronként egy azonosító)LekapcsolódásFelül akarod írni ezt: '%s'?Felhasználói ablakok dokkolásaDokumentációNe feledd, hogy a main.py csak beágyazott beágyazott fő szkript nélkül működik.LeLetöltés ide: %sLetöltés: %s ide: %sSzerkesztésKódszerkesztőKódszerkesztő betűtípusÍrj be egy egész számotÍrd be az új alkönyvtár nevét. Ide kerül: %sAdd meg a cserélendő szöveget.Írd be a privát kulcs jelszavát ehhez: {}Írd be a jelszót ehhez: {}Környezeti változók (soronként egy KULCS=ÉRTÉK legyen)HibaHibakód:Hiba:EseményekKivételKilépésKilépés a Thonny-bólHasználati naplók exportálása...FájlFájlnév:Fájl tulajdonságaiFájlokKeresésKeresés & CsereKeresd ezt:Kurzort a kódszerkesztőbeKurzor ideKurzort a parancsértelmezőbeBetűméretezési módA jobb teljesítmény érdekében a parancsértelmező rövidítve mutatja a nagyon hosszú sorokat (ld. Eszközök → Beállítások → Parancsértelmező). Itt megnézheted a teljes szöveget.Több '%s' lemez is található. Szeretnél egyet választani?Teljes képernyős nézetFüggvényFüggvényhívás: %sÁltalánosKupacKupac mód bekapcsolva. Zárd be a Kupac nézetet, ha ki akarod kapcsolni.SúgóSúgó tartalomRejtett fájlok elrejtéseAktuális sor kiemelése (újra kell indítani a kódszerkesztőt)Lokális változók kiemeléseEgyező nevek kiemeléseZárójelpárok kiemeléseSzintaktikai elemek kiemeléseTAB-ok kiemeléseKezdőlapHonlapIDTELEPÍTÉSIO betűtípusHa egy parancs kivételt vált ki, ez a nézet mutatja a hívási vermet.Ha nem találod, akkor lehet, hogy először egy megfelelő USB meghajtót kell telepítened.Ismeretlen forrású csomagokat érdemes a Python Package Indexen (PyPI-on) keresni. Ehhez írd be a csomag nevét a keresőmezőbe és nyomd le az ENTER-t.Ha valóban ezt szeretnéd, akkor telepítsd parancssorból.Betűméret növeléseBehúzás növeléseBehúzás TAB-bal (nem javasolt Pythonban)IndexTelepítésTelepítés PyPI-rólTelepítés lokális fájlbólTelepítés előfeltétel fájlbólFirmware telepítése vagy frissítéseTelepítve ide:Telepített verzió:TelepítésTelepítés: '%s'ÉrtelmezőVégrehajtás megszakításaBeHagyd nyitva a terminált a Python folyamat kilépése utánKulcsKulcs IDNyelvLegfrissebb stabil verzióLegfrissebb verzióBetöltésBetöltésBetöltés: %sLokális változókHelyHasználati események naplózásaÚgy tűnik, egy Thonny-val kapcsolatos csomagot telepítesz. Ha egy Thonny bővítményt szeretnél telepíteni, akkor használd az Eszközök → Bővítmények kezelése... menüt. Biztosan fel szeretnéd telepíteni ezt a feldolgozó számára: %s?Készítette: Tartu-i Egyetem (Észtország), a nyílt forráskód közösség, a Raspberry Pi Alapítvány és a Cybernetica AS segítségévelEllenőrizd, hogy a MicroPython telepítve van a micro:bit eszközödre.Csomagok kezelése ehhez: %sCsomagok kezelése...Bővítmények kezelése...Nézet maximalizálásaMaximális sorhossz, ami még nem lesz rövidítveMegtartandó sorok maximális számaLassíthatja a hibakeresést.MicroPython (SSH)MicroPython (általános)MicroPython (helyi)MicroPython eszközMódosítvaKukába helyezésFigyelem! A parancsértelmező beállításainál engedélyezned kell az automatikus bezárást (Beállítások → Parancsértelmező)Figyelem! A fájlválasztó gomb nem mindig működik amikor egy virtuális környezetből választasz egy programfájlt. Ilyenkor inkább használd az értelmező 'activate' szkriptjét (vagy írd be közvetlenül az elérési utat)!Figyelem! Nagy érték ronthatja a teljesítményt!Figyelem! Indítsd újra a Thonny-t, ha megváltoztatod ezeket a beállításokat!Figyelem! Egyes stíluselemek csak a Thonny újraindítása után változnak meg!Figyelem! Lehet, hogy van egy másik, az aktuális Thonny-val kompatibilis verzió. Klikkelj a '...' gombra a telepítendő verzió kiválasztásához.Figyelem! Indítsd újra a Thonny-t bővítmények telepítése / frissítése / eltávolítása után.NévÚjÚj könyvtárAz új csomagok is ebbe a könyvtárba lesznek telepítve. Egyéb könyvtárakat más módon kell kezelni.Az új csomagok telepítési helye:Következő objektumNem elérhetőNincs kapcsolatNem támogatottJegyzetekNincs semmi kiválasztvaOKObjektumvizsgálóAz Asszisztens automatikusan nyíljon meg, ha kódhibákra akar figyelmeztetniAz Asszisztens automatikusan nyíljon meg a program összeomlásakorA Thonny adatkönyvtárának megnyitása...A Thonny programkönyvtárának megnyitása...Verem nézet automatikus nyitása és zárásaNyisd meg a értékeket az ObjektumvizsgálóbanMegnyitás innen: %sMegnyitás Thonny-valMegnyitás a Thonny szerkesztőjébenMegnyitás a rendszerben beállított programmalMegnyitás a rendszer fájlkezelőjébenÚjrajátszás megnyitása...Terminál megnyitása...Megnyitás...Verem nézet nyitása az első függvényhívásnál és bezárása az utolsónálBeállítások...KiVázlatÁtFelülírjam?Téma felülírása: '%s'CsomagA '{}' csomagra szükség van más csomagok telepítéséhez ill. eltávolításához.Nincs csomagkezelő ehhez az értelmezőhözCsomagok könyvtáraJelszóBeillesztésElérési útMyPy ellenőrzések végrehajtásaA kiválasztott Pylint ellenőrzések végrehajtásaKérlek ellenőrizd a helyesírást!Kérlek várjGrafikonA Grafikon megjeleníti a parancsértelmezőbe írt számok sorozatát.PortPort vagy WebREPLPreferált hibakeresőAktiváld a Python REPL-t miután lefutott a programElőnézetElőző objektumNyomtatás...Program argumentumokProgram argumentumok:Program faTulajdonságokPyPI oldalPygame Zero módPython programPython értelmezőkKilépésTényleg eltávolítod?Legutóbbi fájlokJavasolt maximális sorhossz (0-ra állítva eltűnik a határoló vonal)IsmétlésFrissítésNormál módTávoli Python 3 (SSH)A legutóbb használt összes fájl megnyitásaCsereÖsszes cseréjeTAB-ok helyettesítése szóközökkelCseréld erre:Csere + KeresésProbléma bejelentéseElőfeltételekElőfeltételek:FolytatásFuttatásFuttatás & HibakeresésFuttatás / FolytatásAktuális szkript futtatásaAktuális szkript futtatása terminálbanFuttatás kurzorigAktuális szkript futtatása terminálbanMentésÖsszes fájl mentéseMentés másként...Másolat mentése...Jelszó mentéseMentés ide: %sMentésMentés ide: %sHatókörKeresés a PyPI-onKeresési eredményekKeresésA részleteket ld. a súgóban.Összes kiválasztásaÖsszes kijelöléseVálassz egyet és próbáld újra!Válassz egy üres könyvtárat az új virtuális környezet számáraVálaszd ki ezt, ha a fájlkezelő ablakok a főablak mögött jelennek megA kiválasztott könyvtár nem üres. Válassz másikat.EOF küldése / "Soft" újraindításParancsértelmezőGrafikon megjelenítéseFüggvényhívások (keretek) mutatása külön ablakbanRejtett fájlok megjelenítéseSorszámok megjelenítéseMéretMéret (bájtok)ForráskódRövidített szöveg (%d karakter)VeremElőször válaszd ki a csomagot a bal oldalon.IndításVisszalépésBelépésKilépésÁtlépésLeállításFeldolgozó leállítása/újraindításaTárhely infóTárhelyTárhely ezen a lemezen vagy fájlrendszerbenÖsszefoglalásVáltás Normál módbaSzintaxis témaCéleszköz helyeCéleszköz típusaCél:TerminálTerminálemulációA válaszA fenti ennek a számnak csupán közelítő értéke. A pontos tárolt érték %s, ami körülbelül %sA megadott szöveg nem található!Téma & BetűtípusEz a mező jegyzetelésre való, pl. hasznos kódrészleteket tárolhatsz benne. Minden automatikusan mentődik, és betöltődik, amikor legközelebb megnyitod a Thonnyt. Nyugodtan töröld ezt a szöveget, hogy helyet biztosíts a saját jegyzeteidnek.Ez a számítógépEz az ablak a Thonny bővítmények és függőségeik kezelésére szolgál. Ha a saját programjaidhoz szeretnél csomagokat telepíteni: Eszközök → Csomagok kezelése...Ez az ablak felsorolja az összes elérhető csomagot, de csak innen enged frissíteni és eltávolítani csomagokat:Ez az ablak az alábbi könyvtárak felsőszintű moduljait mutatja:Ez egy megjegyzésEz a csomag eltérő Thonny verziót igényel:Ez a program SEMMIRE SEM VÁLLAL GARANCIÁT! Ingyenes szoftver, amely bizonyos feltételek betartása mellett szabadon terjeszthető, a részleteket ld. itt: https://opensource.org/licenses/MITThonny beállítasaiThonny bővítményekElőfeltételek nélküli Thonny bővítményMegjegyzés be/kiEszközökAutomatikus portkeresésUI módUI skálafaktorUI témaNe legyen kijelölve, ha hagyományosabb élményre vágysz.Megjegyzés kiVisszavonásEltávolításEltávolítás: '%s'Nem megfelelő előfeltételekFelFrissítésFüggőségek frissítéseFrissítés vagy eltávolításFrissítés: '%s'Feltöltés ide: %sA "Stop" állítsa le a hibakereséstTk fájlkezelő ablak legyen Zenity helyettÉrtékÉrték IDVáltozókVerziótörténetTelepítendő verzióNézetMi történjen egy %s fájllal, ha duplán ráklikkelsz a Thonny fájlkezelőjében?Az aktuális értelmezővel itt csak böngészni lehet a csomagokat. Használd az Eszközök → Rendszer parancsértelmező megnyitása... menüt telepítéshez, frissítéshez és eltávolításhoz.Hosszú sorok tördelése (lassú lehet)Válassz ki egy fájlt!Állítsd le a programod, mielőtt elindítod a csomagkezelőt.Nagyításminden fájlblablabájtszabad tárhelyidekeresd meg az eszközöd nevét ("USB Serial" vagy "UART")nincs abszolút lib könyvtár a sys.path-bankérlek várjANSI-színek és stílusok támogatásacsomagfájl (*.whl, *.tar.gz, *.zip) megkereséséhez és a csomag telepítéséhez.előfeltételek fájl (requirements.txt) megkereséséhez és a benne felsorolt csomagok telepítéséhez.teljes tárhelylezaratlan_sztringhasznált tárhelyfelhasználói csomagokvirtuális környezet././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/hu_HU/LC_MESSAGES/thonny.po0000644000076600000240000014713614417536743022671 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: hu\n" #: thonny/workbench.py:361 msgid "File" msgstr "Fájl" #: thonny/workbench.py:362 msgid "Edit" msgstr "Szerkesztés" #: thonny/workbench.py:363 msgid "View" msgstr "Nézet" #: thonny/running.py:116 thonny/workbench.py:364 msgid "Run" msgstr "Futtatás" #: thonny/workbench.py:365 msgid "Tools" msgstr "Eszközök" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:366 msgid "Help" msgstr "Súgó" #: thonny/workbench.py:583 msgid "Exit" msgstr "Kilépés" #: thonny/workbench.py:610 msgid "Decrease font size" msgstr "Betűméret csökkentése" #: thonny/workbench.py:622 msgid "Focus editor" msgstr "Kurzort a kódszerkesztőbe" #: thonny/workbench.py:631 msgid "Focus shell" msgstr "Kurzort a parancsértelmezőbe" #: thonny/workbench.py:642 msgid "Maximize view" msgstr "Nézet maximalizálása" #: thonny/workbench.py:654 msgid "Full screen" msgstr "Teljes képernyős nézet" #: thonny/workbench.py:1457 msgid "Program arguments" msgstr "Program argumentumok" #: thonny/plugins/about.py:21 thonny/plugins/about.py:140 msgid "About Thonny" msgstr "A Thonny névjegye" #: thonny/plugins/about.py:66 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Készítette: Tartu-i Egyetem (Észtország), a nyílt forráskód közösség, a Raspberry Pi Alapítvány és a Cybernetica AS segítségével" #: thonny/plugins/about.py:86 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Ez a program SEMMIRE SEM VÁLLAL GARANCIÁT! Ingyenes szoftver, amely bizonyos feltételek betartása mellett szabadon terjeszthető, a részleteket ld. itt: https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:129 msgid "Version history" msgstr "Verziótörténet" #: thonny/plugins/about.py:136 msgid "Report problems" msgstr "Probléma bejelentése" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Az Asszisztens automatikusan nyíljon meg a program összeomlásakor" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Az Asszisztens automatikusan nyíljon meg, ha kódhibákra akar figyelmeztetni" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "A kiválasztott Pylint ellenőrzések végrehajtása" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy ellenőrzések végrehajtása" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Letiltott ellenőrzések (soronként egy azonosító)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Asszisztens" #: thonny/plugins/autocomplete.py:512 msgid "Auto-complete" msgstr "Automatikus kódkiegészítés" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Értelmező" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "A Birdseye névjegye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "A Birdseye egy Python hibakereső, melyet külön kell telepíteni.\n" "\n" "Meg szeretnéd nyitni a súgó oldalt további információkért?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Hibakeresés az aktuális szkriptben (Birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Megjegyzés be/ki" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Megjegyzés be" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Megjegyzés ki" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Visszavonás" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Ismétlés" #: thonny/base_file_browser.py:721 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2294 msgid "Cut" msgstr "Kivágás" #: thonny/base_file_browser.py:722 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2295 msgid "Copy" msgstr "Másolás" #: thonny/base_file_browser.py:724 thonny/base_file_browser.py:730 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2296 msgid "Paste" msgstr "Beillesztés" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Összes kijelölése" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Futtatás kurzorig" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "Nem lehet még bezárni" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "A \"Stop\" állítsa le a hibakeresést" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Felhasználói ablakok dokkolása" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Egyező nevek kiemelése" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Lokális változók kiemelése" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Zárójelpárok kiemelése" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Szintaktikai elemek kiemelése" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Aktuális sor kiemelése (újra kell indítani a kódszerkesztőt)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Sorszámok megjelenítése" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Javasolt maximális sorhossz (0-ra állítva eltűnik a határoló vonal)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Kódszerkesztő" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Használati naplók exportálása..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Események" #: thonny/plugins/files.py:606 msgid "Files" msgstr "Fájlok" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:430 msgid "Find & Replace" msgstr "Keresés & Csere" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Keresd ezt:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Cseréld erre:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Kis-nagybetű érzékeny" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Fel" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Le" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Keresés" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Csere" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Csere + Keresés" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Összes cseréje" #: thonny/plugins/find_replace.py:249 msgid "Enter string to be replaced." msgstr "Add meg a cserélendő szöveget." #: thonny/plugins/find_replace.py:333 msgid "The specified text was not found!" msgstr "A megadott szöveg nem található!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Egyszerre csak egy Thonny példány futhat" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "A legutóbb használt összes fájl megnyitása" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Értesítési hang letiltása" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Betűméretezési mód" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Kupac mód bekapcsolva. Zárd be a Kupac nézetet, ha ki akarod kapcsolni." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Kupac" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Nyelv" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Ez a mező jegyzetelésre való, pl. hasznos kódrészleteket tárolhatsz benne.\n" "\n" "Minden automatikusan mentődik, és betöltődik, amikor legközelebb megnyitod a Thonnyt.\n" "\n" "Nyugodtan töröld ezt a szöveget, hogy helyet biztosíts a saját jegyzeteidnek." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Jegyzetek" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Előző objektum" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Következő objektum" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Objektumvizsgáló" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Vázlat" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero mód" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Eltávolítás" #: thonny/editors.py:667 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1871 thonny/workdlg.py:162 msgid "Close" msgstr "Bezárás" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klikkelj " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "ide" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Frissítés" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:348 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Telepítés" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Nem található a csomag a PyPI-on." #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Legfrissebb stabil verzió" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Legfrissebb verzió" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Összefoglalás" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Szerző" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Honlap" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Hibakövetés" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentáció" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPI oldal" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Előfeltételek" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Tényleg eltávolítod?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Biztos vagy benne, hogy el akarod távolítani?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Vissza az\n" "aktuális keretre" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Változók" #: thonny/base_file_browser.py:1558 msgid "This computer" msgstr "Ez a számítógép" #: thonny/base_file_browser.py:641 msgid "Refresh" msgstr "Frissítés" #: thonny/base_file_browser.py:650 msgid "Focus into" msgstr "Kurzor ide" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Hiba" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 msgid "You need to select a file!" msgstr "Válassz ki egy fájlt!" #: thonny/base_file_browser.py:1409 msgid "Overwrite?" msgstr "Felülírjam?" #: thonny/base_file_browser.py:1409 msgid "Do you want to overwrite '%s' ?" msgstr "Felül akarod írni ezt: '%s'?" #: thonny/editors.py:632 thonny/editors.py:634 msgid "New" msgstr "Új" #: thonny/editors.py:645 msgid "Open..." msgstr "Megnyitás..." #: thonny/editors.py:647 msgid "Load" msgstr "Betöltés" #: thonny/editors.py:656 msgid "Recent files" msgstr "Legutóbbi fájlok" #: thonny/editors.py:678 thonny/ui_utils.py:493 msgid "Close all" msgstr "Összes bezárása" #: thonny/editors.py:688 thonny/editors.py:690 msgid "Save" msgstr "Mentés" #: thonny/editors.py:713 msgid "Save as..." msgstr "Mentés másként..." #: thonny/editors.py:724 msgid "Save copy..." msgstr "Másolat mentése..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny beállítasai" #: thonny/running.py:115 msgid "Run current script" msgstr "Aktuális szkript futtatása" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Aktuális szkript futtatása terminálban" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Feldolgozó leállítása/újraindítása" #: thonny/running.py:160 msgid "Stop" msgstr "Leállítás" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Végrehajtás megszakítása" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "EOF küldése / \"Soft\" újraindítás" #: thonny/running.py:195 msgid "Disconnect" msgstr "Lekapcsolódás" #: thonny/plugins/cpython_frontend/cp_front.py:268 msgid "Python interpreters" msgstr "Python értelmezők" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:269 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "minden fájl" #: thonny/plugins/cpython_frontend/cp_front.py:297 msgid "Select empty directory for new virtual environment" msgstr "Válassz egy üres könyvtárat az új virtuális környezet számára" #: thonny/plugins/cpython_frontend/cp_front.py:304 msgid "Bad directory" msgstr "Rossz könyvtár" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "A kiválasztott könyvtár nem üres.\n" "Válassz másikat." #: thonny/plugins/cpython_frontend/cp_front.py:322 msgid "Creating virtual environment" msgstr "Virtuális környezet létrehozása" #: thonny/shell.py:100 msgid "Clear shell" msgstr "Parancsértelmező törlése" #: thonny/shell.py:174 msgid "Plotter" msgstr "Grafikon" #: thonny/shell.py:306 msgid "Clear" msgstr "Törlés" #: thonny/shell.py:319 msgid "Show Plotter" msgstr "Grafikon megjelenítése" #: thonny/shell.py:1648 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "A jobb teljesítmény érdekében a parancsértelmező rövidítve mutatja a nagyon hosszú sorokat (ld. Eszközök → Beállítások → Parancsértelmező).\n" "Itt megnézheted a teljes szöveget." #: thonny/shell.py:1659 msgid "Wrap text (may be slow)" msgstr "Hosszú sorok tördelése (lassú lehet)" #: thonny/ui_utils.py:1866 msgid "Copy to clipboard" msgstr "Vágólapra másolás" #: thonny/shell.py:1701 msgid "Squeezed text (%d characters)" msgstr "Rövidített szöveg (%d karakter)" #: thonny/shell.py:1871 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "A Grafikon megjeleníti a parancsértelmezőbe írt számok sorozatát." #: thonny/shell.py:1873 msgid "See Help for details." msgstr "A részleteket ld. a súgóban." #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Többi bezárása" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Másolás" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Másolás:\n" " %s\n" "ide:\n" " %s" #: thonny/base_file_browser.py:1364 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1818 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Mégsem" #: thonny/base_file_browser.py:1355 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:100 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1815 thonny/workdlg.py:206 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2300 msgid "Select All" msgstr "Összes kiválasztása" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:155 #: thonny/workbench.py:162 msgid "Shell" msgstr "Parancsértelmező" #: thonny/workbench.py:593 msgid "Options..." msgstr "Beállítások..." #: thonny/workbench.py:600 msgid "Increase font size" msgstr "Betűméret növelése" #: thonny/workbench.py:665 msgid "Change font size" msgstr "Betűméret megváltoztatása" #: thonny/workbench.py:666 msgid "Zoom" msgstr "Nagyítás" #: thonny/workbench.py:675 msgid "Exit Thonny" msgstr "Kilépés a Thonny-ból" #: thonny/workbench.py:678 msgid "Quit" msgstr "Kilépés" #: thonny/workbench.py:1236 thonny/workbench.py:1244 msgid "Overwriting theme '%s'" msgstr "Téma felülírása: '%s'" #: thonny/workbench.py:1428 msgid "Program arguments:" msgstr "Program argumentumok:" #: thonny/workbench.py:1482 msgid "Regular mode" msgstr "Normál mód" #: thonny/workbench.py:1483 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "A beállítások megváltoztak. Indítsd újra a Thonny-t a Normál módhoz.\n" "\n" "(Ha meggondolnád magad: Eszközök → Beállítások → Általános)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Program fa" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Folytatás" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Futtatás / Folytatás" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Hibakeresés az aktuális szkriptben" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Hibakeresés" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Hibakeresés az aktuális szkriptben (szebb)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Hibakeresés az aktuális szkriptben (gyorsabb)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Átlépés" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Át" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Belépés" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Be" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Kilépés" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Ki" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Visszalépés" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Vissza" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Verem" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Kivétel" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Használati események naplózása" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Hibakereső mód (részletesebb naplózással jár)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UI mód" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI skálafaktor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "Figyelem! Indítsd újra a Thonny-t, ha megváltoztatod ezeket a beállításokat!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Általános" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "TELEPÍTÉS" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Csomagok böngészése" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Az aktuális értelmezővel itt csak böngészni lehet a csomagokat. Használd az Eszközök → Rendszer parancsértelmező megnyitása... menüt telepítéshez, frissítéshez és eltávolításhoz." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Csomagok könyvtára" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Telepítés PyPI-ról" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Ismeretlen forrású csomagokat érdemes a Python Package Indexen (PyPI-on) keresni. Ehhez írd be a csomag nevét a keresőmezőbe és nyomd le az ENTER-t." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "előfeltételek fájl (requirements.txt) megkereséséhez és a benne felsorolt csomagok telepítéséhez." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Klikkelj" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "csomagfájl (*.whl, *.tar.gz, *.zip) megkereséséhez és a csomag telepítéséhez." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Frissítés vagy eltávolítás" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Először válaszd ki a csomagot a bal oldalon." #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Cél:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "virtuális környezet" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "felhasználói csomagok" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Ez az ablak felsorolja az összes elérhető csomagot, de csak innen enged frissíteni és eltávolítani csomagokat:" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Az új csomagok is ebbe a könyvtárba lesznek telepítve. Egyéb könyvtárakat más módon kell kezelni." #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Telepített verzió:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Telepítve ide:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Kérlek ellenőrizd a helyesírást!" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Nem található csomaginformáció a PyPI-on." #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Hibakód:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "A csomagnév nem található a listában:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "A '{}' csomagra szükség van más csomagok telepítéséhez ill. eltávolításához." #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Csomag" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Csomagok kezelése ehhez: %s" #: thonny/editors.py:571 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Megerősítés" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Úgy tűnik, egy Thonny-val kapcsolatos csomagot telepítesz.\n" "Ha egy Thonny bővítményt szeretnél telepíteni, akkor használd az Eszközök → Bővítmények kezelése... menüt.\n" "\n" "Biztosan fel szeretnéd telepíteni ezt a feldolgozó számára: %s?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Figyelem! Lehet, hogy van egy másik, az aktuális Thonny-val kompatibilis verzió. Klikkelj a '...' gombra a telepítendő verzió kiválasztásához." #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Előfeltételek nélküli Thonny bővítmény" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Nem megfelelő előfeltételek" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Ez a csomag eltérő Thonny verziót igényel:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Ha valóban ezt szeretnéd, akkor telepítsd parancssorból." #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Figyelem! Indítsd újra a Thonny-t bővítmények telepítése / frissítése / eltávolítása után." #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonny bővítmények" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Haladó telepítés / frissítés / visszaléptetés" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Kívánt verzió" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Függőségek frissítése" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Előfeltételek:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Hiba:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Csomagok kezelése..." #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Bővítmények kezelése..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Újrajátszás megnyitása..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Munkakönyvtár módosítása a szkript könyvtárára Futtatás / Hibakeresés esetén" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Függvényhívások (keretek) mutatása külön ablakban" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Ne legyen kijelölve, ha hagyományosabb élményre vágysz." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Verem nézet automatikus nyitása és zárása" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Verem nézet nyitása az első függvényhívásnál és bezárása az utolsónál" #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Könyvtárakba lépés engedélyezése (fő szkriptkönyvtáron kívüliekbe)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Lassíthatja a hibakeresést." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Preferált hibakereső" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(a Hibakeresés gombra klikkeléskor használjuk)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(indítsd újra a Thonny-t ha megváltoztattad)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Futtatás & Hibakeresés" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminálemuláció" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "ANSI-színek és stílusok támogatása" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Megtartandó sorok maximális száma" #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Figyelem! Nagy érték ronthatja a teljesítményt!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximális sorhossz, ami még nem lesz rövidítve" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Aktuális szkript futtatása terminálban" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Aktiváld a Python REPL-t miután lefutott a program" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Hagyd nyitva a terminált a Python folyamat kilépése után" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Figyelem! A parancsértelmező beállításainál engedélyezned kell az automatikus bezárást (Beállítások → Parancsértelmező)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminál" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "UI téma" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Szintaxis téma" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Kódszerkesztő betűtípus" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "IO betűtípus" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Előnézet" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Ez egy megjegyzés" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "A válasz" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "lezaratlan_sztring" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "blabla" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Figyelem! Egyes stíluselemek csak a Thonny újraindítása után változnak meg!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Írj be egy egész számot" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Téma & Betűtípus" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "A Thonny programkönyvtárának megnyitása..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "A Thonny adatkönyvtárának megnyitása..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Kezdőlap" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Súgó tartalom" #: thonny/plugins/micropython/mp_front.py:300 msgid "CircuitPython device" msgstr "CircuitPython eszköz" #: thonny/plugins/micropython/mp_front.py:304 msgid "MicroPython device" msgstr "MicroPython eszköz" #: thonny/plugins/micropython/mp_front.py:541 msgid "Connect your device to the computer and select corresponding port below" msgstr "Csatlakoztasd az eszközödet a számítógéphez és válaszd ki a megfelelő portot:" #: thonny/plugins/micropython/mp_front.py:544 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "keresd meg az eszközöd nevét (\"USB Serial\" vagy \"UART\")" #: thonny/plugins/micropython/mp_front.py:546 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Ha nem találod, akkor lehet, hogy először egy megfelelő USB meghajtót kell telepítened." #: thonny/plugins/micropython/mp_front.py:439 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:449 msgid "Try to detect port automatically" msgstr "Automatikus portkeresés" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (általános)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Nyomtatás..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Terminál megnyitása..." #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Részletek" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Telepítés előfeltétel fájlból" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Telepítés lokális fájlból" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Ez az ablak a Thonny bővítmények és függőségeik kezelésére szolgál.\n" "Ha a saját programjaidhoz szeretnél csomagokat telepíteni: Eszközök → Csomagok kezelése..." #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (általános)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Behúzás növelése" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Behúzás csökkentése" #: thonny/workbench.py:1471 msgid "Switch to\n" "regular\n" "mode" msgstr "Váltás\n" "Normál\n" "módba" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Ellenőrizd, hogy a MicroPython telepítve van a micro:bit eszközödre." #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Ne feledd, hogy a main.py csak beágyazott beágyazott fő szkript nélkül működik." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "kérlek várj" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Nem található a '%s' lemez. Meg szeretnéd keresni?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Több '%s' lemez is található. Szeretnél egyet választani?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Nem található megfelelő lemez" #: thonny/base_file_browser.py:287 msgid "%d items" msgstr "%d tétel" #: thonny/base_file_browser.py:736 msgid "Move to Trash" msgstr "Kukába helyezés" #: thonny/base_file_browser.py:739 msgid "Delete" msgstr "Törlés" #: thonny/base_file_browser.py:718 thonny/base_file_browser.py:869 msgid "New directory" msgstr "Új könyvtár" #: thonny/base_file_browser.py:742 msgid "Properties" msgstr "Tulajdonságok" #: thonny/base_file_browser.py:744 msgid "Storage space" msgstr "Tárhely" #: thonny/base_file_browser.py:754 msgid "Path" msgstr "Elérési út" #: thonny/base_file_browser.py:756 msgid "Directory properties" msgstr "Könyvtár tulajdonságai" #: thonny/base_file_browser.py:758 msgid "File properties" msgstr "Fájl tulajdonságai" #: thonny/base_file_browser.py:760 msgid "bytes" msgstr "bájt" #: thonny/base_file_browser.py:763 msgid "Size" msgstr "Méret" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:774 msgid "Modified" msgstr "Módosítva" #: thonny/base_file_browser.py:833 msgid "Deleting %s" msgstr "Törlés: %s" #: thonny/editors.py:253 msgid "Loading" msgstr "Betöltés" #: thonny/editors.py:382 msgid "Saving" msgstr "Mentés" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Feltöltés ide: %s" #: thonny/plugins/files.py:417 msgid "Downloading %s to %s" msgstr "Letöltés: %s ide: %s" #: thonny/plugins/files.py:323 msgid "Download to %s" msgstr "Letöltés ide: %s" #: thonny/base_file_browser.py:643 msgid "Open in system file manager" msgstr "Megnyitás a rendszer fájlkezelőjében" #: thonny/base_file_browser.py:671 msgid "Hide hidden files" msgstr "Rejtett fájlok elrejtése" #: thonny/base_file_browser.py:671 msgid "Show hidden files" msgstr "Rejtett fájlok megjelenítése" #: thonny/base_file_browser.py:654 msgid "Open in Thonny" msgstr "Megnyitás Thonny-val" #: thonny/base_file_browser.py:685 msgid "Open in system default app" msgstr "Megnyitás a rendszerben beállított programmal" #: thonny/base_file_browser.py:666 thonny/base_file_browser.py:693 msgid "Configure %s files" msgstr "%s fájl beállítása" #: thonny/base_file_browser.py:694 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Mi történjen egy %s fájllal, ha duplán ráklikkelsz a Thonny fájlkezelőjében?" #: thonny/base_file_browser.py:1240 thonny/editors.py:953 thonny/editors.py:955 msgid "Deleting" msgstr "Törlés" #: thonny/base_file_browser.py:1247 msgid "Creating directory" msgstr "Könyvtár készítése" #: thonny/editors.py:251 msgid "Loading %s" msgstr "Betöltés: %s" #: thonny/editors.py:377 msgid "Saving to %s" msgstr "Mentés ide: %s" #: thonny/editors.py:702 thonny/editors.py:704 msgid "Save All files" msgstr "Összes fájl mentése" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:869 msgid "Configure interpreter..." msgstr "Értelmező beállítása..." #: thonny/workbench.py:1581 msgid "Device" msgstr "Eszköz" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "Leállítás" #: thonny/workdlg.py:220 msgid "Starting" msgstr "Indítás" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "Azonosítás" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Írd be a privát kulcs jelszavát ehhez:\n" "{}" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Írd be a jelszót ehhez:\n" "{}" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "A fenti ennek a számnak csupán közelítő értéke. A pontos tárolt érték %s, ami körülbelül %s" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Keresési eredmények" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Keresés" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Telepítés: '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "Frissítés: '%s'" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Eltávolítás: '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "Telepítés" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "Nincs csomagkezelő ehhez az értelmezőhöz" #: thonny/base_file_browser.py:1191 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "Nem támogatott" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "Nem elérhető" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "Állítsd le a programod, mielőtt elindítod a csomagkezelőt." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Nyisd meg a értékeket az Objektumvizsgálóban" #: thonny/plugins/cpython_frontend/cp_front.py:208 msgid "Python executable" msgstr "Python program" #: thonny/plugins/cpython_frontend/cp_front.py:231 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Figyelem! A fájlválasztó gomb nem mindig működik amikor egy virtuális környezetből választasz egy programfájlt. Ilyenkor inkább használd az értelmező 'activate' szkriptjét (vagy írd be közvetlenül az elérési utat)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Távoli Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:310 msgid "Not connected" msgstr "Nincs kapcsolat" #: thonny/plugins/micropython/mp_front.py:515 msgid "Advanced options" msgstr "Haladó beállítások" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Firmware telepítése vagy frissítése" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (helyi)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Hatókör" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Ez az ablak az alábbi könyvtárak felsőszintű moduljait mutatja:" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Az új csomagok telepítési helye:" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "nincs abszolút lib könyvtár a sys.path-ban" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Telepítendő verzió" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "Céleszköz helye" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "Céleszköz típusa" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Kérlek várj" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "Keresés a PyPI-on" #: thonny/base_file_browser.py:686 msgid "Open in Thonny's text editor" msgstr "Megnyitás a Thonny szerkesztőjében" #: thonny/base_file_browser.py:339 msgid "Storage space on this drive or filesystem" msgstr "Tárhely ezen a lemezen vagy fájlrendszerben" #: thonny/base_file_browser.py:340 msgid "total space" msgstr "teljes tárhely" #: thonny/base_file_browser.py:342 msgid "used space" msgstr "használt tárhely" #: thonny/base_file_browser.py:343 msgid "free space" msgstr "szabad tárhely" #: thonny/base_file_browser.py:350 msgid "Storage info" msgstr "Tárhely infó" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "TAB-ok helyettesítése szóközökkel" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "TAB-ok kiemelése" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Behúzás TAB-bal (nem javasolt Pythonban)" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Név" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Méret (bájtok)" #: thonny/base_file_browser.py:870 msgid "Enter name for new directory under\n" "%s" msgstr "Írd be az új alkönyvtár nevét. Ide kerül:\n" "%s" #: thonny/base_file_browser.py:893 msgid "Nothing selected" msgstr "Nincs semmi kiválasztva" #: thonny/base_file_browser.py:893 msgid "Select an item and try again!" msgstr "Válassz egyet és próbáld újra!" #: thonny/base_file_browser.py:1311 msgid "Open from %s" msgstr "Megnyitás innen: %s" #: thonny/base_file_browser.py:1314 msgid "Save to %s" msgstr "Mentés ide: %s" #: thonny/base_file_browser.py:1333 msgid "File name:" msgstr "Fájlnév:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "Érték ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Érték" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Jelszó mentése" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Függvényhívás: %s" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Lokális változók" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Függvény" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "Hely" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Ha egy parancs kivételt vált ki, ez a nézet mutatja a hívási vermet." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Adat" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Jellemzők" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "Index" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "Kulcs ID" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Kulcs" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Vissza ide:\n" "%s" #: thonny/plugins/micropython/mp_front.py:439 msgid "Port or WebREPL" msgstr "Port vagy WebREPL" #: thonny/plugins/micropython/mp_front.py:583 msgid "Password" msgstr "Jelszó" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Forráskód" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Tk fájlkezelő ablak legyen Zenity helyett" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Válaszd ki ezt, ha a fájlkezelő ablakok a főablak mögött jelennek meg" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Környezeti változók (soronként egy KULCS=ÉRTÉK legyen)" #: thonny/base_file_browser.py:715 msgid "New file" msgstr "" #: thonny/base_file_browser.py:733 msgid "Rename" msgstr "" #: thonny/base_file_browser.py:919 msgid "Rename '%s'" msgstr "" #: thonny/base_file_browser.py:919 msgid "Enter new name" msgstr "" #: thonny/base_file_browser.py:1007 msgid "Paste failed" msgstr "" #: thonny/base_file_browser.py:1007 msgid "There are conflicting folders" msgstr "" #: thonny/base_file_browser.py:1129 msgid "File already exists" msgstr "" #: thonny/base_file_browser.py:1194 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "" #: thonny/editors.py:35 msgid "Python files" msgstr "" #: thonny/editors.py:119 thonny/editors.py:182 msgid "" msgstr "" #: thonny/editors.py:146 msgid "File is gone" msgstr "" #: thonny/editors.py:149 msgid "Do you want to also close the editor?" msgstr "" #: thonny/editors.py:165 msgid "External modification" msgstr "" #: thonny/editors.py:168 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "" #: thonny/editors.py:572 msgid "Python files usually have .py extension." msgstr "" #: thonny/editors.py:574 msgid "Did you mean '%s'?" msgstr "" #: thonny/editors.py:733 msgid "Move / rename..." msgstr "" #: thonny/editors.py:742 msgid "Go to line..." msgstr "" #: thonny/editors.py:977 msgid "Line number" msgstr "" #: thonny/editors.py:1123 msgid "Do you want to save files before closing?" msgstr "" #: thonny/editors.py:1125 msgid "Do you want to save file before closing?" msgstr "" #: thonny/editors.py:1128 msgid "Save On Close" msgstr "" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "" #: thonny/workbench.py:686 thonny/workbench.py:786 msgid "Support Ukraine" msgstr "" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:170 msgid "Thonny's Python" msgstr "" #: thonny/plugins/micropython/mp_front.py:487 msgid "Interrupt working program on connect" msgstr "" #: thonny/plugins/micropython/mp_front.py:494 msgid "Synchronize device's real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:500 msgid "Use local time in real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:506 msgid "Restart interpreter before running a script" msgstr "" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "" #: thonny/base_file_browser.py:844 msgid "Moving to Trash" msgstr "" #: thonny/base_file_browser.py:845 msgid "Move %s to Trash?" msgstr "" #: thonny/base_file_browser.py:852 msgid "Moving %s to Trash" msgstr "" #: thonny/base_file_browser.py:659 msgid "Open in default external app" msgstr "" #: thonny/base_file_browser.py:1192 msgid "Opening remote files in external app is not supported." msgstr "" #: thonny/base_file_browser.py:1199 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "" #: thonny/editors.py:147 msgid "Looks like '%s' was deleted or moved." msgstr "" #: thonny/editors.py:166 msgid "Looks like '%s' was modified outside of the editor." msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:229 msgid "NB! Thonny only supports Python %s and later" msgstr "" #: thonny/editors.py:977 msgid "Go to line" msgstr "" #: thonny/workbench.py:689 msgid "Support" msgstr "" #: thonny/editors.py:386 thonny/editors.py:401 msgid "Could not save" msgstr "" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "" #: thonny/workbench.py:859 msgid "Install MicroPython" msgstr "" #: thonny/workbench.py:863 msgid "Install CircuitPython" msgstr "" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "" #: thonny/plugins/todo_view.py:42 msgid "Line" msgstr "" #: thonny/plugins/todo_view.py:43 msgid "Info" msgstr "" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:530 msgid "Install or update %s" msgstr "" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:239 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.937795 thonny-4.1.7/thonny/locale/hy_AM/0000755000076600000240000000000014730055627017171 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1077833 thonny-4.1.7/thonny/locale/hy_AM/LC_MESSAGES/0000755000076600000240000000000014730055627020756 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/hy_AM/LC_MESSAGES/thonny.mo0000644000076600000240000012123214670256721022634 0ustar00aivarannamaastaffL |}]$) *3^ m&z+-! D.7s&      1x?  &5< P[j;{    , GD I [ c <x % * !%!8!U!Y!^!d!y!!!3!""1"8"H" Q"]"m"u"|""!" """ #B#\#b#g#v### ##%##/#'$.B$q$ w$$$ $$ $$$$ $$$$$ %"%(% 1% >% I%U%g%,&/2&=b& &&&&&0&' ''6,'c'}'''''''''L(FM((C\)))7)***!*9*X* s** ** ***3*+ ++&+/+E+T+Y+ a+l+|+ +++~,z1-;---. %.13. e......../ /"/n2//,v000<01-1U1c)222 2n2!3 53 A3 O3 ]3k3q333?3C3454'S4){4 444445&5;5TC5 5555 555H5O'65w66666667 $707:87s7x77&777777 8 8 8*8;8M8a8f8 x8B888 88 8&9)9 19=9 V9 d9q99 999 9 999 9"9: : /: :: G: U:`: g:t:z:: :: : ::2:/;8O;;:;; ;< <0!<R<d<v< {< <<<-<< < <= === 0= ==)K=u=}= ====== =>=n=>0>!> > ? ? @b@@ATA/fAA@PBBB"BBB B CC#C0,C ]CgC lCvCCCCCCC CC2D%7D]DcD lDvDDDLDDD5E EEEECF#YF}F F FF FF1F%F G%GV7GIG GG GGH&HIImJeK=jKKKSK)1LR[LTL>MBMYM<"N_NnNNNNN N1N'O6OP+PIP,cPMPJP)Q':QbQ&uQQ|Q"5RXR oR|R R R RRR+R!S&0T(WTTyT U+UJU!]UrU4UI'V7qVV4V VWW4/WIdWJW?W9X#X*X Y!Y;YLYeYYY+Y,YAY@Z5OZ.ZZ~ZR[c[!j[)[[[#[([9#\@]\S\3\D&]k]t] ]"]]]])]<^U^^^)x^ ^ ^"^ ^__'_?_'V_0~_?_V`VFaa"b>b)Obybbhbb3c*Ccjnc8c4d!Gd.id$d ddddde|e5fIg!g&ggh zhhh,h4h5iLi%diiii#iilibjfj%mj j,jj jjk'kAk[kajk_k',mTnX'o8o.o4opq9pHpFp;q Mqnqqq q!q!q+q%rWrt tetktguk\vvww x xx%x,x y'y=yQyiyzyyyy]Az<z6zV{Vj{{{?{;0|?l|0|7| } }} }~~~&2~ Y~nd~q~ZE,7EP" qƀ8=+MKyŁց%)*Tj Ă %҃ۃ *IH<ń#7[q,)ޅ0G9? ݆$ ",OoهNWq7VÈe!f)@7ъ {9.-/)K u>Ό1/:-jh*0[9s* ؎#p.TP*АGJ,&N 4xB!ٗ915gGz ˜ И J1Hz/'0(Y!s,~š_A )ӛ%#,09j+|,,՞m<pŸܟ Q7i"=Ġ|q#)*M!x%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: hy Language-Team: hy Plural-Forms: nplurals=1; plural=0; MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d տարրեր(Այս դեպքում Թոնիի back-end ֊ը օգտագործում է նույն interpreter֊ը, այնպես որ երկու երկխոսությունն էլ կառավարում են նույն փաթեթները):(վերագործարկեք Թոնիին այս փոփոխությունները կատարելուց հետ)(օգտագործվում է, երբ սեղմվում է Debug գործիքագոտու կոճակը)Հատուկ վիրտուալ միջավայր (հնացած)Թռչնի աչքի մասինThonny֊ի մասինԸնդլայնված տեղադրում / վերազինում / նվազեցումԸնդլայնված ընտրանքներԹույլատրել վահանակում կոդի ավարտը Tab կոճակովԹույլատրել խմբագրիչում կոդի ավարտը Tab կոճակովԹույլատրել միայն մեկ Thonny֊ի օրինակԹույլատրել մուտք գործել գրադարաններ (հիմնական սցենարների պանակից դուրս)Python 3֊ի interpreter֊ի այլընտանքային վիրտուալ միջավայրԻրո՞ք ցանկանում եք հեռացնել այն։ՕգնականՀատկանիշներՆույնականացումՀեղինակԻնքնալրացումՀետBack to %sՀետ գնալ ընթացիկ շրջանակինԱնհամապատասխան պանակԹռչնի աչքը դա Python֊ի վրիպազերծիչը, որն անհրաժեշտ է տեղադրել առանձին։ Ցանկանո՞ւմ եք բացել օգնության էջը և իմանալ ավելին։Թռչնի աչքի portԶննել փաթեթներըՎրիպակ հետևողԴեռ չի կարողանում փակել Հնարավոր չէ գտնել փաթեթի անունը ցուցակից՝Հնարավոր չէ գտնել համապատասխան սկավառակՉեղարկելՉեղարկե՞լ գործընթացըՉեղարկումՏառից կախված զգայունՓոխել տառաչափըՓոխել աշխատանքային պանակը սցենարի պանակում Գործարկել / ՎրիպազերծելCircuitPython (ընդհանուր)CircuitPython սարքՄաքրելՄաքրել վահանակըՍեղմելՍեղմելՓակելՓակել բոլորըՓակել մյուսներըթողնել մեկնաբանությունԿարգաբերումը թարմացվել է։ Վերագործարկել , որպեսզի Թոնին աշխատի սովորական ռեժիմում։ (տես 'Գործիքներ → Ընտրանքներ → Գլխավոր' եթե փոխել եք ձեր միտքը)կարգաբերել %s նիշքերըԿարգաբերել interpreter֊ը ...ՀաստատումՄիացրեք սարքը Ձեր համակարգչին և ներքևում ընտրեք համապատասխան port-ըՊատճենելՊատճենել սեղմատախտակինՊատճենումՊատճենում %s ֊ից %sՉհաջողվեց գտնել '%s' սկավառակը: Ցանկանու՞մ եք ինքներդ գտնել այն:PyPI ֊ում չի գտնվել նման փաթեթ PyPI- ից չհաջողվեց գտնել փաթեթի տվյալները:Ստեղծել նոր վիրտուալ միջավայրՊանակի ստեղծումՎիրտուալ միջավայրի ստեղծումԿտրելՏվյալներՎրիպազերծելՎրիպազերծել ընթացիկ սցենարըՎրիպազերծել ընթացիկ սցենարը (թռչնի աչք)Վրիպազերծել ընթացիկ սցենարը (ավելի արագ)Վրիպազերծել ընթացիկ սցենարը (արագ)Վրիպազերծման ռեժիմ (տրամադրում է ավելի մանրամասն ախտորոշիչ տեղեկամատյաններ)Փոքրացնել տառաչափըՀետարկել ընտրած տողերըՋնջելՋնջել ընտրածըՀեռացում%s ֊ի հեռացումՑանկալի տարբերակՄանրամասներՍարքՊանակի հատկություններըԱնջատել ծանուցման ձայնըՀանել ստուգումները (մեկ id մեկ գծում)ԱնջատելՑանկանո՞ւմ եք վերագրանցել '%s'Dock օգտատիրոջ պատուհաններՓաստաթղթավորումՄի մոռացեք, որ main.py- ն աշխատում է առանց ներկառուցված հիմնական այլագրի:ԿատարվածՎարՆերբեռնել %s ֊ի մեջՆերբեռնել %s ֊ը %s ֊ի մեջԽմբագրելԽմբագիրՏառատեսակի խմբագիրՄուտքագրել ամբողջ թիվՄուտքագրեք նոր պանակի անունը %sՄուտքագրեք տողը փոխարինելու համար:Մուտքագրեք ձեր անձնական բանալու գաղտնաբառը {}Մուտքագրեք ձեր գաղտնաբառը {}Միջավայրի փոփոխականներ (one KEY=VALUE per line)ՍխալՍխալի թիվը՝Սխալ՝ԻրադարձություններԲացառությունԵլքՓակել ԹոնինԲացազատել տերմինալումԱրտահանել տեղեկամատյանները․․․ՆիշքՆիշքի անունը՝Նիշքի հատկություններըՆիշքերՈրոնելՓնտրել և փոխարինելՓնտրել PyPI֊ի փաթեթՓնտրել ՝ՆԾԱԿետնրոնացման խմբագիրԿենտրոնանալԿենտրոնացման վահանակՏառատեսակի մասշտաբի ռեժիմԱրտադրողականության նկատառումներից ելնելով, Shell֊ը խուսափում է ցուցադրել շատ երկար տողերն ամբողջությամբ(տես Tools => Options => Shell)։ Այստեղ դուք կարող եք աշխատել տեքստի բնօրինակ հետ։Ապատեղադրելու համար ջնջեք կապ ունեցող նիշքերը:Նորացման համար պարզապես նորից տեղադրեք փաթեթը:Գտնվել է մի քանի '%s' սկավառակ: Ցանկանո՞ւմ եք ինքներդ ընտրել դրանցից մեկը:Ամբողջ էկրանովՖունկցիաՖունկցիայի կանչը % s- ովՀիմնականԾառԾառի ռեժիմը միացված է։ Փակել ծառի տեսքն անջատելու համար։ՕգնությունՕգնության բովանդակությունըԹաքցնել գաղտնի նիշքերըԸնդգծել ընթացիկ տողը (պահանջում է վերագործարկել խմբագիրը)Ընդգծել տեղային փոփոխականներըԸնդգծել համընկնող անուններըԸնդգծել փակագծերըԸնդգծել տարրերի այլագիրըՆշեք ներդիրի նիշերըՍկիզբՀիմնական էջIDՏԵՂԱԴՐԵԼIO տառատեսակԵթե վերջին հրամանը բացառություն է առաջացրել, ապա ցույց կտա այս տեսքը stacktrace- ը:Եթե չեք գտնում, գուցե նախ անհրաժեշտ է տեղադրել համապատասխան USB driver-ը:Եթե չեք իմանում, թե որտեղից ձեռք բերել փաթեթը, ապա կարող եք փնտրել Python Package Index֊ի օգնությամբ։ Սկսեք մուտքագրելով փաթեթի անունը վերում գտնվող որոնման դաշտում և սեղմեք ENTER։Եթե դեռ ուզում եք, ապա խնդրում ենք տեղադրել այն տերմինալի օգնությամբ։Մեծացնել տառաչափըՀանել ընտրված տողերըԸնկղմել ներդիրի նիշերով (խորհուրդ չի տրվում Python- ի համար)ԻնդեքսՏեղադրելՏեղադրել PyPI֊իցՏեղադրել տեղային նիշքիցՏեղադրել ներկայացվող նիշքիցՏեղադրել կամ թարմացնել ՆԾԱ֊նՏեղադրված է՝Տեղադրված տարբերակ՝ՏեղադրումՏեղադրում '%s'ԹարգմանիչԸնդհատել կատարումըՆերսPython գործընթացի ավարտից հետո պահել տերմինալի պատուհանը բաց KeyKey IDՀայտնի թարգմանիչներԼեզուՎերջին կայուն տարբերակըՎերջին տարբերակըԲեռնելԲեռնումԲեռնում %sՏեղային փոփոխականներԳտնվելու վայրՏարածք՝Ծրագրի տեղեկամատյանի օգտագործման իրադարձություններԿարծես թե տեղադրում եք Թոնիի հետ կապված փաթեթ: Եթե ուզում եք տեղադրել Թոնիի հավելում, ապա դուք պետք է ընտրեք 'Գործիքներ → Կառավարել հավելումները...' Իրո՞ք ցանկանում եք տեղադրել %s back-end֊ի համար։Կարծես փորձում եք տեղադրել հնացած Թոնիի հավելում (այն չի նշում պահանջվող Թոնիի տարբերակը)։ Եթե դեռ ուզում եք, ապա խնդրում ենք տեղադրել այն տերմինալի օգնությամբ։Պատրաստված է Էստոնիայի Տարտու համալսարանում, բաց աղբյուրներով համայնքի, Raspberry Pi Foundation ֊ի և Cybernetica AS ֊ի աջակցությամբՀամոզվեք, որ MicroPython֊ը տեղադրված է Ձեր micro:bit ֊ում։Կառավարել փաթեթները %s ֊ի համարԿառավարել փաթեթները․․․Կառավարել հավելումները․․․Մեծացնել տեսքըՏողերի հատվածների առավելագույն երկարությունը սեղմելուց առաջԱռավելագույն թվով տողեր պահելու համար։Հնարավոր է դանդաղեցնել վրիպազերծումը:MicroPython (SSH)MicroPython (ընդհանուր)MicroPython (local)MicroPython սարքՓոփոխվածՄոդուլՏեղափոխել աղբարկղՏեղափոխել աղբարկղ%s ֊ի տեղափոխում %s ֊ի մեջNB! Ավտոմատ ելքը անհրաժեշտ է միացնել տերմինալի կարգավորումներից (Profiles → Shell → When the shell exits)NB! Նիշքերի ընտրության կոճակի գործարկումը կարող է ճիշտ չաշխատել վիրտուալ միջավայրից: Այս դեպքում interpreter-ի փոխարեն ընտրեք «ակտիվացնելու» սցենարը (կամ մուտքագրեք ուղին անմիջապես տուփի մեջ):NB! Մեծ արժեքները կարող են առաջացնել թույլ արտադրողականություն։NB! Վերագործարկել Թոնին այս ընտրանքները փոփոխելուց հետ։NB! Որոշ ոճի տարրեր փոխվում են Թոնիի վերագործարկումից հետո։NB! Կարող է լինել մեկ այլ տարբերակ, որը համատեղելի է ընթացիկ Թոնիի տարբերակի հետ: Սեղմել '...' կոճակը տեղադրման տարբերակն ընտրելու համար։NB! Թոնին ունի միայն Python 3.5֊ի և բարձր տարբերակի աջակցությունNB! Հավելումները տեղադրելուց / վերազինելուց / տեղահանելուց հետո դուք պետք է վերագործարկեք Թոնին NB! micropython.org- ը հրապարակել է այս փաթեթի %s տարբերակը, և այն կտեղադրվի լռելյայն:ԱնունՆորՆոր պանակՆոր փաթեթները ևս կտեղադրվեն այս պանակում։ Այլ վայրերը պետք է կառավարվեն այլընտրանքային միջոցներով։Նոր փաթեթներ կտեղադրվենՀաջորդ առարկանՀասանելի չէՄիացված չէՉի աջակցվումՆշումներՈչինչ ընտրված չէԼավԱռարկայի տեսուչԲացել Օգնականին ինքնաբերաբար, երբ առկա է զգուշացնումներ Ձեր կոդի համարԲացել Օգնականին ինքնաբերաբար, երբ ծրագիրը կախում էԲացել Թոնի տվյալների պանակը․․․Բացել Թոնի ծրագրի պանակը․․․Ինքնաբերաբար բացել և փակել բուրգանման դիտումը Բացել գնահատված արժեքները «Առարկա»֊ի հսկիչումԲացել %s ֊իցԲացել ԹոնիումԲացել Թոնիի տեքստային խմբագրիչումբացել համակարգի լռելայն ծրագրովԲացել համակարգի նիշքի կառավարմամբԲացել վերագործարկիչը․․․Բացել համակարգի վահանակը․․․ԲացելԲացում է բուրգանման դիտումը առաջւբ կանչից և փակում է այն, երբ ծրագիրը վերադառնում է հիմնական շրջանակին։Ընտրանքներ՝ԴուրսԵզրագիծԱռաջՎերագրանցե՞լՎերագրանցել '%s' տեսքըՓաթեթ'{}' փաթեթը պահանջում է տեղադրել և ապատեղադրել այլ փաթեթները։Փաթեթը հասանելի չէ micropython.org կայքում: Կտեղադրվի PyPI-ի տարբերակը:Փաթեթի կառավարիչը հասանելի չէ այս interpreter ֊ի համարՓաթեթների պանակըԳաղտնաբառԶետեղելՈւղիԿատարել MyPy ստուգումներըԿատարել նշած Pylint ստուգումներըԽնդրում ենք ստուգել ուղղագրությունը։Խնդրում ենք սպասելՊլոտերՊլոտերը վիզուալացնում է տերմինալում արտացոլված թվերի շարքը։PortPort or WebREPLՆախընտրելի վրիպազերծիչՆերկայացնել Python REPL֊ը ծրագրի ավարտից հետոՆախատեսքՆախորդ առարկանՏպել․․․Ծրագրի արգումենտներԾրագրի արգումենտները՝Ծրագրի ծառըՀատկություններPyPI էջPygame Zero ռեժիմԳործարկվող PythonPython թարգմանիչներԵլքԻրո՞ք հեռացնել։Վերջին նիշքերըԽորհուրդ է տրվում առավելագույն տողի երկարություն (սահմանել 0 սահմանային տողը անջատելու համար)ԱռաջԹարմացնելՍովորական ռեժիմՀեռավար Python 3 (SSH)Վերանվանել․․․Վերաբացել բոլո նիշքերը նախորդ սեսիայից ՓոխարինելՓոխարինել բոլորըՓոխարինել ներդիրները բացատներովՓոխարինել՝Փոխարինել+ՓնտրելԶեկուցել խնդիրներըՊահանջում էՊահանջում է՝ՇարունակելԳործարկելԳործարկել և վրիպազերծելԳործարկել / շարունակելԳործարկել ընթացիք սցենարըԳործարկել ընթացիկ սցենարը տերմինալումԲացել կուրսորըԲացել ընթացիկ սցենարը տերմինալումՊահելՊահել բոլոր նիշքերըՊահել որպես․․․Պահել պատճենը․․․Պահել գաղտնաբառըՊահել %s ֊իցՊահպանումՊահպանում %sՇրջանակՈրոնում PyPI ֊ումՈրոնման արդյունքՈրոնումՏես Օգնություն բաժինը մանրամասների համար։Ընտրել բոլորըԸնտրել բոլորըԸնտրեք առարկան և փորձեք նորից:Նշել դատարկ պանակ նոր վիրտուալ միջավայրի համարԸնտրել գոյություն ունեցող կամ ստեղծել նոր դատարկ պանակԸնտրեք, եթե նիշքի երկխոսությունները հայտնվեն հիմնական պատուհանի հետևումԸնտրել թարգմանիչըԸնտրած պանակը դատարկ չէ։ Ընտրել այլ պանակ կամ չեղարկել։Ուղարկել EOF / Փափուկ վերագործարկումՍտվերված առարկաներ (ոչ կարևոր)ՎահանակՑույց տալ ՊլոտերըՑուցադրել ֆունկցիայի կանչերը (շրջանակները) առանձին պատուհաններումՑուցադրել գաղտնի նիշքերըՑույց տալ տողի համարներըՉափսՉափս (բայթ)Կոդերի աղբյուրՍեղմված տեքստ (%d տառեր)ՓաթեթՍկսեք ընտրելով փաթեթը ձախ կողմից։ՄեկնարկՔայլ դեպի հետՔայլ դեպի ներսՔայլ դեպի դուրսՔայլ առաջԿանգԿանգ/Վերագործարկել backend֊ըՊահեստի տեղեկատվությունՊահեստի տարածքըՊահպանման տարածք այս սկավառակի կամ նիշքային համակարգումԱմփոփումՓոխել սովորական ռեժիմիԱյլագրի տեսքԹիրախային սարքի գտնվելու վայրըԹիրախային սարքի մոդելըԹիրախ՝ՎահանակՏերմինալ էմուլացիաՊատասխանն էԳործընթացը դեռ աշխատանքի մեջ է։ Իրո՞ք ցանկանում եք չեղարկել։Վերևում ներկայացրածը այս կոտորակի մոտավոր արժեքն է: Ճշգրիտ պահված արժեքը %s է, որը կազմում է մոտ %sՆույն interpreter֊ն, որով աշխատում է Թոնին (լռելայն)Նշված տեքստը չի գտնվել:Տեսք և տառաչափԱյս տուփը նախատեսված է ձեր աշխատանքային գրառումների համար՝ հանձնարարականների ցուցումներ, կոդերի հատվածներ, ինչ էլ որ լինի։ Ամեն ինչ կպահպանվի ինքնաբերաբար և կբեռնվի, երբ հաջորդ անգամ բացեք Thonny- ն: Ազատորեն ջնջեք այս տեքստը՝ ձեր սեփական գրառումների համար տեղ ստեղծելու համար:Այս համակարգիչըԱյս երկխոսությունը կառավարում է Թոնիի հավելումներն ու պահանջները։ Եթե ցանկանում եք տեղադրել փաթեթներ ձեր սեփական ծրագրերի համար, ապա ընտրեք 'Գործիքներ → Կառավարել փաթեթները ...'Այս երկխոսությունը թվարկում է բոլոր մատչելի փաթեթները, բայց թույլ է տալիս արդիականացնել և ապատեղադրել միայն այդ փաթեթներըԱյս երկխոսությունը գտնվում է հետևյալ պանակների վերին մակարդակի մոդուլներում։ Սա մեկնաբանություն էԱյս փաթեթը պահանջում է Թոնիի այլ տարբերակ՝Այս ծրագիրը թողարկվում է ԱՌԱՆՑ ՈՐԵՎԻՑԵ ԵՐԱՇԽԻՔԻ! Այն անվճար ծրագիր է, ողջունում ենք եթե այն վերաբաշխեք հետևյալ արտոնագրի ներքո https://opensource.org/licenses/MITԱյս վիրտուալ միջավայրը ինքնաբերաբար սպասարկվում է Թոնիի կողմից։ Թոնիի ընտրանքերԹոնիի հավելումներԹոնի հավելում առանց պահանջներիՓոխարկել մեկնաբանությունըԳործիքներՓորձեք ավտոմատ կերպով հայտնաբերել port-ըUI ռեժիմUI մասշտավի գործոնUI տեսքԱպանշեք, եթե հավանում եք ավելի հին փորձը:հեռացնել մեկնաբանությունըՀետԱպատեղադրելԱպատեղադրում '%s'Անհամապատասխան պահանջներՎերՎերազինելՎերազինման պահանջներՎերազինել կամ ապատեղադրելՎերազինում '%s'Վերբեռնել %s ֊ի մեջ%s ֊ի վերբեռնում %s ֊ի մեջՕգտագործեք «Դադար» հրամանը, եթե ցանկանում եք չեղարկել վրիպազերծումըZenity- ի փոխարեն օգտագործեք Tk նիշքի երկխոսություններըԱրժեքID արժեքՓոփոխականներԹողարկման պատմությունՏեղադրման տարբերակըՏեսքԻ՞նչ անել % s նիշքի հետ, երբ կրկնակի սեղմում եք այն Թոնիի նիշքի զննարկչում:Թոնիի ո՞ր interpreter֊ը կամ սարքը պետք է օգտագործի Ձեր կոդը գործարկելու համար։Ներկա interpreter֊ի օգնությամբ դուք միայն կարող եք զննել փաթեթները։ Օգտագործել 'Գործիքներ → Բացել համակարգի վահանակը...' տեղադրելու, վերազինելու կամ ապատեղադրելու համար։Մշակում...Տողադարձ (ոչ այնքան շատ)Դուք պետք է մուտք գործեքԴուք պետք է ընտրեք նիշքըՓաթեթի կառավարիչը բացելուց առաջ պետք է կանգնեցնել ծրագիրը։Ձեր թարգմանիչը առկա՞ չէ ցանկում։Խոշորացումբոլոր նիշքերըբլա, բլաբայթազատ տարածքասյտեղփնտրեք ձեր սարքի անունը, «USB սերիալ» կամ «UART»sys.path- ում բացարձակ lib պանակ չկախնդրում ենք սպասելաջակցում է պարզ ANSI֊գույներ և ոճերտեղակայել և տեղադրել փաթեթի նիշքը (հիմնակում .whl, .tar.gz or .zip ձևաչափով)։տեղակայեք requirements.txt նիշքը և տեղադրել դրանում նշված փաթեթները։ընդհանուր տարածքչփակված_շարքօգտագործված տարածքօգտատիրոջ էջի փաթեթներվիրտուալ միջավայր././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/hy_AM/LC_MESSAGES/thonny.po0000644000076600000240000016465114417536743022657 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: hy\n" #: thonny/workbench.py:357 msgid "File" msgstr "Նիշք" #: thonny/workbench.py:358 msgid "Edit" msgstr "Խմբագրել" #: thonny/workbench.py:359 msgid "View" msgstr "Տեսք" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "Գործարկել" #: thonny/workbench.py:361 msgid "Tools" msgstr "Գործիքներ" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "Օգնություն" #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "Python 3֊ի interpreter֊ի այլընտանքային վիրտուալ միջավայր" #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "Հատուկ վիրտուալ միջավայր (հնացած)" #: thonny/workbench.py:582 msgid "Exit" msgstr "Ելք" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "Փոքրացնել տառաչափը" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "Կետնրոնացման խմբագիր" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "Կենտրոնացման վահանակ" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "Մեծացնել տեսքը" #: thonny/workbench.py:653 msgid "Full screen" msgstr "Ամբողջ էկրանով" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "Ծրագրի արգումենտներ" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "Thonny֊ի մասին" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Պատրաստված է\n" "Էստոնիայի Տարտու համալսարանում,\n" "բաց աղբյուրներով համայնքի,\n" "Raspberry Pi Foundation ֊ի\n" "և Cybernetica AS ֊ի\n" "աջակցությամբ" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Այս ծրագիրը թողարկվում է\n" "ԱՌԱՆՑ ՈՐԵՎԻՑԵ ԵՐԱՇԽԻՔԻ!\n" "Այն անվճար ծրագիր է, ողջունում ենք \n" "եթե այն վերաբաշխեք հետևյալ արտոնագրի ներքո\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:152 msgid "Version history" msgstr "Թողարկման պատմություն" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "Զեկուցել խնդիրները" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Բացել Օգնականին ինքնաբերաբար, երբ ծրագիրը կախում է" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Բացել Օգնականին ինքնաբերաբար, երբ առկա է զգուշացնումներ Ձեր կոդի համար" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Կատարել նշած Pylint ստուգումները" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Կատարել MyPy ստուգումները" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Հանել ստուգումները (մեկ id մեկ գծում)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "Օգնական" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "Ինքնալրացում" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "Թոնիի ո՞ր interpreter֊ը կամ սարքը պետք է օգտագործի Ձեր կոդը գործարկելու համար։" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "Թարգմանիչ" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "Թռչնի աչքի մասին" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Թռչնի աչքը դա Python֊ի վրիպազերծիչը, որն անհրաժեշտ է տեղադրել առանձին։\n" "\n" "Ցանկանո՞ւմ եք բացել օգնության էջը և իմանալ ավելին։" #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "Վրիպազերծել ընթացիկ սցենարը (թռչնի աչք)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Փոխարկել մեկնաբանությունը" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "թողնել մեկնաբանություն" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "հեռացնել մեկնաբանությունը" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Հետ" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Առաջ" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "Կտրել" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "Պատճենել" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "Զետեղել" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Ընտրել բոլորը" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "Բացել կուրսորը" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "Դեռ չի կարողանում փակել " #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Օգտագործեք «Դադար» հրամանը, եթե ցանկանում եք չեղարկել վրիպազերծումը" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Dock օգտատիրոջ պատուհաններ" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "Ընդգծել համընկնող անունները" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "Ընդգծել տեղային փոփոխականները" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "Ընդգծել փակագծերը" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "Ընդգծել տարրերի այլագիրը" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "Ընդգծել ընթացիկ տողը (պահանջում է վերագործարկել խմբագիրը)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "Թույլատրել խմբագրիչում կոդի ավարտը Tab կոճակով" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "Թույլատրել վահանակում կոդի ավարտը Tab կոճակով" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "Ցույց տալ տողի համարները" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Խորհուրդ է տրվում առավելագույն տողի երկարություն\n" "(սահմանել 0 սահմանային տողը անջատելու համար)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "Խմբագիր" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "Արտահանել տեղեկամատյանները․․․" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Իրադարձություններ" #: thonny/plugins/files.py:551 msgid "Files" msgstr "Նիշքեր" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "Փնտրել և փոխարինել" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "Փնտրել ՝" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "Փոխարինել՝" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "Տառից կախված զգայուն" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "Վեր" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "Վար" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "Որոնել" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "Փոխարինել" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "Փոխարինել+Փնտրել" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "Փոխարինել բոլորը" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "Մուտքագրեք տողը փոխարինելու համար:" #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "Նշված տեքստը չի գտնվել:" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Թույլատրել միայն մեկ Thonny֊ի օրինակ" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Վերաբացել բոլո նիշքերը նախորդ սեսիայից " #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Անջատել ծանուցման ձայնը" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Տառատեսակի մասշտաբի ռեժիմ" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Ծառի ռեժիմը միացված է։\n" "Փակել ծառի տեսքն անջատելու համար։" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Ծառ" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Լեզու" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Այս տուփը նախատեսված է ձեր աշխատանքային գրառումների համար՝ հանձնարարականների ցուցումներ, կոդերի հատվածներ, ինչ էլ որ լինի։\n" "Ամեն ինչ կպահպանվի ինքնաբերաբար և կբեռնվի, երբ հաջորդ անգամ բացեք Thonny- ն:\n" "Ազատորեն ջնջեք այս տեքստը՝ ձեր սեփական գրառումների համար տեղ ստեղծելու համար:" #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Նշումներ" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "Նախորդ առարկան" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "Հաջորդ առարկան" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "Առարկայի տեսուչ" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "Եզրագիծ" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero ռեժիմ" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "Փնտրել PyPI֊ի փաթեթ" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "Ապատեղադրել" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "Փակել" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "Սեղմել" #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "ասյտեղ" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "Վերազինել" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "Տեղադրել" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "PyPI ֊ում չի գտնվել նման փաթեթ " #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "Վերջին կայուն տարբերակը" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "Վերջին տարբերակը" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "Ամփոփում" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "Հեղինակ" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "Հիմնական էջ" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "Վրիպակ հետևող" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "Փաստաթղթավորում" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "PyPI էջ" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "Պահանջում է" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "Իրո՞ք հեռացնել։" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "Իրո՞ք ցանկանում եք հեռացնել այն։" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "Հետ գնալ\n" "ընթացիկ շրջանակին" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "Փոփոխականներ" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "Այս համակարգիչը" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "Թարմացնել" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "Կենտրոնանալ" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "Սխալ" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "Դուք պետք է ընտրեք նիշքը" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "Վերագրանցե՞լ" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "Ցանկանո՞ւմ եք վերագրանցել '%s'" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "Նոր" #: thonny/editors.py:565 msgid "Open..." msgstr "Բացել" #: thonny/editors.py:567 msgid "Load" msgstr "Բեռնել" #: thonny/editors.py:576 msgid "Recent files" msgstr "Վերջին նիշքերը" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "Փակել բոլորը" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "Պահել" #: thonny/editors.py:633 msgid "Save as..." msgstr "Պահել որպես․․․" #: thonny/editors.py:644 msgid "Save copy..." msgstr "Պահել պատճենը․․․" #: thonny/editors.py:653 msgid "Rename..." msgstr "Վերանվանել․․․" #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "Թոնիի ընտրանքեր" #: thonny/running.py:121 msgid "Run current script" msgstr "Գործարկել ընթացիք սցենարը" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "Գործարկել ընթացիկ սցենարը տերմինալում" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "Կանգ/Վերագործարկել backend֊ը" #: thonny/running.py:166 msgid "Stop" msgstr "Կանգ" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "Ընդհատել կատարումը" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "Ուղարկել EOF / Փափուկ վերագործարկում" #: thonny/running.py:201 msgid "Disconnect" msgstr "Անջատել" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "Հայտնի թարգմանիչներ" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "Ձեր թարգմանիչը առկա՞ չէ ցանկում։" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "NB! Թոնին ունի միայն Python 3.5֊ի և բարձր տարբերակի աջակցություն" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "Ստեղծել նոր վիրտուալ միջավայր" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "Ընտրել գոյություն ունեցող կամ ստեղծել նոր դատարկ պանակ" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "Python թարգմանիչներ" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "բոլոր նիշքերը" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "Նշել դատարկ պանակ նոր վիրտուալ միջավայրի համար" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "Անհամապատասխան պանակ" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Ընտրած պանակը դատարկ չէ։\n" "Ընտրել այլ պանակ կամ չեղարկել։" #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "Վիրտուալ միջավայրի ստեղծում" #: thonny/shell.py:83 msgid "Clear shell" msgstr "Մաքրել վահանակը" #: thonny/shell.py:138 msgid "Plotter" msgstr "Պլոտեր" #: thonny/shell.py:269 msgid "Clear" msgstr "Մաքրել" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "Ցույց տալ Պլոտերը" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Արտադրողականության նկատառումներից ելնելով, Shell֊ը խուսափում է ցուցադրել \n" "շատ երկար տողերն ամբողջությամբ(տես Tools => Options => Shell)։\n" "Այստեղ դուք կարող եք աշխատել տեքստի բնօրինակ հետ։" #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "Տողադարձ (ոչ այնքան շատ)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "Պատճենել սեղմատախտակին" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "Բացազատել տերմինալում" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "Սեղմված տեքստ (%d տառեր)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Պլոտերը վիզուալացնում է տերմինալում \n" "արտացոլված թվերի շարքը։" #: thonny/shell.py:1796 msgid "See Help for details." msgstr "Տես Օգնություն բաժինը մանրամասների համար։" #: thonny/ui_utils.py:449 msgid "Close others" msgstr "Փակել մյուսները" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "Պատճենում" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Պատճենում\n" " %s\n" "֊ից\n" " %s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "Չեղարկել" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "Լավ" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "Չեղարկե՞լ գործընթացը" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "Գործընթացը դեռ աշխատանքի մեջ է։\n" "Իրո՞ք ցանկանում եք չեղարկել։" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "Ընտրել բոլորը" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "Վահանակ" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "Նույն interpreter֊ն, որով աշխատում է Թոնին (լռելայն)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "Այս վիրտուալ միջավայրը ինքնաբերաբար սպասարկվում է Թոնիի կողմից։\n" "" #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "Տարածք՝" #: thonny/workbench.py:592 msgid "Options..." msgstr "Ընտրանքներ՝" #: thonny/workbench.py:599 msgid "Increase font size" msgstr "Մեծացնել տառաչափը" #: thonny/workbench.py:664 msgid "Change font size" msgstr "Փոխել տառաչափը" #: thonny/workbench.py:665 msgid "Zoom" msgstr "Խոշորացում" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "Փակել Թոնին" #: thonny/workbench.py:677 msgid "Quit" msgstr "Ելք" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "Վերագրանցել '%s' տեսքը" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "Ծրագրի արգումենտները՝" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "Սովորական ռեժիմ" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Կարգաբերումը թարմացվել է։ Վերագործարկել , որպեսզի Թոնին աշխատի սովորական ռեժիմում։\n" "\n" "(տես 'Գործիքներ → Ընտրանքներ → Գլխավոր' եթե փոխել եք ձեր միտքը)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "Ծրագրի ծառը" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "Ընտրել թարգմանիչը" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "Շարունակել" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "Գործարկել / շարունակել" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "Վրիպազերծել ընթացիկ սցենարը" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "Վրիպազերծել" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "Վրիպազերծել ընթացիկ սցենարը (արագ)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "Վրիպազերծել ընթացիկ սցենարը (ավելի արագ)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "Քայլ առաջ" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "Առաջ" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "Քայլ դեպի ներս" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "Ներս" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "Քայլ դեպի դուրս" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "Դուրս" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "Քայլ դեպի հետ" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "Հետ" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "Փաթեթ" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "Բացառություն" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Ծրագրի տեղեկամատյանի օգտագործման իրադարձություններ" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Վրիպազերծման ռեժիմ (տրամադրում է ավելի մանրամասն ախտորոշիչ տեղեկամատյաններ)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UI ռեժիմ" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI մասշտավի գործոն" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Վերագործարկել Թոնին այս ընտրանքները փոփոխելուց հետ։" #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "Հիմնական" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "ՏԵՂԱԴՐԵԼ" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "Զննել փաթեթները" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Ներկա interpreter֊ի օգնությամբ դուք միայն կարող եք զննել փաթեթները։\n" "Օգտագործել 'Գործիքներ → Բացել համակարգի վահանակը...' տեղադրելու, \n" "վերազինելու կամ ապատեղադրելու համար։" #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "Փաթեթների պանակը" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "Տեղադրել PyPI֊ից" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Եթե չեք իմանում, թե որտեղից ձեռք բերել փաթեթը, ապա կարող եք փնտրել Python Package Index֊ի օգնությամբ։ Սկսեք մուտքագրելով փաթեթի անունը վերում գտնվող որոնման դաշտում և սեղմեք ENTER։" #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "տեղակայեք requirements.txt նիշքը և տեղադրել դրանում նշված փաթեթները։" #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "Սեղմել" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "տեղակայել և տեղադրել փաթեթի նիշքը (հիմնակում .whl, .tar.gz or .zip ձևաչափով)։" #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "Վերազինել կամ ապատեղադրել" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "Սկսեք ընտրելով փաթեթը ձախ կողմից։" #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "Թիրախ՝" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "վիրտուալ միջավայր" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "օգտատիրոջ էջի փաթեթներ" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Այս երկխոսությունը թվարկում է բոլոր մատչելի փաթեթները, բայց թույլ է տալիս արդիականացնել և ապատեղադրել միայն այդ փաթեթները" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Նոր փաթեթները ևս կտեղադրվեն այս պանակում։ Այլ վայրերը պետք է կառավարվեն այլընտրանքային միջոցներով։" #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "Տեղադրված տարբերակ՝" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "Տեղադրված է՝" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "Խնդրում ենք ստուգել ուղղագրությունը։" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "Դուք պետք է մուտք գործեք" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "PyPI- ից չհաջողվեց գտնել փաթեթի տվյալները:" #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "Սխալի թիվը՝" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "Հնարավոր չէ գտնել փաթեթի անունը ցուցակից՝" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "'{}' փաթեթը պահանջում է տեղադրել և ապատեղադրել այլ փաթեթները։" #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "Փաթեթ" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "Կառավարել փաթեթները %s ֊ի համար" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "Հաստատում" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Կարծես թե տեղադրում եք Թոնիի հետ կապված փաթեթ:\n" "Եթե ուզում եք տեղադրել Թոնիի հավելում, ապա դուք պետք է\n" "ընտրեք 'Գործիքներ → Կառավարել հավելումները...'\n" "\n" "Իրո՞ք ցանկանում եք տեղադրել %s back-end֊ի համար։" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! Կարող է լինել մեկ այլ տարբերակ, որը համատեղելի է ընթացիկ Թոնիի տարբերակի հետ: Սեղմել '...' կոճակը տեղադրման տարբերակն ընտրելու համար։" #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "Թոնի հավելում առանց պահանջների" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "Կարծես փորձում եք տեղադրել հնացած Թոնիի\n" "հավելում (այն չի նշում պահանջվող Թոնիի տարբերակը)։\n" "\n" "Եթե դեռ ուզում եք, ապա խնդրում ենք տեղադրել այն տերմինալի օգնությամբ։" #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "Անհամապատասխան պահանջներ" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "Այս փաթեթը պահանջում է Թոնիի այլ տարբերակ՝" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "Եթե դեռ ուզում եք, ապա խնդրում ենք տեղադրել այն տերմինալի օգնությամբ։" #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "(Այս դեպքում Թոնիի back-end ֊ը օգտագործում է նույն interpreter֊ը, այնպես որ երկու երկխոսությունն էլ կառավարում են նույն փաթեթները):" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! Հավելումները տեղադրելուց / վերազինելուց / տեղահանելուց հետո դուք պետք է վերագործարկեք Թոնին " #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "Թոնիի հավելումներ" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "Ընդլայնված տեղադրում / վերազինում / նվազեցում" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "Ցանկալի տարբերակ" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "Վերազինման պահանջներ" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "Պահանջում է՝" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "Սխալ՝" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "Կառավարել փաթեթները․․․" #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "Կառավարել հավելումները․․․" #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Բացել վերագործարկիչը․․․" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Փոխել աշխատանքային պանակը սցենարի պանակում Գործարկել / Վրիպազերծել" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Ցուցադրել ֆունկցիայի կանչերը (շրջանակները) առանձին պատուհաններում" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Ապանշեք, եթե հավանում եք ավելի հին փորձը:" #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Ինքնաբերաբար բացել և փակել բուրգանման դիտումը " #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Բացում է բուրգանման դիտումը առաջւբ կանչից և փակում է այն, երբ ծրագիրը վերադառնում է հիմնական շրջանակին։" #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Թույլատրել մուտք գործել գրադարաններ (հիմնական սցենարների պանակից դուրս)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Հնարավոր է դանդաղեցնել վրիպազերծումը:" #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Նախընտրելի վրիպազերծիչ" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(օգտագործվում է, երբ սեղմվում է Debug գործիքագոտու կոճակը)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Թռչնի աչքի port" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(վերագործարկեք Թոնիին այս փոփոխությունները կատարելուց հետ)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Գործարկել և վրիպազերծել" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "Տերմինալ էմուլացիա" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "աջակցում է պարզ ANSI֊գույներ և ոճեր" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "Առավելագույն թվով տողեր պահելու համար։" #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "NB! Մեծ արժեքները կարող են առաջացնել թույլ արտադրողականություն։" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "Տողերի հատվածների առավելագույն երկարությունը սեղմելուց առաջ" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Բացել ընթացիկ սցենարը տերմինալում" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Ներկայացնել Python REPL֊ը ծրագրի ավարտից հետո" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Python գործընթացի ավարտից հետո պահել տերմինալի պատուհանը բաց " #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! Ավտոմատ ելքը անհրաժեշտ է միացնել տերմինալի կարգավորումներից\n" "(Profiles → Shell → When the shell exits)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Վահանակ" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "UI տեսք" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Այլագրի տեսք" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Տառատեսակի խմբագիր" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "IO տառատեսակ" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Նախատեսք" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "Սա մեկնաբանություն է" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "Պատասխանն է" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "չփակված_շարք" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "բլա, բլա" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Որոշ ոճի տարրեր փոխվում են Թոնիի վերագործարկումից հետո։" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "Մուտքագրել ամբողջ թիվ" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "Տեսք և տառաչափ" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Բացել Թոնի ծրագրի պանակը․․․" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Բացել Թոնի տվյալների պանակը․․․" #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "Սկիզբ" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "Օգնության բովանդակությունը" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "CircuitPython սարք" #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "MicroPython սարք" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "Միացրեք սարքը Ձեր համակարգչին և ներքևում ընտրեք համապատասխան port-ը" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "փնտրեք ձեր սարքի անունը, «USB սերիալ» կամ «UART»" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Եթե չեք գտնում, գուցե նախ անհրաժեշտ է տեղադրել համապատասխան USB driver-ը:" #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "Փորձեք ավտոմատ կերպով հայտնաբերել port-ը" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "MicroPython (ընդհանուր)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "Տպել․․․" #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "Բացել համակարգի վահանակը․․․" #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "Մանրամասներ" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "Տեղադրել ներկայացվող նիշքից" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "Տեղադրել տեղային նիշքից" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Այս երկխոսությունը կառավարում է Թոնիի հավելումներն ու պահանջները։\n" "Եթե ցանկանում եք տեղադրել փաթեթներ ձեր սեփական ծրագրերի համար, ապա ընտրեք 'Գործիքներ → Կառավարել փաթեթները ...'" #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "CircuitPython (ընդհանուր)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Հանել ընտրված տողերը" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Հետարկել ընտրած տողերը" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "Փոխել\n" "սովորական\n" "ռեժիմի" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Համոզվեք, որ MicroPython֊ը տեղադրված է Ձեր micro:bit ֊ում։" #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "Մի մոռացեք, որ main.py- ն աշխատում է առանց ներկառուցված հիմնական այլագրի:" #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "խնդրում ենք սպասել" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "Կատարված" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "ՆԾԱ" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Չհաջողվեց գտնել '%s' սկավառակը: Ցանկանու՞մ եք ինքներդ գտնել այն:" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Գտնվել է մի քանի '%s' սկավառակ: Ցանկանո՞ւմ եք ինքներդ ընտրել դրանցից մեկը:" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "Հնարավոր չէ գտնել համապատասխան սկավառակ" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "%d տարրեր" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "Տեղափոխել աղբարկղ" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "Տեղափոխել աղբարկղ" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "Ջնջել" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "Նոր պանակ" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "Հատկություններ" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "Պահեստի տարածքը" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "Ուղի" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "Պանակի հատկությունները" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "Նիշքի հատկությունները" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "բայթ" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "Չափս" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "Փոփոխված" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "%s ֊ի հեռացում" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "%s ֊ի տեղափոխում %s ֊ի մեջ" #: thonny/editors.py:219 msgid "Loading" msgstr "Բեռնում" #: thonny/editors.py:335 msgid "Saving" msgstr "Պահպանում" #: thonny/running.py:1408 msgid "Working..." msgstr "Մշակում..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "%s ֊ի վերբեռնում %s ֊ի մեջ" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "Վերբեռնել %s ֊ի մեջ" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "Ներբեռնել %s ֊ը %s ֊ի մեջ" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "Ներբեռնել %s ֊ի մեջ" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "Բացել համակարգի նիշքի կառավարմամբ" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "Թաքցնել գաղտնի նիշքերը" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "Ցուցադրել գաղտնի նիշքերը" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "Բացել Թոնիում" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "բացել համակարգի լռելայն ծրագրով" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "կարգաբերել %s նիշքերը" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Ի՞նչ անել % s նիշքի հետ, երբ կրկնակի սեղմում եք այն Թոնիի նիշքի զննարկչում:" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "Հեռացում" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "Պանակի ստեղծում" #: thonny/editors.py:217 msgid "Loading %s" msgstr "Բեռնում %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "Պահպանում %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "Պահել բոլոր նիշքերը" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "Կարգաբերել interpreter֊ը ..." #: thonny/workbench.py:1501 msgid "Device" msgstr "Սարք" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "Չեղարկում" #: thonny/workdlg.py:212 msgid "Starting" msgstr "Մեկնարկ" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "Նույնականացում" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Մուտքագրեք ձեր անձնական բանալու գաղտնաբառը\n" "{}" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "Մուտքագրեք ձեր գաղտնաբառը\n" "{}" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Վերևում ներկայացրածը այս կոտորակի մոտավոր արժեքն է: Ճշգրիտ պահված արժեքը %s է, որը կազմում է մոտ %s" #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "Որոնման արդյունք" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "Որոնում" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "Տեղադրում '%s'" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "Վերազինում '%s'" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "Ապատեղադրում '%s'" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "Տեղադրում" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "Փաթեթի կառավարիչը հասանելի չէ այս interpreter ֊ի համար" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "Չի աջակցվում" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "Հասանելի չէ" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "Փաթեթի կառավարիչը բացելուց առաջ պետք է կանգնեցնել ծրագիրը։" #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "Բացել գնահատված արժեքները «Առարկա»֊ի հսկիչում" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "Գործարկվող Python" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! Նիշքերի ընտրության կոճակի գործարկումը կարող է ճիշտ չաշխատել\n" "վիրտուալ միջավայրից: Այս դեպքում interpreter-ի փոխարեն ընտրեք «ակտիվացնելու» սցենարը\n" " (կամ մուտքագրեք ուղին անմիջապես տուփի մեջ):" #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "Հեռավար Python 3 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "Միացված չէ" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "Ընդլայնված ընտրանքներ" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "Տեղադրել կամ թարմացնել ՆԾԱ֊ն" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "Մոդուլ" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "Ստվերված առարկաներ (ոչ կարևոր)" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "Փաթեթը հասանելի չէ micropython.org կայքում: Կտեղադրվի PyPI-ի տարբերակը:" #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "NB! micropython.org- ը հրապարակել է այս փաթեթի %s տարբերակը, և այն կտեղադրվի լռելյայն:" #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "Նորացման համար պարզապես նորից տեղադրեք փաթեթը:" #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "Ապատեղադրելու համար ջնջեք կապ ունեցող նիշքերը:" #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "Շրջանակ" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Այս երկխոսությունը գտնվում է հետևյալ պանակների վերին մակարդակի մոդուլներում։ " #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "Նոր փաթեթներ կտեղադրվեն" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "sys.path- ում բացարձակ lib պանակ չկա" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "Տեղադրման տարբերակը" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "Թիրախային սարքի գտնվելու վայրը" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "Թիրախային սարքի մոդելը" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "Խնդրում ենք սպասել" #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "Որոնում PyPI ֊ում" #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "Ջնջել ընտրածը" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "Բացել Թոնիի տեքստային խմբագրիչում" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "Պահպանման տարածք այս սկավառակի կամ նիշքային համակարգում" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "ընդհանուր տարածք" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "օգտագործված տարածք" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "ազատ տարածք" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "Պահեստի տեղեկատվություն" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Փոխարինել ներդիրները բացատներով" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "Նշեք ներդիրի նիշերը" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "Ընկղմել ներդիրի նիշերով (խորհուրդ չի տրվում Python- ի համար)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "Անուն" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "Չափս (բայթ)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "Մուտքագրեք նոր պանակի անունը \n" "%s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "Ոչինչ ընտրված չէ" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "Ընտրեք առարկան և փորձեք նորից:" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "Բացել %s ֊ից" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "Պահել %s ֊ից" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "Նիշքի անունը՝" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "ID արժեք" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "Արժեք" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "Պահել գաղտնաբառը" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Ֆունկցիայի կանչը % s- ով" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "Տեղային փոփոխականներ" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "Ֆունկցիա" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "Գտնվելու վայր" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Եթե վերջին հրամանը բացառություն է առաջացրել, ապա ցույց կտա այս տեսքը stacktrace- ը:" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "Տվյալներ" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "Հատկանիշներ" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "Ինդեքս" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "Key ID" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "Key" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "Back to\n" "%s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "Port or WebREPL" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "Գաղտնաբառ" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "Կոդերի աղբյուր" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Zenity- ի փոխարեն օգտագործեք Tk նիշքի երկխոսությունները" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Ընտրեք, եթե նիշքի երկխոսությունները հայտնվեն հիմնական պատուհանի հետևում" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Միջավայրի փոփոխականներ (one KEY=VALUE per line)" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9381382 thonny-4.1.7/thonny/locale/it_IT/0000755000076600000240000000000014730055627017204 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1087806 thonny-4.1.7/thonny/locale/it_IT/LC_MESSAGES/0000755000076600000240000000000014730055627020771 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/it_IT/LC_MESSAGES/thonny.mo0000644000076600000240000010767514670256721022666 0ustar00aivarannamaastaff,- 6$W)|  &!3DR&   .0&2W  x M [ o z &     ; 8!P!e!Gk! !!!! ! !! ! """ "G"##(#:#B#W#<q#%#*##$!$>$B$G$M$b$$$3$$%%+%2% ;%G%W%_%f%y%%!% %3%% &L0&}&(&)&& 'B'S'X'g'|'' ''%'''/''(.B(q( w((( (( ((((( ( ( ))%)+)0)?) E) R) ])i).{))=H* **** * *+**0+2+ 7+E+6W++++++ ,,,,#,{+,L,m,Fb--Wq.m.C7/{//7/// ///0%070O0n0 00 00 00$013 1=1A1H1Q1g1v1~1 111 11111%132/B2r2zG3%3;3($4M4d4w4 414 4455.5B5U5^5p5 555n5!6,60#7<T77,%8UR888 88n8 79C9 c9 q9 99999?9C9<:W:'u:): :::;;8;T;e;z;6;T; <<<%< *<5<L<HT<5<<<< <===;=L=]=y=:=====$=&>B>J>Z>c>k>>> > > >>> >(> ?4?9? K?BX?? ??? ?&?@ @@ -@ ;@H@)X@+@@ @+@@@ @ AA$A CA"QAtAyA A A A A AA AAA B B#B 9B DBOB2mB8B:BC+C 1C0>CoCCCC C CCC-CD D *D4D =DGDLD aD nD)|DDDDD$D EEEE$E 7EnEE!E EEF:F -G;GbG^CHjHk IyI/IIuJJ"JJJJ!J JK'K9K0BK sK}K KKKKKKKK K2L%:L!`LLL LLL(L.LMLM]MBoMMBNZNOC1OuO zO OO OO1O%O%OV#PIzP PP PP sRR*RER SS3SJSEeS+S-S]T$cT T TTTT;T;UC>UU UUUU{U[VmV VV6V#VV WW"%WNHWWWWTW'X8X?XGX NX[XrXXX5YGYaYPjYYY YY"Y?Z)]Z:ZZZ Z [[[[09[)j[([E[&\*\I\^\ f\s\\\ \\\\'\ ]0*][]Ky]]']&^-^L^Q[^^ ^^^^^^._A_!Y_7{__1_` ``#` *`4`9`H`h`y`~`````````a aa'+a>Saa?Ebbbbb bbEb%cD*cocucc<cc"c!d"8d$[dddddddS5m,tmmmmmAm%>ndn~nnnn nnn oo=oUoo6p5 qI@qq8-rSfrrrr rxrXs-kss ssssss@sa ! ;EW g- ǀ ր 26J. 7yF* G0x@eɅh/ 96p>Pb ",Έ 8$ ]h p|͉ 015+g  Ȋ-ӊ79Y@ F%Kʍ (1 7E4I*~*cԎV8  %d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: it Language-Team: it Plural-Forms: nplurals=2; plural=(n != 1); MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d elementi%s non sembra un file di testo(riavvia Thonny dopo aver cambiato questo)(usato quando si clicca il bottone Debug nella barra degli strumenti)Informazioni su BirdseyeInformazioni su ThonnyAttiva l'ambiente virtualeInstallazione avanzata/aggiornamento/ritorno alla versione precedenteConsenti solo una singola istanza di ThonnyConsenti l'esecuzione di programmi senza nomeConsenti l'accesso alle librerie (ad es. al di fuori della directory principale degli script)Sei sicuro di volerlo disinstallare?AssistenteAttributiAutenticazioneAutoreAuto-completamentoProponi automaticamente suggerimenti durante la digitazioneMostra automaticamente la documentazione per i suggerimentiMostra automaticamente le info del parametro dopo aver digitato '('IndietroTorna a %sTorna al riquadro attualeIl back-end non è prontoDirectory non validaBirdseye è un debugger Python che deve essere installato separatamente. Vuoi aprire la pagina di aiuto e saperne di più?Porta di BirdseyeSfoglia i pacchettiBugtrackerImpossibile chiudereImpossibile trovare il nome del pacchetto dall'elenco:Impossibile trovare un disco adattoAnnullaAnnullamentoMAIUSCOLO/minuscoloCambia la dimensione del carattereCambia la directory di lavoro nella directory degli script mentre Esegui/DebugCircuitPython (generico)Dispositivo CircuitPythonPulisciPulisci la shell prima di iniziare un nuovo processo (Run ,Debug, Stop/Restart, ...)Pulisci la shellCliccaClicca ChiudiChiudi tuttoChiudi le altre schedeComando non disponibileCommentaLa configurazione è stata aggiornata. Riavvia Thonny per iniziare a lavorare in modalità normale. (Vedi Strumenti → Opzioni → Generale se poi cambi idea.)Configura %s fileConfigura l'interprete...ConfermaCollega il dispositivo al computer e seleziona la porta corrispondente qui sottoCopiaCopia negli appuntiSto copiandoSto copiando %s su %sImpossibile trovare la definizioneImpossibile trovare il disco '%s'. Vuoi localizzarlo tu stesso?Impossibile trovare il pacchetto da PyPI.Impossibile trovare le informazioni sul pacchetto da PyPI.Impossibile salvareCreazione directorySto creando un ambiente virtualeTagliaDatiDebugDebug dello script correnteEsegui il debug dello script corrente (birdseye)Debug dello script corrente (più veloce)Debug dello script corrente (più bello)Modalità debug (fornisce informazioni diagnostiche più dettagliate)Diminuisci la dimensione del carattereDeindenta le linee selezionatePassword predefinitaEliminaEliminazioneEliminazione di %sVersione desiderataDettagliDispotivoIntendevi '%s'?Proprietà della cartellaDisabilita i suoni di notificaControlli disabilitati (un id per riga)DisconnettiVuoi ancora usare questo nome per questo script?Vuoi anche chiudere l'editor?Eliminare il contenuto dell'editor corrente e ricaricare il file dal disco?Vuoi sovrascrivere '%s'?Vuoi salvare il file prima di chiudere?Vuoi salvare i file prima di chiudere?Ancora le finestre dell'utenteDocumentazioneNon dimenticare che main.py funziona solo senza lo script principale incorporato.GiùScarica in %sSto scaricando %s in %sModificaEditorCarattere dell'editorInserisci un interoInserisci il nome per la nuova directory in %sInserisci un nuovo nomeImmetti la stringa da sostituire.Inserisci la passphrase della tua chiave privata per {}Inserisci la password per {}Variabili d'ambiente (una CHIAVE=VALORE per riga)ErroreCodice di errore:Errore:EventiEccezioneEsciEsci da ThonnyEsporta registri di utilizzo...Modifica esternaFileIl file esiste giàIl file è sparitoIl file è apertoNome del file:Proprietà del fileFileTrovaTrova e sostituisciTrova:Vai all'editorConcentra suVai alla shellModalità di ridimensionamento del fontPer eseguire il debug, il programma deve essere prima salvato.Per ragioni di efficienza, la shell evita di mostrare per intero righe molto lunghe (vedi Strumenti => Opzioni => Shell). Qui puoi interagire con il frammento di testo originale.Impossibile trovare il disco '%s'. Vuoi localizzarlo tu stesso?Schermo interoFunzioneChiamata di funzione a %sGeneraleVai alla rigaVai alla riga...Errore di autorizzazione ottenuto durante il tentativo di caricare %sHeapLa modalità Heap è attiva. Chiudi la scheda Heap per disattivarla.AiutoContenuti dell'aiutoNascondi i file nascostiEvidenzia la riga corrente (richeide il riavvio dell'editor)Evidenzia le variabili localiEvidenzia i nomi che corrispondonoEvidenzia le parentesiEvidenzia gli elementi di sintassiEvidenzia i caratteri di tabulazioneHomeHomepageIDINSTALLACarattere di IOSe si tratta di un file di testo puoi impostarne l'apertura con Thonny cliccandoci col tasto destro e selezionando 'Configura files di tipo ...'.Se l'ultimo comando ha generato un'eccezione, questa vista mostrerà lo stacktrace.Se il file deve essere aperto in un'app esterna, scaricalo in una directory locale e aprilo da lì!Se non riesci a trovarlo potresti aver bisgno di installare un driver USB adatto.Se non sai dove prendere i pacchetti, allora dovresti cercare nell'Indice dei Pacchetti Python. Inizia inserendo il nome del pacchetto nella casella di ricerca e premi INVIO.Se chiami questo script '%s', non sarai in grado di importare il modulo della libreria chiamato '%s'Se inserisci le virgolette in una variabile di ambiente, le virgolette faranno parte del valore. Intendevi questo?Se lo desideri ancora, installalo dalla riga di comando.Aumenta la dimensione del carattereIndenta le linee selezionateIndentazione con caratteri di tabulazione (non raccomandato con Python)IndiceInfoInformazioniInstallaInstalla CircuitPythonInstalla MicroPythonInstalla da PyPIInstalla da file localeInstalla dal file requirementsInstalla o aggiorna %sInstalla su:Versione installata:InstallazioneInstallazione di '%s'InterpreteInterrompi l'esecuzioneInterrompi il programma quando avviene la connessioneDentroMantieni aperta la finestra del terminale al termine del processo PythonChiaveID chiaveLinguaUltima versione stabileUltima versioneLicenzaRigaNumero di rigaCaricaSto caricandoCaricamento %sPython 3 LocaleVariabili localiPosizioneRegistra gli eventi di utilizzo del programmaSembra che '%s' sia stato eliminato o spostato.Sembra che '%s' sia stato modificato al di fuori dell'editor.Sembra che questo file o cartella non sia scrivibile.Sembra che tu stia installando un pacchetto relativo a Thonny. Se intendevi installare un plugin Thonny, allora dovresti scegliere invece 'Strumenti → Gestisci plugin...' Sei sicuro di voler installare %s per il back-end?Creato presso Università di Tartu, Estonia, con l'aiuto della comunità open source, Fondazione Raspberry Pi e Cibernetica ASRendi eseguibili gli script shebang salvatiAssicurati che MicroPython sia stato installato sul micro:bit.Rendi eseguibili gli script shebang caricatiGestisci i pacchetti per %sGestisci pacchetti...Gestisci i plug-in...Vista massimizzataLunghezza massima dei frammenti di linea prima della compressioneNumero massimo di linee da mantenere.Può rallentare il debug.MicroPython (SSH)MicroPython (generico)MicroPython (locale)Dispositivo MicroPythonModificatoSpostare %s nel Cestino?Sposta/Rinomina ...Sposta nel CestinoSpostamento di %s nel CestinoSpostamento nel CestinoNB! La chiusura automatica deve essere abilitata nelle impostazioni del Terminale (Profili → Shell → Quando termina la shell)NB! Il pulsante di selezione dei file potrebbe non funzionare correttamente quando si selezionano gli eseguibili da un ambiente virtuale. In questo caso scegli invece lo script 'activate' dell'interprete (o inserisci il percorso direttamente al box)!NB! Valori elevati possono causare scarse prestazioni!NB! Riavvia Thonny dopo aver cambiato queste opzioni!NB! Alcuni elementi dello stile cambiano solo dopo aver riavviato Thonny!NB! Potrebbe essere disponibile un'altra versione compatibile con l'attuale versione di Thonny. Clicca sul pulsante '...' per scegliere la versione da installare.NB! Thonny supporta solo Python versione %s e successiveNB! Devi riavviare Thonny dopo aver installato/aggiornato/disinstallato un plug-in.NomeNuovoNuova cartellaNuovo fileAnche i nuovi pacchetti verranno installati in questa directory. Altre sedi devono essere gestite con mezzi alternativi.Oggetto successivoNessuna riga contrassegnata con #todo trovataNon disponibileNon connessoNon supportatoNoteNiente di selezionatoOKAnalizzatore di oggettiApri automaticamente l'Assistente quando ha avvisi per il codiceApri automaticamente l'Assistente quando il programma si arresta in modo anomalo con un'eccezioneApri la cartella dei dati di Thonny...Apri la cartella di programma di Thonny...Apri e chiudi la vista Stack automaticamenteApri i valori valutati nell'Analizzatore di oggettiApri da %sApri in ThonnyApri nell'editor di testo di ThonnyApri nell'app esterna predefinitaApri nell'app di sistema predefinitaApri nel file manager di sistemaApri replayer...Apri shell di sistema...Apri...L'apertura di file remoti in applicazioni esterne non è supportata.Apre la vista Stack alla prima chiamata e la chiude quando il programma ritorna al frame principale.Opzioni...FuoriStrutturaSopraSovrascrivere?Sovrascrivi il tema '%s'PacchettoIl pacchetto '{}' è necessario per l'installazione e la disinstallazione di altri pacchetti.Il gestore dei pacchetti non è disponibile per questo interpreteDirectory dei pacchettiPasswordIncollaImpossibile incollarePercorsoEsegui i controlli MyPyEsegui i controlli Pylint selezionatiErrore di autorizzazioneErrore di autorizzazionePer favore controlla lo spelling!PlotterIl plotter visualizza serie di numeri stampati nella Shell.PortaPorta o WebREPLPotenziale problemaDebug preferitoPreparazioni (salta la parte su VS Code)Presenta Python REPL al termine del programmaAnteprimaOggetto precedenteStampa...ProblemaProblema durante il caricamento del fileArgomenti del programmaArgomenti del programma:Albero del programmaProprietàPagina PyPIModalità Pygame ZeroEseguibile PythonFile PythonI file Python di solito hanno estensione .py.Interpreti PythonChiudiVuoi veramente disinstallare?File recentiLunghezza massima consigliata della linea (0 per disattivare la linea di margine)AggiornaModalitá regolarePython 3 remoto (SSH)RinominaRinomina '%s'Riapri tutti i file dalla sessione precedenteSostituisciSostituisci tuttoSostituisci le tabulazioni con gli spaziSostituisci con:Sostituisci e trovaSegnalazione di problemiRichiedi suggerimenti con il tasto Tab nella shellRichiedi suggerimenti con il tasto Tab negli editorRichiedeRichiede:Riavvia l'interprete prima di eseguire uno scriptRiprendiEseguiEsegui & DebugEsegui/RiprendiEsegui lo script correnteEsegui lo script corrente nel terminaleEsegui fino al cursoreEsecuzione dello script corrente nel terminaleSalvaSalva tutti i fileSalva alla ChiusuraSalva come...Salva una copia...Salva passwordSalva in %sSto salvandoSalvataggio in %sCerca micropython-lib e PyPICerca in PyPIRisultati della ricercaRicerca in corsoVedi Aiuto per i dettagli.Seleziona tuttoSeleziona tuttoSeleziona un elemento e riprova!Seleziona una directory vuota per un nuovo ambiente virtualeSeleziona se i file di dialogo vanno dietro la finestra principaleLa directory selezionata non è vuota. Selezionane un'altra o annulla.Invia un EOF/Riavvio softShellMostra il plotterMostra le chiamate alle funzioni (frames) in finestre separateMostra i file nascostiMostra i numeri di rigaMostra info sui parametriGrandezzaDimensione (byte)Codice sorgenteTesto schiacciato (%d caratteri)StackInizia selezionando il pacchetto da sinistra.AvviamentoPasso indietroPasso dentroPasso fuoriPasso sopraFermaFerma/Riavvia il backendInfo sull'archiviazioneSpazio di archiviazioneSpazio di archiviazione su questa unità o file systemIndiceSupportoSupporta l'UcrainaPassa alla modalità regolareSincronizza l'ora in real time del dispositivoTema della sintassiTODOObbiettivoTerminaleEmulazione di terminaleLa risposta èLa rappresentazione sopra è un valore approssimativo di questo float. Il valore esatto memorizzato è %s che è circa %sIl testo specificato non è stato trovato!Temi & FontCi sono cartelle in conflittoQuesto riquadro serve per le tue note di lavoro -- istruzioni di assegnazione, frammenti di codice, qualunque cosa. Il tutto verrà salvato automaticamente e caricato quando aprirai Thonny la prossima volta. Sentiti libero di cancellare questo testo per fare spazio alle tue note.Questo comando non è disponibile se Thonny è eseguito tramite FlatpakQuesto computerQuesta finestra di dialogo serve per gestire i plug-in Thonny e le loro dipendenze. Se vuoi installare i pacchetti per i tuoi programmi, scegli 'Strumenti → Gestisci i pacchetti...'Questa finestra di dialogo elenca tutti i pacchetti disponibili, ma consente l'aggiornamento e la disinstallazione solo dei pacchetti daQuesta non sembra essere una libreria di MicroPython/CircuitPython. Sei sicuro di volerla installare?Questo file è già aperto in Thonny. Se vuoi salvare con questo nome, chiudi prima l'editor esistente!Questo file sembra avere problemi con la codifica. Assicurati che sia in UTF-8 o che contenga un suggerimento di codifica appropriato.Questo è un commentoQuesto pacchetto richiede una versione diversa di Thonny:Questo programma viene fornito ASSOLUTAMENTE SENZA GARANZIA! È un software gratuito e sei il benvenuto a ridistribuirlo a determinate condizioni, vedi https://opensource.org/licenses/MIT per i dettagliOpzioni di ThonnyPlug-in di ThonnyPlugin Thonny senza requisitiPython di ThonnyAttiva commentiStrumentiProva ad aprirlo con File => Apri.Prova a determinare la porta automaticamenteModalità UIFattore di scala UITema UIDeseleziona se desideri un'esperienza più tradizionale.DecommentaAnnullaDisinstallaDisinstallazione di '%s'Requisiti non idoneiSuAggiornaAggiorna le dipendenzeAggiorna o installaAggiornamento di '%s'Carica in %sUsa il comando "Stop" per annullare il debuggingUsa le finestre di dialogo di Tk invece di ZenityUsa l'ora locale nell'orologio in real timeValoreID valoreVariabiliCronologia delle versioniVisualizzaVisualizza lo script corrente su Python TutorAvvisa se un modulo utente oscura un modulo di libreriaAvvisoCosa fare con un file %s quando fai doppio clic su di esso nel browser di file di Thonny?Dove salvare?Quale tipo di interprete dovrebbe usare Thonny per eseguire il codice?Con l'interprete corrente puoi solo sfogliare i pacchetti qui. Utilizza 'Strumenti --> Apri la shell di sistema...' per installarli, aggiornarli o disinstallarli.A capo automatico (può essere lento)È possibile attivare un ambiente virtuale esistente anche tramite il menu di scelta rapida con il tasto destro del mouse durante la navigazione dei file, quando si seleziona una cartella dell'ambiente virtuale, o il file 'pyveng.cfg' all'interno.Devi selezionare un file!È necessario arrestare il programma prima di avviare il gestore pacchetti.Zoomtutti i filebla, blabytesspazio liberoquicerca il nome del dispositivo, "USB Serial" o "UART"nessuna directory lib assoluta in sys.pathsupporta i colori e gli stili ANSI di baseper individuare e installare il file del pacchetto (di solito con estensione .whl, .tar.gz o .zip).per individuare il file requirements.txt e installare i pacchetti specificati in esso.spazio totalestringa_non_chiusaspazio usato././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/it_IT/LC_MESSAGES/thonny.po0000644000076600000240000015725114626075445022667 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: it\n" #: thonny/workbench.py:375 msgid "File" msgstr "File" #: thonny/workbench.py:376 msgid "Edit" msgstr "Modifica" #: thonny/workbench.py:377 msgid "View" msgstr "Visualizza" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "Esegui" #: thonny/workbench.py:379 msgid "Tools" msgstr "Strumenti" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "Aiuto" #: thonny/workbench.py:598 msgid "Exit" msgstr "Esci" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "Diminuisci la dimensione del carattere" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "Vai all'editor" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "Vai alla shell" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "Vista massimizzata" #: thonny/workbench.py:668 msgid "Full screen" msgstr "Schermo intero" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "Argomenti del programma" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Informazioni su Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Creato presso\n" "Università di Tartu, Estonia,\n" "con l'aiuto della\n" "comunità open source,\n" "Fondazione Raspberry Pi\n" "e Cibernetica AS" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Questo programma viene fornito\n" "ASSOLUTAMENTE SENZA GARANZIA!\n" "È un software gratuito e sei il benvenuto a ridistribuirlo \n" "a determinate condizioni, vedi \n" "https://opensource.org/licenses/MIT \n" "per i dettagli" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "Cronologia delle versioni" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "Segnalazione di problemi" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Apri automaticamente l'Assistente quando il programma si arresta in modo anomalo con un'eccezione" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Apri automaticamente l'Assistente quando ha avvisi per il codice" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Esegui i controlli Pylint selezionati" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Esegui i controlli MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Controlli disabilitati (un id per riga)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistente" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "Auto-completamento" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "Interprete" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Informazioni su Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye è un debugger Python che deve essere installato separatamente.\n" "\n" "Vuoi aprire la pagina di aiuto e saperne di più?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Esegui il debug dello script corrente (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "Attiva commenti" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "Commenta" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "Decommenta" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Annulla" #. Sui software tradotti c'è scritto "Ripristina", NON "Ripeti" #: thonny/plugins/common_editing_commands.py:33 #, fuzzy msgid "Redo" msgstr "Ripristina" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "Taglia" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "Copia" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "Incolla" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Seleziona tutto" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "Esegui fino al cursore" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "Impossibile chiudere" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Usa il comando \"Stop\" per annullare il debugging" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ancora le finestre dell'utente" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Evidenzia i nomi che corrispondono" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Evidenzia le variabili locali" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Evidenzia le parentesi" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Evidenzia gli elementi di sintassi" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Evidenzia la riga corrente (richeide il riavvio dell'editor)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Mostra i numeri di riga" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Lunghezza massima consigliata della linea\n" "(0 per disattivare la linea di margine)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Esporta registri di utilizzo..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Eventi" #: thonny/plugins/files.py:609 msgid "Files" msgstr "File" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "Trova e sostituisci" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Trova:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "Sostituisci con:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "MAIUSCOLO/minuscolo" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "Su" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "Giù" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "Trova" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "Sostituisci" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "Sostituisci e trova" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "Sostituisci tutto" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "Immetti la stringa da sostituire." #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "Il testo specificato non è stato trovato!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Consenti solo una singola istanza di Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Riapri tutti i file dalla sessione precedente" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Disabilita i suoni di notifica" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Modalità di ridimensionamento del font" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "La modalità Heap è attiva.\n" "Chiudi la scheda Heap per disattivarla." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Lingua" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Questo riquadro serve per le tue note di lavoro -- istruzioni di assegnazione, frammenti di codice, qualunque cosa.\n" "\n" "Il tutto verrà salvato automaticamente e caricato quando aprirai Thonny la prossima volta.\n" "\n" "Sentiti libero di cancellare questo testo per fare spazio alle tue note." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Note" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Oggetto precedente" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Oggetto successivo" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "Analizzatore di oggetti" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Struttura" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Modalità Pygame Zero" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "Disinstalla" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "Chiudi" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Clicca " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "qui" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "Aggiorna" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "Installa" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "Impossibile trovare il pacchetto da PyPI." #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "Ultima versione stabile" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "Ultima versione" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "Indice" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "Autore" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "Homepage" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "Bugtracker" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "Documentazione" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "Pagina PyPI" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "Richiede" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "Vuoi veramente disinstallare?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "Sei sicuro di volerlo disinstallare?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Torna al\n" "riquadro attuale" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variabili" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "Questo computer" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "Aggiorna" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "Concentra su" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "Errore" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "Devi selezionare un file!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "Sovrascrivere?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "Vuoi sovrascrivere '%s'?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "Nuovo" #: thonny/editors.py:671 msgid "Open..." msgstr "Apri..." #: thonny/editors.py:673 msgid "Load" msgstr "Carica" #: thonny/editors.py:682 msgid "Recent files" msgstr "File recenti" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "Chiudi tutto" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "Salva" #: thonny/editors.py:739 msgid "Save as..." msgstr "Salva come..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "Salva una copia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Opzioni di Thonny" #: thonny/running.py:160 msgid "Run current script" msgstr "Esegui lo script corrente" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "Esegui lo script corrente nel terminale" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "Ferma/Riavvia il backend" #: thonny/running.py:205 msgid "Stop" msgstr "Ferma" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "Interrompi l'esecuzione" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "Invia un EOF/Riavvio soft" #: thonny/running.py:240 msgid "Disconnect" msgstr "Disconnetti" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Interpreti Python" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "tutti i file" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "Seleziona una directory vuota per un nuovo ambiente virtuale" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "Directory non valida" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "La directory selezionata non è vuota.\n" "Selezionane un'altra o annulla." #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "Sto creando un ambiente virtuale" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Pulisci la shell" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:317 msgid "Clear" msgstr "Pulisci" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Mostra il plotter" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Per ragioni di efficienza, la shell evita di mostrare per intero righe molto lunghe (vedi Strumenti => Opzioni => Shell).\n" "Qui puoi interagire con il frammento di testo originale." #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "A capo automatico (può essere lento)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "Copia negli appunti" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "Testo schiacciato (%d caratteri)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Il plotter visualizza serie di\n" "numeri stampati nella Shell." #: thonny/shell.py:1885 msgid "See Help for details." msgstr "Vedi Aiuto per i dettagli." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "Chiudi le altre schede" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "Sto copiando" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Sto copiando\n" " %s\n" "su\n" " %s" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "Annulla" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "Seleziona tutto" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "Shell" #: thonny/workbench.py:608 msgid "Options..." msgstr "Opzioni..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "Aumenta la dimensione del carattere" #: thonny/workbench.py:679 msgid "Change font size" msgstr "Cambia la dimensione del carattere" #: thonny/workbench.py:680 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Esci da Thonny" #: thonny/workbench.py:692 msgid "Quit" msgstr "Chiudi" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "Sovrascrivi il tema '%s'" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "Argomenti del programma:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "Modalitá regolare" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "La configurazione è stata aggiornata. Riavvia Thonny per iniziare a lavorare in modalità normale.\n" "\n" "(Vedi Strumenti → Opzioni → Generale se poi cambi idea.)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "Albero del programma" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "Riprendi" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "Esegui/Riprendi" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "Debug dello script corrente" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "Debug" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "Debug dello script corrente (più bello)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "Debug dello script corrente (più veloce)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "Passo sopra" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "Sopra" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "Passo dentro" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "Dentro" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "Passo fuori" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "Fuori" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "Passo indietro" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "Indietro" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "Stack" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "Eccezione" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Registra gli eventi di utilizzo del programma" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Modalità debug (fornisce informazioni diagnostiche più dettagliate)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Modalità UI" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Fattore di scala UI" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Riavvia Thonny dopo aver cambiato queste opzioni!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Generale" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALLA" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Sfoglia i pacchetti" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Con l'interprete corrente puoi solo sfogliare i pacchetti qui.\n" "Utilizza 'Strumenti --> Apri la shell di sistema...' per installarli, aggiornarli o disinstallarli." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Directory dei pacchetti" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installa da PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Se non sai dove prendere i pacchetti, allora dovresti cercare nell'Indice dei Pacchetti Python. Inizia inserendo il nome del pacchetto nella casella di ricerca e premi INVIO." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "per individuare il file requirements.txt e installare i pacchetti specificati in esso." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Clicca" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "per individuare e installare il file del pacchetto (di solito con estensione .whl, .tar.gz o .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Aggiorna o installa" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Inizia selezionando il pacchetto da sinistra." #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Questa finestra di dialogo elenca tutti i pacchetti disponibili, ma consente l'aggiornamento e la disinstallazione solo dei pacchetti da" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Anche i nuovi pacchetti verranno installati in questa directory. Altre sedi devono essere gestite con mezzi alternativi." #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "Versione installata:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "Installa su:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "Per favore controlla lo spelling!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "Impossibile trovare le informazioni sul pacchetto da PyPI." #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "Codice di errore:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "Impossibile trovare il nome del pacchetto dall'elenco:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Il pacchetto '{}' è necessario per l'installazione e la disinstallazione di altri pacchetti." #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "Pacchetto" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "Gestisci i pacchetti per %s" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "Conferma" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Sembra che tu stia installando un pacchetto relativo a Thonny. \n" "Se intendevi installare un plugin Thonny, allora dovresti scegliere\n" "invece 'Strumenti → Gestisci plugin...'\n" "\n" "Sei sicuro di voler installare %s per il back-end?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! Potrebbe essere disponibile un'altra versione compatibile con l'attuale versione di Thonny. Clicca sul pulsante '...' per scegliere la versione da installare." #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "Plugin Thonny senza requisiti" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "Requisiti non idonei" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "Questo pacchetto richiede una versione diversa di Thonny:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "Se lo desideri ancora, installalo dalla riga di comando." #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! Devi riavviare Thonny dopo aver installato/aggiornato/disinstallato un plug-in." #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Plug-in di Thonny" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "Installazione avanzata/aggiornamento/ritorno alla versione precedente" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "Versione desiderata" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "Aggiorna le dipendenze" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "Richiede:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "Errore:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "Gestisci pacchetti..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "Gestisci i plug-in..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "Apri replayer..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "Cambia la directory di lavoro nella directory degli script mentre Esegui/Debug" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "Mostra le chiamate alle funzioni (frames) in finestre separate" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "Deseleziona se desideri un'esperienza più tradizionale." #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "Apri e chiudi la vista Stack automaticamente" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Apre la vista Stack alla prima chiamata e la chiude quando il programma ritorna al frame principale." #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Consenti l'accesso alle librerie (ad es. al di fuori della directory principale degli script)" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "Può rallentare il debug." #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "Debug preferito" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(usato quando si clicca il bottone Debug nella barra degli strumenti)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Porta di Birdseye" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(riavvia Thonny dopo aver cambiato questo)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "Esegui & Debug" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Emulazione di terminale" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "supporta i colori e gli stili ANSI di base" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Numero massimo di linee da mantenere." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "NB! Valori elevati possono causare scarse prestazioni!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Lunghezza massima dei frammenti di linea prima della compressione" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Esecuzione dello script corrente nel terminale" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Presenta Python REPL al termine del programma" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Mantieni aperta la finestra del terminale al termine del processo Python" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! La chiusura automatica deve essere abilitata nelle impostazioni del Terminale\n" "(Profili → Shell → Quando termina la shell)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminale" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "Tema UI" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "Tema della sintassi" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "Carattere dell'editor" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "Carattere di IO" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "Anteprima" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "Questo è un commento" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "La risposta è" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "stringa_non_chiusa" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Alcuni elementi dello stile cambiano solo dopo aver riavviato Thonny!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "Inserisci un intero" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "Temi & Font" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Apri la cartella di programma di Thonny..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Apri la cartella dei dati di Thonny..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Home" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Contenuti dell'aiuto" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "Dispositivo CircuitPython" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "Dispositivo MicroPython" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "Collega il dispositivo al computer e seleziona la porta corrispondente qui sotto" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "cerca il nome del dispositivo, \"USB Serial\" o \"UART\"" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Se non riesci a trovarlo potresti aver bisgno di installare un driver USB adatto." #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "Porta" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "Prova a determinare la porta automaticamente" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (generico)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Stampa..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Apri shell di sistema..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "Dettagli" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installa dal file requirements" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installa da file locale" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Questa finestra di dialogo serve per gestire i plug-in Thonny e le loro dipendenze.\n" "Se vuoi installare i pacchetti per i tuoi programmi, scegli 'Strumenti → Gestisci i pacchetti...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generico)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "Indenta le linee selezionate" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "Deindenta le linee selezionate" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "Passa alla\n" "modalità\n" "regolare" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Assicurati che MicroPython sia stato installato sul micro:bit." #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "Non dimenticare che main.py funziona solo senza lo script principale incorporato." #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Impossibile trovare il disco '%s'. Vuoi localizzarlo tu stesso?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Impossibile trovare il disco '%s'. Vuoi localizzarlo tu stesso?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "Impossibile trovare un disco adatto" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d elementi" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "Sposta nel Cestino" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "Elimina" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "Nuova cartella" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "Proprietà" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "Spazio di archiviazione" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "Percorso" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "Proprietà della cartella" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "Proprietà del file" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "Grandezza" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "Modificato" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "Eliminazione di %s" #: thonny/editors.py:262 msgid "Loading" msgstr "Sto caricando" #: thonny/editors.py:395 msgid "Saving" msgstr "Sto salvando" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Carica in %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Sto scaricando %s in %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Scarica in %s" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "Apri nel file manager di sistema" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "Nascondi i file nascosti" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "Mostra i file nascosti" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Apri in Thonny" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "Apri nell'app di sistema predefinita" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "Configura %s file" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Cosa fare con un file %s quando fai doppio clic su di esso nel browser di file di Thonny?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "Eliminazione" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "Creazione directory" #: thonny/editors.py:260 msgid "Loading %s" msgstr "Caricamento %s" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "Salvataggio in %s" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "Salva tutti i file" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "Configura l'interprete..." #: thonny/workbench.py:1591 msgid "Device" msgstr "Dispotivo" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "Annullamento" #: thonny/workdlg.py:270 msgid "Starting" msgstr "Avviamento" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "Autenticazione" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Inserisci la passphrase della tua chiave privata per\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "Inserisci la password per\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "La rappresentazione sopra è un valore approssimativo di questo float. Il valore esatto memorizzato è %s che è circa %s" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "Risultati della ricerca" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "Ricerca in corso" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "Installazione di '%s'" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "Aggiornamento di '%s'" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "Disinstallazione di '%s'" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "Installazione" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "Il gestore dei pacchetti non è disponibile per questo interprete" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "Non supportato" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "Non disponibile" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "È necessario arrestare il programma prima di avviare il gestore pacchetti." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Apri i valori valutati nell'Analizzatore di oggetti" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Eseguibile Python" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! Il pulsante di selezione dei file potrebbe non funzionare correttamente \n" "quando si selezionano gli eseguibili da un ambiente virtuale.\n" "In questo caso scegli invece lo script 'activate' dell'interprete (o inserisci il percorso direttamente al box)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 remoto (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Non connesso" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (locale)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "nessuna directory lib assoluta in sys.path" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "Cerca in PyPI" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Apri nell'editor di testo di Thonny" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "Spazio di archiviazione su questa unità o file system" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "spazio totale" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "spazio usato" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "spazio libero" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "Info sull'archiviazione" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "Sostituisci le tabulazioni con gli spazi" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Evidenzia i caratteri di tabulazione" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Indentazione con caratteri di tabulazione (non raccomandato con Python)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "Nome" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "Dimensione (byte)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "Inserisci il nome per la nuova directory in\n" "%s" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "Niente di selezionato" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "Seleziona un elemento e riprova!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "Apri da %s" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "Salva in %s" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "Nome del file:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "ID valore" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "Valore" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "Salva password" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "Chiamata di funzione a %s" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "Variabili locali" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "Funzione" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "Posizione" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Se l'ultimo comando ha generato un'eccezione, questa vista mostrerà lo stacktrace." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Dati" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attributi" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "Indice" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "ID chiave" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "Chiave" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Torna a\n" "%s" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "Porta o WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "Password" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "Codice sorgente" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Usa le finestre di dialogo di Tk invece di Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Seleziona se i file di dialogo vanno dietro la finestra principale" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Variabili d'ambiente (una CHIAVE=VALORE per riga)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "Nuovo file" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "Rinomina" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "Rinomina '%s'" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "Inserisci un nuovo nome" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "Impossibile incollare" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "Ci sono cartelle in conflitto" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "Il file esiste già" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Se si tratta di un file di testo puoi impostarne l'apertura con Thonny cliccandoci col tasto destro e selezionando 'Configura files di tipo ...'." #: thonny/editors.py:38 msgid "Python files" msgstr "File Python" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:150 msgid "File is gone" msgstr "Il file è sparito" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "Vuoi anche chiudere l'editor?" #: thonny/editors.py:169 msgid "External modification" msgstr "Modifica esterna" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Eliminare il contenuto dell'editor corrente e ricaricare il file dal disco?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "I file Python di solito hanno estensione .py." #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "Intendevi '%s'?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "Sposta/Rinomina ..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "Vai alla riga..." #: thonny/editors.py:1010 msgid "Line number" msgstr "Numero di riga" #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "Vuoi salvare i file prima di chiudere?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "Vuoi salvare il file prima di chiudere?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "Salva alla Chiusura" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "Comando non disponibile" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Questo comando non è disponibile se Thonny è eseguito tramite Flatpak" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "Supporta l'Ucraina" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Quale tipo di interprete dovrebbe usare Thonny per eseguire il codice?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Mostra info sui parametri" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Mostra automaticamente le info del parametro dopo aver digitato '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Proponi automaticamente suggerimenti durante la digitazione" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Mostra automaticamente la documentazione per i suggerimenti" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Richiedi suggerimenti con il tasto Tab negli editor" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Richiedi suggerimenti con il tasto Tab nella shell" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problema" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Impossibile trovare la definizione" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Pulisci la shell prima di iniziare un nuovo processo (Run ,Debug, Stop/Restart, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "Python di Thonny" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "Interrompi il programma quando avviene la connessione" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "Sincronizza l'ora in real time del dispositivo" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "Usa l'ora locale nell'orologio in real time" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "Riavvia l'interprete prima di eseguire uno script" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Questa non sembra essere una libreria di MicroPython/CircuitPython.\n" "Sei sicuro di volerla installare?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "Spostamento nel Cestino" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "Spostare %s nel Cestino?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "Spostamento di %s nel Cestino" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "Apri nell'app esterna predefinita" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "L'apertura di file remoti in applicazioni esterne non è supportata." #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Se il file deve essere aperto in un'app esterna, scaricalo in una directory locale e aprilo da lì!" #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "Sembra che '%s' sia stato eliminato o spostato." #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "Sembra che '%s' sia stato modificato al di fuori dell'editor." #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "NB! Thonny supporta solo Python versione %s e successive" #: thonny/editors.py:1010 msgid "Go to line" msgstr "Vai alla riga" #: thonny/workbench.py:703 msgid "Support" msgstr "Supporto" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "Impossibile salvare" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Avviso" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Se inserisci le virgolette in una variabile di ambiente, le virgolette faranno parte del valore.\n" "Intendevi questo?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "Installa MicroPython" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "Installa CircuitPython" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "Rendi eseguibili gli script shebang caricati" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Rendi eseguibili gli script shebang salvati" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Attiva l'ambiente virtuale" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Obbiettivo" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualizza lo script corrente su Python Tutor" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "Riga" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "Nessuna riga contrassegnata con #todo trovata" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Installa o aggiorna %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Python 3 Locale" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "È possibile attivare un ambiente virtuale esistente anche tramite il menu di scelta rapida con il tasto destro del mouse durante la navigazione dei file, quando si seleziona una cartella dell'ambiente virtuale, o il file 'pyveng.cfg' all'interno." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Preparazioni (salta la parte su VS Code)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Password predefinita" #: thonny/running.py:392 msgid "Information" msgstr "Informazioni" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "Per eseguire il debug, il programma deve essere prima salvato." #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s non sembra un file di testo" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "Problema durante il caricamento del file" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "Questo file sembra avere problemi con la codifica.\n" "\n" "Assicurati che sia in UTF-8 o che contenga un suggerimento di codifica appropriato." #: thonny/editors.py:295 msgid "File is open" msgstr "Il file è aperto" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "Questo file è già aperto in Thonny.\n" "\n" "Se vuoi salvare con questo nome,\n" "chiudi prima l'editor esistente!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "Errore di autorizzazione" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "Sembra che questo file o cartella non sia scrivibile." #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "Il back-end non è pronto" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "Dove salvare?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "Potenziale problema" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "Se chiami questo script '%s', non sarai in grado di importare il modulo della libreria chiamato '%s'" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "Vuoi ancora usare questo nome per questo script?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "Errore di autorizzazione ottenuto durante il tentativo di caricare\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "Prova ad aprirlo con File => Apri." #: thonny/editors.py:1057 msgid "Permission error" msgstr "Errore di autorizzazione" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "Consenti l'esecuzione di programmi senza nome" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "Licenza" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "Avvisa se un modulo utente oscura un modulo di libreria" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "Cerca micropython-lib e PyPI" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.938513 thonny-4.1.7/thonny/locale/ja_JP/0000755000076600000240000000000014730055627017157 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1094854 thonny-4.1.7/thonny/locale/ja_JP/LC_MESSAGES/0000755000076600000240000000000014730055627020744 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1726045649.0 thonny-4.1.7/thonny/locale/ja_JP/LC_MESSAGES/thonny.mo0000644000076600000240000012011714670256721022623 0ustar00aivarannamaastaff<= F$g)  &!!CDb&   .062g  x ] k   &     ; !H!`!u!G{! !!!! ! !! """" "G"3#8#J#R#g#<#%#*#$$1$N$R$W$]$r$$$3$%%*%;%B% K%W%g%o%v%%%!% %3%%&L@&&(&)&' 'B 'c'h'w''' ''%'''/(7(.R(( ((( (( ((((( ) ) )%)5);)@)O) U) b) m)y).))=X* **** * *+* +0+B+ G+U+6g+++++,,,(,+,3,{;,L,m-Fr--W.m.CG///7/// /0 0!050G0_0~0 00 00 00$0131M1Q1X1a1w111 111 11111%132/R22zW3%3;3(44]4t44 414 445(5>5R5e5n55 555n516,7037<d77,58Ub888 88n8 G9S9 s9 9 99999?9C:L:g:':): :::;-;H;d;u;;6;T; <)<-<5< :<E<\<Hd<5<<<= ===,=K=\=m==:=====$>&+>R>Z>j>s>{>>> > > >>> >(?0?D?I? [?Bh??? ??? ?&?@ @)@ B@ P@]@)m@+@@ @+@A A A A&A9A XA"fAAA A A A A AA AABB .B8B NB YBdB2B8B:B)C@C FC0SCCCCC C CCC-C,D 5D ?DID RD\DaD vD D)DDDDD$D E$E)E0E9E LEnZE!E EEF:G BGPGbG^XHjHk"II/IIJJ"JJJJ!J K4K%d ΋& 6 LVm 1Ki p*}=Í"2'B j\t1ю'0Dguݐ hȔFޔ.%Tj$ іYۖ!5 Wc ~Qܗ #9LS*i8 ͘HAP=Йԙڙ:c9jH, u21i S] v ;2۞7xF_2 B%d items%s doesn't look like a text file(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAllow only single Thonny instanceAllow running unnamed programsAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBack-end is not readyBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you still want to use this name for your script?Do you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile is openFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...Got permission error when trying to load %sHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you name your script '%s', you won't be able to import the library module named '%s'If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLicenseLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like this file or folder is not writable.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.Next objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPermission ErrorPermission errorPlease check your spelling!PlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPotential problemPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProblem loading fileProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sSearch micropython-lib and PyPISearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This file is already open in Thonny. If you want to save with this name, close the existing editor first!This file seems to have problems with encoding. Make sure it is in UTF-8 or contains proper encoding hint.This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry opening it with File => Open.Try to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyViewVisualize current script at Python TutorWarn if a user module shadows a library moduleWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Where to save to?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceProject-Id-Version: Thonny Report-Msgid-Bugs-To: EMAIL@ADDRESS POT-Creation-Date: 2024-09-11 03:37+0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: ja Language-Team: ja Plural-Forms: nplurals=1; plural=0; MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.12.1 %d アイテム%s はテキストファイルではないようです(変更後、Thonnyを再起動してください)(ツールバーのデバッグボタンをクリックすると使われます)<無題>BirdseyeについてThonnyについて仮想環境をアクティブにする高度なインストール / アップグレード / ダウングレードThonnyが1つしか起動しないようにする名前を付けていないプログラムの実行を許可するライブラリ(メインスクリプトのディレクトリ外)へのステップインを許可します本当にアンインストールしますか?アシスタントアトリビュート認証作者オートコンプリート入力中に補完を自動的に提案する補完のドキュメントを自動的に表示する「(」を入力した後にパラメーター情報を自動的に表示するバック%s に戻る現在のフレーム へ戻るバックエンドの準備が完了していません不正なディレクトリBirdseyeはPythonデバッガであり、別にインストールする必要があります。 ヘルプページを開いて詳細を確認しますか?Birdseye ポートパッケージを閲覧するバグの追跡まだ閉じられませんリストからパッケージ名が見つかりません:適切なディスクが見つかりませんキャンセルキャンセル中大文字小文字の区別フォントサイズを変更実行/デバッグ時に作業ディレクトリをスクリプトディレクトリに変更するCircuitPython (ジェネリック)CircuitPythonデバイスクリア新しいプロセスを開始する前にシェルをクリアする (実行、デバッグ、ストップ/リスタートなど)シェルをクリアClickClick 閉じるすべて閉じるその他を閉じるこのコマンドは使用不可能です。コメントアウト構成を更新しました。Thonnyを再起動すると、通常モードで開始されます。 (ツール → オプション → ジェネラル から元に戻すことができます。)%s ファイルの設定インタプリタ設定...確認デバイスをコンピュータに接続し、ポートを選択しますコピークリップボードにコピーコピー中 %s を %s へコピー中定義が見つかりませんでしたディスク '%s' が見つかりません。自分で選択しますか?PyPIでパッケージを見つけられませんでした。PyPIでパッケージ情報を見つけられませんでした。保存できませんでしたディレクトリを作成仮想環境を作成中切り取りデータデバッグ現在のスクリプトをデバッグ現在のスクリプトをデバッグ (birdseye)現在のスクリプトをデバッグ(faster)現在のスクリプトをデバッグ(nicer)デバッグモード (詳細な診断ログを提供します)文字を小さくする選択した行をデデントするデフォルトのパスワード削除削除中%s を削除中希望バージョン詳細デバイス「%s」のことですか?ディレクトリプロパティ通知音を鳴らさないようにする無効にするチェック項目 (1行につき1つの id)切断このままこの名前をスクリプトに付けますか?エディタも閉じますか?現在のエディタの内容を破棄して、ディスクからファイルを再読み込みしますか?'%s' を上書きしますか?終了する前にファイルを保存しますか?終了する前にファイルをすべて保存しますか?ユーザーウインドウをドッキングドキュメントメインスクリプトが埋め込まれていない場合のみ main.py が動くことを忘れないでください。下へ%s にダウンロード%s を %s にダウンロード中編集エディタエディタフォント整数を入力%s に作る新しいディレクトリの名前を入力新しい名前を入力置換される文字列を入力してください。秘密鍵のパスフレーズを入力してください {}パスワードを入力 {}環境変数 (1行につき1つの KEY=VALUE)エラーエラーコード:エラー:イベント例外終了Thonnyを終了使用状況ログのエクスポート...外部からの変更ファイルファイルがすでに存在しますファイルが見つかりませんファイルが開いていますファイル名:ファイルプロパティファイル検索検索と置換検索:エディタにフォーカス開くシェルにフォーカス文字の拡大縮小モードデバッグするには、まずプログラムを保存する必要があります。パフォーマンスの理由から、シェルは非常に長い行を表示することを避けています (ツール => オプション => シェル). ここで元のテキストフラグメントを操作できます。複数の '%s' ディスクが見つかりました。自分で選択しますか?全画面表示関数%s で関数呼び出しジェネラル行に移動行に移動...読み込む際にパーミッションエラーが発生しました %sヒープヒープモードがオンです。 オフにするにはヒープビューを閉じてください。ヘルプヘルプコンテンツ隠しファイルを非表示現在の行を強調表示(エディタの再起動が必要)ローカル変数を強調表示一致する名前を強調表示カッコを強調表示文法要素を強調表示タブ文字を強調表示ホームホームページIDインストールIOフォントテキスト ファイルの場合は、ファイルを右クリックして [...ファイルの設定] を選択すると、Thonny で開くように設定できます。最後のコマンドで例外が発生した場合、このビューにはスタックトレースが表示されます。ファイルを外部アプリで開く必要がある場合は、ローカル ディレクトリにダウンロードして、そこから開きます。見つからない場合には、最初にUSBドライバーをインストールする必要があります。パッケージの入手先がわからない場合は、Python Package Indexを検索するのがおすすめです。上の検索ボックスにパッケージ名を入力し、エンターキーを押してください。スクリプトに '%s' という名前を付けると、ライブラリモジュールの '%s' がインポートできなくなります環境変数の値にクオートを使用すると、クオートは値に含まれます。 これは意図したことですか?必要な場合、コマンドラインからインストールしてください。文字を大きくする選択した行をインデントするタブ文字でインデントする (Pythonでは非推奨)インデックスインフォインフォメーションインストールCircuitPythonをインストールMicroPythonをインストールPyPIからインストールローカルファイルからインストールrequirementsファイルからインストールInstall or update %sインストール先:インストールバージョン:インストール中'%s' をインストール中インタプリタ実行の中断接続時に作業中のプログラムを中断するインPythonプロセスが終わってもターミナルウインドウを開いたままにするキーキーID言語最新の安定版最新版ライセンス行行番号開く読込中%s を読込中ローカル Python 3ローカル変数位置使用状況ログを記録する'%s'は削除または移動されたため、開けません。'%s'はエディタ外で変更が加えられています。ファイルまたはフォルダが書き込み禁止のようです。Thonny関連パッケージをインストールしようとしています。 もしThonnyプラグインとしてインストールする場合は、 メニューから 'ツール → プラグインを管理...' を選択してください このままバックエンドに %s をインストールしますか?このアプリケーションは オープンソースコミュニティの Cybernetica ASと Raspberry Pi財団の助けを得て エストニアのタルトゥ大学で 作られています保存されたシバンスクリプトを実行可能にするMicroPythonがmicro:bitにインストールされていることを確認してください。アップロードされたシバンスクリプトを実行可能にする%s のパッケージを管理するパッケージを管理...プラグインを管理...最大化スクイーズする前のラインフラグメント最大長保持する行の最大値。デバッグが遅くなる可能性があります。MicroPython (SSH)MicroPython (ジェネリック)MicroPython (ローカル)MicroPythonデバイス変更%sをゴミ箱に捨てますか?移動/名前変更...ごみ箱に移動%sをゴミ箱に捨てていますゴミ箱に移動注意! 自動クローズをターミナルの設定から有効にする必要があります (プロファイル → シェル → シェル終了時)注意! 仮想環境から実行可能ファイルを選択するとファイル選択ボタンが正しく機能しない場合があります。 この場合インタプリタのかわりに 'activate' スクリプトを選択します (またはパスをボックスに入力します)!注意! 大きな値の場合パフォーマンスが低下します!注意! これらのオプションを変更したらThonnyを再起動してください!注意! 一部のスタイルはThonnyを再起動しないと反映されません!注意! 現在のバージョンと互換性のあるThonnyバージョンが利用できます。'...' ボタンをクリックしてインストールするバージョンを選択してください。注意! ThonnyはPython %s 以上のみをサポートしています。注意! プラグインのインストール / アップグレード / アンインストール後にはThonnyを再起動してください。名前新規ファイル新しいディレクトリ新しいファイル新しいパッケージもこのディレクトリにインストールされます。それ以外の場所は別の方法で管理する必要があります。次のオブジェクト#todo でマークされた行が見つかりません利用不可未接続未サポートメモ未選択OKオブジェクトインスペクタコードに警告がある場合にアシスタントを自動的に開くプログラムが例外を送出して停止したら自動的にアシスタントを開くThonnyデータフォルダを開く...Thonnyプログラムフォルダを開く...自動的にスタックビューを開閉します評価値をオブジェクトインスペクタで開く%s から開くThonnyで開くThonnyのテキストエディタで開くデフォルトの外部アプリで開くシステムデフォルトアプリを開くシステムファイルマネージャで開くリプレイヤーを開く...システムシェルを開く...ファイルを開く...外部アプリでリモート ファイルを開くことはサポートされていません。最初の呼び出しでスタックビューを開き、プログラムがメインフレームに戻ったときに閉じます。オプション...アウトアウトラインオーバー上書きしますか?テーマ '%s' を上書きしていますパッケージパッケージ '{}' は他のパッケージのインストールとアンインストールに必要です。パッケージマネージャはこのインタプリタでは利用できませんパッケージのディレクトリパスワード貼り付け貼り付けに失敗パスMypyでチェックするPylintでチェックするパーミッションエラーパーミッションエラースペルをチェックしてください!プロッタープロッターはシェルの一連の数値を 可視化します。ポートポート または WebREPL潜在的な問題優先デバッガー準備(VS Codeの部分はスキップ)プログラム終了後に Python REPL に移行するプレビュー前のオブジェクト印刷...問題ファイル読み込みの問題プログラムの引数プログラムの引数:プログラムツリープロパティPyPIページPygame ZeroモードPython実行可能ファイルPythonファイル通常、Python ファイルには拡張子 .py が付きます。Pythonインタプリタ終了本当にアンインストールしますか?最近利用したファイル1行の推奨最大文字数 (0でガイドラインを非表示)やり直す更新通常モードリモート Python 3 (SSH)リネーム'%s' をリネーム前回開いていたファイルをすべて開く置換すべて置換タブをスペースに置換する置換:置換して次を検索問題を報告シェルで Tab キーを使用して補完を要求するエディターで Tab キーを使用して補完を要求する必須必須:スクリプトを実行する前にインタプリタを再起動する再開実行実行 & デバッグ実行 / 再開現在のスクリプトを実行ターミナルで現在のスクリプトを実行カーソル位置まで実行ターミナルで現在のスクリプトを実行中保存すべてのファイルを保存閉じるときに保存名前を付けて保存...コピーを保存...パスワードを保存%s に保存保存中%s に保存中micropython-lib/PyPIで検索PyPIを検索検索結果検索中ヘルプで詳細を見る.すべてを選択すべてを選択アイテムを選択して再試行してください!新しい仮想環境用に空のディレクトリを選択しますファイルダイアログがメインウィンドウの後ろに表示されてしまう場合に選択選択したディレクトリは空ではありません。 他を選択するかキャンセルしてください。EOFを送信 / ソフトリブートシェルプロッターを表示別ウインドウに関数呼び出し(フレーム)を表示隠しファイルを表示行数を表示パラメータ情報を表示サイズサイズ(バイト)ソースコードスクイーズテキスト(%d 文字)スタック左からパッケージを選択してください。開始中ステップ バックステップ インステップ アウトステップ オーバーストップバックエンドをストップ/リスタートストレージ情報ストレージ容量このドライブまたはファイルシステムのストレージ容量概要サポートウクライナを支援してください通常 モードに 変更デバイスのリアルタイム クロックを同期するシンタックステーマTODOターゲットターミナルターミナルエミュレーション答えはこのフロートのおおよその値です。正確な値は %s でこれは約 %s です指定された文字列が見つかりません!テーマ & フォント競合するフォルダがありますここにはメモを取ることができ、例えばやることリストやコードスニペットなど、なんでも書き込めます。 書いたことは自動で保存され、次にThonnyを起動した時に読み込まれます。 この文章は消してしまっても大丈夫です。このコマンドは、Thonny が Flatpak 経由で実行されている場合は使用できませんこのコンピュータこのダイアログはThonnyプラグインとその依存関係を管理するためのものです。 あなたのプログラムで使うパッケージをインストールする場合は 'ツール → パッケージを管理...' を選択してください。このダイアログでは、利用可能なすべてのパッケージが表示されますが、アップグレードやアンインストールができるのは以下のディレクトリのパッケージだけですこれは MicroPython/CircuitPython のパッケージではないようです。 インストールしてもよろしいですか?このファイルはすでにThonnyで開いています。 この名前で保存したい場合、 既存のエディターを先に閉じてください!このファイルは、エンコードに問題があるようです。 UTF-8であるか、適切なエンコーディングヒントが含まれていることを確認してください。これはコメントこのパッケージには別のThonnyバージョンが必要です:このプログラムの使用によって起きた いかなる事象に対しても一切の保証はありません! このプログラムはフリーソフトウェアであり、 https://opensource.org/licenses/MIT に記載された条件のもとで 自由に再配布することが出来ますThonnyオプションThonnyプラグイン要件のないThonnyプラグインThonnyのPythonコメントの切り替えツールファイル => ファイルを開く からファイルを開いてみてください。ポートの自動検出を試すUIモードUIスケーリング係数UIテーマ従来のデバッガを使用する場合チェックを外してください。コメント解除元に戻すアンインストール'%s' をアンインストール中要件が不適切上へアップグレード依存関係をアップグレードするアップグレード または アンインストール'%s' をアップグレード中%s にアップロードデバッグをキャンセルするために"Stop"コマンドを使うZenityのかわりにTkファイルダイアログを利用するリアルタイム クロックで現地時間を使用する値値ID変数バージョン履歴表示Python Tutor で現在のスクリプトを視覚化するユーザーモジュールがライブラリモジュールを上書きする場合に警告する警告Thonnyのファイルブラウザで %s ファイルをダブルクリックした際どうしますか?どこに保存しますか?どのインタプリタを使用してコードを実行しますか?現在のインタプリタではこのパッケージを閲覧することしかできません。 インストール、アップグレード、アンインストールを行うには 'ツール → システムシェルを開く...' を実行してください。テキスト折返し(遅い場合があります)仮想環境フォルダーまたは内部の 'pyveng.cfg' ファイルを選択するときに、ファイル ナビゲーションの右クリック コンテキスト メニューから既存の仮想環境をアクティブにすることもできます。ファイルを選択する必要があります!パッケージマネージャを起動する前にプログラムを停止する必要があります。ズームすべてのファイルなどなどバイト空き容量here"USBシリアル"または"UART"のデバイス名を探すsys.pathにlibディレクトリがありません基本的なANSIカラーとスタイルをサポートでパッケージファイル (通常 .whl / .tar.gz / .zip の拡張子) を指定してインストールします。でrequirements.txt ファイルを指定し、パッケージをインストールします。トータル容量unclosed_string利用容量././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/locale/ja_JP/LC_MESSAGES/thonny.po0000644000076600000240000017011014626075445022627 0ustar00aivarannamaastaffmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: ja\n" #: thonny/workbench.py:375 msgid "File" msgstr "ファイル" #: thonny/workbench.py:376 msgid "Edit" msgstr "編集" #: thonny/workbench.py:377 msgid "View" msgstr "表示" #: thonny/running.py:161 thonny/workbench.py:378 msgid "Run" msgstr "実行" #: thonny/workbench.py:379 msgid "Tools" msgstr "ツール" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:380 msgid "Help" msgstr "ヘルプ" #: thonny/workbench.py:598 msgid "Exit" msgstr "終了" #: thonny/workbench.py:625 msgid "Decrease font size" msgstr "文字を小さくする" #: thonny/workbench.py:637 msgid "Focus editor" msgstr "エディタにフォーカス" #: thonny/workbench.py:646 msgid "Focus shell" msgstr "シェルにフォーカス" #: thonny/workbench.py:656 msgid "Maximize view" msgstr "最大化" #: thonny/workbench.py:668 msgid "Full screen" msgstr "全画面表示" #: thonny/workbench.py:1467 msgid "Program arguments" msgstr "プログラムの引数" #: thonny/plugins/about.py:24 thonny/plugins/about.py:153 msgid "About Thonny" msgstr "Thonnyについて" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "このアプリケーションは\n" "オープンソースコミュニティの\n" "Cybernetica ASと\n" "Raspberry Pi財団の助けを得て\n" "エストニアのタルトゥ大学で\n" "作られています" #: thonny/plugins/about.py:101 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "このプログラムの使用によって起きた\n" "いかなる事象に対しても一切の保証はありません!\n" "このプログラムはフリーソフトウェアであり、\n" "https://opensource.org/licenses/MIT\n" "に記載された条件のもとで\n" "自由に再配布することが出来ます" #: thonny/plugins/about.py:142 msgid "Version history" msgstr "バージョン履歴" #: thonny/plugins/about.py:149 msgid "Report problems" msgstr "問題を報告" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "プログラムが例外を送出して停止したら自動的にアシスタントを開く" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "コードに警告がある場合にアシスタントを自動的に開く" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Pylintでチェックする" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Mypyでチェックする" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "無効にするチェック項目 (1行につき1つの id)" #: thonny/assistance.py:981 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "アシスタント" #: thonny/plugins/autocomplete.py:529 msgid "Auto-complete" msgstr "オートコンプリート" #: thonny/plugins/backend_config_page.py:335 msgid "Interpreter" msgstr "インタプリタ" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Birdseyeについて" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "BirdseyeはPythonデバッガであり、別にインストールする必要があります。\n" "\n" "ヘルプページを開いて詳細を確認しますか?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "現在のスクリプトをデバッグ (birdseye)" #: thonny/plugins/commenting_indenting.py:171 msgid "Toggle comment" msgstr "コメントの切り替え" #: thonny/plugins/commenting_indenting.py:181 msgid "Comment out" msgstr "コメントアウト" #: thonny/plugins/commenting_indenting.py:191 msgid "Uncomment" msgstr "コメント解除" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "元に戻す" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "やり直す" #: thonny/base_file_browser.py:728 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2339 msgid "Cut" msgstr "切り取り" #: thonny/base_file_browser.py:729 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2340 msgid "Copy" msgstr "コピー" #: thonny/base_file_browser.py:731 thonny/base_file_browser.py:737 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2341 msgid "Paste" msgstr "貼り付け" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "すべてを選択" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1402 msgid "Run to cursor" msgstr "カーソル位置まで実行" #: thonny/plugins/debugger.py:985 msgid "Can't close yet" msgstr "まだ閉じられません" #: thonny/plugins/debugger.py:986 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "デバッグをキャンセルするために\"Stop\"コマンドを使う" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "ユーザーウインドウをドッキング" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "一致する名前を強調表示" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "ローカル変数を強調表示" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "カッコを強調表示" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "文法要素を強調表示" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "現在の行を強調表示(エディタの再起動が必要)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "行数を表示" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "1行の推奨最大文字数\n" "(0でガイドラインを非表示)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "エディタ" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "使用状況ログのエクスポート..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "イベント" #: thonny/plugins/files.py:609 msgid "Files" msgstr "ファイル" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:438 msgid "Find & Replace" msgstr "検索と置換" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "検索:" #: thonny/plugins/find_replace.py:90 msgid "Replace with:" msgstr "置換:" #: thonny/plugins/find_replace.py:108 msgid "Case sensitive" msgstr "大文字小文字の区別" #: thonny/plugins/find_replace.py:115 msgid "Up" msgstr "上へ" #: thonny/plugins/find_replace.py:119 msgid "Down" msgstr "下へ" #: thonny/plugins/find_replace.py:128 msgid "Find" msgstr "検索" #: thonny/plugins/find_replace.py:138 msgid "Replace" msgstr "置換" #: thonny/plugins/find_replace.py:146 msgid "Replace+Find" msgstr "置換して次を検索" #: thonny/plugins/find_replace.py:156 msgid "Replace all" msgstr "すべて置換" #: thonny/plugins/find_replace.py:254 msgid "Enter string to be replaced." msgstr "置換される文字列を入力してください。" #: thonny/plugins/find_replace.py:339 msgid "The specified text was not found!" msgstr "指定された文字列が見つかりません!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Thonnyが1つしか起動しないようにする" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "前回開いていたファイルをすべて開く" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "通知音を鳴らさないようにする" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "文字の拡大縮小モード" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "ヒープモードがオンです。\n" "オフにするにはヒープビューを閉じてください。" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "ヒープ" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "言語" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "ここにはメモを取ることができ、例えばやることリストやコードスニペットなど、なんでも書き込めます。\n" "\n" "書いたことは自動で保存され、次にThonnyを起動した時に読み込まれます。\n" "\n" "この文章は消してしまっても大丈夫です。" #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "メモ" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "前のオブジェクト" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "次のオブジェクト" #: thonny/plugins/object_inspector.py:732 msgid "Object inspector" msgstr "オブジェクトインスペクタ" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "アウトライン" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zeroモード" #: thonny/plugins/pip_gui.py:80 msgid "Uninstall" msgstr "アンインストール" #: thonny/editors.py:693 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:496 #: thonny/ui_utils.py:1884 thonny/workdlg.py:203 msgid "Close" msgstr "閉じる" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Click " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "here" #: thonny/plugins/pip_gui.py:77 msgid "Upgrade" msgstr "アップグレード" #: thonny/plugins/micropython/base_flashing_dialog.py:398 #: thonny/plugins/pip_gui.py:74 msgid "Install" msgstr "インストール" #: thonny/plugins/pip_gui.py:570 msgid "Could not find the package from PyPI." msgstr "PyPIでパッケージを見つけられませんでした。" #: thonny/plugins/pip_gui.py:592 msgid "Latest stable version" msgstr "最新の安定版" #: thonny/plugins/pip_gui.py:594 msgid "Latest version" msgstr "最新版" #: thonny/plugins/pip_gui.py:596 msgid "Summary" msgstr "概要" #: thonny/plugins/pip_gui.py:598 msgid "Author" msgstr "作者" #: thonny/plugins/pip_gui.py:602 msgid "Homepage" msgstr "ホームページ" #: thonny/plugins/pip_gui.py:604 msgid "Bugtracker" msgstr "バグの追跡" #: thonny/plugins/pip_gui.py:606 msgid "Documentation" msgstr "ドキュメント" #: thonny/plugins/pip_gui.py:608 msgid "PyPI page" msgstr "PyPIページ" #: thonny/plugins/pip_gui.py:648 msgid "Requires" msgstr "必須" #: thonny/plugins/pip_gui.py:802 msgid "Really uninstall?" msgstr "本当にアンインストールしますか?" #: thonny/plugins/pip_gui.py:807 msgid "Are you sure you want to uninstall it?" msgstr "本当にアンインストールしますか?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "現在のフレーム\n" "へ戻る" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "変数" #: thonny/base_file_browser.py:1576 msgid "This computer" msgstr "このコンピュータ" #: thonny/base_file_browser.py:648 msgid "Refresh" msgstr "更新" #: thonny/base_file_browser.py:657 msgid "Focus into" msgstr "開く" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 #: thonny/plugins/autocomplete.py:303 thonny/plugins/highlight_names.py:86 msgid "Error" msgstr "エラー" #: thonny/base_file_browser.py:1411 thonny/base_file_browser.py:1423 msgid "You need to select a file!" msgstr "ファイルを選択する必要があります!" #: thonny/base_file_browser.py:1427 msgid "Overwrite?" msgstr "上書きしますか?" #: thonny/base_file_browser.py:1427 msgid "Do you want to overwrite '%s' ?" msgstr "'%s' を上書きしますか?" #: thonny/editors.py:658 thonny/editors.py:660 msgid "New" msgstr "新規ファイル" #: thonny/editors.py:671 msgid "Open..." msgstr "ファイルを開く..." #: thonny/editors.py:673 msgid "Load" msgstr "開く" #: thonny/editors.py:682 msgid "Recent files" msgstr "最近利用したファイル" #: thonny/editors.py:704 thonny/ui_utils.py:498 msgid "Close all" msgstr "すべて閉じる" #: thonny/editors.py:714 thonny/editors.py:716 msgid "Save" msgstr "保存" #: thonny/editors.py:739 msgid "Save as..." msgstr "名前を付けて保存..." #: thonny/editors.py:750 msgid "Save copy..." msgstr "コピーを保存..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonnyオプション" #: thonny/running.py:160 msgid "Run current script" msgstr "現在のスクリプトを実行" #: thonny/running.py:191 msgid "Run current script in terminal" msgstr "ターミナルで現在のスクリプトを実行" #: thonny/running.py:204 msgid "Stop/Restart backend" msgstr "バックエンドをストップ/リスタート" #: thonny/running.py:205 msgid "Stop" msgstr "ストップ" #: thonny/running.py:216 msgid "Interrupt execution" msgstr "実行の中断" #: thonny/running.py:229 msgid "Send EOF / Soft reboot" msgstr "EOFを送信 / ソフトリブート" #: thonny/running.py:240 msgid "Disconnect" msgstr "切断" #: thonny/plugins/cpython_frontend/cp_front.py:295 msgid "Python interpreters" msgstr "Pythonインタプリタ" #: thonny/editors.py:39 thonny/plugins/cpython_frontend/cp_front.py:296 #: thonny/plugins/pip_gui.py:848 thonny/plugins/pip_gui.py:861 msgid "all files" msgstr "すべてのファイル" #: thonny/plugins/cpython_frontend/cp_front.py:324 msgid "Select empty directory for new virtual environment" msgstr "新しい仮想環境用に空のディレクトリを選択します" #: thonny/plugins/cpython_frontend/cp_front.py:331 msgid "Bad directory" msgstr "不正なディレクトリ" #: thonny/plugins/cpython_frontend/cp_front.py:332 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "選択したディレクトリは空ではありません。\n" "他を選択するかキャンセルしてください。" #: thonny/plugins/cpython_frontend/cp_front.py:349 msgid "Creating virtual environment" msgstr "仮想環境を作成中" #: thonny/shell.py:101 msgid "Clear shell" msgstr "シェルをクリア" #: thonny/shell.py:185 msgid "Plotter" msgstr "プロッター" #: thonny/shell.py:317 msgid "Clear" msgstr "クリア" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "プロッターを表示" #: thonny/shell.py:1660 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "パフォーマンスの理由から、シェルは非常に長い行を表示することを避けています (ツール => オプション => シェル).\n" "ここで元のテキストフラグメントを操作できます。" #: thonny/shell.py:1671 msgid "Wrap text (may be slow)" msgstr "テキスト折返し(遅い場合があります)" #: thonny/ui_utils.py:1879 msgid "Copy to clipboard" msgstr "クリップボードにコピー" #: thonny/shell.py:1713 msgid "Squeezed text (%d characters)" msgstr "スクイーズテキスト(%d 文字)" #: thonny/shell.py:1883 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "プロッターはシェルの一連の数値を\n" "可視化します。" #: thonny/shell.py:1885 msgid "See Help for details." msgstr "ヘルプで詳細を見る." #: thonny/ui_utils.py:497 msgid "Close others" msgstr "その他を閉じる" #: thonny/ui_utils.py:1734 msgid "Copying" msgstr "コピー中" #: thonny/ui_utils.py:1737 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr " %s\n" "を\n" " %s\n" "へコピー中" #: thonny/base_file_browser.py:1382 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:288 thonny/plugins/pip_gui.py:1338 #: thonny/ui_utils.py:160 thonny/ui_utils.py:1745 thonny/ui_utils.py:1831 #: thonny/workdlg.py:205 thonny/workdlg.py:259 msgid "Cancel" msgstr "キャンセル" #: thonny/base_file_browser.py:1373 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:115 thonny/plugins/backend_config_page.py:283 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1828 thonny/workdlg.py:256 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2345 msgid "Select All" msgstr "すべてを選択" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:164 msgid "Shell" msgstr "シェル" #: thonny/workbench.py:608 msgid "Options..." msgstr "オプション..." #: thonny/workbench.py:615 msgid "Increase font size" msgstr "文字を大きくする" #: thonny/workbench.py:679 msgid "Change font size" msgstr "フォントサイズを変更" #: thonny/workbench.py:680 msgid "Zoom" msgstr "ズーム" #: thonny/workbench.py:689 msgid "Exit Thonny" msgstr "Thonnyを終了" #: thonny/workbench.py:692 msgid "Quit" msgstr "終了" #: thonny/workbench.py:1247 thonny/workbench.py:1255 msgid "Overwriting theme '%s'" msgstr "テーマ '%s' を上書きしています" #: thonny/workbench.py:1438 msgid "Program arguments:" msgstr "プログラムの引数:" #: thonny/workbench.py:1492 msgid "Regular mode" msgstr "通常モード" #: thonny/workbench.py:1493 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "構成を更新しました。Thonnyを再起動すると、通常モードで開始されます。\n" "\n" "(ツール → オプション → ジェネラル から元に戻すことができます。)" #: thonny/plugins/ast_view.py:211 msgid "Program tree" msgstr "プログラムツリー" #: thonny/plugins/debugger.py:1284 msgid "Resume" msgstr "再開" #: thonny/plugins/debugger.py:1300 msgid "Run / resume" msgstr "実行 / 再開" #: thonny/plugins/debugger.py:1315 msgid "Debug current script" msgstr "現在のスクリプトをデバッグ" #: thonny/plugins/debugger.py:1317 msgid "Debug" msgstr "デバッグ" #: thonny/plugins/debugger.py:1328 msgid "Debug current script (nicer)" msgstr "現在のスクリプトをデバッグ(nicer)" #: thonny/plugins/debugger.py:1340 msgid "Debug current script (faster)" msgstr "現在のスクリプトをデバッグ(faster)" #: thonny/plugins/debugger.py:1351 msgid "Step over" msgstr "ステップ オーバー" #: thonny/plugins/debugger.py:1353 msgid "Over" msgstr "オーバー" #: thonny/plugins/debugger.py:1364 msgid "Step into" msgstr "ステップ イン" #: thonny/plugins/debugger.py:1366 msgid "Into" msgstr "イン" #: thonny/plugins/debugger.py:1377 msgid "Step out" msgstr "ステップ アウト" #: thonny/plugins/debugger.py:1379 msgid "Out" msgstr "アウト" #: thonny/plugins/debugger.py:1414 msgid "Step back" msgstr "ステップ バック" #: thonny/plugins/debugger.py:1416 msgid "Back" msgstr "バック" #: thonny/plugins/debugger.py:1422 msgid "Stack" msgstr "スタック" #: thonny/plugins/debugger.py:1423 msgid "Exception" msgstr "例外" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "使用状況ログを記録する" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "デバッグモード (詳細な診断ログを提供します)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UIモード" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UIスケーリング係数" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "注意! これらのオプションを変更したらThonnyを再起動してください!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "ジェネラル" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "インストール" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "パッケージを閲覧する" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "現在のインタプリタではこのパッケージを閲覧することしかできません。\n" "インストール、アップグレード、アンインストールを行うには 'ツール → システムシェルを開く...' を実行してください。" #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "パッケージのディレクトリ" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "PyPIからインストール" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "パッケージの入手先がわからない場合は、Python Package Indexを検索するのがおすすめです。上の検索ボックスにパッケージ名を入力し、エンターキーを押してください。" #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "でrequirements.txt ファイルを指定し、パッケージをインストールします。" #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Click" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "でパッケージファイル (通常 .whl / .tar.gz / .zip の拡張子) を指定してインストールします。" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "アップグレード または アンインストール" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "左からパッケージを選択してください。" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "このダイアログでは、利用可能なすべてのパッケージが表示されますが、アップグレードやアンインストールができるのは以下のディレクトリのパッケージだけです" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "新しいパッケージもこのディレクトリにインストールされます。それ以外の場所は別の方法で管理する必要があります。" #: thonny/plugins/pip_gui.py:493 msgid "Installed version:" msgstr "インストールバージョン:" #: thonny/plugins/pip_gui.py:495 msgid "Installed to:" msgstr "インストール先:" #: thonny/plugins/pip_gui.py:573 msgid "Please check your spelling!" msgstr "スペルをチェックしてください!" #: thonny/plugins/pip_gui.py:577 msgid "Could not find the package info from PyPI." msgstr "PyPIでパッケージ情報を見つけられませんでした。" #: thonny/plugins/pip_gui.py:579 thonny/plugins/pip_gui.py:1408 msgid "Error code:" msgstr "エラーコード:" #: thonny/plugins/pip_gui.py:748 msgid "Can't find package name from the list:" msgstr "リストからパッケージ名が見つかりません:" #: thonny/plugins/pip_gui.py:803 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "パッケージ '{}' は他のパッケージのインストールとアンインストールに必要です。" #: thonny/plugins/pip_gui.py:848 msgid "Package" msgstr "パッケージ" #: thonny/plugins/pip_gui.py:960 msgid "Manage packages for %s" msgstr "%s のパッケージを管理する" #: thonny/editors.py:587 thonny/plugins/micropython/pip_gui.py:25 #: thonny/plugins/pip_gui.py:1034 msgid "Confirmation" msgstr "確認" #: thonny/plugins/pip_gui.py:1035 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Thonny関連パッケージをインストールしようとしています。\n" "もしThonnyプラグインとしてインストールする場合は、\n" "メニューから 'ツール → プラグインを管理...' を選択してください\n" "\n" "このままバックエンドに %s をインストールしますか?" #: thonny/plugins/pip_gui.py:1141 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "注意! 現在のバージョンと互換性のあるThonnyバージョンが利用できます。'...' ボタンをクリックしてインストールするバージョンを選択してください。" #: thonny/plugins/pip_gui.py:1149 msgid "Thonny plugin without requirements" msgstr "要件のないThonnyプラグイン" #: thonny/plugins/pip_gui.py:1165 msgid "Unsuitable requirements" msgstr "要件が不適切" #: thonny/plugins/pip_gui.py:1166 msgid "This package requires different Thonny version:" msgstr "このパッケージには別のThonnyバージョンが必要です:" #: thonny/plugins/pip_gui.py:1170 msgid "If you still want it, then please install it from the command line." msgstr "必要な場合、コマンドラインからインストールしてください。" #: thonny/plugins/pip_gui.py:1207 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "注意! プラグインのインストール / アップグレード / アンインストール後にはThonnyを再起動してください。" #: thonny/plugins/pip_gui.py:1217 msgid "Thonny plug-ins" msgstr "Thonnyプラグイン" #: thonny/plugins/pip_gui.py:1253 msgid "Advanced install / upgrade / downgrade" msgstr "高度なインストール / アップグレード / ダウングレード" #: thonny/plugins/pip_gui.py:1262 msgid "Desired version" msgstr "希望バージョン" #: thonny/plugins/pip_gui.py:1321 msgid "Upgrade dependencies" msgstr "依存関係をアップグレードする" #: thonny/plugins/pip_gui.py:1406 msgid "Requires:" msgstr "必須:" #: thonny/plugins/pip_gui.py:1410 msgid "Error:" msgstr "エラー:" #: thonny/plugins/pip_gui.py:1601 msgid "Manage packages..." msgstr "パッケージを管理..." #: thonny/plugins/pip_gui.py:1607 msgid "Manage plug-ins..." msgstr "プラグインを管理..." #: thonny/plugins/replayer.py:364 msgid "Open replayer..." msgstr "リプレイヤーを開く..." #: thonny/plugins/run_debug_config_page.py:21 msgid "Change working directory to script directory on Run / Debug" msgstr "実行/デバッグ時に作業ディレクトリをスクリプトディレクトリに変更する" #: thonny/plugins/run_debug_config_page.py:35 msgid "Show function calls (frames) in separate windows" msgstr "別ウインドウに関数呼び出し(フレーム)を表示" #: thonny/plugins/run_debug_config_page.py:36 msgid "Uncheck if you want more traditional experience." msgstr "従来のデバッガを使用する場合チェックを外してください。" #: thonny/plugins/run_debug_config_page.py:42 msgid "Open and close Stack view automatically" msgstr "自動的にスタックビューを開閉します" #: thonny/plugins/run_debug_config_page.py:43 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "最初の呼び出しでスタックビューを開き、プログラムがメインフレームに戻ったときに閉じます。" #: thonny/plugins/run_debug_config_page.py:52 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "ライブラリ(メインスクリプトのディレクトリ外)へのステップインを許可します" #: thonny/plugins/run_debug_config_page.py:53 msgid "May make debugging slower." msgstr "デバッグが遅くなる可能性があります。" #: thonny/plugins/run_debug_config_page.py:58 msgid "Preferred debugger" msgstr "優先デバッガー" #: thonny/plugins/run_debug_config_page.py:70 msgid "(used when clicking Debug toolbar button)" msgstr "(ツールバーのデバッグボタンをクリックすると使われます)" #: thonny/plugins/run_debug_config_page.py:75 msgid "Birdseye port" msgstr "Birdseye ポート" #: thonny/plugins/run_debug_config_page.py:79 msgid "(restart Thonny after changing this)" msgstr "(変更後、Thonnyを再起動してください)" #: thonny/plugins/run_debug_config_page.py:87 msgid "Run & Debug" msgstr "実行 & デバッグ" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "ターミナルエミュレーション" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "基本的なANSIカラーとスタイルをサポート" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "保持する行の最大値。" #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "注意! 大きな値の場合パフォーマンスが低下します!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "スクイーズする前のラインフラグメント最大長" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "ターミナルで現在のスクリプトを実行中" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "プログラム終了後に Python REPL に移行する" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Pythonプロセスが終わってもターミナルウインドウを開いたままにする" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "注意! 自動クローズをターミナルの設定から有効にする必要があります\n" "(プロファイル → シェル → シェル終了時)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "ターミナル" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "UIテーマ" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "シンタックステーマ" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "エディタフォント" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "IOフォント" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "プレビュー" #: thonny/plugins/theme_and_font_config_page.py:150 msgid "This is a comment" msgstr "これはコメント" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "The answer is" msgstr "答えは" #: thonny/plugins/theme_and_font_config_page.py:157 msgid "unclosed_string" msgstr "unclosed_string" #: thonny/plugins/theme_and_font_config_page.py:159 msgid "blah, blah" msgstr "などなど" #: thonny/plugins/theme_and_font_config_page.py:183 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "注意! 一部のスタイルはThonnyを再起動しないと反映されません!" #: thonny/plugins/theme_and_font_config_page.py:222 msgid "Enter an integer" msgstr "整数を入力" #: thonny/plugins/theme_and_font_config_page.py:235 msgid "Theme & Font" msgstr "テーマ & フォント" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Thonnyプログラムフォルダを開く..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Thonnyデータフォルダを開く..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "ホーム" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "ヘルプコンテンツ" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPythonデバイス" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPythonデバイス" #: thonny/plugins/micropython/mp_front.py:558 msgid "Connect your device to the computer and select corresponding port below" msgstr "デバイスをコンピュータに接続し、ポートを選択します" #: thonny/plugins/micropython/mp_front.py:561 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "\"USBシリアル\"または\"UART\"のデバイス名を探す" #: thonny/plugins/micropython/mp_front.py:563 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "見つからない場合には、最初にUSBドライバーをインストールする必要があります。" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port" msgstr "ポート" #: thonny/plugins/micropython/mp_front.py:458 msgid "Try to detect port automatically" msgstr "ポートの自動検出を試す" #: thonny/plugins/micropython/__init__.py:24 msgid "MicroPython (generic)" msgstr "MicroPython (ジェネリック)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "印刷..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "システムシェルを開く..." #: thonny/plugins/backend_config_page.py:109 msgid "Details" msgstr "詳細" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "requirementsファイルからインストール" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "ローカルファイルからインストール" #: thonny/plugins/pip_gui.py:1200 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "このダイアログはThonnyプラグインとその依存関係を管理するためのものです。\n" "あなたのプログラムで使うパッケージをインストールする場合は 'ツール → パッケージを管理...' を選択してください。" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (ジェネリック)" #: thonny/plugins/commenting_indenting.py:142 msgid "Indent selected lines" msgstr "選択した行をインデントする" #: thonny/plugins/commenting_indenting.py:152 msgid "Dedent selected lines" msgstr "選択した行をデデントする" #: thonny/workbench.py:1481 msgid "Switch to\n" "regular\n" "mode" msgstr "通常\n" "モードに\n" "変更" #: thonny/plugins/microbit/__init__.py:62 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "MicroPythonがmicro:bitにインストールされていることを確認してください。" #: thonny/plugins/microbit/__init__.py:64 msgid "Don't forget that main.py only works without embedded main script." msgstr "メインスクリプトが埋め込まれていない場合のみ main.py が動くことを忘れないでください。" #: thonny/misc_utils.py:177 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "ディスク '%s' が見つかりません。自分で選択しますか?" #: thonny/misc_utils.py:180 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "複数の '%s' ディスクが見つかりました。自分で選択しますか?" #: thonny/misc_utils.py:196 msgid "Can't find suitable disk" msgstr "適切なディスクが見つかりません" #: thonny/base_file_browser.py:294 msgid "%d items" msgstr "%d アイテム" #: thonny/base_file_browser.py:743 msgid "Move to Trash" msgstr "ごみ箱に移動" #: thonny/base_file_browser.py:746 msgid "Delete" msgstr "削除" #: thonny/base_file_browser.py:725 thonny/base_file_browser.py:878 msgid "New directory" msgstr "新しいディレクトリ" #: thonny/base_file_browser.py:749 msgid "Properties" msgstr "プロパティ" #: thonny/base_file_browser.py:751 msgid "Storage space" msgstr "ストレージ容量" #: thonny/base_file_browser.py:761 msgid "Path" msgstr "パス" #: thonny/base_file_browser.py:763 msgid "Directory properties" msgstr "ディレクトリプロパティ" #: thonny/base_file_browser.py:765 msgid "File properties" msgstr "ファイルプロパティ" #: thonny/base_file_browser.py:767 msgid "bytes" msgstr "バイト" #: thonny/base_file_browser.py:770 msgid "Size" msgstr "サイズ" #: thonny/base_file_browser.py:94 thonny/base_file_browser.py:781 msgid "Modified" msgstr "変更" #: thonny/base_file_browser.py:842 msgid "Deleting %s" msgstr "%s を削除中" #: thonny/editors.py:262 msgid "Loading" msgstr "読込中" #: thonny/editors.py:395 msgid "Saving" msgstr "保存中" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "%s にアップロード" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "%s を %s にダウンロード中" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "%s にダウンロード" #: thonny/base_file_browser.py:650 msgid "Open in system file manager" msgstr "システムファイルマネージャで開く" #: thonny/base_file_browser.py:678 msgid "Hide hidden files" msgstr "隠しファイルを非表示" #: thonny/base_file_browser.py:678 msgid "Show hidden files" msgstr "隠しファイルを表示" #: thonny/base_file_browser.py:661 msgid "Open in Thonny" msgstr "Thonnyで開く" #: thonny/base_file_browser.py:692 msgid "Open in system default app" msgstr "システムデフォルトアプリを開く" #: thonny/base_file_browser.py:673 thonny/base_file_browser.py:700 msgid "Configure %s files" msgstr "%s ファイルの設定" #: thonny/base_file_browser.py:701 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Thonnyのファイルブラウザで %s ファイルをダブルクリックした際どうしますか?" #: thonny/base_file_browser.py:1258 thonny/editors.py:986 thonny/editors.py:988 msgid "Deleting" msgstr "削除中" #: thonny/base_file_browser.py:1265 msgid "Creating directory" msgstr "ディレクトリを作成" #: thonny/editors.py:260 msgid "Loading %s" msgstr "%s を読込中" #: thonny/editors.py:390 msgid "Saving to %s" msgstr "%s に保存中" #: thonny/editors.py:728 thonny/editors.py:730 msgid "Save All files" msgstr "すべてのファイルを保存" #: thonny/plugins/backend_config_page.py:338 thonny/workbench.py:880 msgid "Configure interpreter..." msgstr "インタプリタ設定..." #: thonny/workbench.py:1591 msgid "Device" msgstr "デバイス" #: thonny/workdlg.py:234 msgid "Cancelling" msgstr "キャンセル中" #: thonny/workdlg.py:270 msgid "Starting" msgstr "開始中" #: thonny/plugins/backend_config_page.py:249 msgid "Authentication" msgstr "認証" #: thonny/plugins/backend_config_page.py:251 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "秘密鍵のパスフレーズを入力してください\n" "{}" #: thonny/plugins/backend_config_page.py:254 msgid "Enter your password for\n" "{}" msgstr "パスワードを入力\n" "{}" #: thonny/plugins/object_inspector.py:486 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "このフロートのおおよその値です。正確な値は %s でこれは約 %s です" #: thonny/plugins/pip_gui.py:682 msgid "Search results" msgstr "検索結果" #: thonny/plugins/pip_gui.py:683 msgid "Searching" msgstr "検索中" #: thonny/plugins/pip_gui.py:787 thonny/plugins/pip_gui.py:876 msgid "Installing '%s'" msgstr "'%s' をインストール中" #: thonny/plugins/pip_gui.py:793 msgid "Upgrading '%s'" msgstr "'%s' をアップグレード中" #: thonny/plugins/pip_gui.py:800 msgid "Uninstalling '%s'" msgstr "'%s' をアンインストール中" #: thonny/plugins/pip_gui.py:814 msgid "Installing" msgstr "インストール中" #: thonny/plugins/pip_gui.py:1562 msgid "Package manager is not available for this interpreter" msgstr "パッケージマネージャはこのインタプリタでは利用できません" #: thonny/base_file_browser.py:1209 thonny/plugins/pip_gui.py:1576 msgid "Not supported" msgstr "未サポート" #: thonny/plugins/micropython/pip_gui.py:142 thonny/plugins/pip_gui.py:1581 msgid "Not available" msgstr "利用不可" #: thonny/plugins/pip_gui.py:1582 msgid "You need to stop your program before launching the package manager." msgstr "パッケージマネージャを起動する前にプログラムを停止する必要があります。" #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "評価値をオブジェクトインスペクタで開く" #: thonny/plugins/cpython_frontend/cp_front.py:234 msgid "Python executable" msgstr "Python実行可能ファイル" #: thonny/plugins/cpython_frontend/cp_front.py:258 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "注意! 仮想環境から実行可能ファイルを選択するとファイル選択ボタンが正しく機能しない場合があります。\n" "この場合インタプリタのかわりに 'activate' スクリプトを選択します\n" "(またはパスをボックスに入力します)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "リモート Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "未接続" #: thonny/plugins/micropython/__init__.py:35 msgid "MicroPython (local)" msgstr "MicroPython (ローカル)" #: thonny/plugins/micropython/__init__.py:46 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:144 msgid "no absolute lib directory in sys.path" msgstr "sys.pathにlibディレクトリがありません" #: thonny/plugins/pip_gui.py:71 msgid "Search on PyPI" msgstr "PyPIを検索" #: thonny/base_file_browser.py:693 msgid "Open in Thonny's text editor" msgstr "Thonnyのテキストエディタで開く" #: thonny/base_file_browser.py:346 msgid "Storage space on this drive or filesystem" msgstr "このドライブまたはファイルシステムのストレージ容量" #: thonny/base_file_browser.py:347 msgid "total space" msgstr "トータル容量" #: thonny/base_file_browser.py:349 msgid "used space" msgstr "利用容量" #: thonny/base_file_browser.py:350 msgid "free space" msgstr "空き容量" #: thonny/base_file_browser.py:357 msgid "Storage info" msgstr "ストレージ情報" #: thonny/plugins/commenting_indenting.py:162 msgid "Replace tabs with spaces" msgstr "タブをスペースに置換する" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "タブ文字を強調表示" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "タブ文字でインデントする (Pythonでは非推奨)" #: thonny/base_file_browser.py:92 thonny/memory.py:63 msgid "Name" msgstr "名前" #: thonny/base_file_browser.py:96 msgid "Size (bytes)" msgstr "サイズ(バイト)" #: thonny/base_file_browser.py:879 msgid "Enter name for new directory under\n" "%s" msgstr "%s\n" "に作る新しいディレクトリの名前を入力" #: thonny/base_file_browser.py:902 msgid "Nothing selected" msgstr "未選択" #: thonny/base_file_browser.py:902 msgid "Select an item and try again!" msgstr "アイテムを選択して再試行してください!" #: thonny/base_file_browser.py:1329 msgid "Open from %s" msgstr "%s から開く" #: thonny/base_file_browser.py:1332 msgid "Save to %s" msgstr "%s に保存" #: thonny/base_file_browser.py:1351 msgid "File name:" msgstr "ファイル名:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:538 #: thonny/plugins/object_inspector.py:617 msgid "Value ID" msgstr "値ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value" msgstr "値" #: thonny/plugins/backend_config_page.py:272 msgid "Save password" msgstr "パスワードを保存" #: thonny/plugins/debugger.py:557 msgid "Function call at %s" msgstr "%s で関数呼び出し" #: thonny/plugins/debugger.py:1006 msgid "Local variables" msgstr "ローカル変数" #: thonny/plugins/debugger.py:1038 msgid "Function" msgstr "関数" #: thonny/plugins/debugger.py:1039 msgid "Location" msgstr "位置" #: thonny/plugins/debugger.py:1115 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "最後のコマンドで例外が発生した場合、このビューにはスタックトレースが表示されます。" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "データ" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "アトリビュート" #: thonny/plugins/object_inspector.py:537 msgid "Index" msgstr "インデックス" #: thonny/plugins/object_inspector.py:615 msgid "Key ID" msgstr "キーID" #: thonny/plugins/object_inspector.py:616 msgid "Key" msgstr "キー" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "%s\n" "に戻る" #: thonny/plugins/micropython/mp_front.py:453 msgid "Port or WebREPL" msgstr "ポート または WebREPL" #: thonny/plugins/micropython/mp_front.py:599 msgid "Password" msgstr "パスワード" #: thonny/plugins/debugger.py:964 msgid "Source code" msgstr "ソースコード" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "ZenityのかわりにTkファイルダイアログを利用する" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "ファイルダイアログがメインウィンドウの後ろに表示されてしまう場合に選択" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "環境変数 (1行につき1つの KEY=VALUE)" #: thonny/base_file_browser.py:722 msgid "New file" msgstr "新しいファイル" #: thonny/base_file_browser.py:740 msgid "Rename" msgstr "リネーム" #: thonny/base_file_browser.py:928 msgid "Rename '%s'" msgstr "'%s' をリネーム" #: thonny/base_file_browser.py:928 msgid "Enter new name" msgstr "新しい名前を入力" #: thonny/base_file_browser.py:1016 msgid "Paste failed" msgstr "貼り付けに失敗" #: thonny/base_file_browser.py:1016 msgid "There are conflicting folders" msgstr "競合するフォルダがあります" #: thonny/base_file_browser.py:1144 msgid "File already exists" msgstr "ファイルがすでに存在します" #: thonny/base_file_browser.py:1212 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "テキスト ファイルの場合は、ファイルを右クリックして [...ファイルの設定] を選択すると、Thonny で開くように設定できます。" #: thonny/editors.py:38 msgid "Python files" msgstr "Pythonファイル" #: thonny/editors.py:123 thonny/editors.py:189 msgid "" msgstr "<無題>" #: thonny/editors.py:150 msgid "File is gone" msgstr "ファイルが見つかりません" #: thonny/editors.py:153 msgid "Do you want to also close the editor?" msgstr "エディタも閉じますか?" #: thonny/editors.py:169 msgid "External modification" msgstr "外部からの変更" #: thonny/editors.py:172 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "現在のエディタの内容を破棄して、ディスクからファイルを再読み込みしますか?" #: thonny/editors.py:588 msgid "Python files usually have .py extension." msgstr "通常、Python ファイルには拡張子 .py が付きます。" #: thonny/editors.py:590 msgid "Did you mean '%s'?" msgstr "「%s」のことですか?" #: thonny/editors.py:759 msgid "Move / rename..." msgstr "移動/名前変更..." #: thonny/editors.py:768 msgid "Go to line..." msgstr "行に移動..." #: thonny/editors.py:1010 msgid "Line number" msgstr "行番号" #. ファイル->ファイル群にするのかは検討が必要 #: thonny/editors.py:1156 msgid "Do you want to save files before closing?" msgstr "終了する前にファイルをすべて保存しますか?" #: thonny/editors.py:1158 msgid "Do you want to save file before closing?" msgstr "終了する前にファイルを保存しますか?" #: thonny/editors.py:1161 msgid "Save On Close" msgstr "閉じるときに保存" #: thonny/misc_utils.py:539 msgid "Command not available" msgstr "このコマンドは使用不可能です。" #: thonny/misc_utils.py:540 msgid "This command is not available if Thonny is run via Flatpak" msgstr "このコマンドは、Thonny が Flatpak 経由で実行されている場合は使用できません" #: thonny/workbench.py:700 thonny/workbench.py:799 msgid "Support Ukraine" msgstr "ウクライナを支援してください" #: thonny/plugins/backend_config_page.py:90 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "どのインタプリタを使用してコードを実行しますか?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "パラメータ情報を表示" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "「(」を入力した後にパラメーター情報を自動的に表示する" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "入力中に補完を自動的に提案する" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "補完のドキュメントを自動的に表示する" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "エディターで Tab キーを使用して補完を要求する" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "シェルで Tab キーを使用して補完を要求する" #: thonny/editors.py:213 thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "問題" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "定義が見つかりませんでした" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "新しいプロセスを開始する前にシェルをクリアする (実行、デバッグ、ストップ/リスタートなど)" #: thonny/plugins/cpython_frontend/cp_front.py:196 msgid "Thonny's Python" msgstr "ThonnyのPython" #: thonny/plugins/micropython/mp_front.py:496 msgid "Interrupt working program on connect" msgstr "接続時に作業中のプログラムを中断する" #: thonny/plugins/micropython/mp_front.py:504 msgid "Synchronize device's real time clock" msgstr "デバイスのリアルタイム クロックを同期する" #: thonny/plugins/micropython/mp_front.py:510 msgid "Use local time in real time clock" msgstr "リアルタイム クロックで現地時間を使用する" #: thonny/plugins/micropython/mp_front.py:516 msgid "Restart interpreter before running a script" msgstr "スクリプトを実行する前にインタプリタを再起動する" #: thonny/plugins/micropython/pip_gui.py:26 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "これは MicroPython/CircuitPython のパッケージではないようです。\n" "インストールしてもよろしいですか?" #: thonny/base_file_browser.py:853 msgid "Moving to Trash" msgstr "ゴミ箱に移動" #: thonny/base_file_browser.py:854 msgid "Move %s to Trash?" msgstr "%sをゴミ箱に捨てますか?" #: thonny/base_file_browser.py:861 msgid "Moving %s to Trash" msgstr "%sをゴミ箱に捨てています" #: thonny/base_file_browser.py:666 msgid "Open in default external app" msgstr "デフォルトの外部アプリで開く" #: thonny/base_file_browser.py:1210 msgid "Opening remote files in external app is not supported." msgstr "外部アプリでリモート ファイルを開くことはサポートされていません。" #: thonny/base_file_browser.py:1217 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "ファイルを外部アプリで開く必要がある場合は、ローカル ディレクトリにダウンロードして、そこから開きます。" #. ファイルが開けないという意味で使用されると考えたため、このような翻訳としました。 #: thonny/editors.py:151 msgid "Looks like '%s' was deleted or moved." msgstr "'%s'は削除または移動されたため、開けません。" #: thonny/editors.py:170 msgid "Looks like '%s' was modified outside of the editor." msgstr "'%s'はエディタ外で変更が加えられています。" #: thonny/plugins/cpython_frontend/cp_front.py:256 msgid "NB! Thonny only supports Python %s and later" msgstr "注意! ThonnyはPython %s 以上のみをサポートしています。" #: thonny/editors.py:1010 msgid "Go to line" msgstr "行に移動" #: thonny/workbench.py:703 msgid "Support" msgstr "サポート" #: thonny/editors.py:399 thonny/editors.py:414 msgid "Could not save" msgstr "保存できませんでした" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "警告" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "環境変数の値にクオートを使用すると、クオートは値に含まれます。\n" "これは意図したことですか?" #: thonny/workbench.py:870 msgid "Install MicroPython" msgstr "MicroPythonをインストール" #: thonny/workbench.py:874 msgid "Install CircuitPython" msgstr "CircuitPythonをインストール" #: thonny/plugins/backend_config_page.py:210 msgid "Make uploaded shebang scripts executable" msgstr "アップロードされたシバンスクリプトを実行可能にする" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "保存されたシバンスクリプトを実行可能にする" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "仮想環境をアクティブにする" #: thonny/plugins/micropython/pip_gui.py:119 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "ターゲット" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Python Tutor で現在のスクリプトを視覚化する" #: thonny/plugins/todo_view.py:43 msgid "Line" msgstr "行" #: thonny/plugins/todo_view.py:44 msgid "Info" msgstr "インフォ" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "#todo でマークされた行が見つかりません" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "TODO" #. インストールとアップデートの略語が無いため、英語自体が難しくない点と、文字数的に英語のままの方が良いと判断しました。 #: thonny/plugins/circuitpython/cirpy_front.py:113 #: thonny/plugins/micropython/mp_front.py:550 msgid "Install or update %s" msgstr "Install or update %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "ローカル Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:266 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "仮想環境フォルダーまたは内部の 'pyveng.cfg' ファイルを選択するときに、ファイル ナビゲーションの右クリック コンテキスト メニューから既存の仮想環境をアクティブにすることもできます。" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "準備(VS Codeの部分はスキップ)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "デフォルトのパスワード" #: thonny/running.py:392 msgid "Information" msgstr "インフォメーション" #: thonny/running.py:393 msgid "For debugging the program must be saved first." msgstr "デバッグするには、まずプログラムを保存する必要があります。" #: thonny/editors.py:213 msgid "%s doesn't look like a text file" msgstr "%s はテキストファイルではないようです" #: thonny/editors.py:219 msgid "Problem loading file" msgstr "ファイル読み込みの問題" #: thonny/editors.py:220 msgid "This file seems to have problems with encoding.\n" "\n" "Make sure it is in UTF-8 or contains proper encoding hint." msgstr "このファイルは、エンコードに問題があるようです。\n" "\n" "UTF-8であるか、適切なエンコーディングヒントが含まれていることを確認してください。" #: thonny/editors.py:295 msgid "File is open" msgstr "ファイルが開いています" #: thonny/editors.py:296 msgid "This file is already open in Thonny.\n" "\n" "If you want to save with this name,\n" "close the existing editor first!" msgstr "このファイルはすでにThonnyで開いています。\n" "\n" "この名前で保存したい場合、\n" "既存のエディターを先に閉じてください!" #: thonny/editors.py:349 msgid "Permission Error" msgstr "パーミッションエラー" #: thonny/editors.py:350 msgid "Looks like this file or folder is not writable." msgstr "ファイルまたはフォルダが書き込み禁止のようです。" #: thonny/editors.py:414 msgid "Back-end is not ready" msgstr "バックエンドの準備が完了していません" #: thonny/editors.py:419 msgid "Where to save to?" msgstr "どこに保存しますか?" #: thonny/editors.py:490 msgid "Potential problem" msgstr "潜在的な問題" #: thonny/editors.py:491 msgid "If you name your script '%s', you won't be able to import the library module named '%s'" msgstr "スクリプトに '%s' という名前を付けると、ライブラリモジュールの '%s' がインポートできなくなります" #: thonny/editors.py:497 msgid "Do you still want to use this name for your script?" msgstr "このままこの名前をスクリプトに付けますか?" #: thonny/editors.py:1053 msgid "Got permission error when trying to load\n" "%s" msgstr "読み込む際にパーミッションエラーが発生しました\n" "%s" #: thonny/editors.py:1055 msgid "Try opening it with File => Open." msgstr "ファイル => ファイルを開く からファイルを開いてみてください。" #: thonny/editors.py:1057 msgid "Permission error" msgstr "パーミッションエラー" #: thonny/plugins/run_debug_config_page.py:14 msgid "Allow running unnamed programs" msgstr "名前を付けていないプログラムの実行を許可する" #: thonny/plugins/pip_gui.py:600 msgid "License" msgstr "ライセンス" #: thonny/plugins/run_debug_config_page.py:27 msgid "Warn if a user module shadows a library module" msgstr "ユーザーモジュールがライブラリモジュールを上書きする場合に警告する" #: thonny/plugins/micropython/pip_gui.py:65 msgid "Search micropython-lib and PyPI" msgstr "micropython-lib/PyPIで検索" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368150.9391615 thonny-4.1.7/thonny/locale/ko_KR/0000755000076600000240000000000014730055627017201 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.1151152 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/0000755000076600000240000000000014730055627021123 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/birdseye.rst0000644000076600000240000000332014417536743023466 0ustar00aivarannamaastaff버드아이에 대해 ========================== Birdseye는 Alex Hall이 만든 멋진 Python 디버거로, 프로그램이 실행될 때 표현식의 값들을 기록하고 프로그램이 완료된 후 이 값들을 탐색 할 수 있습니다. 더 많은 정보는 `https://birdseye.readthedocs.io `_ 에서 확인하세요. Birdseye는 기본적으로 설치되지 않으며 *도구 → 플러그인 관리...*를 통해 간단하게 설치할 수 있습니다. ``birdseye`` 라는 이름의 패키지를 설치하면 됩니다. Birdseye는`Thonny의 내장 디버거 `_ 와는 다르게 작동합니다. *실행 → 현재 스크립트 디버그(Birdseye)*로 프로그램을 실행하면 실행 시간이 평소보다 약간 더 걸립니다. 그러나 *Run current script*로 실행 한 것처럼 프로그램이 실행됩니다. 다시 말해, 브레이크 포인트가 무시되고 프로그램을 단계별로 실행할 수 없습니다. 그러나 프로그램의 실행이 완료되면 Thonny는 웹 페이지 (Birdseye에서 제공하는 로컬 서버에서 제공) 를 열어 실행 프로세스를 자세히 살펴보고 최종 결과가 어떻게 중간값으로 구성되는지를 확인 할 수 있습니다. 주의! Thonny에서 Birdseye를 사용할 때``birdseye.eye``를 가져오거나 함수를 데코레이팅할 필요가 없습니다. Thonny는 모든 기능에 대한 정보를 기록하도록 Birdseye를 실행합니다. 로컬 서버는 기본적으로 포트 7777을 사용합니다. 만약 다른 응용 프로그램에서 사용하는 경우 다른 포트 (도구 → 옵션 → 실행 & 디버그)를 설정하고 Thonny를 다시 시작하면 됩니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/debuggers.rst0000644000076600000240000001144514417536743023636 0ustar00aivarannamaastaff디버거를 사용하는 방법에 대해 ========================== Python이 프로그램을 단계별로 실행하는 방법을 확인하려면 "nicer"또는 "faster" *debug-mode* 에서 실행해야합니다. `Birdseye `_ 로 실행하고 나중에 실행 단계를 탐색 할 수도 있습니다. "Nicer" 모드 ------------ 이 모드는 모든 초보자에게 권장됩니다. *실행* 메뉴에서 *현재 스크립트 디버그(똑똑하게)*를 선택하거나 Ctrl + F5를 눌러 시작합니다. (`XFCE에서는 Shift + Ctrl + F5 `__ 를 사용하세요) 프로그램의 첫 번째 문장이 강조 표시되고 더 이상 아무 일도 일어나지 않는 것을 볼 수 있습니다. 이 모드에서는 Python이 다음 단계를 수행 할 준비가 되었음을 Thonny에 알려주는 게 필요합니다. 이를 위해 두 가지 주요 옵션이 있습니다: * *실행 → 스텝 나가기* (또는 F6)는 큰 단계를 수행합니다. 강조 표시된 코드를 실행하고 코드의 다음 부분을 강조 표시합니다. * *실행 → 단계 들어가기* (또는 F7)는 더 작은 단계를 수행합니다. 강조 표시된 코드가 더 작은 부분 (문 또는 표현식)으로 구성된 경우 먼저 강조 표시되고 Thonny는 다음 명령을 기다립니다. 하위 부분 (예 : 변수 이름)이없는 프로그램 구성 요소에 도달 한 경우 *단계 들어가기*는 *스텝 나가기* 처럼 작동합니다. 코드를 실행 (또는 평가)합니다. 실행문이나 표현식의 깊이에 들어갔고 더 빨리 진행하려면 *실행 → 단계 나가기를 사용하여 현재 강조 표시된 코드와 다음 모든 프로그램 부분을 동일한 수준에서 실행할 수 있습니다. *다시 실행* 이라는 약간 유사한 명령이 있습니다. 이 명령은 완료 될 때까지 (또는 다음 중단 점까지, 아래 참조) 단계 없이 명령을 실행합니다. 실수로 조사해야할 코드에서 많은 단계를 지나쳤다면 *실행 → 뒤로 가기*를 선택하여 **단계를 되돌리기** 를 할 수 있습니다. Thonny는 마지막 단계 이전의 프로그램 상태를 보여줍니다. 이제 작은 단계를 계속 진행하고 코드를 자세히 살펴 볼 수 있습니다. (어떻게 작동하냐구요? 큰 단계를 진행해도 Thonny는 모든 중간 프로그램 상태를 저장하므로 한 단계 전 상태를 재생할 수 있습니다.) 코드의 특정 부분에 도달하려면 해당 줄에 커서를 놓고 *실행 → 커서까지 실행*를 선택하여 디버깅 속도를 높일 수 있습니다. 이렇게 하면 Thonny가 커서 위치의 줄까지 자동으로 진행합니다. 거기에서 다른 명령을 시작하시면 됩니다. 편집기 줄 번호를 활성화 한 경우 (도구 → 옵션 → 편집기) **중단점**을 사용할 수도 있습니다. 편집기 왼쪽 여백에서 문 옆을 두 번 클릭하면 점이 나타납니다. 이제 디버거를 시작하면 첫 번째 실행문 앞에서 멈추지 않고 점(중단점이라고도 함)으로 표시된 실행문까지 실행됩니다. 프로그램에 필요한 만큼 중단점을 배치 할 수 있습니다. 점을 두 번 클릭하여 중단점을 제거 할 수도 있습니다. "Faster" 모드 ------------- 프로그램이 커지면 똑똑한 디버거로는 큰 단계를 수행하는 데 시간이 오래 걸리는 것을 알 수 있습니다. 똑똑한 기능들(예를 들어, 표현식 평가를 위해 한 스텝 더 나아가고 뒤로 돌아갈 가능성이 있기 때문에) 에는 크고 느린 장비가 필요하기 때문입니다. *현재 스크립트 디버그(빠르게)*를 사용하면 똑똑하지는 않지만 디버깅을 훨씬 빠르게 진행할 수 있습니다. 똑똑한 디버거에서와 동일한 명령 ("단계 뒤로가기" 제외)을 사용할 수 있습니다. 대부분의 전문 프로그래머가 익숙한 디버깅 스타일입니다. 콜 스택을 표시하는 다양한 스타일 ------------------------------------------- 기본적으로 Thonny는 스택 창을 사용하여 호출 스택을 표시합니다. 이것은 개념에 대한 좋은 직관을 제공하지만 사용하기는 번거로울 수 있습니다. 따라서 버전 3.0부터 호출 스택을 표시하기 위해 두 가지 다른 스타일 중에서 선택할 수 있습니다. "도구 → 옵션 → 디버거"에서 호출 프레임을 표시하고 전환하기 위한 별도의 보기 옵션을 사용하여 보다 전통적인 스타일로 전환 할 수 있습니다. 두 스타일 모두 두 디버깅 모드에서 사용할 수 있습니다. 버드아이 -------- *현재 스크립트 디버그(Birdseye)*는 별도의 ` 페이지`_ 에 설명되어 있습니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/debugging.rst0000644000076600000240000001400714417536743023617 0ustar00aivarannamaastaff디버깅 기술 ==================== 프로그램이 제대로 작동하지 않더라도 당황하지 마세요. 여기에 몇 가지 상황을 나아지게 할 수 있는 방법이 있습니다. 예를 들어: * 다른 사람이 문제를 해결하도록 하세요. * 코드에서 *뭔가*를 변경하고 다시 시도해보세요. * 두 단계로 문제에 접근하세요: 1) 문제 진단 2) 수정 도움을 요청하는 것은 매우 좋은 생각 일 수 있지만 달콤한 성취감을 느낄 수는 없습니다. 어쨌든 먼저 자신의 노력을 기울이지 않고 도움을 요청하지 않는 것이 좋습니다. 프로그램이 작을 때는 무작위로 변경하고 다시 시도 (여러 번 반복)하다가 성공에 다다를 수는 있지만 아무것도 배우지 못할수도 있기 때문에 성공이 별 의미가 없을 수 있습니다. 프로그래밍에 능숙해지려면 문제에 더 체계적으로 접근해야 합니다. 이는 프로그램을 수정하기 전에 프로그램이 오작동하는 이유를 정확히 찾아내야 함을 의미합니다. 문제의 원인을 찾는 과정을 *디버깅* 이라고 합니다. 프로그램 흐름 트레이스 / 파이썬과 같이 생각하기 ------------------------------------------------------ 대부분의 경우 프로그램이 완전히 잘못되지는 않습니다. 어딘가에 오타가 있거나 무언가를 간과하거나 오해했을 수 있습니다. *주의! 파이썬이 당신을 오해했다고는 생각하지 마세요. -- 당신을 이해하려고 시도조차 하지 않는 기계니까요. 디버깅의 핵심은 프로그램 동작에 대한 가정이 실제 동작과 다른 부분과 타이밍을 정확하게 파악하는 것입니다. 프로그램이 잘못된 최종 답을 출력하는 것으로 프로그램 동작을 파악 할 수 있지만 일반적으로 문제를 정확하게 찾을 때 사용하기에는 충분하지 않습니다. 또한 **중간 단계** 중 어느 것이 가정과 일치하고 어떤 것이 일치하지 않는지도 확인해야 합니다. 한 가지 명백하면서도 매우 유용한 기술은 코드에 **부가적인 print 문**을 추가하는 것입니다. 이는 Python이 어디까지 실행되었고 지금까지 수행한 작업을 파악하는데 도움이 됩니다. 예를 들어 .. code:: print("friends before for-loop", friends) 주의! 때로는 더 자세한 정보를 출력하기 위해 새로운 변수를 도입하고 복잡한 표현식을 더 작은 부분으로 분할해야 할 수 있습니다. 전문가들도 출력-디버깅을 사용하지만 (*로깅*이라고 부름) 대부분의 경우 더 편리한 방법이 있습니다. **코드를 단계별로 실행**이라고 하며 Thonny의 빵과 버터(핵심 기능)입니다. 자세한 내용은 `디버거 사용 `_ 장을 참고하세요. 코드 리뷰 --------------------- 또 다른 유용한 기술 중 하나는 코드 리뷰입니다. 이것은 프로그램 흐름을 추적하는 것과 다소 유사하지만 머리 속에서 수행하며 작은 단계를 따르는 대신 더 큰 그림을 보려고 하는 부분이 있습니다. 코드의 각 문장을 보고 그 목적과 작업과의 관계를 이해하세요. 각 **변수**에 대해 다음과 같이 자문해보세요: * 변수의 이름이 그 목적을 나타내고 있나요? 단수나 복수 중 어떤것으로 이름을 지정하는 것이 더 낫나요? * 어떤 유형의 값이 이 변수에 포함될 수 있나요? 문자열, 정수, 문자열 목록, 부동 소수점 목록 ? * 변수의 역할은 무엇인가요? 결국 유용한 정보를 포함하도록 반복적으로 업데이트 되야 하나요? 여러 위치에서 동일한 정보를 사용하고 복사-붙여 넣기를 줄이기 위한 것인가요? 또 다른 건 없나요? 각 **반복문**에 대해 다음과 같이 자문해보세요: * 반복문이 정말 필요한가요? * 반복문은 몇 번 실행해야 하나요? 이것은 어떤것과 연관이 있나요? * 어떤 코드가 반복문 내부에 있어야 하고 어떤 코드가 외부에 있어야 하나요? * 루프 전에 수행해야 하는 작업과 이후 수행해야 하는 작업은 무엇인가요? 각 복잡한 **표현식**에 대해 다음과 같이 자문해보세요: * 이 표현을 평가하는 단계는 어느 순서로 해야 하나요? 파이썬에서 실행 가능한가요? 확실하지 않은 경우, 디버거를 사용하거나 도우미 변수를 도입하고 식을 더 작은 부분으로 나누세요. * 이 표현에서 어떤 타입의 값이 나올까요? 문자열? 문자열 목록? 프로그램에서 몇 가지 중요한 부분이 누락되었을 수도 있으니 확인해보세요: * 작업이 다른 상황을 다르게 처리해야 하나요? 그렇다면 아마 if 문이 필요할 겁니다. * 작업을 수행하려면 여러 번 수행해야 하나요? 그렇다면 아마 반복문이 필요할 겁니다. 트랙킹을 하다가 놓치셨나요? ------------------------------ "당신이 했던 가정이 깨지는 곳을 찾으세요" -- 이것은 생각보다 쉽지 않은 일입니다. 복잡한 프로그램의 경우 더 이상 당신이 무엇을 가정하고 왜 이 프로그래밍 작업을 시작했는지 확신 할 수 없는 상황에 도달하기 쉽습니다. 이 경우 가능한 한 작업을 단순화하고 더 간단한 문제를 먼저 구현하는 것이 유용합니다. 새 편집기를 사용하여 처음부터 시작하거나 기존 코드를 복사하고 문제에 필수적이지 않은 모든 것을 정리하세요. 예를 들어, 사용자가 협조적이며 항상 "좋은" 데이터를 입력한다고 가정 할 수 있습니다. 작업에 반복적으로 수행해야 하는 작업이 있으면 "반복" 부분을 버리고 작업에 복잡한 조건이 포함되어 있으면 조건을 더 단순하게 만드는 등의 작업을 수행하면 됩니다. 단순화된 문제를 해결 한 후에는 원래 작업을 해결할 수 있는 능력이 훨씬 더 좋아집니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/dock.rst0000644000076600000240000000241414417536743022603 0ustar00aivarannamaastaff사용자 윈도우 도킹에 대해 ==================== Turtle (혹은 다른 Tkinter) 프로그램을 개발할 때 코드에서 무언가를 수정하는 동안 마지막 실행에서 윈도우를 보고 싶을 수 있습니다. 화면이 크거나 여러 개인 경우, Thonny의 옆에 윈도우를 맞추는 것이 어렵지 않지만 다음 실행시 윈도우 매니저가 창을 다른 곳에 배치 할 수도 있어서 다시 창을 정렬해야 합니다. **실행**의 **사용자 창 붙이기**는 이러한 상황에 도움을 줄 수 있습니다. 만약 이것을 체크하고 Tkinter 프로그램을 실행하면 Thonny는 다음과 같은 트릭을 사용합니다: * 윈도우 위치를 기억합니다. 다음에 윈도우를 같은 위치에 배치합니다. * Thonny 윈도우를 클릭하여 코드 수정을 시작 하더라도 창이 가장 앞에 유지됩니다. Tkinter 창이 표시되면, Thonny는 자동으로 소유 윈도우에 초점을 맞추므로 마우스를 잡지 않고도 계속 스크립트를 편집 할 수 있습니다. 작업이 끝나면 F5를 눌러 이전 윈도우를 새 윈도우로 바꿉니다. *현재 macOS 에서 turtle 프로그램은 상단 유지가 작동하지 않습니다.(https://github.com/thonny/thonny/issues/798)* ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/errors.rst0000644000076600000240000000470714417536743023206 0ustar00aivarannamaastaff에러에 대한 이해 ==================== 프로그램이 오류나 잘못된 결과를 제공하는 경우 문제를 이해하기 전에 아무것도 고치지 않는게 좋습니다. `다른 페이지 `__ 에서 더 자세한 이야기를 확인 할 수 있습니다. 여기에 빠른 체크리스트가 있으므로 당신의 아이디어를 구현하는데 도움이 될 겁니다. 혹시 두려우신가요? --------------- 그럴 필요 없습니다! 에러 메시지는 도움을 주기 위한 것입니다. 에러를 발생시켰다고 해서 당신이 나쁜 사람이라는 뜻이 아닙니다. 아, 그리고 당신은 컴퓨터를 망가트리지 않았습니다. 에러 메시지를 처음 봤을 때는 횡설수설 하는 것처럼 보일 수 있지만 실제로는 에러 메시지에서 유용한 정보를 추출 할 수 있습니다. 에러가 발생한 곳은 어디인가요? ------------------------------------- Thonny의 에러 메시지에는 오류를 일으킨 코드 위치로 연결되는 링크가 있습니다. 링크가 여러 개인 경우 일반적으로 마지막 링크가 가장 관련성이 높습니다. 함수 내에서 에러가 발생한 경우 메시지에 여러 링크가 있습니다. 위에서 아래로 하나씩 클릭하면 Python 이 어떻게 오류 위치에 도달했는지 알 수 있습니다. 이러한 링크 세트를 *스택 트레이스* 라고 합니다. 어떤 것을 의미하는 에러인가요? ------------------------- 오류 블록의 마지막 줄은 Python의 문제를 나타냅니다. 메시지를 이해하려고 할 때 컨텍스트를 잊지 말고 메시지의 일부를 코드의 링크 된 위치와 일치 시키십시오. 어쩔때는 Thonny의 어시스턴트가 오류를 더 간단한 용어로 설명 할 수 있으며 어쩔때는 메시지에 대해 인터넷 검색을 해야 할 수 있습니다. (검색에 "Python"을 추가하는 것을 잊지 마세요). 에러 상황에서의 변수는 어떤 값을 가지고 있나요? --------------------------------------------------------- 변수 보기를 열고 값을 확인하세요! 함수 내에서 오류가 발생한 경우 스택 트레이스에서 링크를 클릭하여 로컬 변수를 볼 수 있습니다. 프로그램이 그 상태에 어떻게 도달했나요? --------------------------------------- `the page about debugging `_ 혹은 `the page about using Thonny's debuggers `_ 참조하세요. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/flask.rst0000644000076600000240000000407414417536743022767 0ustar00aivarannamaastaff플라스크를 이용한 웹개발에 대해 ========================== `Flask `__ 는 웹 앱을 빌드하는데 널리 사용되는 프레임워크 입니다. Flask 튜토리얼은 일반적으로 터미널에 몇 가지 명령을 입력하여 Flask 프로그램을 실행하도록 지시하지만 일부 초심자는 이를 두려워 할 수 있습니다. Thonny는 이를 쉽게 만들고 다른 프로그램과 마찬가지로 Flask 프로그램을 실행할 수 있도록 합니다 (간단한 F5 사용함으로). Flask 프로그램을 실행하고 있음을 감지하면 몇 줄의 코드를 추가 및 실행하여 적절한 설정으로 개발 서버를 시작합니다. 디버깅 --------- Flask 프로그램을 단계별로 진행하려면 일부 함수 내부에 브레이크 포인트를 설정하고 디버거를 호출합니다 (멋지고 빠른 작업이지만, 빠른건.. 빠른겁니다). 페이지를 새로 고침하고 함수 내부로 진입하세요. 보다 편안한 작업을 위해 "분리된 창에 있는 프레임" (도구 => 옵션 => 실행 & 디버그)을 끌 수 있습니다. 세부사항들 ------- Thonny는 대략 다음과 같이 개발 서버를 시작합니다: .. code:: os.environ["FLASK_ENV"] = "development" app.run(threaded=False, use_reloader=False, debug=False) ``threaded=False`` Thonny의 디버거는 싱글-쓰레드 프로그램만 지원하기 때문에 이 옵션을 사용합니다, ``use_reloader=False`` 는 아래의 이유로 사용됩니다 `자동 재로딩은 안정적이지 않습니다. 링크 확인 `_ 그리고 ``debug=False`` "이미 사용 중인 주소" 에러를 더 적게 발생시키기 위해 사용됩니다. 만약 설정을 더 많이 제어하고 싶으면 ``run``-함수를 아래와 같이 직접 호출해야 합니다. 예: .. code:: ... if __name__ == "__main__": app.run(port=5005, threaded=False, use_reloader=True, debug=True) 이 경우 Thonny는 코드에 아무것도 추가하지 않습니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/index.rst0000644000076600000240000000156614417536743023001 0ustar00aivarannamaastaff기능들에 대해 =========== * `디버거를 사용하는 방법에 대해 `_ * `써드파티 패키지들의 설치에 대해 `_ * `사용자 윈도우 도킹에 대해 `_ * `터틀 프로그램에 대한 특별한 지원에 대해 `_ * `커맨드 라인 인자(아규먼트)들을 이용해 실행하는 것에 대해 `_ * `간단 모드와 전문가 모드에 대해 `_ * `쉘에 대해 `_ * `플로터에 대해 `_ * `버드아이에 대해 `_ * `플라스크를 이용한 웹개발에 대해 `_ 일반 주제 ============== * `에러를 다루는 방법 `_ * `디버깅에 대한 일반적인 조언 `_ 온라인 ====== Thonny wiki에 좀 더 많은 정보가 있습니다: https://github.com/thonny/thonny/wiki. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/modes.rst0000644000076600000240000000216614730022736022764 0ustar00aivarannamaastaff다양한 모드들 =============== *도구 → 옵션 → 일반* 에서 UI 모드를 세 가지 모드 중 하나로 변경 할 수 있습니다. 일반 모드 ------------ 기본 모드입니다. 특별한 것은 없습니다. 간단 모드 ----------- 이 모드에서는 메뉴들이 숨겨지고, 툴바 버튼에서 설명을 표시하고 변수 보기가 자동으로 열립니다. 일반 모드로 돌아가려면 메인 윈도우 오른쪽 최상단의 작은 링크를 사용하세요. 전문가 모드 ----------- This mode looks almost like regular mode, but has some extra features, which are useful for teachers. 기본 모드와 유사해 보이지만, 선생님들을 위한 추가적인 기능들이 있습니다. * 보기 메뉴에는 Thonny를 전체 화면으로 전환할 수 있는 * 전체 화면 *이 추가 항목으로 있습니다. * 편집기 또는 보기 탭을 두 번 클릭하면 최대화됩니다. 최대화를 해제하려면 탭을 다시 두 번 클릭하세요. * 도구 메뉴의 추가 아이템인 * 재생기 열기 ... *를 이용하면 사용자 작업 로그를 재생할 수 있습니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/packages.rst0000644000076600000240000000523714417536743023447 0ustar00aivarannamaastaff써드파티 패키지들의 설치에 대해 ============================== Thonny는 써드파티 라이브러리 설치를 위한 두 개의 옵션이 있습니다. pip-GUI를 이용할 경우 ------------- "도구"에서 "패키지 관리..."를 선택하고 안내에 따르세요. 커맨드라인에서 pip를 이용할 경우 ------------------------ #. "도구"에서 "시스템 셸 열기..."를 선택하세요. *pip* 명령(일반적으로``pip ''또는``pip3 '')을 나타내는 새 터미널 창이 표시됩니다. 여기서는 명령 이름이``pip ''라고 가정했습니다. #. ``pip install <패키지 이름>``(예 :``pip install pygame '')을 입력하고 엔터를 누릅니다. *pip*가 패키지 다운로드 및 설치 및 성공 메시지를 표시합니다. #. 터미널을 닫으세요 (선택) #. Thonny로 돌아가세요 #. "실행"에서 "정지/재시작"을 선택하여 인터프리터를 재설정합니다 (pip 설치를 처음 수행 할 때만) #. 설치된 패키지를 사용하시면 됩니다. scientific Python 패키지들을 이용할 경우 ================================ Thonny와 함께 제공되는 Python 배포판에는 과학 프로그래밍 라이브러리가 포함되어 있지 않습니다 (예: `NumPy `_ , `Matplotlib `_) 대부분의 인기있는 과학 Python 패키지의 최신 버전 (예 : numpy, pandas 및 matplotlib) 에는 널리 사용되는 플랫폼에서 사용 가능한 휠이 있으므로 대부분 pip를 사용하여 설치할 수 있으나 만약 문제가있는 경우 Thonny를 별도의 과학 컴퓨팅을위한 Python 배포판을 사용해 볼 수 있습니다. (예: `Anaconda `_ 혹은 `Pyzo `_) 예제: Anaconda를 이용할 경우 ------------------------------------ https://www.anaconda.com/products/individual 에서 플랫폼에 맞는 사용할 바이너리 배포판을 다운로드 하세요. 대부분 그래픽 설치 프로그램 및 64비트 버전을 사용합니다. (아주 오래된 시스템을 사용하는 경우 32비트 버전을 사용하세요) 설치 및 Python 실행 파일이 어디에 있는지 확인하세요. (Windows에서는 *pythonw.exe* 을 Linux 및 Mac의 경우에는 *python3* 혹은 *python* ) Thonny에서 "도구"를 열고 "옵션..."을 선택하세요. 옵션 대화 상자에서 "인터프리터" 탭을 열고, "실행 파일 선택"을 클릭하고 Anaconda의 Python 실행 파일 위치를 선택합니다. 이 작업 후, 다음에 프로그램을 실행할 때 Anaconda에서 사용되는 Python이 실행되며 설치된 모든 라이브러리를 사용할 수 있습니다. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/plotter.rst0000644000076600000240000000466214417536743023363 0ustar00aivarannamaastaff플로터에 대해 ========================== 플로터는 프로그램 출력에서 숫자를 추출하여 선형 차트로 표시하는 Shell의 추가 기능입니다. 연결된 장치에서 오는 라이브 센서 데이터를 관찰하거나 정적 데이터를 분석하는데 유용할 수 있습니다 (더 강력한 도구를 사용하지 않는 경우). `Mu Python 편집기 `__ 에서 영감을 얻었습니다. "보기" 메뉴 또는 셸의 컨텍스트 메뉴에서 열 수 있습니다. 예제로 다음 프로그램을 한 번 실행해보세요. (Ctrl + C 또는 도구 모음의 "정지/재시작" 버튼으로 중지 할 수 있음): .. code:: from time import sleep from random import randint p1 = 0 while True: p1 += randint(-1, 1) p2 = randint(-10, 10) print("Random walk:", p1, " just random:", p2) sleep(0.05) 플로터를 연 상태에서 실행하면 두 개의 시리즈로 구성된 꺾은 선형 차트가 표시됩니다. 차트의 각 열은 쉘의 한 줄에 해당합니다. 차트의 가장 오른쪽 열은 쉘에서 가장 아래에 보이는 줄에 해당하며 프로그램을 중지했을 때에도 마찬가지 입니다. 플로터는 동일한 패턴의 숫자와 주변 텍스트를 포함하는 두 개 이상의 연속된 선을 감지하면 그리기를 시작합니다. 숫자가 플로팅되고 주변 텍스트가 플로터의 오른쪽 아래 모서리에 있는 범례가 됩니다. 애니메이션의 속도 -------------------------------- 고정된 수의 선을 플로팅하지 않는 한 쉘과 플로터에 데이터가 넘치지 않도록 하는 것이 좋습니다. 위의 예제에서 다음 줄을 출력하기 전에 약간의 멈춤 (``sleep (0.05)``)을 만드는 이유입니다. Y축의 범위 ------------------- 플로터는 너무 자주 변경하지 않도록 플롯에 적합한 범위를 감지하려고 합니다. 이러한 이유로 필요한 경우 범위를 확장하지만 새 시리즈를 시작할 때는 축소된 형태입니다. 일부 이상치가 범위를 너무 크게 만든 경우 이상치가 그림에서 벗어날 때까지 기다렸다가 플로터를 클릭하여 수동으로 축소 할 수 있습니다. 범위를 더 크게 만들고 싶다면 (혹은 데이터를 특정 값과 비교하기만 할 거라면) 데이터 라인에 적절한 상수를 넣어주기만 하면 됩니다. 예 : ``print(0, measure1, measure2, 100)``. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/locale/ko_KR/HELP_CONTENT/program_arguments.rst0000644000076600000240000000233514417536743025421 0ustar00aivarannamaastaff커맨드 라인 인자(아규먼트)들을 이용해 실행하는 것에 대해 ================================================= *my_program.py*를 편집하고 F5 키를 누르면 Thonny는 매직 커맨드 ``% Run my_program.py``를 쉘로 전송하여 Thonny의 백엔드에서 해당 스크립트를 실행하도록 요청합니다. 쉘로 이동하여 ``% Run`` 명령을 다시 불러오면 (키보드의 위쪽 방향키) *명령 줄 인수*를 추가 할 수 있습니다. 예를 들어 명령을 ``% Run my_program.py first second`` 로 변경하고 Enter 키를 누릅니다. 다음과 같은 프로그램을 실행하면 ``sys.argv``를 이용해 인자에 접근 할 수 있습니다: .. code:: import sys print(sys.argv) 커맨드라인 인자들을 수정하는 방법 --------------------------------- 동일한 아규먼트 집합을 여러 번 사용해야하는 경우, ``% Run``을 직접 구성하는 것이 지루할 수 있습니다. 그런 경우 **보기**에서 **프로그램 인자**를 체크하세요. 그러면 도구 모음 버튼 옆에 작은 입력 상자가 열립니다. 이제부터 F5를 누를 때마다 이 상자에 입력된 모든 내용이 ``% Run ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3281584 thonny-4.1.7/thonny/plugins/pylint/0000755000076600000240000000000014730055627017735 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/pylint/__init__.py0000644000076600000240000001405214730022736022043 0ustar00aivarannamaastaffimport ast import subprocess from logging import getLogger from thonny import get_workbench, ui_utils from thonny.assistance import SubprocessProgramAnalyzer, add_program_analyzer from thonny.plugins.pylint.messages import checks_by_id from thonny.running import get_front_interpreter_for_subprocess logger = getLogger(__name__) RESULT_MARKER = "ForThonny: " class PylintAnalyzer(SubprocessProgramAnalyzer): def is_enabled(self): return get_workbench().get_option("assistance.use_pylint") def start_analysis(self, main_file_path, imported_file_paths): relevant_symbols = { checks_by_id[key]["msg_sym"] for key in checks_by_id if checks_by_id[key]["usage"] == "warning" } if "bad-python3-import" in relevant_symbols: # https://github.com/PyCQA/pylint/issues/2453 # TODO: allow if this is fixed in minimum version relevant_symbols.remove("bad-python3-import") # remove user-disabled checks relevant_symbols = relevant_symbols - set( get_workbench().get_option("assistance.disabled_checks") ) ignored_modules = {"turtle"} # has dynamically generated attributes options = [ # "--rcfile=None", # TODO: make it ignore any rcfiles that can be somewhere "--persistent=n", # "--confidence=HIGH", # Leave empty to show all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED # "--disable=missing-docstring,invalid-name,trailing-whitespace,trailing-newlines,missing-final-newline,locally-disabled,suppressed-message", "--disable=all", "--enable=" + ",".join(relevant_symbols), "--ignored-modules=" + ",".join(ignored_modules), "--max-line-length=120", "--output-format=text", "--reports=n", "--msg-template=" + RESULT_MARKER + "{abspath},,{line},,{column},,{symbol},,{msg},,{msg_id},,{C}", ] # disallow unused globals only in main script """ Not good idea, because unused * imports also count as unused global vars from pylint.__pkginfo__ import numversion if not imported_file_paths and numversion >= (1, 7): # (unfortunately can't separate main script when user modules are present) options.append("--allow-global-unused-variables=no") """ self._proc = ui_utils.popen_with_ui_thread_callback( [get_front_interpreter_for_subprocess(), "-m", "pylint"] + options + [main_file_path] + list(imported_file_paths), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, on_completion=self._parse_and_output_warnings, ) def _parse_and_output_warnings(self, pylint_proc, out_lines, err_lines): # print("COMPL", out, err) # get rid of non-error err = ( "".join(err_lines) .replace("No config file found, using default configuration", "") .strip() ) if err: logger.error("Pylint: " + err) warnings = [] for line in out_lines: if line.startswith(RESULT_MARKER): # See https://github.com/thonny/thonny/issues/2359 for the background of this format atts_tuple = line[len(RESULT_MARKER) :].strip().split(",,") if len(atts_tuple) != 7: logger.error("Can't parse Pylint line %r (%r)", line, atts_tuple) continue try: atts = { "filename": atts_tuple[0], "lineno": int(atts_tuple[1]), "col_offset": int(atts_tuple[2]), "symbol": atts_tuple[3], "msg": atts_tuple[4], "msg_id": atts_tuple[5], "category": atts_tuple[6], } except ValueError: logger.exception("Can't parse Pylint line %r (%r)", line, atts_tuple) continue if atts["msg_id"] not in checks_by_id: logger.warning("Unknown msg_id %r", atts["msg_id"]) continue check = checks_by_id[atts["msg_id"]] if check.get("tho_xpln"): explanation = check["tho_xpln"] else: explanation = check["msg_xpln"] if explanation.startswith("Used when an "): explanation = "It looks like the " + explanation[(len("Used when an ")) :] elif explanation.startswith("Emitted when an "): explanation = "It looks like the " + explanation[(len("Emitted when an ")) :] elif explanation.startswith("Used when a "): explanation = "It looks like the " + explanation[(len("Used when a ")) :] elif explanation.startswith("Emitted when a "): explanation = "It looks like the " + explanation[(len("Emitted when a ")) :] elif explanation.startswith("Used when "): explanation = "It looks like " + explanation[(len("Used when ")) :] elif explanation.startswith("Emitted when "): explanation = "It looks like " + explanation[(len("Emitted when ")) :] atts["explanation"] = explanation if check.get("tho_xpln_rst"): atts["explanation_rst"] = check["tho_xpln_rst"] if atts["category"] in ("I", "F"): atts["msg"] = "INTERNAL ERROR when analyzing the code: " + atts["msg"] # atts["more_info_url"] = "http://pylint-messages.wikidot.com/messages:%s" % atts["msg_id"].lower() warnings.append(atts) self.completion_handler(self, warnings) def load_plugin(): add_program_analyzer(PylintAnalyzer) get_workbench().set_default("assistance.use_pylint", True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/plugins/pylint/messages.py0000644000076600000240000045764214626075445022144 0ustar00aivarannamaastaff# according to version 2.5.3 (pylint --list-msgs) checks_by_id = { "C0102": { "msg_id": "C0102", "msg_sym": "blacklisted-name", "msg_text": 'Black listed name "%s"', "msg_xpln": "Used when the name is listed in the black list (unauthorized names).", "tho_xpln": "", "usage": "skip", }, "C0103": { "msg_id": "C0103", "msg_sym": "invalid-name", "msg_text": '%s name "%s" doesn\'t conform to %s', "msg_xpln": "Used when the name doesn't conform to naming rules associated to its type (constant, variable, class...).", "tho_xpln": "", "usage": "enhancement", }, "C0104": { "msg_id": "C0104", "msg_sym": "disallowed-name", "msg_text": 'Disallowed name "%s"', "msg_xpln": "Used when the name matches bad-names or bad-names-rgxs- (unauthorized names).", "usage": "style", }, "C0105": { "msg_id": "C0105", "msg_sym": "typevar-name-incorrect-variance", "msg_text": "Type variable name does not reflect variance%s", "msg_xpln": "Emitted when a TypeVar name doesn't reflect its type variance. According to PEP8, it is recommended to add suffixes '_co' and '_contra' to the variables used to declare covariant or contravariant behaviour respectively. Invariant (default) variables do not require a suffix. The message is also emitted when invariant variables do have a suffix.", "usage": "typing", }, "C0111": { "msg_id": "C0111", "msg_sym": "missing-docstring", "msg_text": "Missing %s docstring", "msg_xpln": "Used when a module, function, class or method has no docstring.Some special methods like __init__ doesn't necessary require a docstring.", "tho_xpln": "", "usage": "skip", }, "C0112": { "msg_id": "C0112", "msg_sym": "empty-docstring", "msg_text": "Empty %s docstring", "msg_xpln": "Used when a module, function, class or method has an empty docstring (it would be too easy ;).", "tho_xpln": "", "usage": "skip", }, "C0113": { "msg_id": "C0113", "msg_sym": "unneeded-not", "msg_text": 'Consider changing "%s" to "%s"', "msg_xpln": "Used when a boolean expression contains an unneeded negation.", "tho_xpln": "", "usage": "enhancement", }, "C0114": { "msg_id": "C0114", "msg_sym": "missing-module-docstring", "msg_text": "Missing module docstring", "msg_xpln": "Used when a module has no docstring.Empty modules do not require a docstring.", "tho_xpln": "", "usage": "skip", }, "C0115": { "msg_id": "C0115", "msg_sym": "missing-class-docstring", "msg_text": "Missing class docstring", "msg_xpln": "Used when a class has no docstring.Even an empty class must have a docstring.", "tho_xpln": "", "usage": "skip", }, "C0116": { "msg_id": "C0116", "msg_sym": "missing-function-docstring", "msg_text": "Missing function or method docstring", "msg_xpln": "Used when a function or method has no docstring.Some special methods like __init__ do not require a docstring.", "tho_xpln": "", "usage": "skip", }, "C0121": { "msg_id": "C0121", "msg_sym": "singleton-comparison", "msg_text": "Comparison %s should be %s", "msg_xpln": "Used when an expression is compared to singleton values like True, False or None.", "tho_xpln": "", "usage": "enhancement", }, "C0122": { "msg_id": "C0122", "msg_sym": "misplaced-comparison-constant", "msg_text": "Comparison should be %s", "msg_xpln": "Used when the constant is placed on the left side of a comparison. It is usually clearer in intent to place it in the right hand side of the comparison.", "tho_xpln": "", "usage": "enhancement", }, "C0123": { "msg_id": "C0123", "msg_sym": "unidiomatic-typecheck", "msg_text": "Use isinstance() rather than type() for a typecheck.", "msg_xpln": "The idiomatic way to perform an explicit typecheck in Python is to use isinstance(x, Y) rather than type(x) == Y, type(x) is Y. Though there are unusual situations where these give different results.", "tho_xpln": "", "usage": "enhancement", }, "C0131": { "msg_id": "C0131", "msg_sym": "typevar-double-variance", "msg_text": "TypeVar cannot be both covariant and contravariant", "msg_xpln": 'Emitted when both the "covariant" and "contravariant" keyword arguments are set to "True" in a TypeVar.', "usage": "typing", }, "C0132": { "msg_id": "C0132", "msg_sym": "typevar-name-mismatch", "msg_text": 'TypeVar name "%s" does not match assigned variable name "%s"', "msg_xpln": "Emitted when a TypeVar is assigned to a variable that does not match its name argument.", "usage": "typing", }, "C0144": { "msg_id": "C0144", "msg_sym": "non-ascii-name", "msg_text": '%s name "%s" contains a non-ASCII unicode character', "msg_xpln": "Used when the name contains at least one non-ASCII unicode character.", "tho_xpln": "", "usage": "style", }, "C0200": { "msg_id": "C0200", "msg_sym": "consider-using-enumerate", "msg_text": "Consider using enumerate instead of iterating with range and len", "msg_xpln": "Emitted when code that iterates with range and len is encountered. Such code can be simplified by using the enumerate builtin.", "tho_xpln": "", "usage": "enhancement", }, "C0201": { "msg_id": "C0201", "msg_sym": "consider-iterating-dictionary", "msg_text": "Consider iterating the dictionary directly instead of calling .keys()", "msg_xpln": "Emitted when the keys of a dictionary are iterated through the ``.keys()`` method or when ``.keys()`` is used for a membership check. It is enough to iterate through the dictionary itself, ``for key in dictionary``. For membership checks, ``if key in dictionary`` is faster.", "tho_xpln": "", "usage": "enhancement", }, "C0202": { "msg_id": "C0202", "msg_sym": "bad-classmethod-argument", "msg_text": "Class method %s should have %s as first argument", "msg_xpln": 'Used when a class method has a first argument named differently than the value specified in valid-classmethod-first-arg option (default to "cls"), recommended to easily differentiate them from regular instance methods.', "tho_xpln": "", "usage": "enhancement", }, "C0203": { "msg_id": "C0203", "msg_sym": "bad-mcs-method-argument", "msg_text": "Metaclass method %s should have %s as first argument", "msg_xpln": 'Used when a metaclass method has a first argument named differently than the value specified in valid-classmethod-first-arg option (default to "cls"), recommended to easily differentiate them from regular instance methods.', "tho_xpln": "", "usage": "skip", }, "C0204": { "msg_id": "C0204", "msg_sym": "bad-mcs-classmethod-argument", "msg_text": "Metaclass class method %s should have %s as first argument", "msg_xpln": 'Used when a metaclass class method has a first argument named differently than the value specified in valid-metaclass-classmethod-first-arg option (default to "mcs"), recommended to easily differentiate them from regular instance methods.', "tho_xpln": "", "usage": "skip", }, "C0205": { "msg_id": "C0205", "msg_sym": "single-string-used-for-slots", "msg_text": "Class __slots__ should be a non-string iterable", "msg_xpln": "Used when a class __slots__ is a simple string, rather than an iterable.", "tho_xpln": "", "usage": "warning", }, "C0206": { "msg_id": "C0206", "msg_sym": "consider-using-dict-items", "msg_text": "Consider iterating with .items()", "msg_xpln": "Emitted when iterating over the keys of a dictionary and accessing the value by index lookup. Both the key and value can be accessed by iterating using the .items() method of the dictionary instead.", "usage": "advanced", }, "C0207": { "msg_id": "C0207", "msg_sym": "use-maxsplit-arg", "msg_text": "Use %s instead", "msg_xpln": "Emitted when accessing only the first or last element of str.split(). The first and last element can be accessed by using str.split(sep, maxsplit=1)[0] or str.rsplit(sep, maxsplit=1)[-1] instead.", "usage": "advanced", }, "C0208": { "msg_id": "C0208", "msg_sym": "use-sequence-for-iteration", "msg_text": "Use a sequence type when iterating over values", "msg_xpln": "When iterating over values, sequence types (e.g., ``lists``, ``tuples``, ``ranges``) are more efficient than ``sets``.", "usage": "advanced", }, "C0209": { "msg_id": "C0209", "msg_sym": "consider-using-f-string", "msg_text": "Formatting a regular string which could be a f-string", "msg_xpln": "Used when we detect a string that is being formatted with format() or % which could potentially be a f-string. The use of f-strings is preferred. Requires Python 3.6 and ``py-version >= 3.6``.", "usage": "style", }, "C0301": { "msg_id": "C0301", "msg_sym": "line-too-long", "msg_text": "Line too long (%s/%s)", "msg_xpln": "Used when a line is longer than a given number of characters.", "tho_xpln": "", "usage": "enhancement", }, "C0302": { "msg_id": "C0302", "msg_sym": "too-many-lines", "msg_text": "Too many lines in module (%s/%s)", "msg_xpln": "Used when a module has too many lines, reducing its readability.", "tho_xpln": "", "usage": "skip", }, "C0303": { "msg_id": "C0303", "msg_sym": "trailing-whitespace", "msg_text": "Trailing whitespace", "msg_xpln": "Used when there is whitespace between the end of a line and the newline.", "tho_xpln": "", "usage": "skip", }, "C0304": { "msg_id": "C0304", "msg_sym": "missing-final-newline", "msg_text": "Final newline missing", "msg_xpln": "Used when the last line in a file is missing a newline.", "tho_xpln": "", "usage": "skip", }, "C0305": { "msg_id": "C0305", "msg_sym": "trailing-newlines", "msg_text": "Trailing newlines", "msg_xpln": "Used when there are trailing blank lines in a file.", "tho_xpln": "", "usage": "skip", }, "C0321": { "msg_id": "C0321", "msg_sym": "multiple-statements", "msg_text": "More than one statement on a single line", "msg_xpln": "Used when more than on statement are found on the same line.", "tho_xpln": "", "usage": "enhancement", }, "C0325": { "msg_id": "C0325", "msg_sym": "superfluous-parens", "msg_text": "Unnecessary parens after %r keyword", "msg_xpln": "Used when a single item in parentheses follows an if, for, or other keyword.", "tho_xpln": "", "usage": "enhancement", }, "C0326": { "msg_id": "C0326", "msg_sym": "bad-whitespace", "msg_text": "%s space %s %s %s", "msg_xpln": "Used when a wrong number of spaces is used around an operator, bracket or block opener.", "tho_xpln": "", "usage": "style", }, "C0327": { "msg_id": "C0327", "msg_sym": "mixed-line-endings", "msg_text": "Mixed line endings LF and CRLF", "msg_xpln": "Used when there are mixed (LF and CRLF) newline signs in a file.", "tho_xpln": "", "usage": "skip", }, "C0328": { "msg_id": "C0328", "msg_sym": "unexpected-line-ending-format", "msg_text": "Unexpected line ending format. There is '%s' while it should be '%s'.", "msg_xpln": "Used when there is different newline than expected.", "tho_xpln": "", "usage": "skip", }, "C0330": { "msg_id": "C0330", "msg_sym": "bad-continuation", "msg_text": "Wrong %s indentation%s%s.", "msg_xpln": "TODO", "tho_xpln": "", "usage": "skip", }, "C0401": { "msg_id": "C0401", "msg_sym": "wrong-spelling-in-comment", "msg_text": "Wrong spelling of a word '%s' in a comment:", "msg_xpln": "Used when a word in comment is not spelled correctly.", "tho_xpln": "", "usage": "skip", }, "C0402": { "msg_id": "C0402", "msg_sym": "wrong-spelling-in-docstring", "msg_text": "Wrong spelling of a word '%s' in a docstring:", "msg_xpln": "Used when a word in docstring is not spelled correctly.", "tho_xpln": "", "usage": "skip", }, "C0403": { "msg_id": "C0403", "msg_sym": "invalid-characters-in-docstring", "msg_text": "Invalid characters %r in a docstring", "msg_xpln": "Used when a word in docstring cannot be checked by enchant.", "tho_xpln": "", "usage": "skip", }, "C0410": { "msg_id": "C0410", "msg_sym": "multiple-imports", "msg_text": "Multiple imports on one line (%s)", "msg_xpln": "Used when import statement importing multiple modules is detected.", "tho_xpln": "", "usage": "style", }, "C0411": { "msg_id": "C0411", "msg_sym": "wrong-import-order", "msg_text": "%s should be placed before %s", "msg_xpln": "Used when PEP8 import order is not respected (standard imports first, then third-party libraries, then local imports)", "tho_xpln": "", "usage": "style", }, "C0412": { "msg_id": "C0412", "msg_sym": "ungrouped-imports", "msg_text": "Imports from package %s are not grouped", "msg_xpln": "Used when imports are not grouped by packages", "tho_xpln": "", "usage": "style", }, "C0413": { "msg_id": "C0413", "msg_sym": "wrong-import-position", "msg_text": 'Import "%s" should be placed at the top of the module', "msg_xpln": "Used when code and imports are mixed", "tho_xpln": "", "usage": "style", }, "C0414": { "msg_id": "C0414", "msg_sym": "useless-import-alias", "msg_text": "Import alias does not rename original package", "msg_xpln": "Used when an import alias is same as original package.e.g using import numpy as numpy instead of import numpy as np", "tho_xpln": "Used when an import alias is same as original package. e.g using import numpy as numpy instead of import numpy as np or e.g using import os.path as path instead of from os import path.", "usage": "enhancement", }, "C0415": { "msg_id": "C0415", "msg_sym": "import-outside-toplevel", "msg_text": "Import outside toplevel (%s)", "msg_xpln": "Used when an import statement is used anywhere other than the module toplevel. Move this import to the top of the file.", "tho_xpln": "", "usage": "skip", }, "C1801": { "msg_id": "C1801", "msg_sym": "len-as-condition", "msg_text": "Do not use `len(SEQUENCE)` without comparison to determine if a sequence is empty", "msg_xpln": "Used when Pylint detects that len(sequence) is being used without explicit comparison inside a condition to determine if a sequence is empty. Instead of coercing the length to a boolean, either rely on the fact that empty sequences are false or compare the length against a scalar.", "tho_xpln": "", "usage": "enhancement", }, "C1802": { "msg_id": "C1802", "msg_sym": "use-implicit-booleaness-not-len", "msg_text": "Do not use `len(SEQUENCE)` without comparison to determine if a sequence is empty", "msg_xpln": "Used when Pylint detects that len(sequence) is being used without explicit comparison inside a condition to determine if a sequence is empty. Instead of coercing the length to a boolean, either rely on the fact that empty sequences are false or compare the length against a scalar.", "usage": "enhancement", }, "C1803": { "msg_id": "C1803", "msg_sym": "use-implicit-booleaness-not-comparison", "msg_text": "'%s' can be simplified to '%s' as an empty sequence is falsey", "msg_xpln": "Used when Pylint detects that collection literal comparison is being used to check for emptiness; Use implicit booleaness insteadof a collection classes; empty collections are considered as false", "usage": "enhancement", }, "C2401": { "msg_id": "C2401", "msg_sym": "non-ascii-name", "msg_text": '%s name "%s" contains a non-ASCII character, consider renaming it.', "msg_xpln": "Used when the name contains at least one non-ASCII unicode character. See https://peps.python.org/pep-0672/#confusing-features for a background why this could be bad. If your programming guideline defines that you are programming in English, then there should be no need for non ASCII characters in Python Names. If not you can simply disable this check.", "usage": "style", }, "C2403": { "msg_id": "C2403", "msg_sym": "non-ascii-module-import", "msg_text": '%s name "%s" contains a non-ASCII character, use an ASCII-only alias for import.', "msg_xpln": "Used when the name contains at least one non-ASCII unicode character. See https://peps.python.org/pep-0672/#confusing-features for a background why this could be bad. If your programming guideline defines that you are programming in English, then there should be no need for non ASCII characters in Python Names. If not you can simply disable this check.", "usage": "style", }, "C2503": { "msg_id": "C2503", "msg_sym": "bad-file-encoding", "msg_text": "PEP8 recommends UTF-8 as encoding for Python files", "msg_xpln": "PEP8 recommends UTF-8 default encoding for Python files. See https://peps.python.org/pep-0008/#source-file-encoding", "usage": "style", }, "C2801": { "msg_id": "C2801", "msg_sym": "unnecessary-dunder-call", "msg_text": "Unnecessarily calls dunder method %s. %s.", "msg_xpln": "Used when a dunder method is manually called instead of using the corresponding function/method/operator.", "usage": "enhancement", }, "C3001": { "msg_id": "C3001", "msg_sym": "unnecessary-lambda-assignment", "msg_text": 'Lambda expression assigned to a variable. Define a function using the "def" keyword instead.', "msg_xpln": 'Used when a lambda expression is assigned to variable rather than defining a standard function with the "def" keyword.', "usage": "style", }, "C3002": { "msg_id": "C3002", "msg_sym": "unnecessary-direct-lambda-call", "msg_text": "Lambda expression called directly. Execute the expression inline instead.", "msg_xpln": "Used when a lambda expression is directly called rather than executing its contents inline.", "usage": "warning", }, "E0001": { "msg_id": "E0001", "msg_sym": "syntax-error", "msg_text": "", "msg_xpln": "Used when a syntax error is raised for a module.", "tho_xpln": "", "usage": "skip", }, "E0011": { "msg_id": "E0011", "msg_sym": "unrecognized-inline-option", "msg_text": "Unrecognized file option %r", "msg_xpln": "Used when an unknown inline option is encountered.", "tho_xpln": "", "usage": "warning", }, "E0012": { "msg_id": "E0012", "msg_sym": "bad-option-value", "msg_text": "Bad option value %r", "msg_xpln": "Used when a bad value for an inline option is encountered.", "tho_xpln": "", "usage": "skip", # makes it easier to support both Pylint 2 and 3 }, "E0013": { "msg_id": "E0013", "msg_sym": "bad-plugin-value", "msg_text": "Plugin '%s' is impossible to load, is it installed ? ('%s')", "msg_xpln": "Used when a bad value is used in 'load-plugins'.", "usage": "technical", }, "E0014": { "msg_id": "E0014", "msg_sym": "bad-configuration-section", "msg_text": "Out-of-place setting encountered in top level configuration-section '%s' : '%s'", "msg_xpln": "Used when we detect a setting in the top level of a toml configuration that shouldn't be there.", "usage": "technical", }, "E0015": { "msg_id": "E0015", "msg_sym": "unrecognized-option", "msg_text": "Unrecognized option found: %s", "msg_xpln": "Used when we detect an option that we do not recognize.", "usage": "technical", }, "E0100": { "msg_id": "E0100", "msg_sym": "init-is-generator", "msg_text": "__init__ method is a generator", "msg_xpln": "Used when the special class method __init__ is turned into a generator by a yield in its body.", "tho_xpln": "", "usage": "warning", }, "E0101": { "msg_id": "E0101", "msg_sym": "return-in-init", "msg_text": "Explicit return in __init__", "msg_xpln": "Used when the special class method __init__ has an explicit return value.", "tho_xpln": "", "usage": "warning", }, "E0102": { "msg_id": "E0102", "msg_sym": "function-redefined", "msg_text": "%s already defined line %s", "msg_xpln": "Used when a function / class / method is redefined.", "tho_xpln": "", "usage": "warning", }, "E0103": { "msg_id": "E0103", "msg_sym": "not-in-loop", "msg_text": "%r not properly in loop", "msg_xpln": "Used when break or continue keywords are used outside a loop.", "tho_xpln": "", "usage": "skip", }, "E0104": { "msg_id": "E0104", "msg_sym": "return-outside-function", "msg_text": "Return outside function", "msg_xpln": 'Used when a "return" statement is found outside a function or method.', "tho_xpln": "", "usage": "skip", }, "E0105": { "msg_id": "E0105", "msg_sym": "yield-outside-function", "msg_text": "Yield outside function", "msg_xpln": 'Used when a "yield" statement is found outside a function or method.', "tho_xpln": "", "usage": "skip", }, "E0106": { "msg_id": "E0106", "msg_sym": "return-arg-in-generator", "msg_text": "Return with argument inside generator", "msg_xpln": 'Used when a "return" statement with an argument is found outside in a generator function or method (e.g. with some "yield" statements). This message can\'t be emitted when using Python >= 3.3.', "usage": "skip", }, "E0107": { "msg_id": "E0107", "msg_sym": "nonexistent-operator", "msg_text": "Use of the non-existent %s operator", "msg_xpln": "Used when you attempt to use the C-style pre-increment or pre-decrement operator -- and ++, which doesn't exist in Python.", "tho_xpln": "", "usage": "warning", }, "E0108": { "msg_id": "E0108", "msg_sym": "duplicate-argument-name", "msg_text": "Duplicate argument name %s in function definition", "msg_xpln": "Duplicate argument names in function definitions are syntax errors.", "tho_xpln": "", "usage": "skip", }, "E0110": { "msg_id": "E0110", "msg_sym": "abstract-class-instantiated", "msg_text": "Abstract class %r with abstract methods instantiated", "msg_xpln": "Used when an abstract class with `abc.ABCMeta` as metaclass has abstract methods and is instantiated.", "tho_xpln": "", "usage": "warning", }, "E0111": { "msg_id": "E0111", "msg_sym": "bad-reversed-sequence", "msg_text": "The first reversed() argument is not a sequence", "msg_xpln": "Used when the first argument to reversed() builtin isn't a sequence (does not implement __reversed__, nor __getitem__ and __len__", "tho_xpln": "", "usage": "typing", }, "E0112": { "msg_id": "E0112", "msg_sym": "too-many-star-expressions", "msg_text": "More than one starred expression in assignment", "msg_xpln": "Emitted when there are more than one starred expressions (`*x`) in an assignment. This is a SyntaxError.", "tho_xpln": "", "usage": "skip", }, "E0113": { "msg_id": "E0113", "msg_sym": "invalid-star-assignment-target", "msg_text": "Starred assignment target must be in a list or tuple", "msg_xpln": "Emitted when a star expression is used as a starred assignment target.", "tho_xpln": "", "usage": "warning", }, "E0114": { "msg_id": "E0114", "msg_sym": "star-needs-assignment-target", "msg_text": "Can use starred expression only in assignment target", "msg_xpln": "Emitted when a star expression is not used in an assignment target.", "tho_xpln": "", "usage": "skip", }, "E0115": { "msg_id": "E0115", "msg_sym": "nonlocal-and-global", "msg_text": "Name %r is nonlocal and global", "msg_xpln": "Emitted when a name is both nonlocal and global.", "tho_xpln": "", "usage": "warning", }, "E0116": { "msg_id": "E0116", "msg_sym": "continue-in-finally", "msg_text": "'continue' not supported inside 'finally' clause", "msg_xpln": "Emitted when the `continue` keyword is found inside a finally clause, which is a SyntaxError. This message can't be emitted when using Python >= 3.8.", "tho_xpln": "", "usage": "skip", }, "E0117": { "msg_id": "E0117", "msg_sym": "nonlocal-without-binding", "msg_text": "nonlocal name %s found without binding", "msg_xpln": "Emitted when a nonlocal variable does not have an attached name somewhere in the parent scopes", "tho_xpln": "", "usage": "skip", }, "E0118": { "msg_id": "E0118", "msg_sym": "used-prior-global-declaration", "msg_text": "Name %r is used prior to global declaration", "msg_xpln": "Emitted when a name is used prior a global declaration, which results in an error since Python 3.6. This message can't be emitted when using Python < 3.6.", "tho_xpln": "", "usage": "skip", }, "E0119": { "msg_id": "E0119", "msg_sym": "misplaced-format-function", "msg_text": "format function is not called on str", "msg_xpln": 'Emitted when format function is not called on str object. e.g doing print("value: {}").format(123) instead of print("value: {}".format(123)). This might not be what the user intended to do.', "tho_xpln": "", "usage": "typing", }, "E0202": { "msg_id": "E0202", "msg_sym": "method-hidden", "msg_text": "An attribute defined in %s line %s hides this method", "msg_xpln": "Used when a class defines a method which is hidden by an instance attribute from an ancestor class or set by some client code.", "tho_xpln": "", "usage": "warning", }, "E0203": { "msg_id": "E0203", "msg_sym": "access-member-before-definition", "msg_text": "Access to member %r before its definition line %s", "msg_xpln": "Used when an instance member is accessed before it's actually assigned.", "tho_xpln": "", "usage": "warning", }, "E0211": { "msg_id": "E0211", "msg_sym": "no-method-argument", "msg_text": "Method has no argument", "msg_xpln": "Used when a method which should have the bound instance as first argument has no argument defined.", "tho_xpln": 'Methods should have "self" as first argument.', "usage": "warning", }, "E0213": { "msg_id": "E0213", "msg_sym": "no-self-argument", "msg_text": 'Method should have "self" as first argument', "msg_xpln": 'Used when a method has an attribute different the "self" as first argument. This is considered as an error since this is a so common convention that you shouldn\'t break it!', "tho_xpln": "", "usage": "warning", }, "E0236": { "msg_id": "E0236", "msg_sym": "invalid-slots-object", "msg_text": "Invalid object %r in __slots__, must contain only non empty strings", "msg_xpln": "Used when an invalid (non-string) object occurs in __slots__.", "tho_xpln": "", "usage": "warning", }, "E0237": { "msg_id": "E0237", "msg_sym": "assigning-non-slot", "msg_text": "Assigning to attribute %r not defined in class slots", "msg_xpln": "Used when assigning to an attribute not defined in the class slots.", "tho_xpln": "", "usage": "typing", }, "E0238": { "msg_id": "E0238", "msg_sym": "invalid-slots", "msg_text": "Invalid __slots__ object", "msg_xpln": "Used when an invalid __slots__ is found in class. Only a string, an iterable or a sequence is permitted.", "tho_xpln": "", "usage": "warning", }, "E0239": { "msg_id": "E0239", "msg_sym": "inherit-non-class", "msg_text": "Inheriting %r, which is not a class.", "msg_xpln": "Used when a class inherits from something which is not a class.", "tho_xpln": "", "usage": "warning", }, "E0240": { "msg_id": "E0240", "msg_sym": "inconsistent-mro", "msg_text": "Inconsistent method resolution order for class %r", "msg_xpln": "Used when a class has an inconsistent method resolution order.", "tho_xpln": "", "usage": "warning", }, "E0241": { "msg_id": "E0241", "msg_sym": "duplicate-bases", "msg_text": "Duplicate bases for class %r", "msg_xpln": "Duplicate use of base classes in derived classes raise TypeErrors.", "tho_xpln": "", "usage": "warning", }, "E0242": { "msg_id": "E0242", "msg_sym": "class-variable-slots-conflict", "msg_text": "Value %r in slots conflicts with class variable", "msg_xpln": "Used when a value in __slots__ conflicts with a class variable, property or method.", "tho_xpln": "", "usage": "warning", }, "E0243": { "msg_id": "E0243", "msg_sym": "invalid-class-object", "msg_text": "Invalid __class__ object", "msg_xpln": "Used when an invalid object is assigned to a __class__ property. Only a class is permitted.", "usage": "advanced", }, "E0244": { "msg_id": "E0244", "msg_sym": "invalid-enum-extension", "msg_text": 'Extending inherited Enum class "%s"', "msg_xpln": "Used when a class tries to extend an inherited Enum class. Doing so will raise a TypeError at runtime.", "usage": "advanced", }, "E0301": { "msg_id": "E0301", "msg_sym": "non-iterator-returned", "msg_text": "__iter__ returns non-iterator", "msg_xpln": "Used when an __iter__ method returns something which is not an iterable (i.e. has no `__next__` method)", "tho_xpln": "", "usage": "warning", }, "E0302": { "msg_id": "E0302", "msg_sym": "unexpected-special-method-signature", "msg_text": "The special method %r expects %s param(s), %d %s given", "msg_xpln": "Emitted when a special method was defined with an invalid number of parameters. If it has too few or too many, it might not work at all.", "tho_xpln": "", "usage": "warning", }, "E0303": { "msg_id": "E0303", "msg_sym": "invalid-length-returned", "msg_text": "__len__ does not return non-negative integer", "msg_xpln": "Used when a __len__ method returns something which is not a non-negative integer", "tho_xpln": "", "usage": "warning", }, "E0304": { "msg_id": "E0304", "msg_sym": "invalid-bool-returned", "msg_text": "__bool__ does not return bool", "msg_xpln": "Used when a __bool__ method returns something which is not a bool", "usage": "warning", }, "E0305": { "msg_id": "E0305", "msg_sym": "invalid-index-returned", "msg_text": "__index__ does not return int", "msg_xpln": "Used when an __index__ method returns something which is not an integer", "usage": "warning", }, "E0306": { "msg_id": "E0306", "msg_sym": "invalid-repr-returned", "msg_text": "__repr__ does not return str", "msg_xpln": "Used when a __repr__ method returns something which is not a string", "usage": "advanced", }, "E0307": { "msg_id": "E0307", "msg_sym": "invalid-str-returned", "msg_text": "__str__ does not return str", "msg_xpln": "Used when a __str__ method returns something which is not a string", "usage": "advanced", }, "E0308": { "msg_id": "E0308", "msg_sym": "invalid-bytes-returned", "msg_text": "__bytes__ does not return bytes", "msg_xpln": "Used when a __bytes__ method returns something which is not bytes", "usage": "advanced", }, "E0309": { "msg_id": "E0309", "msg_sym": "invalid-hash-returned", "msg_text": "__hash__ does not return int", "msg_xpln": "Used when a __hash__ method returns something which is not an integer", "usage": "advanced", }, "E0310": { "msg_id": "E0310", "msg_sym": "invalid-length-hint-returned", "msg_text": "__length_hint__ does not return non-negative integer", "msg_xpln": "Used when a __length_hint__ method returns something which is not a non- negative integer", "usage": "advanced", }, "E0311": { "msg_id": "E0311", "msg_sym": "invalid-format-returned", "msg_text": "__format__ does not return str", "msg_xpln": "Used when a __format__ method returns something which is not a string", "usage": "advanced", }, "E0312": { "msg_id": "E0312", "msg_sym": "invalid-getnewargs-returned", "msg_text": "__getnewargs__ does not return a tuple", "msg_xpln": "Used when a __getnewargs__ method returns something which is not a tuple", "usage": "advanced", }, "E0313": { "msg_id": "E0313", "msg_sym": "invalid-getnewargs-ex-returned", "msg_text": "__getnewargs_ex__ does not return a tuple containing (tuple, dict)", "msg_xpln": "Used when a __getnewargs_ex__ method returns something which is not of the form tuple(tuple, dict)", "usage": "advanced", }, "E0401": { "msg_id": "E0401", "msg_sym": "import-error", "msg_text": "Unable to import %s", "msg_xpln": "Used when pylint has been unable to import a module.", "tho_xpln": "", "usage": "skip", }, "E0402": { "msg_id": "E0402", "msg_sym": "relative-beyond-top-level", "msg_text": "Attempted relative import beyond top-level package", "msg_xpln": "Used when a relative import tries to access too many levels in the current package.", "tho_xpln": "", "usage": "warning", }, "E0601": { "msg_id": "E0601", "msg_sym": "used-before-assignment", "msg_text": "Using variable %r before assignment", "msg_xpln": "Emitted when a local variable is accessed before its assignment took place. Assignments in try blocks are assumed not to have occurred when evaluating associated except/finally blocks. Assignments in except blocks are assumed not to have occurred when evaluating statements outside the block, except when the associated try block contains a return statement.", "tho_xpln": "", "usage": "warning", }, "E0602": { "msg_id": "E0602", "msg_sym": "undefined-variable", "msg_text": "Undefined variable %r", "msg_xpln": "Used when an undefined variable is accessed.", "tho_xpln": "", "usage": "typing", }, "E0603": { "msg_id": "E0603", "msg_sym": "undefined-all-variable", "msg_text": "Undefined variable name %r in __all__", "msg_xpln": "Used when an undefined variable name is referenced in __all__.", "tho_xpln": "", "usage": "warning", }, "E0604": { "msg_id": "E0604", "msg_sym": "invalid-all-object", "msg_text": "Invalid object %r in __all__, must contain only strings", "msg_xpln": "Used when an invalid (non-string) object occurs in __all__.", "tho_xpln": "", "usage": "warning", }, "E0605": { "msg_id": "E0605", "msg_sym": "invalid-all-format", "msg_text": "Invalid format for __all__, must be tuple or list", "msg_xpln": "Used when __all__ has an invalid format.", "usage": "advanced", }, "E0611": { "msg_id": "E0611", "msg_sym": "no-name-in-module", "msg_text": "No name %r in module %r", "msg_xpln": "Used when a name cannot be found in a module.", "tho_xpln": "", "usage": "typing", }, "E0632": { "msg_id": "E0632", "msg_sym": "unbalanced-tuple-unpacking", "msg_text": "Possible unbalanced tuple unpacking with sequence%s: left side has %d label(s), right side has %d value(s)", "msg_xpln": "Used when there is an unbalanced tuple unpacking in assignment", "tho_xpln": "", "usage": "typing", }, "E0633": { "msg_id": "E0633", "msg_sym": "unpacking-non-sequence", "msg_text": "Attempting to unpack a non-sequence%s", "msg_xpln": "Used when something which is not a sequence is used in an unpack assignment", "tho_xpln": "", "usage": "typing", }, "E0643": { "msg_id": "E0643", "msg_sym": "potential-index-error", "msg_text": "Invalid index for iterable length", "msg_xpln": "Emitted when an index used on an iterable goes beyond the length of that iterable.", "usage": "advanced", }, "E0701": { "msg_id": "E0701", "msg_sym": "bad-except-order", "msg_text": "Bad except clauses order (%s)", "msg_xpln": "Used when except clauses are not in the correct order (from the more specific to the more generic). If you don't fix the order, some exceptions may not be caught by the most specific handler.", "tho_xpln": "", "usage": "warning", }, "E0702": { "msg_id": "E0702", "msg_sym": "raising-bad-type", "msg_text": "Raising %s while only classes or instances are allowed", "msg_xpln": "Used when something which is neither a class nor an instance is raised (i.e. a `TypeError` will be raised).", "tho_xpln": "", "usage": "typing", }, "E0703": { "msg_id": "E0703", "msg_sym": "bad-exception-context", "msg_text": "Exception context set to something which is not an exception, nor None", "msg_xpln": 'Used when using the syntax "raise ... from ...", where the exception context is not an exception, nor None.', "tho_xpln": "", "usage": "typing", }, "E0704": { "msg_id": "E0704", "msg_sym": "misplaced-bare-raise", "msg_text": "The raise statement is not inside an except clause", "msg_xpln": "Used when a bare raise is not used inside an except clause. This generates an error, since there are no active exceptions to be reraised. An exception to this rule is represented by a bare raise inside a finally clause, which might work, as long as an exception is raised inside the try block, but it is nevertheless a code smell that must not be relied upon.", "tho_xpln": "", "usage": "warning", }, "E0710": { "msg_id": "E0710", "msg_sym": "raising-non-exception", "msg_text": "Raising a new style class which doesn't inherit from BaseException", "msg_xpln": "Used when a new style class which doesn't inherit from BaseException is raised.", "tho_xpln": "", "usage": "typing", }, "E0711": { "msg_id": "E0711", "msg_sym": "notimplemented-raised", "msg_text": "NotImplemented raised - should raise NotImplementedError", "msg_xpln": "Used when NotImplemented is raised instead of NotImplementedError", "tho_xpln": "", "usage": "warning", }, "E0712": { "msg_id": "E0712", "msg_sym": "catching-non-exception", "msg_text": "Catching an exception which doesn't inherit from Exception: %s", "msg_xpln": "Used when a class which doesn't inherit from Exception is used as an exception in an except clause.", "tho_xpln": "", "usage": "typing", }, "E1003": { "msg_id": "E1003", "msg_sym": "bad-super-call", "msg_text": "Bad first argument %r given to super()", "msg_xpln": "Used when another argument than the current class is given as first argument of the super builtin.", "tho_xpln": "", "usage": "typing", }, "E1101": { "msg_id": "E1101", "msg_sym": "no-member", "msg_text": "%s %r has no %r member%s", "msg_xpln": "Used when a variable is accessed for a nonexistent member.", "tho_xpln": "", "usage": "typing", }, "E1102": { "msg_id": "E1102", "msg_sym": "not-callable", "msg_text": "%s is not callable", "msg_xpln": "Used when an object being called has been inferred to a non callable object.", "tho_xpln": "", "usage": "typing", }, "E1111": { "msg_id": "E1111", "msg_sym": "assignment-from-no-return", "msg_text": "Assigning result of a function call, where the function has no return", "msg_xpln": "Used when an assignment is done on a function call but the inferred function doesn't return anything.", "tho_xpln": "", "usage": "warning", }, "E1120": { "msg_id": "E1120", "msg_sym": "no-value-for-parameter", "msg_text": "No value for argument %s in %s call", "msg_xpln": "Used when a function call passes too few arguments.", "tho_xpln": "", "usage": "typing", }, "E1121": { "msg_id": "E1121", "msg_sym": "too-many-function-args", "msg_text": "Too many positional arguments for %s call", "msg_xpln": "Used when a function call passes too many positional arguments.", "tho_xpln": "", "usage": "typing", }, "E1123": { "msg_id": "E1123", "msg_sym": "unexpected-keyword-arg", "msg_text": "Unexpected keyword argument %r in %s call", "msg_xpln": "Used when a function call passes a keyword argument that doesn't correspond to one of the function's parameter names.", "tho_xpln": "", "usage": "typing", }, "E1124": { "msg_id": "E1124", "msg_sym": "redundant-keyword-arg", "msg_text": "Argument %r passed by position and keyword in %s call", "msg_xpln": "Used when a function call would result in assigning multiple values to a function parameter, one value from a positional argument and one from a keyword argument.", "tho_xpln": "", "usage": "typing", }, "E1125": { "msg_id": "E1125", "msg_sym": "missing-kwoa", "msg_text": "Missing mandatory keyword argument %r in %s call", "msg_xpln": "Used when a function call does not pass a mandatory keyword-only argument.", "tho_xpln": "", "usage": "typing", }, "E1126": { "msg_id": "E1126", "msg_sym": "invalid-sequence-index", "msg_text": "Sequence index is not an int, slice, or instance with __index__", "msg_xpln": "Used when a sequence type is indexed with an invalid type. Valid types are ints, slices, and objects with an __index__ method.", "tho_xpln": "", "usage": "typing", }, "E1127": { "msg_id": "E1127", "msg_sym": "invalid-slice-index", "msg_text": "Slice index is not an int, None, or instance with __index__", "msg_xpln": "Used when a slice index is not an integer, None, or an object with an __index__ method.", "tho_xpln": "", "usage": "typing", }, "E1128": { "msg_id": "E1128", "msg_sym": "assignment-from-none", "msg_text": "Assigning result of a function call, where the function returns None", "msg_xpln": "Used when an assignment is done on a function call but the inferred function returns nothing but None.", "tho_xpln": "", "usage": "typing", }, "E1129": { "msg_id": "E1129", "msg_sym": "not-context-manager", "msg_text": "Context manager '%s' doesn't implement __enter__ and __exit__.", "msg_xpln": "Used when an instance in a with statement doesn't implement the context manager protocol(__enter__/__exit__).", "tho_xpln": "", "usage": "typing", }, "E1130": { "msg_id": "E1130", "msg_sym": "invalid-unary-operand-type", "msg_text": "", "msg_xpln": "Emitted when a unary operand is used on an object which does not support this type of operation.", "tho_xpln": "", "usage": "typing", }, "E1131": { "msg_id": "E1131", "msg_sym": "unsupported-binary-operation", "msg_text": "", "msg_xpln": "Emitted when a binary arithmetic operation between two operands is not supported.", "tho_xpln": "", "usage": "typing", }, "E1132": { "msg_id": "E1132", "msg_sym": "repeated-keyword", "msg_text": "Got multiple values for keyword argument %r in function call", "msg_xpln": "Emitted when a function call got multiple values for a keyword.", "tho_xpln": "", "usage": "typing", }, "E1133": { "msg_id": "E1133", "msg_sym": "not-an-iterable", "msg_text": "Non-iterable value %s is used in an iterating context", "msg_xpln": "Used when a non-iterable value is used in place where iterable is expected", "tho_xpln": "", "usage": "typing", }, "E1134": { "msg_id": "E1134", "msg_sym": "not-a-mapping", "msg_text": "Non-mapping value %s is used in a mapping context", "msg_xpln": "Used when a non-mapping value is used in place where mapping is expected", "tho_xpln": "", "usage": "typing", }, "E1135": { "msg_id": "E1135", "msg_sym": "unsupported-membership-test", "msg_text": "Value '%s' doesn't support membership test", "msg_xpln": "Emitted when an instance in membership test expression doesn't implement membership protocol (__contains__/__iter__/__getitem__).", "tho_xpln": "", "usage": "typing", }, "E1136": { "msg_id": "E1136", "msg_sym": "unsubscriptable-object", "msg_text": "Value '%s' is unsubscriptable", "msg_xpln": "Emitted when a subscripted value doesn't support subscription (i.e. doesn't define __getitem__ method or __class_getitem__ for a class).", "tho_xpln": "", "usage": "typing", }, "E1137": { "msg_id": "E1137", "msg_sym": "unsupported-assignment-operation", "msg_text": "%r does not support item assignment", "msg_xpln": "Emitted when an object does not support item assignment (i.e. doesn't define __setitem__ method).", "tho_xpln": "", "usage": "typing", }, "E1138": { "msg_id": "E1138", "msg_sym": "unsupported-delete-operation", "msg_text": "%r does not support item deletion", "msg_xpln": "Emitted when an object does not support item deletion (i.e. doesn't define __delitem__ method).", "tho_xpln": "", "usage": "typing", }, "E1139": { "msg_id": "E1139", "msg_sym": "invalid-metaclass", "msg_text": "Invalid metaclass %r used", "msg_xpln": "Emitted whenever we can detect that a class is using, as a metaclass, something which might be invalid for using as a metaclass.", "tho_xpln": "", "usage": "typing", }, "E1140": { "msg_id": "E1140", "msg_sym": "unhashable-dict-key", "msg_text": "Dict key is unhashable", "msg_xpln": "Emitted when a dict key is not hashable (i.e. doesn't define __hash__ method).", "tho_xpln": "", "usage": "typing", }, "E1141": { "msg_id": "E1141", "msg_sym": "dict-iter-missing-items", "msg_text": "Unpacking a dictionary in iteration without calling .items()", "msg_xpln": "Emitted when trying to iterate through a dict without calling .items()", "tho_xpln": "", "usage": "typing", }, "E1142": { "msg_id": "E1142", "msg_sym": "await-outside-async", "msg_text": "'await' should be used within an async function", "msg_xpln": "Emitted when await is used outside an async function.", "usage": "warning", }, "E1200": { "msg_id": "E1200", "msg_sym": "logging-unsupported-format", "msg_text": "Unsupported logging format character %r (%#02x) at index %d", "msg_xpln": "Used when an unsupported format character is used in a logging statement format string.", "tho_xpln": "", "usage": "warning", }, "E1201": { "msg_id": "E1201", "msg_sym": "logging-format-truncated", "msg_text": "Logging format string ends in middle of conversion specifier", "msg_xpln": "Used when a logging statement format string terminates before the end of a conversion specifier.", "tho_xpln": "", "usage": "warning", }, "E1205": { "msg_id": "E1205", "msg_sym": "logging-too-many-args", "msg_text": "Too many arguments for logging format string", "msg_xpln": "Used when a logging format string is given too many arguments.", "tho_xpln": "", "usage": "warning", }, "E1206": { "msg_id": "E1206", "msg_sym": "logging-too-few-args", "msg_text": "Not enough arguments for logging format string", "msg_xpln": "Used when a logging format string is given too few arguments.", "tho_xpln": "", "usage": "warning", }, "E1300": { "msg_id": "E1300", "msg_sym": "bad-format-character", "msg_text": "Unsupported format character %r (%#02x) at index %d", "msg_xpln": "Used when an unsupported format character is used in a format string.", "tho_xpln": "", "usage": "warning", }, "E1301": { "msg_id": "E1301", "msg_sym": "truncated-format-string", "msg_text": "Format string ends in middle of conversion specifier", "msg_xpln": "Used when a format string terminates before the end of a conversion specifier.", "tho_xpln": "", "usage": "warning", }, "E1302": { "msg_id": "E1302", "msg_sym": "mixed-format-string", "msg_text": "Mixing named and unnamed conversion specifiers in format string", "msg_xpln": "Used when a format string contains both named (e.g. '%(foo)d') and unnamed (e.g. '%d') conversion specifiers. This is also used when a named conversion specifier contains * for the minimum field width and/or precision.", "tho_xpln": "", "usage": "warning", }, "E1303": { "msg_id": "E1303", "msg_sym": "format-needs-mapping", "msg_text": "Expected mapping for format string, not %s", "msg_xpln": "Used when a format string that uses named conversion specifiers is used with an argument that is not a mapping.", "tho_xpln": "", "usage": "warning", }, "E1304": { "msg_id": "E1304", "msg_sym": "missing-format-string-key", "msg_text": "Missing key %r in format string dictionary", "msg_xpln": "Used when a format string that uses named conversion specifiers is used with a dictionary that doesn't contain all the keys required by the format string.", "tho_xpln": "", "usage": "warning", }, "E1305": { "msg_id": "E1305", "msg_sym": "too-many-format-args", "msg_text": "Too many arguments for format string", "msg_xpln": "Used when a format string that uses unnamed conversion specifiers is given too many arguments.", "tho_xpln": "", "usage": "warning", }, "E1306": { "msg_id": "E1306", "msg_sym": "too-few-format-args", "msg_text": "Not enough arguments for format string", "msg_xpln": "Used when a format string that uses unnamed conversion specifiers is given too few arguments", "tho_xpln": "", "usage": "warning", }, "E1307": { "msg_id": "E1307", "msg_sym": "bad-string-format-type", "msg_text": "Argument %r does not match format type %r", "msg_xpln": "Used when a type required by format string is not suitable for actual argument type", "usage": "warning", }, "E1310": { "msg_id": "E1310", "msg_sym": "bad-str-strip-call", "msg_text": "Suspicious argument in %s.%s call", "msg_xpln": "The argument to a str.{l,r,}strip call contains a duplicate character,", "tho_xpln": "", "usage": "warning", }, "E1507": { "msg_id": "E1507", "msg_sym": "invalid-envvar-value", "msg_text": "%s does not support %s type argument", "msg_xpln": "Env manipulation functions support only string type arguments. See https://docs.python.org/3/library/os.html#os.getenv.", "tho_xpln": "", "usage": "warning", }, "E1601": { "msg_id": "E1601", "msg_sym": "print-statement", "msg_text": "print statement used", "msg_xpln": "Used when a print statement is used (`print` is a function in Python 3)", "tho_xpln": "", "usage": "skip", }, "E1602": { "msg_id": "E1602", "msg_sym": "parameter-unpacking", "msg_text": "Parameter unpacking specified", "msg_xpln": "Used when parameter unpacking is specified for a function(Python 3 doesn't allow it)", "tho_xpln": "", "usage": "skip", }, "E1603": { "msg_id": "E1603", "msg_sym": "unpacking-in-except", "msg_text": "Implicit unpacking of exceptions is not supported in Python 3", "msg_xpln": "Python3 will not allow implicit unpacking of exceptions in except clauses. See http://www.python.org/dev/peps/pep-3110/", "tho_xpln": "", "usage": "skip", }, "E1604": { "msg_id": "E1604", "msg_sym": "old-raise-syntax", "msg_text": "Use raise ErrorClass(args) instead of raise ErrorClass, args.", "msg_xpln": "Used when the alternate raise syntax 'raise foo, bar' is used instead of 'raise foo(bar)'.", "tho_xpln": "", "usage": "skip", }, "E1605": { "msg_id": "E1605", "msg_sym": "backtick", "msg_text": "Use of the `` operator", "msg_xpln": 'Used when the deprecated "``" (backtick) operator is used instead of the str() function.', "tho_xpln": "", "usage": "skip", }, "E1700": { "msg_id": "E1700", "msg_sym": "yield-inside-async-function", "msg_text": "Yield inside async function", "msg_xpln": "Used when an `yield` or `yield from` statement is found inside an async function. This message can't be emitted when using Python < 3.5.", "tho_xpln": "", "usage": "warning", }, "E1701": { "msg_id": "E1701", "msg_sym": "not-async-context-manager", "msg_text": "Async context manager '%s' doesn't implement __aenter__ and __aexit__.", "msg_xpln": "Used when an async context manager is used with an object that does not implement the async context management protocol. This message can't be emitted when using Python < 3.5.", "tho_xpln": "", "usage": "warning", }, "E2501": { "msg_id": "E2501", "msg_sym": "invalid-unicode-codec", "msg_text": "UTF-16 and UTF-32 aren't backward compatible. Use UTF-8 instead", "msg_xpln": "For compatibility use UTF-8 instead of UTF-16/UTF-32. See also https://bugs.python.org/issue1503789 for a history of this issue. And https://softwareengineering.stackexchange.com/questions/102205/should- utf-16-be-considered-harmful for some possible problems when using UTF-16 for instance.", "usage": "advanced", }, "E2502": { "msg_id": "E2502", "msg_sym": "bidirectional-unicode", "msg_text": "Contains control characters that can permit obfuscated code executed differently than displayed", "msg_xpln": "bidirectional unicode are typically not displayed characters required to display right-to-left (RTL) script (i.e. Chinese, Japanese, Arabic, Hebrew, ...) correctly. So can you trust this code? Are you sure it displayed correctly in all editors? If you did not write it or your language is not RTL, remove the special characters, as they could be used to trick you into executing code, that does something else than what it looks like. More Information: https://en.wikipedia.org/wiki/Bidirectional_text https://trojansource.codes/", "usage": "advanced", }, "E2510": { "msg_id": "E2510", "msg_sym": "invalid-character-backspace", "msg_text": 'Invalid unescaped character backspace, use "\\b" instead.', "msg_xpln": "Moves the cursor back, so the character after it will overwrite the character before.", "usage": "advanced", }, "E2511": { "msg_id": "E2511", "msg_sym": "invalid-character-carriage-return", "msg_text": 'Invalid unescaped character carriage-return, use "\\r" instead.', "msg_xpln": "Moves the cursor to the start of line, subsequent characters overwrite the start of the line.", "usage": "advanced", }, "E2512": { "msg_id": "E2512", "msg_sym": "invalid-character-sub", "msg_text": 'Invalid unescaped character sub, use "\\x1A" instead.', "msg_xpln": 'Ctrl+Z "End of text" on Windows. Some programs (such as type) ignore the rest of the file after it.', "usage": "advanced", }, "E2513": { "msg_id": "E2513", "msg_sym": "invalid-character-esc", "msg_text": 'Invalid unescaped character esc, use "\\x1B" instead.', "msg_xpln": "Commonly initiates escape codes which allow arbitrary control of the terminal.", "usage": "advanced", }, "E2514": { "msg_id": "E2514", "msg_sym": "invalid-character-nul", "msg_text": 'Invalid unescaped character nul, use "\\0" instead.', "msg_xpln": "Mostly end of input for python.", "usage": "advanced", }, "E2515": { "msg_id": "E2515", "msg_sym": "invalid-character-zero-width-space", "msg_text": 'Invalid unescaped character zero-width-space, use "\\u200B" instead.', "msg_xpln": "Invisible space character could hide real code execution.", "usage": "advanced", }, "E4702": { "msg_id": "E4702", "msg_sym": "modified-iterating-dict", "msg_text": "Iterated dict '%s' is being modified inside for loop body, iterate through a copy of it instead.", "msg_xpln": "Emitted when items are added or removed to a dict being iterated through. Doing so raises a RuntimeError.", "usage": "advanced", }, "E4703": { "msg_id": "E4703", "msg_sym": "modified-iterating-set", "msg_text": "Iterated set '%s' is being modified inside for loop body, iterate through a copy of it instead.", "msg_xpln": "Emitted when items are added or removed to a set being iterated through. Doing so raises a RuntimeError.", "usage": "advanced", }, "F0001": { "msg_id": "F0001", "msg_sym": "fatal", "msg_text": "", "msg_xpln": "Used when an error occurred preventing the analysis of a module (unable to find it for instance).", "tho_xpln": "Program analyzer internal error. Used when an error occurred preventing the analysis of a module (unable to find it for instance).", "usage": "warning", }, "F0002": { "msg_id": "F0002", "msg_sym": "astroid-error", "msg_text": "%s: %s", "msg_xpln": "Used when an unexpected error occurred while building the Astroid representation. This is usually accompanied by a traceback. Please report such errors !", "tho_xpln": "Program analyzer internal error. Used when an unexpected error occurred while building the Astroid representation. This is usually accompanied by a traceback. Please report such errors !", "usage": "warning", }, "F0010": { "msg_id": "F0010", "msg_sym": "parse-error", "msg_text": "error while code parsing: %s", "msg_xpln": "Used when an exception occurred while building the Astroid representation which could be handled by astroid.", "tho_xpln": "Program analyzer internal error. Used when an exception occurred while building the Astroid representation which could be handled by astroid.", "usage": "warning", }, "F0011": { "msg_id": "F0011", "msg_sym": "config-parse-error", "msg_text": "error while parsing the configuration: %s", "msg_xpln": "Used when an exception occurred while parsing a pylint configuration file.", "usage": "technical", }, "F0202": { "msg_id": "F0202", "msg_sym": "method-check-failed", "msg_text": "Unable to check methods signature (%s / %s)", "msg_xpln": "Used when Pylint has been unable to check methods signature compatibility for an unexpected reason. Please report this kind if you don't make sense of it.", "tho_xpln": "Program analyzer internal error. Used when Pylint has been unable to check methods signature compatibility for an unexpected reason. Please report this kind if you don't make sense of it.", "usage": "warning", }, "I0001": { "msg_id": "I0001", "msg_sym": "raw-checker-failed", "msg_text": "Unable to run raw checkers on built-in module %s", "msg_xpln": "Used to inform that a built-in module has not been checked using the raw checkers.", "tho_xpln": "", "usage": "skip", }, "I0010": { "msg_id": "I0010", "msg_sym": "bad-inline-option", "msg_text": "Unable to consider inline option %r", "msg_xpln": "Used when an inline option is either badly formatted or can't be used inside modules.", "tho_xpln": "", "usage": "warning", }, "I0011": { "msg_id": "I0011", "msg_sym": "locally-disabled", "msg_text": "Locally disabling %s (%s)", "msg_xpln": "Used when an inline option disables a message or a messages category.", "tho_xpln": "", "usage": "skip", }, "I0012": { "msg_id": "I0012", "msg_sym": "locally-enabled", "msg_text": "Locally enabling %s (%s)", "msg_xpln": "Used when an inline option enables a message or a messages category.", "tho_xpln": "", "usage": "skip", }, "I0013": { "msg_id": "I0013", "msg_sym": "file-ignored", "msg_text": "Ignoring entire file", "msg_xpln": "Used to inform that the file will not be checked", "tho_xpln": "", "usage": "skip", }, "I0020": { "msg_id": "I0020", "msg_sym": "suppressed-message", "msg_text": "Suppressed %s (from line %d)", "msg_xpln": "A message was triggered on a line, but suppressed explicitly by a disable= comment in the file. This message is not generated for messages that are ignored due to configuration settings.", "tho_xpln": "", "usage": "skip", }, "I0021": { "msg_id": "I0021", "msg_sym": "useless-suppression", "msg_text": "Useless suppression of %s", "msg_xpln": "Reported when a message is explicitly disabled for a line or a block of code, but never triggered.", "tho_xpln": "", "usage": "warning", }, "I0022": { "msg_id": "I0022", "msg_sym": "deprecated-pragma", "msg_text": 'Pragma "%s" is deprecated, use "%s" instead', "msg_xpln": "Some inline pylint options have been renamed or reworked, only the most recent form should be used. NOTE:skip-all is only available with pylint >= 0.26", "tho_xpln": "", "usage": "style", }, "I0023": { "msg_id": "I0023", "msg_sym": "use-symbolic-message-instead", "msg_text": "", "msg_xpln": "Used when a message is enabled or disabled by id.", "tho_xpln": "", "usage": "skip", }, "I1101": { "msg_id": "I1101", "msg_sym": "c-extension-no-member", "msg_text": "%s %r has no %r member%s, but source is unavailable. Consider adding this module to extension-pkg-allow-list if you want to perform analysis based on run-time introspection of living objects.", "msg_xpln": "Used when a variable is accessed for non-existent member of C extension. Due to unavailability of source static analysis is impossible, but it may be performed by introspecting living objects in run-time.", "tho_xpln": "", "usage": "skip", }, "R0022": { "msg_id": "R0022", "msg_sym": "useless-option-value", "msg_text": "Useless option value for '%s', %s", "msg_xpln": "Used when a value for an option that is now deleted from pylint is encountered.", "usage": "technical", }, "R0123": { "msg_id": "R0123", "msg_sym": "literal-comparison", "msg_text": "Comparison to literal", "msg_xpln": "Used when comparing an object to a literal, which is usually what you do not want to do, since you can compare to a different literal than what was expected altogether.", "tho_xpln": 'Are you sure you want to compare with "is"/"is not" instead of "=="/"!=" ?', "usage": "warning", }, "R0124": { "msg_id": "R0124", "msg_sym": "comparison-with-itself", "msg_text": "Redundant comparison - %s", "msg_xpln": "Used when something is compared against itself.", "tho_xpln": "", "usage": "warning", }, "R0133": { "msg_id": "R0133", "msg_sym": "comparison-of-constants", "msg_text": "Comparison between constants: '%s %s %s' has a constant value", "msg_xpln": "When two literals are compared with each other the result is a constant. Using the constant directly is both easier to read and more performant. Initializing 'True' and 'False' this way is not required since Python 2.3.", "usage": "warning", }, "R0201": { "msg_id": "R0201", "msg_sym": "no-self-use", "msg_text": "Method could be a function", "msg_xpln": "Used when a method doesn't use its bound instance, and so could be written as a function.", "tho_xpln": "", "usage": "style", }, "R0202": { "msg_id": "R0202", "msg_sym": "no-classmethod-decorator", "msg_text": "Consider using a decorator instead of calling classmethod", "msg_xpln": "Used when a class method is defined without using the decorator syntax.", "tho_xpln": "", "usage": "enhancement", }, "R0203": { "msg_id": "R0203", "msg_sym": "no-staticmethod-decorator", "msg_text": "Consider using a decorator instead of calling staticmethod", "msg_xpln": "Used when a static method is defined without using the decorator syntax.", "tho_xpln": "", "usage": "enhancement", }, "R0205": { "msg_id": "R0205", "msg_sym": "useless-object-inheritance", "msg_text": "Class %r inherits from object, can be safely removed from bases in python3", "msg_xpln": "Used when a class inherit from object, which under python3 is implicit, hence can be safely removed from bases.", "tho_xpln": "", "usage": "enhancement", }, "R0206": { "msg_id": "R0206", "msg_sym": "property-with-parameters", "msg_text": "Cannot have defined parameters for properties", "msg_xpln": "Used when we detect that a property also has parameters, which are useless, given that properties cannot be called with additional arguments.", "tho_xpln": "", "usage": "enhancement", }, "R0401": { "msg_id": "R0401", "msg_sym": "cyclic-import", "msg_text": "Cyclic import (%s)", "msg_xpln": "Used when a cyclic import between two or more modules is detected.", "tho_xpln": "", "usage": "skip", }, "R0402": { "msg_id": "R0402", "msg_sym": "consider-using-from-import", "msg_text": "Use 'from %s import %s' instead", "msg_xpln": "Emitted when a submodule of a package is imported and aliased with the same name. E.g., instead of ``import concurrent.futures as futures`` use ``from concurrent import futures``", "usage": "style", }, "R0801": { "msg_id": "R0801", "msg_sym": "duplicate-code", "msg_text": "Similar lines in %s files", "msg_xpln": "Indicates that a set of similar lines has been detected among multiple file. This usually means that the code should be refactored to avoid this duplication.", "tho_xpln": "", "usage": "enhancement", }, "R0901": { "msg_id": "R0901", "msg_sym": "too-many-ancestors", "msg_text": "Too many ancestors (%s/%s)", "msg_xpln": "Used when class has too many parent classes, try to reduce this to get a simpler (and so easier to use) class.", "tho_xpln": "", "usage": "style", }, "R0902": { "msg_id": "R0902", "msg_sym": "too-many-instance-attributes", "msg_text": "Too many instance attributes (%s/%s)", "msg_xpln": "Used when class has too many instance attributes, try to reduce this to get a simpler (and so easier to use) class.", "tho_xpln": "", "usage": "style", }, "R0903": { "msg_id": "R0903", "msg_sym": "too-few-public-methods", "msg_text": "Too few public methods (%s/%s)", "msg_xpln": "Used when class has too few public methods, so be sure it's really worth it.", "tho_xpln": "", "usage": "skip", }, "R0904": { "msg_id": "R0904", "msg_sym": "too-many-public-methods", "msg_text": "Too many public methods (%s/%s)", "msg_xpln": "Used when class has too many public methods, try to reduce this to get a simpler (and so easier to use) class.", "tho_xpln": "", "usage": "style", }, "R0911": { "msg_id": "R0911", "msg_sym": "too-many-return-statements", "msg_text": "Too many return statements (%s/%s)", "msg_xpln": "Used when a function or method has too many return statement, making it hard to follow.", "tho_xpln": "", "usage": "style", }, "R0912": { "msg_id": "R0912", "msg_sym": "too-many-branches", "msg_text": "Too many branches (%s/%s)", "msg_xpln": "Used when a function or method has too many branches, making it hard to follow.", "tho_xpln": "", "usage": "style", }, "R0913": { "msg_id": "R0913", "msg_sym": "too-many-arguments", "msg_text": "Too many arguments (%s/%s)", "msg_xpln": "Used when a function or method takes too many arguments.", "tho_xpln": "", "usage": "enhancement", }, "R0914": { "msg_id": "R0914", "msg_sym": "too-many-locals", "msg_text": "Too many local variables (%s/%s)", "msg_xpln": "Used when a function or method has too many local variables.", "tho_xpln": "", "usage": "enhancement", }, "R0915": { "msg_id": "R0915", "msg_sym": "too-many-statements", "msg_text": "Too many statements (%s/%s)", "msg_xpln": "Used when a function or method has too many statements. You should then split it in smaller functions / methods.", "tho_xpln": "", "usage": "enhancement", }, "R0916": { "msg_id": "R0916", "msg_sym": "too-many-boolean-expressions", "msg_text": "Too many boolean expressions in if statement (%s/%s)", "msg_xpln": "Used when an if statement contains too many boolean expressions.", "tho_xpln": "Consider simplifying the expression with helper variables or functions.", "usage": "enhancement", }, "R1701": { "msg_id": "R1701", "msg_sym": "consider-merging-isinstance", "msg_text": "Consider merging these isinstance calls to isinstance(%s, (%s))", "msg_xpln": "Used when multiple consecutive isinstance calls can be merged into one.", "tho_xpln": "", "usage": "enhancement", }, "R1702": { "msg_id": "R1702", "msg_sym": "too-many-nested-blocks", "msg_text": "Too many nested blocks (%s/%s)", "msg_xpln": "Used when a function or a method has too many nested blocks. This makes the code less understandable and maintainable.", "tho_xpln": "Consider moving some of the code to helper functions.", "usage": "enhancement", }, "R1703": { "msg_id": "R1703", "msg_sym": "simplifiable-if-statement", "msg_text": "The if statement can be replaced with %s", "msg_xpln": "Used when an if statement can be replaced with 'bool(test)'.", "tho_xpln": "", "usage": "enhancement", }, "R1704": { "msg_id": "R1704", "msg_sym": "redefined-argument-from-local", "msg_text": "Redefining argument with the local name %r", "msg_xpln": "Used when a local name is redefining an argument, which might suggest a potential error. This is taken in account only for a handful of name binding operations, such as for iteration, with statement assignment and exception handler assignment.", "tho_xpln": "Did you notice that an argument gets overwritten here?", "usage": "warning", }, "R1705": { "msg_id": "R1705", "msg_sym": "no-else-return", "msg_text": 'Unnecessary "%s" after "return", %s', "msg_xpln": "Used in order to highlight an unnecessary block of code following an if containing a return statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a return statement.", "tho_xpln": "", "usage": "style", }, "R1706": { "msg_id": "R1706", "msg_sym": "consider-using-ternary", "msg_text": "Consider using ternary (%s)", "msg_xpln": "Used when one of known pre-python 2.5 ternary syntax is used.", "tho_xpln": "", "usage": "skip", }, "R1707": { "msg_id": "R1707", "msg_sym": "trailing-comma-tuple", "msg_text": "Disallow trailing comma tuple", "msg_xpln": "In Python, a tuple is actually created by the comma symbol, not by the parentheses. Unfortunately, one can actually create a tuple by misplacing a trailing comma, which can lead to potential weird bugs in your code. You should always use parentheses explicitly for creating a tuple.", "tho_xpln": "", "usage": "warning", }, "R1708": { "msg_id": "R1708", "msg_sym": "stop-iteration-return", "msg_text": "Do not raise StopIteration in generator, use return statement instead", "msg_xpln": "According to PEP479, the raise of StopIteration to end the loop of a generator may lead to hard to find bugs. This PEP specify that raise StopIteration has to be replaced by a simple return statement", "tho_xpln": "", "usage": "warning", }, "R1709": { "msg_id": "R1709", "msg_sym": "simplify-boolean-expression", "msg_text": "Boolean expression may be simplified to %s", "msg_xpln": "Emitted when redundant pre-python 2.5 ternary syntax is used.", "tho_xpln": "", "usage": "skip", }, "R1710": { "msg_id": "R1710", "msg_sym": "inconsistent-return-statements", "msg_text": "Either all return statements in a function should return an expression, or none of them should.", "msg_xpln": "According to PEP8, if any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None, and an explicit return statement should be present at the end of the function (if reachable)", "tho_xpln": "", "usage": "warning", }, "R1711": { "msg_id": "R1711", "msg_sym": "useless-return", "msg_text": "Useless return at end of function or method", "msg_xpln": 'Emitted when a single "return" or "return None" statement is found at the end of function or method definition. This statement can safely be removed because Python will implicitly return None', "tho_xpln": "", "usage": "style", }, "R1712": { "msg_id": "R1712", "msg_sym": "consider-swap-variables", "msg_text": "Consider using tuple unpacking for swapping variables", "msg_xpln": 'You do not have to use a temporary variable in order to swap variables. Using "tuple unpacking" to directly swap variables makes the intention more clear.', "tho_xpln": 'You do not have to use a temporary variable in order to swap variables. Using "tuple unpacking" to directly swap variables makes the intention more clear. Example: "a, b = b, a".', "usage": "enhancement", }, "R1713": { "msg_id": "R1713", "msg_sym": "consider-using-join", "msg_text": "Consider using str.join(sequence) for concatenating strings from an iterable", "msg_xpln": "Using str.join(sequence) is faster, uses less memory and increases readability compared to for-loop iteration.", "tho_xpln": "", "usage": "enhancement", }, "R1714": { "msg_id": "R1714", "msg_sym": "consider-using-in", "msg_text": 'Consider merging these comparisons with "in" to %r', "msg_xpln": 'To check if a variable is equal to one of many values,combine the values into a tuple and check if the variable is contained "in" it instead of checking for equality against each of the values.This is faster and less verbose.', "tho_xpln": "", "usage": "enhancement", }, "R1715": { "msg_id": "R1715", "msg_sym": "consider-using-get", "msg_text": "Consider using dict.get for getting values from a dict if a key is present or a default if not", "msg_xpln": "Using the builtin dict.get for getting a value from a dictionary if a key is present or a default if not, is simpler and considered more idiomatic, although sometimes a bit slower", "tho_xpln": "", "usage": "enhancement", }, "R1716": { "msg_id": "R1716", "msg_sym": "chained-comparison", "msg_text": "Simplify chained comparison between the operands", "msg_xpln": 'This message is emitted when pylint encounters boolean operation like"a < b and b < c", suggesting instead to refactor it to "a < b < c"', "tho_xpln": "", "usage": "style", }, "R1717": { "msg_id": "R1717", "msg_sym": "consider-using-dict-comprehension", "msg_text": "Consider using a dictionary comprehension", "msg_xpln": "Emitted when we detect the creation of a dictionary using the dict() callable and a transient list. Although there is nothing syntactically wrong with this code, it is hard to read and can be simplified to a dict comprehension.Also it is faster since you don't need to create another transient list", "tho_xpln": "", "usage": "enhancement", }, "R1718": { "msg_id": "R1718", "msg_sym": "consider-using-set-comprehension", "msg_text": "Consider using a set comprehension", "msg_xpln": "Although there is nothing syntactically wrong with this code, it is hard to read and can be simplified to a set comprehension.Also it is faster since you don't need to create another transient list", "tho_xpln": "", "usage": "enhancement", }, "R1719": { "msg_id": "R1719", "msg_sym": "simplifiable-if-expression", "msg_text": "The if expression can be replaced with %s", "msg_xpln": "Used when an if expression can be replaced with 'bool(test)' or simply 'test' if the boolean cast is implicit.", "tho_xpln": "", "usage": "enhancement", }, "R1720": { "msg_id": "R1720", "msg_sym": "no-else-raise", "msg_text": 'Unnecessary "%s" after "raise", %s', "msg_xpln": "Used in order to highlight an unnecessary block of code following an if containing a raise statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a raise statement.", "tho_xpln": "", "usage": "enhancement", }, "R1721": { "msg_id": "R1721", "msg_sym": "unnecessary-comprehension", "msg_text": "Unnecessary use of a comprehension, use %s instead.", "msg_xpln": "Instead of using an identity comprehension, consider using the list, dict or set constructor. It is faster and simpler.", "tho_xpln": "", "usage": "enhancement", }, "R1722": { "msg_id": "R1722", "msg_sym": "consider-using-sys-exit", "msg_text": "Consider using sys.exit()", "msg_xpln": "Instead of using exit() or quit(), consider using the sys.exit().", "tho_xpln": "", "usage": "enhancement", }, "R1723": { "msg_id": "R1723", "msg_sym": "no-else-break", "msg_text": 'Unnecessary "%s" after "break", %s', "msg_xpln": "Used in order to highlight an unnecessary block of code following an if containing a break statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a break statement.", "tho_xpln": "", "usage": "enhancement", }, "R1724": { "msg_id": "R1724", "msg_sym": "no-else-continue", "msg_text": 'Unnecessary "%s" after "continue", %s', "msg_xpln": "Used in order to highlight an unnecessary block of code following an if containing a continue statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a continue statement.", "tho_xpln": "", "usage": "enhancement", }, "R1725": { "msg_id": "R1725", "msg_sym": "super-with-arguments", "msg_text": "Consider using Python 3 style super() without arguments", "msg_xpln": "Emitted when calling the super() builtin with the current class and instance. On Python 3 these arguments are the default and they can be omitted.", "usage": "advanced", }, "R1726": { "msg_id": "R1726", "msg_sym": "simplifiable-condition", "msg_text": "Boolean condition '%s' may be simplified to '%s'", "msg_xpln": "Emitted when a boolean condition is able to be simplified.", "usage": "warning", }, "R1727": { "msg_id": "R1727", "msg_sym": "condition-evals-to-constant", "msg_text": "Boolean condition '%s' will always evaluate to '%s'", "msg_xpln": "Emitted when a boolean condition can be simplified to a constant value.", "usage": "warning", }, "R1728": { "msg_id": "R1728", "msg_sym": "consider-using-generator", "msg_text": "Consider using a generator instead '%s(%s)'", "msg_xpln": "If your container can be large using a generator will bring better performance.", "usage": "advanced", }, "R1729": { "msg_id": "R1729", "msg_sym": "use-a-generator", "msg_text": "Use a generator instead '%s(%s)'", "msg_xpln": "Comprehension inside of 'any', 'all', 'max', 'min' or 'sum' is unnecessary. A generator would be sufficient and faster.", "usage": "advanced", }, "R1730": { "msg_id": "R1730", "msg_sym": "consider-using-min-builtin", "msg_text": "Consider using '%s' instead of unnecessary if block", "msg_xpln": "Using the min builtin instead of a conditional improves readability and conciseness.", "usage": "advanced", }, "R1731": { "msg_id": "R1731", "msg_sym": "consider-using-max-builtin", "msg_text": "Consider using '%s' instead of unnecessary if block", "msg_xpln": "Using the max builtin instead of a conditional improves readability and conciseness.", "usage": "advanced", }, "R1732": { "msg_id": "R1732", "msg_sym": "consider-using-with", "msg_text": "Consider using 'with' for resource-allocating operations", "msg_xpln": "Emitted if a resource-allocating assignment or call may be replaced by a 'with' block. By using 'with' the release of the allocated resources is ensured even in the case of an exception.", "usage": "advanced", }, "R1733": { "msg_id": "R1733", "msg_sym": "unnecessary-dict-index-lookup", "msg_text": "Unnecessary dictionary index lookup, use '%s' instead", "msg_xpln": "Emitted when iterating over the dictionary items (key-item pairs) and accessing the value by index lookup. The value can be accessed directly instead.", "usage": "advanced", }, "R1734": { "msg_id": "R1734", "msg_sym": "use-list-literal", "msg_text": "Consider using [] instead of list()", "msg_xpln": "Emitted when using list() to create an empty list instead of the literal []. The literal is faster as it avoids an additional function call.", "usage": "advanced", }, "R1735": { "msg_id": "R1735", "msg_sym": "use-dict-literal", "msg_text": "Consider using {} instead of dict()", "msg_xpln": "Emitted when using dict() to create an empty dictionary instead of the literal {}. The literal is faster as it avoids an additional function call.", "usage": "advanced", }, "R1736": { "msg_id": "R1736", "msg_sym": "unnecessary-list-index-lookup", "msg_text": "Unnecessary list index lookup, use '%s' instead", "msg_xpln": "Emitted when iterating over an enumeration and accessing the value by index lookup. The value can be accessed directly instead.", "usage": "advanced", }, "W0012": { "msg_id": "W0012", "msg_sym": "unknown-option-value", "msg_text": "Unknown option value for '%s', expected a valid pylint message and got '%s'", "msg_xpln": "Used when an unknown value is encountered for an option.", "usage": "technical", }, "W0101": { "msg_id": "W0101", "msg_sym": "unreachable", "msg_text": "Unreachable code", "msg_xpln": 'Used when there is some code behind a "return" or "raise" statement, which will never be accessed.', "tho_xpln": "", "usage": "warning", }, "W0102": { "msg_id": "W0102", "msg_sym": "dangerous-default-value", "msg_text": "Dangerous default value %s as argument", "msg_xpln": "Used when a mutable value as list or dictionary is detected in a default value for an argument.", "tho_xpln": "", "usage": "warning", }, "W0104": { "msg_id": "W0104", "msg_sym": "pointless-statement", "msg_text": "Statement seems to have no effect", "msg_xpln": "Used when a statement doesn't have (or at least seems to) any effect.", "tho_xpln": "", "usage": "warning", }, "W0105": { "msg_id": "W0105", "msg_sym": "pointless-string-statement", "msg_text": "String statement has no effect", "msg_xpln": "Used when a string is used as a statement (which of course has no effect). This is a particular case of W0104 with its own message so you can easily disable it if you're using those strings as documentation, instead of comments.", "tho_xpln": "", "usage": "skip", }, "W0106": { "msg_id": "W0106", "msg_sym": "expression-not-assigned", "msg_text": 'Expression "%s" is assigned to nothing', "msg_xpln": "Used when an expression that is not a function call is assigned to nothing. Probably something else was intended.", "tho_xpln": "", "usage": "warning", }, "W0107": { "msg_id": "W0107", "msg_sym": "unnecessary-pass", "msg_text": "Unnecessary pass statement", "msg_xpln": 'Used when a "pass" statement that can be avoided is encountered.', "tho_xpln": "", "usage": "enhancement", }, "W0108": { "msg_id": "W0108", "msg_sym": "unnecessary-lambda", "msg_text": "Lambda may not be necessary", "msg_xpln": "Used when the body of a lambda expression is a function call on the same argument list as the lambda itself; such lambda expressions are in all but a few cases replaceable with the function being called in the body of the lambda.", "tho_xpln": "", "usage": "warning", }, "W0109": { "msg_id": "W0109", "msg_sym": "duplicate-key", "msg_text": "Duplicate key %r in dictionary", "msg_xpln": "Used when a dictionary expression binds the same key multiple times.", "tho_xpln": "", "usage": "warning", }, "W0111": { "msg_id": "W0111", "msg_sym": "assign-to-new-keyword", "msg_text": "Name %s will become a keyword in Python %s", "msg_xpln": "Used when assignment will become invalid in future Python release due to introducing new keyword.", "tho_xpln": "", "usage": "removed", }, "W0120": { "msg_id": "W0120", "msg_sym": "useless-else-on-loop", "msg_text": "Else clause on loop without a break statement, remove the else and de-indent all the code inside it", "msg_xpln": "Loops should only have an else clause if they can exit early with a break statement, otherwise the statements under else should be on the same scope as the loop itself.", "tho_xpln": "", "usage": "enhancement", }, "W0122": { "msg_id": "W0122", "msg_sym": "exec-used", "msg_text": "Use of exec", "msg_xpln": 'Used when you use the "exec" statement (function for Python 3), to discourage its usage. That doesn\'t mean you cannot use it !', "tho_xpln": "", "usage": "skip", }, "W0123": { "msg_id": "W0123", "msg_sym": "eval-used", "msg_text": "Use of eval", "msg_xpln": 'Used when you use the "eval" function, to discourage its usage. Consider using `ast.literal_eval` for safely evaluating strings containing Python expressions from untrusted sources.', "tho_xpln": "", "usage": "skip", }, "W0124": { "msg_id": "W0124", "msg_sym": "confusing-with-statement", "msg_text": 'Following "as" with another context manager looks like a tuple.', "msg_xpln": "Emitted when a `with` statement component returns multiple values and uses name binding with `as` only for a part of those values, as in with ctx() as a, b. This can be misleading, since it's not clear if the context manager returns a tuple or if the node without a name binding is another context manager.", "tho_xpln": "", "usage": "warning", }, "W0125": { "msg_id": "W0125", "msg_sym": "using-constant-test", "msg_text": "Using a conditional statement with a constant value", "msg_xpln": "Emitted when a conditional statement (If or ternary if) uses a constant value for its test. This might not be what the user intended to do.", "tho_xpln": "", "usage": "warning", }, "W0126": { "msg_id": "W0126", "msg_sym": "missing-parentheses-for-call-in-test", "msg_text": "Using a conditional statement with potentially wrong function or method call due to missing parentheses", "msg_xpln": "Emitted when a conditional statement (If or ternary if) seems to wrongly call a function due to missing parentheses", "usage": "warning", }, "W0127": { "msg_id": "W0127", "msg_sym": "self-assigning-variable", "msg_text": "Assigning the same variable %r to itself", "msg_xpln": "Emitted when we detect that a variable is assigned to itself", "usage": "warning", }, "W0128": { "msg_id": "W0128", "msg_sym": "redeclared-assigned-name", "msg_text": "Redeclared variable %r in assignment", "msg_xpln": "Emitted when we detect that a variable was redeclared in the same assignment.", "usage": "warning", }, "W0129": { "msg_id": "W0129", "msg_sym": "assert-on-string-literal", "msg_text": "Assert statement has a string literal as its first argument. The assert will %s fail.", "msg_xpln": "Used when an assert statement has a string literal as its first argument, which will cause the assert to always pass.", "usage": "warning", }, "W0130": { "msg_id": "W0130", "msg_sym": "duplicate-value", "msg_text": "Duplicate value %r in set", "msg_xpln": "This message is emitted when a set contains the same value two or more times.", "usage": "warning", }, "W0143": { "msg_id": "W0143", "msg_sym": "comparison-with-callable", "msg_text": "Comparing against a callable, did you omit the parenthesis?", "msg_xpln": "This message is emitted when pylint detects that a comparison with a callable was made, which might suggest that some parenthesis were omitted, resulting in potential unwanted behaviour.", "tho_xpln": "", "usage": "warning", }, "W0150": { "msg_id": "W0150", "msg_sym": "lost-exception", "msg_text": "%s statement in finally block may swallow exception", "msg_xpln": "Used when a break or a return statement is found inside the finally clause of a try...finally block: the exceptions raised in the try clause will be silently swallowed instead of being re-raised.", "tho_xpln": "", "usage": "warning", }, "W0177": { "msg_id": "W0177", "msg_sym": "nan-comparison", "msg_text": "Comparison %s should be %s", "msg_xpln": "Used when an expression is compared to NaNvalues like numpy.NaN and float('nan')", "usage": "warning", }, "W0199": { "msg_id": "W0199", "msg_sym": "assert-on-tuple", "msg_text": "Assert called on a 2-item-tuple. Did you mean 'assert x,y'?", "msg_xpln": "A call of assert on a tuple will always evaluate to true if the tuple is not empty, and will always evaluate to false if it is.", "tho_xpln": "", "usage": "warning", }, "W0201": { "msg_id": "W0201", "msg_sym": "attribute-defined-outside-init", "msg_text": "Attribute %r defined outside __init__", "msg_xpln": "Used when an instance attribute is defined outside the __init__ method.", "tho_xpln": "", "usage": "style", }, "W0211": { "msg_id": "W0211", "msg_sym": "bad-staticmethod-argument", "msg_text": "Static method with %r as first argument", "msg_xpln": 'Used when a static method has "self" or a value specified in valid- classmethod-first-arg option or valid-metaclass-classmethod-first-arg option as first argument.', "tho_xpln": 'Static methods should not have "self" as first argument.', "usage": "warning", }, "W0212": { "msg_id": "W0212", "msg_sym": "protected-access", "msg_text": "Access to a protected member %s of a client class", "msg_xpln": "Used when a protected member (i.e. class member with a name beginning with an underscore) is access outside the class or a descendant of the class where it's defined.", "tho_xpln": "", "usage": "warning", }, "W0221": { "msg_id": "W0221", "msg_sym": "arguments-differ", "msg_text": "%s %s %r method", "msg_xpln": "Used when a method has a different number of arguments than in the implemented interface or in an overridden method. Extra arguments with default values are ignored.", "tho_xpln": "", "usage": "warning", }, "W0222": { "msg_id": "W0222", "msg_sym": "signature-differs", "msg_text": "Signature differs from %s %r method", "msg_xpln": "Used when a method signature is different than in the implemented interface or in an overridden method.", "tho_xpln": "", "usage": "warning", }, "W0223": { "msg_id": "W0223", "msg_sym": "abstract-method", "msg_text": "Method %r is abstract in class %r but is not overridden", "msg_xpln": "Used when an abstract method (i.e. raise NotImplementedError) is not overridden in concrete class.", "tho_xpln": "", "usage": "skip", }, "W0231": { "msg_id": "W0231", "msg_sym": "super-init-not-called", "msg_text": "__init__ method from base class %r is not called", "msg_xpln": "Used when an ancestor class method has an __init__ method which is not called by a derived class.", "tho_xpln": "", "usage": "warning", }, "W0232": { "msg_id": "W0232", "msg_sym": "no-init", "msg_text": "Class has no __init__ method", "msg_xpln": "Used when a class has no __init__ method, neither its parent classes.", "tho_xpln": "", "usage": "skip", }, "W0233": { "msg_id": "W0233", "msg_sym": "non-parent-init-called", "msg_text": "__init__ method from a non direct base class %r is called", "msg_xpln": "Used when an __init__ method is called on a class which is not in the direct ancestors for the analysed class.", "tho_xpln": "", "usage": "warning", }, "W0235": { "msg_id": "W0235", "msg_sym": "useless-super-delegation", "msg_text": "Useless super delegation in method %r", "msg_xpln": "Used whenever we can detect that an overridden method is useless, relying on super() delegation to do the same thing as another method from the MRO.", "tho_xpln": "", "usage": "enhancement", }, "W0236": { "msg_id": "W0236", "msg_sym": "invalid-overridden-method", "msg_text": "Method %r was expected to be %r, found it instead as %r", "msg_xpln": "Used when we detect that a method was overridden in a way that does not match its base class which could result in potential bugs at runtime.", "tho_xpln": "", "usage": "enhancement", }, "W0237": { "msg_id": "W0237", "msg_sym": "arguments-renamed", "msg_text": "%s %s %r method", "msg_xpln": "Used when a method parameter has a different name than in the implemented interface or in an overridden method.", "usage": "advanced", }, "W0238": { "msg_id": "W0238", "msg_sym": "unused-private-member", "msg_text": "Unused private member `%s.%s`", "msg_xpln": "Emitted when a private member of a class is defined but not used.", "usage": "warning", }, "W0239": { "msg_id": "W0239", "msg_sym": "overridden-final-method", "msg_text": "Method %r overrides a method decorated with typing.final which is defined in class %r", "msg_xpln": "Used when a method decorated with typing.final has been overridden.", "usage": "advanced", }, "W0240": { "msg_id": "W0240", "msg_sym": "subclassed-final-class", "msg_text": "Class %r is a subclass of a class decorated with typing.final: %r", "msg_xpln": "Used when a class decorated with typing.final has been subclassed.", "usage": "advanced", }, "W0244": { "msg_id": "W0244", "msg_sym": "redefined-slots-in-subclass", "msg_text": "Redefined slots %r in subclass", "msg_xpln": "Used when a slot is re-defined in a subclass.", "usage": "advanced", }, "W0245": { "msg_id": "W0245", "msg_sym": "super-without-brackets", "msg_text": "Super call without brackets", "msg_xpln": "Used when a call to super does not have brackets and thus is not an actual call and does not work as expected.", "usage": "warning", }, "W0301": { "msg_id": "W0301", "msg_sym": "unnecessary-semicolon", "msg_text": "Unnecessary semicolon", "msg_xpln": "Used when a statement is ended by a semi-colon (\";\"), which isn't necessary (that's python, not C ;).", "tho_xpln": "", "usage": "enhancement", }, "W0311": { "msg_id": "W0311", "msg_sym": "bad-indentation", "msg_text": "Bad indentation. Found %s %s, expected %s", "msg_xpln": "Used when an unexpected number of indentation's tabulations or spaces has been found.", "tho_xpln": "", "usage": "warning", }, "W0312": { "msg_id": "W0312", "msg_sym": "mixed-indentation", "msg_text": "Found indentation with %ss instead of %ss", "msg_xpln": "Used when there are some mixed tabs and spaces in a module.", "tho_xpln": "", "usage": "removed", }, "W0401": { "msg_id": "W0401", "msg_sym": "wildcard-import", "msg_text": "Wildcard import %s", "msg_xpln": "Used when `from module import *` is detected.", "tho_xpln": '"from ____ import *" is not recommended. It\'s better to import only required names from the module', "usage": "enhancement", }, "W0402": { "msg_id": "W0402", "msg_sym": "deprecated-module", "msg_text": "Deprecated module %r", "msg_xpln": "A module marked as deprecated is imported.", "tho_xpln": "", "usage": "warning", }, "W0404": { "msg_id": "W0404", "msg_sym": "reimported", "msg_text": "Reimport %r (imported line %s)", "msg_xpln": "Used when a module is reimported multiple times.", "tho_xpln": "", "usage": "warning", }, "W0406": { "msg_id": "W0406", "msg_sym": "import-self", "msg_text": "Module import itself", "msg_xpln": "Used when a module is importing itself.", "tho_xpln": "", "usage": "warning", }, "W0407": { "msg_id": "W0407", "msg_sym": "preferred-module", "msg_text": "Prefer importing %r instead of %r", "msg_xpln": "Used when a module imported has a preferred replacement module.", "tho_xpln": "", "usage": "enhancement", }, "W0410": { "msg_id": "W0410", "msg_sym": "misplaced-future", "msg_text": "__future__ import is not the first non docstring statement", "msg_xpln": "Python 2.5 and greater require __future__ import to be the first non docstring statement in the module.", "tho_xpln": "", "usage": "skip", }, "W0511": { "msg_id": "W0511", "msg_sym": "fixme", "msg_text": "", "msg_xpln": "Used when a warning note as FIXME or XXX is detected.", "tho_xpln": "", "usage": "enhancement", }, "W0601": { "msg_id": "W0601", "msg_sym": "global-variable-undefined", "msg_text": "Global variable %r undefined at the module level", "msg_xpln": 'Used when a variable is defined through the "global" statement but the variable is not defined in the module scope.', "tho_xpln": "", "usage": "warning", }, "W0602": { "msg_id": "W0602", "msg_sym": "global-variable-not-assigned", "msg_text": "Using global for %r but no assignment is done", "msg_xpln": 'Used when a variable is defined through the "global" statement but no assignment to this variable is done.', "tho_xpln": "You don't need \"global\" statement if you don't want to update the variable.", "usage": "warning", }, "W0603": { "msg_id": "W0603", "msg_sym": "global-statement", "msg_text": "Using the global statement", "msg_xpln": 'Used when you use the "global" statement to update a global variable. Pylint just try to discourage this usage. That doesn\'t mean you cannot use it !', "tho_xpln": "", "usage": "enhancement", }, "W0604": { "msg_id": "W0604", "msg_sym": "global-at-module-level", "msg_text": "Using the global statement at the module level", "msg_xpln": 'Used when you use the "global" statement at the module level since it has no effect', "tho_xpln": "", "usage": "warning", }, "W0611": { "msg_id": "W0611", "msg_sym": "unused-import", "msg_text": "Unused %s", "msg_xpln": "Used when an imported module or variable is not used.", "tho_xpln": "", "usage": "warning", }, "W0612": { "msg_id": "W0612", "msg_sym": "unused-variable", "msg_text": "Unused variable %r", "msg_xpln": "Used when a variable is defined but not used.", "tho_xpln": "Looks like the variable is defined (or imported) but not used.", "usage": "warning", }, "W0613": { "msg_id": "W0613", "msg_sym": "unused-argument", "msg_text": "Unused argument %r", "msg_xpln": "Used when a function or method argument is not used.", "tho_xpln": 'If you want to keep the argument and silence this warning, then add comment "#pylint: disable=unused-argument" as first line in your function body.', "usage": "warning", }, "W0614": { "msg_id": "W0614", "msg_sym": "unused-wildcard-import", "msg_text": "Unused import(s) %s from wildcard import of %s", "msg_xpln": "Used when an imported module or variable is not used from a `'from X import *'` style import.", "tho_xpln": "", "usage": "enhancement", }, "W0621": { "msg_id": "W0621", "msg_sym": "redefined-outer-name", "msg_text": "Redefining name %r from outer scope (line %s)", "msg_xpln": "Used when a variable's name hides a name defined in an outer scope or except handler.", "tho_xpln": 'It looks like the local variable is hiding a global variable with the same name.\n\nMost likely there is nothing wrong with this. I just wanted to remind you that you can\'t access the global variable like this. If you knew it then please ignore the warning.\n\nIf you don\'t want to see this reminder in the future, then add "redefined-outer-name" (without quotes) into "Tools → Options → Assistant → Disabled checks".', "usage": "warning", }, "W0622": { "msg_id": "W0622", "msg_sym": "redefined-builtin", "msg_text": "Redefining built-in %r", "msg_xpln": "Used when a variable or function override a built-in.", "tho_xpln": "", "usage": "enhancement", }, "W0623": { "msg_id": "W0623", "msg_sym": "redefine-in-handler", "msg_text": "Redefining name %r from %s in exception handler", "msg_xpln": "Used when an exception handler assigns the exception to an existing name", "tho_xpln": "", "usage": "removed", }, "W0631": { "msg_id": "W0631", "msg_sym": "undefined-loop-variable", "msg_text": "Using possibly undefined loop variable %r", "msg_xpln": "Used when a loop variable (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the loop.", "tho_xpln": "", "usage": "warning", }, "W0632": { "msg_id": "W0632", "msg_sym": "unbalanced-tuple-unpacking", "msg_text": "Possible unbalanced tuple unpacking with sequence%s: left side has %d label(s), right side has %d value(s)", "msg_xpln": "Used when there is an unbalanced tuple unpacking in assignment", "tho_xpln": "", "usage": "typing", }, "W0640": { "msg_id": "W0640", "msg_sym": "cell-var-from-loop", "msg_text": "Cell variable %s defined in loop", "msg_xpln": "A variable used in a closure is defined in a loop. This will result in all closures using the same value for the closed-over variable.", "tho_xpln": "", "usage": "warning", }, "W0641": { "msg_id": "W0641", "msg_sym": "possibly-unused-variable", "msg_text": "Possibly unused variable %r", "msg_xpln": "Used when a variable is defined but might not be used. The possibility comes from the fact that locals() might be used, which could consume or not the said variable", "tho_xpln": "", "usage": "warning", }, "W0642": { "msg_id": "W0642", "msg_sym": "self-cls-assignment", "msg_text": "Invalid assignment to %s in method", "msg_xpln": "Invalid assignment to self or cls in instance or class method respectively.", "tho_xpln": "", "usage": "warning", }, "W0702": { "msg_id": "W0702", "msg_sym": "bare-except", "msg_text": "No exception type(s) specified", "msg_xpln": "Used when an except clause doesn't specify exceptions type to catch.", "tho_xpln": 'Used when an except clause doesn\'t specify exceptions type to catch. Did you mean to catch also SystemExit and KeyboardInterrupt? If not then prefer "except Exception:".', "usage": "enhancement", }, "W0703": { "msg_id": "W0703", "msg_sym": "broad-except", "msg_text": "Catching too general exception %s", "msg_xpln": "Used when an except catches a too general exception, possibly burying unrelated errors.", "tho_xpln": 'This may silence unrelated errors. Consider using more narrow type or several types, eg. "except (ZeroDivisionError, IndexError):".', "usage": "enhancement", }, "W0705": { "msg_id": "W0705", "msg_sym": "duplicate-except", "msg_text": "Catching previously caught exception type %s", "msg_xpln": "Used when an except catches a type that was already caught by a previous handler.", "tho_xpln": "", "usage": "warning", }, "W0706": { "msg_id": "W0706", "msg_sym": "try-except-raise", "msg_text": "The except handler raises immediately", "msg_xpln": "Used when an except handler uses raise as its first or only operator. This is useless because it raises back the exception immediately. Remove the raise operator or the entire try-except-raise block!", "tho_xpln": "", "usage": "warning", }, "W0707": { "msg_id": "W0707", "msg_sym": "raise-missing-from", "msg_text": "Consider explicitly re-raising using %s'%s from %s'", "msg_xpln": "Python's exception chaining shows the traceback of the current exception, but also of the original exception. When you raise a new exception after another exception was caught it's likely that the second exception is a friendly re- wrapping of the first exception. In such cases `raise from` provides a better link between the two tracebacks in the final error.", "usage": "advanced", }, "W0711": { "msg_id": "W0711", "msg_sym": "binary-op-exception", "msg_text": 'Exception to catch is the result of a binary "%s" operation', "msg_xpln": 'Used when the exception to catch is of the form "except A or B:". If intending to catch multiple, rewrite as "except (A, B):"', "tho_xpln": "", "usage": "warning", }, "W0715": { "msg_id": "W0715", "msg_sym": "raising-format-tuple", "msg_text": "Exception arguments suggest string formatting might be intended", "msg_xpln": "Used when passing multiple arguments to an exception constructor, the first of them a string literal containing what appears to be placeholders intended for formatting", "tho_xpln": "", "usage": "warning", }, "W0716": { "msg_id": "W0716", "msg_sym": "wrong-exception-operation", "msg_text": "Invalid exception operation. %s", "msg_xpln": "Used when an operation is done against an exception, but the operation is not valid for the exception in question. Usually emitted when having binary operations between exceptions in except handlers.", "usage": "advanced", }, "W1113": { "msg_id": "W1113", "msg_sym": "keyword-arg-before-vararg", "msg_text": "Keyword argument before variable positional arguments list in the definition of %s function", "msg_xpln": "When defining a keyword argument before variable positional arguments, one can end up in having multiple values passed for the aforementioned parameter in case the method is called with keyword arguments.", "tho_xpln": "", "usage": "warning", }, "W1114": { "msg_id": "W1114", "msg_sym": "arguments-out-of-order", "msg_text": "Positional arguments appear to be out of order", "msg_xpln": "Emitted when the caller's argument names fully match the parameter names in the function signature but do not have the same order.", "tho_xpln": "", "usage": "warning", }, "W1115": { "msg_id": "W1115", "msg_sym": "non-str-assignment-to-dunder-name", "msg_text": "Non-string value assigned to __name__", "msg_xpln": "Emitted when a non-string value is assigned to __name__", "usage": "advanced", }, "W1116": { "msg_id": "W1116", "msg_sym": "isinstance-second-argument-not-valid-type", "msg_text": "Second argument of isinstance is not a type", "msg_xpln": "Emitted when the second argument of an isinstance call is not a type.", "usage": "warning", }, "W1201": { "msg_id": "W1201", "msg_sym": "logging-not-lazy", "msg_text": "Use %s formatting in logging functions", "msg_xpln": 'Used when a logging statement has a call form of "logging.(format_string % (format_args...))". Use another type of string formatting instead. You can use % formatting but leave interpolation to the logging function by passing the parameters as arguments. If logging-fstring- interpolation is disabled then you can use fstring formatting. If logging- format-interpolation is disabled then you can use str.format.', "tho_xpln": "", "usage": "enhancement", }, "W1202": { "msg_id": "W1202", "msg_sym": "logging-format-interpolation", "msg_text": "Use %s formatting in logging functions", "msg_xpln": 'Used when a logging statement has a call form of "logging.(format_string.format(format_args...))". Use another type of string formatting instead. You can use % formatting but leave interpolation to the logging function by passing the parameters as arguments. If logging-fstring- interpolation is disabled then you can use fstring formatting. If logging- not-lazy is disabled then you can use % formatting as normal.', "tho_xpln": "", "usage": "enhancement", }, "W1203": { "msg_id": "W1203", "msg_sym": "logging-fstring-interpolation", "msg_text": "Use %s formatting in logging functions", "msg_xpln": 'Used when a logging statement has a call form of "logging.(f"...")".Use another type of string formatting instead. You can use % formatting but leave interpolation to the logging function by passing the parameters as arguments. If logging-format-interpolation is disabled then you can use str.format. If logging-not-lazy is disabled then you can use % formatting as normal.', "tho_xpln": "", "usage": "style", }, "W1300": { "msg_id": "W1300", "msg_sym": "bad-format-string-key", "msg_text": "Format string dictionary key should be a string, not %s", "msg_xpln": "Used when a format string that uses named conversion specifiers is used with a dictionary whose keys are not all strings.", "tho_xpln": "", "usage": "warning", }, "W1301": { "msg_id": "W1301", "msg_sym": "unused-format-string-key", "msg_text": "Unused key %r in format string dictionary", "msg_xpln": "Used when a format string that uses named conversion specifiers is used with a dictionary that contains keys not required by the format string.", "tho_xpln": "", "usage": "warning", }, "W1302": { "msg_id": "W1302", "msg_sym": "bad-format-string", "msg_text": "Invalid format string", "msg_xpln": "Used when a PEP 3101 format string is invalid.", "tho_xpln": "Used when a PEP 3101 format string is invalid.", "usage": "warning", }, "W1303": { "msg_id": "W1303", "msg_sym": "missing-format-argument-key", "msg_text": "Missing keyword argument %r for format string", "msg_xpln": "Used when a PEP 3101 format string that uses named fields doesn't receive one or more required keywords.", "tho_xpln": "Used when a PEP 3101 format string that uses named fields doesn't receive one or more required keywords.", "usage": "warning", }, "W1304": { "msg_id": "W1304", "msg_sym": "unused-format-string-argument", "msg_text": "Unused format argument %r", "msg_xpln": "Used when a PEP 3101 format string that uses named fields is used with an argument that is not required by the format string.", "tho_xpln": "", "usage": "warning", }, "W1305": { "msg_id": "W1305", "msg_sym": "format-combined-specification", "msg_text": "Format string contains both automatic field numbering and manual field specification", "msg_xpln": "Used when a PEP 3101 format string contains both automatic field numbering (e.g. '{}') and manual field specification (e.g. '{0}').", "tho_xpln": "Used when a PEP 3101 format string contains both automatic field numbering (e.g. '{}') and manual field specification (e.g. '{0}').", "usage": "warning", }, "W1306": { "msg_id": "W1306", "msg_sym": "missing-format-attribute", "msg_text": "Missing format attribute %r in format specifier %r", "msg_xpln": "Used when a PEP 3101 format string uses an attribute specifier ({0.length}), but the argument passed for formatting doesn't have that attribute.", "tho_xpln": "Used when a PEP 3101 format string uses an attribute specifier ({0.length}), but the argument passed for formatting doesn't have that attribute.", "usage": "warning", }, "W1307": { "msg_id": "W1307", "msg_sym": "invalid-format-index", "msg_text": "Using invalid lookup key %r in format specifier %r", "msg_xpln": "Used when a PEP 3101 format string uses a lookup specifier ({a[1]}), but the argument passed for formatting doesn't contain or doesn't have that key as an attribute.", "tho_xpln": "Used when a PEP 3101 format string uses a lookup specifier ({a[1]}), but the argument passed for formatting doesn't contain or doesn't have that key as an attribute.", "usage": "warning", }, "W1308": { "msg_id": "W1308", "msg_sym": "duplicate-string-formatting-argument", "msg_text": "Duplicate string formatting argument %r, consider passing as named argument", "msg_xpln": "Used when we detect that a string formatting is repeating an argument instead of using named string arguments", "tho_xpln": "", "usage": "warning", }, "W1309": { "msg_id": "W1309", "msg_sym": "f-string-without-interpolation", "msg_text": "Using an f-string that does not have any interpolated variables", "msg_xpln": "Used when we detect an f-string that does not use any interpolation variables, in which case it can be either a normal string or a bug in the code.", "usage": "warning", }, "W1310": { "msg_id": "W1310", "msg_sym": "format-string-without-interpolation", "msg_text": "Using formatting for a string that does not have any interpolated variables", "msg_xpln": "Used when we detect a string that does not have any interpolation variables, in which case it can be either a normal string without formatting or a bug in the code.", "usage": "warning", }, "W1401": { "msg_id": "W1401", "msg_sym": "anomalous-backslash-in-string", "msg_text": "Anomalous backslash in string: '%s'. String constant might be missing an r prefix.", "msg_xpln": "Used when a backslash is in a literal string but not as an escape.", "tho_xpln_rst": "In regular string literals backslash is treated as a special character. If you meant to represent backslash itself, then you should double it, eg:\n\n``'C:\\\\Users\\\\Tim'``\n\nor use raw-string literal, eg:\n\n``r'C:\\Users\\Tim'``", "usage": "warning", }, "W1402": { "msg_id": "W1402", "msg_sym": "anomalous-unicode-escape-in-string", "msg_text": "Anomalous Unicode escape in byte string: '%s'. String constant might be missing an r or u prefix.", "msg_xpln": "Used when an escape like \\u is encountered in a byte string where it has no effect.", "tho_xpln": "", "usage": "warning", }, "W1403": { "msg_id": "W1403", "msg_sym": "implicit-str-concat-in-sequence", "msg_text": "Implicit string concatenation found in %s", "msg_xpln": "String literals are implicitly concatenated in a literal iterable definition : maybe a comma is missing ?", "tho_xpln": "", "usage": "warning", }, "W1404": { "msg_id": "W1404", "msg_sym": "implicit-str-concat", "msg_text": "Implicit string concatenation found in %s", "msg_xpln": "String literals are implicitly concatenated in a literal iterable definition : maybe a comma is missing ?", "usage": "warning", }, "W1405": { "msg_id": "W1405", "msg_sym": "inconsistent-quotes", "msg_text": "Quote delimiter %s is inconsistent with the rest of the file", "msg_xpln": "Quote delimiters are not used consistently throughout a module (with allowances made for avoiding unnecessary escaping).", "usage": "style", }, "W1406": { "msg_id": "W1406", "msg_sym": "redundant-u-string-prefix", "msg_text": "The u prefix for strings is no longer necessary in Python >=3.0", "msg_xpln": "Used when we detect a string with a u prefix. These prefixes were necessary in Python 2 to indicate a string was Unicode, but since Python 3.0 strings are Unicode by default.", "usage": "warning", }, "W1501": { "msg_id": "W1501", "msg_sym": "bad-open-mode", "msg_text": '"%s" is not a valid mode for open.', "msg_xpln": "Python supports: r, w, a[, x] modes with b, +, and U (only with r) options. See https://docs.python.org/3/library/functions.html#open", "tho_xpln": "", "usage": "warning", }, "W1502": { "msg_id": "W1502", "msg_sym": "boolean-datetime", "msg_text": "Using datetime.time in a boolean context.", "msg_xpln": "Using datetime.time in a boolean context can hide subtle bugs when the time they represent matches midnight UTC. This behaviour was fixed in Python 3.5. See https://bugs.python.org/issue13936 for reference. This message can't be emitted when using Python >= 3.5.", "usage": "warning", }, "W1503": { "msg_id": "W1503", "msg_sym": "redundant-unittest-assert", "msg_text": "Redundant use of %s with constant value %r", "msg_xpln": "The first argument of assertTrue and assertFalse is a condition. If a constant is passed as parameter, that condition will be always true. In this case a warning should be emitted.", "tho_xpln": "", "usage": "warning", }, "W1505": { "msg_id": "W1505", "msg_sym": "deprecated-method", "msg_text": "Using deprecated method %s()", "msg_xpln": "The method is marked as deprecated and will be removed in the future.", "tho_xpln": "", "usage": "warning", }, "W1506": { "msg_id": "W1506", "msg_sym": "bad-thread-instantiation", "msg_text": "threading.Thread needs the target function", "msg_xpln": "The warning is emitted when a threading.Thread class is instantiated without the target function being passed. By default, the first parameter is the group param, not the target param.", "tho_xpln": "", "usage": "warning", }, "W1507": { "msg_id": "W1507", "msg_sym": "shallow-copy-environ", "msg_text": "Using copy.copy(os.environ). Use os.environ.copy() instead.", "msg_xpln": "os.environ is not a dict object but proxy object, so shallow copy has still effects on original object. See https://bugs.python.org/issue15373 for reference.", "tho_xpln": "", "usage": "warning", }, "W1508": { "msg_id": "W1508", "msg_sym": "invalid-envvar-default", "msg_text": "%s default type is %s. Expected str or None.", "msg_xpln": "Env manipulation functions return None or str values. Supplying anything different as a default may cause bugs. See https://docs.python.org/3/library/os.html#os.getenv.", "tho_xpln": "", "usage": "warning", }, "W1509": { "msg_id": "W1509", "msg_sym": "subprocess-popen-preexec-fn", "msg_text": "Using preexec_fn keyword which may be unsafe in the presence of threads", "msg_xpln": "The preexec_fn parameter is not safe to use in the presence of threads in your application. The child process could deadlock before exec is called. If you must use it, keep it trivial! Minimize the number of libraries you call into.https://docs.python.org/3/library/subprocess.html#popen-constructor", "tho_xpln": "", "usage": "warning", }, "W1510": { "msg_id": "W1510", "msg_sym": "subprocess-run-check", "msg_text": "Using subprocess.run without explicitly set `check` is not recommended.", "msg_xpln": "The check parameter should always be used with explicitly set `check` keyword to make clear what the error-handling behavior is.https://docs.python.org/3/library/subprocess.html#subprocess.run", "tho_xpln": "", "usage": "enhancement", }, "W1511": { "msg_id": "W1511", "msg_sym": "deprecated-argument", "msg_text": "Using deprecated argument %s of method %s()", "msg_xpln": "The argument is marked as deprecated and will be removed in the future.", "usage": "warning", }, "W1512": { "msg_id": "W1512", "msg_sym": "deprecated-class", "msg_text": "Using deprecated class %s of module %s", "msg_xpln": "The class is marked as deprecated and will be removed in the future.", "usage": "warning", }, "W1513": { "msg_id": "W1513", "msg_sym": "deprecated-decorator", "msg_text": "Using deprecated decorator %s()", "msg_xpln": "The decorator is marked as deprecated and will be removed in the future.", "usage": "warning", }, "W1514": { "msg_id": "W1514", "msg_sym": "unspecified-encoding", "msg_text": "Using open without explicitly specifying an encoding", "msg_xpln": "It is better to specify an encoding when opening documents. Using the system default implicitly can create problems on other operating systems. See https://peps.python.org/pep-0597/", "usage": "warning", }, "W1515": { "msg_id": "W1515", "msg_sym": "forgotten-debug-statement", "msg_text": "Leaving functions creating breakpoints in production code is not recommended", "msg_xpln": "Calls to breakpoint(), sys.breakpointhook() and pdb.set_trace() should be removed from code that is not actively being debugged.", "usage": "advanced", }, "W1518": { "msg_id": "W1518", "msg_sym": "method-cache-max-size-none", "msg_text": "'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self'", "msg_xpln": "By decorating a method with lru_cache or cache the 'self' argument will be linked to the function and therefore never garbage collected. Unless your instance will never need to be garbage collected (singleton) it is recommended to refactor code to avoid this pattern or add a maxsize to the cache.The default value for maxsize is 128.", "usage": "advanced", }, "W1601": { "msg_id": "W1601", "msg_sym": "apply-builtin", "msg_text": "apply built-in referenced", "msg_xpln": "Used when the apply built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1602": { "msg_id": "W1602", "msg_sym": "basestring-builtin", "msg_text": "basestring built-in referenced", "msg_xpln": "Used when the basestring built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1603": { "msg_id": "W1603", "msg_sym": "buffer-builtin", "msg_text": "buffer built-in referenced", "msg_xpln": "Used when the buffer built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1604": { "msg_id": "W1604", "msg_sym": "cmp-builtin", "msg_text": "cmp built-in referenced", "msg_xpln": "Used when the cmp built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "skip", }, "W1605": { "msg_id": "W1605", "msg_sym": "coerce-builtin", "msg_text": "coerce built-in referenced", "msg_xpln": "Used when the coerce built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1606": { "msg_id": "W1606", "msg_sym": "execfile-builtin", "msg_text": "execfile built-in referenced", "msg_xpln": "Used when the execfile built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1607": { "msg_id": "W1607", "msg_sym": "file-builtin", "msg_text": "file built-in referenced", "msg_xpln": "Used when the file built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1608": { "msg_id": "W1608", "msg_sym": "long-builtin", "msg_text": "long built-in referenced", "msg_xpln": "Used when the long built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1609": { "msg_id": "W1609", "msg_sym": "raw_input-builtin", "msg_text": "raw_input built-in referenced", "msg_xpln": "Used when the raw_input built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1610": { "msg_id": "W1610", "msg_sym": "reduce-builtin", "msg_text": "reduce built-in referenced", "msg_xpln": "Used when the reduce built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1611": { "msg_id": "W1611", "msg_sym": "standarderror-builtin", "msg_text": "StandardError built-in referenced", "msg_xpln": "Used when the StandardError built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1612": { "msg_id": "W1612", "msg_sym": "unicode-builtin", "msg_text": "unicode built-in referenced", "msg_xpln": "Used when the unicode built-in function is referenced (missing from Python 3)", "tho_xpln": "", "usage": "removed", }, "W1613": { "msg_id": "W1613", "msg_sym": "xrange-builtin", "msg_text": "xrange built-in referenced", "msg_xpln": "Used when the xrange built-in function is referenced (missing from Python 3)", "tho_xpln": "Used when the xrange built-in function is referenced (missing from Python 3). Use range instead.", "usage": "removed", }, "W1614": { "msg_id": "W1614", "msg_sym": "coerce-method", "msg_text": "__coerce__ method defined", "msg_xpln": "Used when a __coerce__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1615": { "msg_id": "W1615", "msg_sym": "delslice-method", "msg_text": "__delslice__ method defined", "msg_xpln": "Used when a __delslice__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1616": { "msg_id": "W1616", "msg_sym": "getslice-method", "msg_text": "__getslice__ method defined", "msg_xpln": "Used when a __getslice__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1617": { "msg_id": "W1617", "msg_sym": "setslice-method", "msg_text": "__setslice__ method defined", "msg_xpln": "Used when a __setslice__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1618": { "msg_id": "W1618", "msg_sym": "no-absolute-import", "msg_text": "import missing `from __future__ import absolute_import`", "msg_xpln": "Used when an import is not accompanied by ``from __future__ import absolute_import`` (default behaviour in Python 3)", "tho_xpln": "", "usage": "skip", }, "W1619": { "msg_id": "W1619", "msg_sym": "old-division", "msg_text": "division w/o __future__ statement", "msg_xpln": "Used for non-floor division w/o a float literal or ``from __future__ import division`` (Python 3 returns a float for int division unconditionally)", "tho_xpln": "", "usage": "skip", }, "W1620": { "msg_id": "W1620", "msg_sym": "dict-iter-method", "msg_text": "Calling a dict.iter*() method", "msg_xpln": "Used for calls to dict.iterkeys(), itervalues() or iteritems() (Python 3 lacks these methods)", "tho_xpln": "Used for calls to dict.iterkeys(), itervalues() or iteritems(). Python 3 lacks these methods, use dict.keys(), values() or items().", "usage": "removed", }, "W1621": { "msg_id": "W1621", "msg_sym": "dict-view-method", "msg_text": "Calling a dict.view*() method", "msg_xpln": "Used for calls to dict.viewkeys(), viewvalues() or viewitems() (Python 3 lacks these methods)", "tho_xpln": "Used for calls to dict.viewkeys(), viewvalues() or viewitems(). Python 3 lacks these methods, use dict.keys(), values() or items().", "usage": "removed", }, "W1622": { "msg_id": "W1622", "msg_sym": "next-method-called", "msg_text": "Called a next() method on an object", "msg_xpln": "Used when an object's next() method is called (Python 3 uses the next() built-in function)", "tho_xpln": "", "usage": "removed", }, "W1623": { "msg_id": "W1623", "msg_sym": "metaclass-assignment", "msg_text": "Assigning to a class's __metaclass__ attribute", "msg_xpln": "Used when a metaclass is specified by assigning to __metaclass__ (Python 3 specifies the metaclass as a class statement argument)", "tho_xpln": "", "usage": "removed", }, "W1624": { "msg_id": "W1624", "msg_sym": "indexing-exception", "msg_text": "Indexing exceptions will not work on Python 3", "msg_xpln": "Indexing exceptions will not work on Python 3. Use `exception.args[index]` instead.", "tho_xpln": "", "usage": "removed", }, "W1625": { "msg_id": "W1625", "msg_sym": "raising-string", "msg_text": "Raising a string exception", "msg_xpln": "Used when a string exception is raised. This will not work on Python 3.", "tho_xpln": "", "usage": "removed", }, "W1626": { "msg_id": "W1626", "msg_sym": "reload-builtin", "msg_text": "reload built-in referenced", "msg_xpln": "Used when the reload built-in function is referenced (missing from Python 3). You can use instead imp.reload or importlib.reload.", "tho_xpln": "", "usage": "removed", }, "W1627": { "msg_id": "W1627", "msg_sym": "oct-method", "msg_text": "__oct__ method defined", "msg_xpln": "Used when an __oct__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1628": { "msg_id": "W1628", "msg_sym": "hex-method", "msg_text": "__hex__ method defined", "msg_xpln": "Used when a __hex__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "skip", }, "W1629": { "msg_id": "W1629", "msg_sym": "nonzero-method", "msg_text": "__nonzero__ method defined", "msg_xpln": "Used when a __nonzero__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1630": { "msg_id": "W1630", "msg_sym": "cmp-method", "msg_text": "__cmp__ method defined", "msg_xpln": "Used when a __cmp__ method is defined (method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1632": { "msg_id": "W1632", "msg_sym": "input-builtin", "msg_text": "input built-in referenced", "msg_xpln": "Used when the input built-in is referenced (backwards-incompatible semantics in Python 3)", "tho_xpln": "", "usage": "skip", }, "W1633": { "msg_id": "W1633", "msg_sym": "round-builtin", "msg_text": "round built-in referenced", "msg_xpln": "Used when the round built-in is referenced (backwards-incompatible semantics in Python 3)", "tho_xpln": "", "usage": "skip", }, "W1634": { "msg_id": "W1634", "msg_sym": "intern-builtin", "msg_text": "intern built-in referenced", "msg_xpln": "Used when the intern built-in is referenced (Moved to sys.intern in Python 3)", "tho_xpln": "", "usage": "skip", }, "W1635": { "msg_id": "W1635", "msg_sym": "unichr-builtin", "msg_text": "unichr built-in referenced", "msg_xpln": "Used when the unichr built-in is referenced (Use chr in Python 3)", "tho_xpln": "", "usage": "skip", }, "W1636": { "msg_id": "W1636", "msg_sym": "map-builtin-not-iterating", "msg_text": "map built-in referenced when not iterating", "msg_xpln": "Used when the map built-in is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1637": { "msg_id": "W1637", "msg_sym": "zip-builtin-not-iterating", "msg_text": "zip built-in referenced when not iterating", "msg_xpln": "Used when the zip built-in is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1638": { "msg_id": "W1638", "msg_sym": "range-builtin-not-iterating", "msg_text": "range built-in referenced when not iterating", "msg_xpln": "Used when the range built-in is referenced in a non-iterating context (returns a range in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1639": { "msg_id": "W1639", "msg_sym": "filter-builtin-not-iterating", "msg_text": "filter built-in referenced when not iterating", "msg_xpln": "Used when the filter built-in is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1640": { "msg_id": "W1640", "msg_sym": "using-cmp-argument", "msg_text": "Using the cmp argument for list.sort / sorted", "msg_xpln": "Using the cmp argument for list.sort or the sorted builtin should be avoided, since it was removed in Python 3. Using either `key` or `functools.cmp_to_key` should be preferred.", "tho_xpln": "", "usage": "removed", }, "W1641": { "msg_id": "W1641", "msg_sym": "eq-without-hash", "msg_text": "Implementing __eq__ without also implementing __hash__", "msg_xpln": "Used when a class implements __eq__ but not __hash__. In Python 2, objects get object.__hash__ as the default implementation, in Python 3 objects get None as their default __hash__ implementation if they also implement __eq__.", "tho_xpln": "", "usage": "removed", }, "W1642": { "msg_id": "W1642", "msg_sym": "div-method", "msg_text": "__div__ method defined", "msg_xpln": "Used when a __div__ method is defined. Using `__truediv__` and setting__div__ = __truediv__ should be preferred.(method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1643": { "msg_id": "W1643", "msg_sym": "idiv-method", "msg_text": "__idiv__ method defined", "msg_xpln": "Used when an __idiv__ method is defined. Using `__itruediv__` and setting__idiv__ = __itruediv__ should be preferred.(method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1644": { "msg_id": "W1644", "msg_sym": "rdiv-method", "msg_text": "__rdiv__ method defined", "msg_xpln": "Used when a __rdiv__ method is defined. Using `__rtruediv__` and setting__rdiv__ = __rtruediv__ should be preferred.(method is not used by Python 3)", "tho_xpln": "", "usage": "removed", }, "W1645": { "msg_id": "W1645", "msg_sym": "exception-message-attribute", "msg_text": "Exception.message removed in Python 3", "msg_xpln": "Used when the message attribute is accessed on an Exception. Use str(exception) instead.", "tho_xpln": "", "usage": "removed", }, "W1646": { "msg_id": "W1646", "msg_sym": "invalid-str-codec", "msg_text": "non-text encoding used in str.decode", "msg_xpln": "Used when using str.encode or str.decode with a non-text encoding. Use codecs module to handle arbitrary codecs.", "tho_xpln": "", "usage": "skip", }, "W1647": { "msg_id": "W1647", "msg_sym": "sys-max-int", "msg_text": "sys.maxint removed in Python 3", "msg_xpln": "Used when accessing sys.maxint. Use sys.maxsize instead.", "tho_xpln": "", "usage": "removed", }, "W1648": { "msg_id": "W1648", "msg_sym": "bad-python3-import", "msg_text": "Module moved in Python 3", "msg_xpln": "Used when importing a module that no longer exists in Python 3.", "tho_xpln": "", "usage": "warning", }, "W1649": { "msg_id": "W1649", "msg_sym": "deprecated-string-function", "msg_text": "Accessing a deprecated function on the string module", "msg_xpln": "Used when accessing a string function that has been deprecated in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1650": { "msg_id": "W1650", "msg_sym": "deprecated-str-translate-call", "msg_text": "Using str.translate with deprecated deletechars parameters", "msg_xpln": "Used when using the deprecated deletechars parameters from str.translate. Use re.sub to remove the desired characters", "tho_xpln": "", "usage": "removed", }, "W1651": { "msg_id": "W1651", "msg_sym": "deprecated-itertools-function", "msg_text": "Accessing a deprecated function on the itertools module", "msg_xpln": "Used when accessing a function on itertools that has been removed in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1652": { "msg_id": "W1652", "msg_sym": "deprecated-types-field", "msg_text": "Accessing a deprecated fields on the types module", "msg_xpln": "Used when accessing a field on types that has been removed in Python 3.", "tho_xpln": "", "usage": "skip", }, "W1653": { "msg_id": "W1653", "msg_sym": "next-method-defined", "msg_text": "next method defined", "msg_xpln": "Used when a next method is defined that would be an iterator in Python 2 but is treated as a normal function in Python 3.", "tho_xpln": "", "usage": "enhancement", }, "W1654": { "msg_id": "W1654", "msg_sym": "dict-items-not-iterating", "msg_text": "dict.items referenced when not iterating", "msg_xpln": "Used when dict.items is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1655": { "msg_id": "W1655", "msg_sym": "dict-keys-not-iterating", "msg_text": "dict.keys referenced when not iterating", "msg_xpln": "Used when dict.keys is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1656": { "msg_id": "W1656", "msg_sym": "dict-values-not-iterating", "msg_text": "dict.values referenced when not iterating", "msg_xpln": "Used when dict.values is referenced in a non-iterating context (returns an iterator in Python 3)", "tho_xpln": "", "usage": "removed", }, "W1657": { "msg_id": "W1657", "msg_sym": "deprecated-operator-function", "msg_text": "Accessing a removed attribute on the operator module", "msg_xpln": "Used when accessing a field on operator module that has been removed in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1658": { "msg_id": "W1658", "msg_sym": "deprecated-urllib-function", "msg_text": "Accessing a removed attribute on the urllib module", "msg_xpln": "Used when accessing a field on urllib module that has been removed or moved in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1659": { "msg_id": "W1659", "msg_sym": "xreadlines-attribute", "msg_text": "Accessing a removed xreadlines attribute", "msg_xpln": "Used when accessing the xreadlines() function on a file stream, removed in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1660": { "msg_id": "W1660", "msg_sym": "deprecated-sys-function", "msg_text": "Accessing a removed attribute on the sys module", "msg_xpln": "Used when accessing a field on sys module that has been removed in Python 3.", "tho_xpln": "", "usage": "removed", }, "W1661": { "msg_id": "W1661", "msg_sym": "exception-escape", "msg_text": "Using an exception object that was bound by an except handler", "msg_xpln": "Emitted when using an exception, that was bound in an except handler, outside of the except handler. On Python 3 these exceptions will be deleted once they get out of the except handler.", "tho_xpln": "", "usage": "removed", }, "W1662": { "msg_id": "W1662", "msg_sym": "comprehension-escape", "msg_text": "Using a variable that was bound inside a comprehension", "msg_xpln": "Emitted when using a variable, that was bound in a comprehension handler, outside of the comprehension itself. On Python 3 these variables will be deleted outside of the comprehension.", "tho_xpln": "", "usage": "removed", }, "W2101": { "msg_id": "W2101", "msg_sym": "useless-with-lock", "msg_text": "'%s()' directly created in 'with' has no effect", "msg_xpln": "Used when a new lock instance is created by using with statement which has no effect. Instead, an existing instance should be used to acquire lock.", "usage": "advanced", }, "W2301": { "msg_id": "W2301", "msg_sym": "unnecessary-ellipsis", "msg_text": "Unnecessary ellipsis constant", "msg_xpln": "Used when the ellipsis constant is encountered and can be avoided. A line of code consisting of an ellipsis is unnecessary if there is a docstring on the preceding line or if there is a statement in the same scope.", "usage": "style", }, "W2402": { "msg_id": "W2402", "msg_sym": "non-ascii-file-name", "msg_text": '%s name "%s" contains a non-ASCII character. PEP 3131 only allows non-ascii identifiers, not file names.', "msg_xpln": "Some editors don't support non-ASCII file names properly. Even though Python supports UTF-8 files since Python 3.5 this isn't recommended for interoperability. Further reading: - https://peps.python.org/pep-0489/#export-hook-name - https://peps.python.org/pep-0672/#confusing-features - https://bugs.python.org/issue20485", "usage": "advanced", }, "W2601": { "msg_id": "W2601", "msg_sym": "using-f-string-in-unsupported-version", "msg_text": "F-strings are not supported by all versions included in the py-version setting", "msg_xpln": "Used when the py-version set by the user is lower than 3.6 and pylint encounters a f-string.", "usage": "skip", }, "W2602": { "msg_id": "W2602", "msg_sym": "using-final-decorator-in-unsupported-version", "msg_text": "typing.final is not supported by all versions included in the py-version setting", "msg_xpln": "Used when the py-version set by the user is lower than 3.8 and pylint encounters a ``typing.final`` decorator.", "usage": "skip", }, "W4701": { "msg_id": "W4701", "msg_sym": "modified-iterating-list", "msg_text": "Iterated list '%s' is being modified inside for loop body, consider iterating through a copy of it instead.", "msg_xpln": "Emitted when items are added or removed to a list being iterated through. Doing so can result in unexpected behaviour, that is why it is preferred to use a copy of the list.", "usage": "warning", }, } if __name__ == "__main__": # for updating messages import subprocess print(subprocess.check_output(["pylint", "--version"], universal_newlines=True)) lines = ( subprocess.check_output(["pylint", "--list-msgs"], universal_newlines=True) .strip() .splitlines() ) i = 0 while i < len(lines): header = lines[i] if ( header.startswith("Emittable messages") or header.startswith("Non-emittable messages") or not header ): i += 1 continue assert header.startswith(":"), "hea " + repr(header[0]) refs, msg_text = header[1:].split(":", maxsplit=1) msg_sym, msg_id = refs.split() assert msg_id.startswith("(") and msg_id.endswith(")") msg_id = msg_id[1:-1] msg_text = msg_text.strip() if msg_text: assert msg_text.startswith("*") and msg_text.endswith("*") msg_text = msg_text[1:-1] i += 1 xpln_lines = [] while i < len(lines) and lines[i].startswith(" "): xpln_lines.append(lines[i]) i += 1 msg_xpln = " ".join(map(str.strip, xpln_lines)) if msg_id not in checks_by_id: checks_by_id[msg_id] = { "msg_id": msg_id, "msg_sym": msg_sym, "msg_text": msg_text, "msg_xpln": msg_xpln, "usage": "new", } print("New:", (msg_id, msg_sym, msg_text, msg_xpln)) else: assert checks_by_id[msg_id]["msg_sym"] == msg_sym checks_by_id[msg_id]["msg_text"] = msg_text checks_by_id[msg_id]["msg_xpln"] = msg_xpln print(dict(sorted(checks_by_id.items()))) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1701089175.0 thonny-4.1.7/thonny/plugins/pythontutor.py0000644000076600000240000000215314531107627021405 0ustar00aivarannamaastaffimport webbrowser from urllib.parse import urlencode from thonny import get_workbench from thonny.languages import tr def _do_visualize() -> None: editor = get_workbench().get_editor_notebook().get_current_editor() if editor is None: return content = editor.get_content() if not content.strip(): return args = { "code": content, "cumulative": "false", "curInstr": "0", "heapPrimitives": "nevernest", "mode": "display", "origin": "opt-frontend.js", "py": "3", "rawInputLstJSON": "[]", "textReferences": "false", } url = f"https://pythontutor.com/visualize.html#{urlencode(args)}" webbrowser.open(url) def _can_visualize() -> bool: editor = get_workbench().get_editor_notebook().get_current_editor() return editor is not None and editor.get_content().strip() def load_plugin(): get_workbench().add_command( "visualize_in_pythontutor", "run", tr("Visualize current script at Python Tutor"), _do_visualize, tester=_can_visualize, group=11, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/remove_old_data_dir.py0000644000076600000240000000275214730022736022753 0ustar00aivarannamaastaffimport os.path from tkinter.messagebox import askyesno, showinfo from thonny import THONNY_USER_DIR, get_workbench def load_plugin(): old_data_dir = os.path.join(os.path.expanduser("~"), ".thonny") if os.path.exists(old_data_dir): def doit(): import shutil if not os.path.exists(old_data_dir): showinfo( "Already deleted", "Looks like it's already deleted", master=get_workbench() ) return answer = askyesno( "Delete old data directory?", "Thonny versions before 3.0 (and first 3.0 betas) used to keep " + "configuration, logs and such in '%s'" % old_data_dir + ". " + "Since 3.0 this data is kept in a new location: '%s'.\n\n" % THONNY_USER_DIR + "If you don't intend to use older Thonny versions anymore, " + "you probably want to delete the old directory and reclaim disk space.\n\n" + "Do you want me to delete this directory now?", master=get_workbench(), ) if answer: shutil.rmtree(old_data_dir, True) shutil.rmtree(old_data_dir, True) # first one may keep empty directory showinfo("Done!", "Done!", master=get_workbench()) get_workbench().add_command( "delolddatadir", "tools", "Clean up Thonny 2.1 data folder ...", doit, group=110 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/replayer.py0000644000076600000240000003226314730022736020614 0ustar00aivarannamaastaffimport ast import os.path import tkinter as tk from datetime import datetime from tkinter import ttk from thonny import THONNY_USER_DIR, codeview, get_workbench, ui_utils from thonny.base_file_browser import BaseLocalFileBrowser from thonny.languages import tr from thonny.plugins.coloring import SyntaxColorer from thonny.ui_utils import CommonDialog, lookup_style_option class ReplayWindow(CommonDialog): def __init__(self, master): super().__init__(master, background=lookup_style_option("TFrame", "background")) ui_utils.set_zoomed(self, True) self.main_pw = ReplayerPanedWindow(self, orient=tk.HORIZONTAL, sashwidth=10) self.center_pw = ReplayerPanedWindow(self.main_pw, orient=tk.VERTICAL, sashwidth=10) self.right_frame = ttk.Frame(self.main_pw) self.right_pw = ReplayerPanedWindow(self.right_frame, orient=tk.VERTICAL, sashwidth=10) self.editor_notebook = ReplayerEditorNotebook(self.center_pw) shell_book = ttk.Notebook(self.main_pw) self.shell = ShellFrame(shell_book) self.details_frame = EventDetailsFrame(self.right_pw) self.log_frame = LogFrame( self.right_pw, self.editor_notebook, self.shell, self.details_frame ) self.browser = ReplayerFileBrowser(self.main_pw, self.log_frame) self.control_frame = ControlFrame(self.right_frame) self.main_pw.grid(padx=10, pady=10, sticky=tk.NSEW) self.main_pw.add(self.browser, width=200) self.main_pw.add(self.center_pw, width=1000) self.main_pw.add(self.right_frame, width=200) self.center_pw.add(self.editor_notebook, height=700) self.center_pw.add(shell_book, height=300) shell_book.add(self.shell, text="Shell") self.right_pw.grid(sticky=tk.NSEW) self.control_frame.grid(sticky=tk.NSEW) self.right_pw.add(self.log_frame, height=600) self.right_pw.add(self.details_frame, height=200) self.right_frame.columnconfigure(0, weight=1) self.right_frame.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) class ReplayerFileBrowser(BaseLocalFileBrowser): def __init__(self, master, log_frame): super().__init__(master, True) self.log_frame = log_frame self.configure(border=1, relief=tk.GROOVE) user_logs_path = os.path.join(THONNY_USER_DIR, "user_logs") if os.path.exists(user_logs_path): self.focus_into(user_logs_path) else: self.focus_into(os.path.expanduser("~")) def on_double_click(self, event): # self.save_current_folder() path = self.get_selected_path() if path: kind = self.get_selected_kind() if kind == "dir": self.focus_into(path) else: self.log_frame.load_log(path) return "break" # avoid default action of opening the node class ControlFrame(ttk.Frame): def __init__(self, master, **kw): ttk.Frame.__init__(self, master=master, **kw) self.toggle_button = ttk.Button(self, text="Play") self.speed_scale = ttk.Scale(self, from_=1, to=100, orient=tk.HORIZONTAL) self.toggle_button.grid(row=0, column=0, sticky=tk.NSEW, pady=(10, 0), padx=(0, 5)) self.speed_scale.grid(row=0, column=1, sticky=tk.NSEW, pady=(10, 0), padx=(5, 0)) self.columnconfigure(1, weight=1) class LogFrame(ui_utils.TreeFrame): def __init__(self, master, editor_book, shell, details_frame): ui_utils.TreeFrame.__init__(self, master, ("desc", "pause")) self.tree.heading("desc", text="Event", anchor=tk.W) self.tree.heading("pause", text="Pause (sec)", anchor=tk.W) self.configure(border=1, relief=tk.GROOVE) self.editor_notebook = editor_book self.shell = shell self.details_frame = details_frame self.all_events = [] self.last_event_index = -1 self.loading = False def load_log(self, filename): self._clear_tree() self.details_frame._clear_tree() self.all_events = [] self.last_event_index = -1 self.loading = True self.editor_notebook.reset() self.shell.reset() import json with open(filename, encoding="UTF-8") as f: events = json.load(f) last_event_time = None for event in events: node_id = self.tree.insert("", "end") self.tree.set(node_id, "desc", event["sequence"]) if len(event["time"]) == 19: # 0 fraction may have been skipped event["time"] += ".0" event_time = datetime.strptime(event["time"], "%Y-%m-%dT%H:%M:%S.%f") if last_event_time: delta = event_time - last_event_time pause = delta.seconds else: pause = 0 self.tree.set(node_id, "pause", str(pause if pause else "")) self.all_events.append(event) last_event_time = event_time self.loading = False def replay_event(self, event): "this should be called with events in correct order" # print("log replay", event) if "text_widget_id" in event: if ( event.get("text_widget_context", None) == "shell" or event.get("text_widget_class") == "ShellText" ): self.shell.replay_event(event) else: self.editor_notebook.replay_event(event) def reset(self): self.shell.reset() self.editor_notebook.reset() self.last_event_index = -1 def on_select(self, event): # parameter "event" is here tkinter event if self.loading: return iid = self.tree.focus() if iid != "": self.select_event(self.tree.index(iid)) def select_event(self, event_index): event = self.all_events[event_index] self.details_frame.load_event(event) # here event means logged event if event_index > self.last_event_index: # replay all events between last replayed event up to and including this event while self.last_event_index < event_index: self.replay_event(self.all_events[self.last_event_index + 1]) self.last_event_index += 1 elif event_index < self.last_event_index: # Undo by resetting and replaying again self.reset() self.select_event(event_index) class EventDetailsFrame(ui_utils.TreeFrame): def __init__(self, master): ui_utils.TreeFrame.__init__(self, master, columns=("attribute", "value")) self.tree.heading("attribute", text="Attribute", anchor=tk.W) self.tree.heading("value", text="Value", anchor=tk.W) self.configure(border=1, relief=tk.GROOVE) def load_event(self, event): self._clear_tree() for name in self.order_keys(event): node_id = self.tree.insert("", "end") self.tree.set(node_id, "attribute", name) self.tree.set(node_id, "value", event[name]) def order_keys(self, event): return event.keys() class ReplayerCodeView(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) self.vbar = ttk.Scrollbar(self, orient=tk.VERTICAL) self.vbar.grid(row=0, column=2, sticky=tk.NSEW) self.hbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL) self.hbar.grid(row=1, column=0, sticky=tk.NSEW, columnspan=2) self.text = codeview.SyntaxText( self, yscrollcommand=self.vbar.set, xscrollcommand=self.hbar.set, borderwidth=0, font="EditorFont", wrap=tk.NONE, insertwidth=2, # selectborderwidth=2, inactiveselectbackground="gray", # highlightthickness=0, # TODO: try different in Mac and Linux # highlightcolor="gray", padx=5, pady=5, undo=True, autoseparators=False, ) self.text.grid(row=0, column=1, sticky=tk.NSEW) self.hbar["command"] = self.text.xview self.vbar["command"] = self.text.yview self.columnconfigure(1, weight=1) self.rowconfigure(0, weight=1) class ReplayerEditor(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) self.code_view = ReplayerCodeView(self) self.code_view.grid(sticky=tk.NSEW) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) def replay_event(self, event): if event["sequence"] in ["TextInsert", "TextDelete"]: if event["sequence"] == "TextInsert": self.code_view.text.insert( event["index"], event["text"], ast.literal_eval(event["tags"]) ) elif event["sequence"] == "TextDelete": if event["index2"] and event["index2"] != "None": self.code_view.text.delete(event["index1"], event["index2"]) else: self.code_view.text.delete(event["index1"]) self.see_event(event) def see_event(self, event): for key in ["index", "index1", "index2"]: if key in event and event[key] and event[key] != "None": self.code_view.text.see(event[key]) def reset(self): self.code_view.text.delete("1.0", "end") class ReplayerEditorProper(ReplayerEditor): def __init__(self, master): ReplayerEditor.__init__(self, master) self.set_colorer() def set_colorer(self): self.colorer = SyntaxColorer(self.code_view.text) def replay_event(self, event): ReplayerEditor.replay_event(self, event) # TODO: some problem when doing fast rewind # self.colorer.notify_range("1.0", "end") def reset(self): ReplayerEditor.reset(self) self.set_colorer() class ReplayerEditorNotebook(ttk.Notebook): def __init__(self, master): ttk.Notebook.__init__(self, master, padding=0) self._editors_by_text_widget_id = {} def clear(self): for child in self.winfo_children(): child.destroy() self._editors_by_text_widget_id = {} def get_editor_by_text_widget_id(self, text_widget_id): if text_widget_id not in self._editors_by_text_widget_id: editor = ReplayerEditorProper(self) self.add(editor, text="") self._editors_by_text_widget_id[text_widget_id] = editor return self._editors_by_text_widget_id[text_widget_id] def replay_event(self, event): if "text_widget_id" in event: editor = self.get_editor_by_text_widget_id(event["text_widget_id"]) # print(event.editor_id, id(editor), event) self.select(editor) editor.replay_event(event) if "filename" in event: self.tab(editor, text=os.path.basename(event["filename"])) def reset(self): for editor in self.winfo_children(): self.forget(editor) editor.destroy() self._editors_by_text_widget_id = {} class ShellFrame(ReplayerEditor): def __init__(self, master): ReplayerEditor.__init__(self, master) # TODO: use same source as shell vert_spacing = 10 io_indent = 16 self.code_view.text.tag_configure("toplevel", font="EditorFont") self.code_view.text.tag_configure("prompt", foreground="purple", font="BoldEditorFont") self.code_view.text.tag_configure("command", foreground="black") self.code_view.text.tag_configure("version", foreground="DarkGray") self.code_view.text.tag_configure("automagic", foreground="DarkGray") self.code_view.text.tag_configure( "value", foreground="DarkBlue" ) # TODO: see also _text_key_press and _text_key_release self.code_view.text.tag_configure("error", foreground="Red") self.code_view.text.tag_configure( "io", lmargin1=io_indent, lmargin2=io_indent, rmargin=io_indent, font="IOFont" ) self.code_view.text.tag_configure("stdin", foreground="Blue") self.code_view.text.tag_configure("stdout", foreground="Black") self.code_view.text.tag_configure("stderr", foreground="Red") self.code_view.text.tag_configure("hyperlink", foreground="#3A66DD", underline=True) self.code_view.text.tag_configure("vertically_spaced", spacing1=vert_spacing) self.code_view.text.tag_configure("inactive", foreground="#aaaaaa") class ReplayerPanedWindow(tk.PanedWindow): def __init__(self, master=None, cnf={}, **kw): cnf = cnf.copy() cnf.update(kw) cnf["background"] = lookup_style_option("TFrame", "background") super().__init__(master=master, cnf=cnf) def load_plugin() -> None: def open_replayer(): win = ReplayWindow(get_workbench()) ui_utils.show_dialog(win) get_workbench().set_default("tools.replayer_last_browser_folder", None) if get_workbench().get_ui_mode() == "expert": get_workbench().add_command( "open_replayer", "tools", tr("Open replayer..."), open_replayer, group=110 ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3289626 thonny-4.1.7/thonny/plugins/rp2040/0000755000076600000240000000000014730055627017345 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/rp2040/__init__.py0000644000076600000240000000333414730022736021454 0ustar00aivarannamaastafffrom logging import getLogger from typing import List from thonny.plugins.micropython import add_micropython_backend from thonny.plugins.micropython.mp_common import RAW_PASTE_SUBMIT_MODE from thonny.plugins.micropython.mp_front import ( BareMetalMicroPythonConfigPage, BareMetalMicroPythonProxy, get_uart_adapter_vids_pids, ) from thonny.plugins.micropython.uf2dialog import show_uf2_installer logger = getLogger(__name__) VIDS_PIDS_TO_AVOID_IN_RP2040 = set() class RP2040BackendProxy(BareMetalMicroPythonProxy): @classmethod def should_consider_unknown_devices(cls): return True @classmethod def get_known_usb_vids_pids(cls): # can be anything return set() def get_node_label(self): return "RP2040 device" def _get_backend_launcher_path(self) -> str: import thonny.plugins.rp2040.rp2040_back return thonny.plugins.rp2040.rp2040_back.__file__ @classmethod def get_vids_pids_to_avoid(self): return get_uart_adapter_vids_pids() | VIDS_PIDS_TO_AVOID_IN_RP2040 class RP2040BackendConfigPage(BareMetalMicroPythonConfigPage): def get_flashing_dialog_kinds(self) -> List[str]: return [""] def _open_flashing_dialog(self, kind: str) -> None: assert kind == "" show_uf2_installer(self, firmware_name="MicroPython") @property def allow_webrepl(self): return True def load_plugin(): add_micropython_backend( "RP2040", RP2040BackendProxy, "MicroPython (RP2040)", RP2040BackendConfigPage, bare_metal=True, sort_key="33", validate_time=False, sync_time=True, submit_mode=RAW_PASTE_SUBMIT_MODE, write_block_size=64, ) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.329806 thonny-4.1.7/thonny/plugins/rp2040/api_stubs/0000755000076600000240000000000014730055627021336 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/plugins/rp2040/api_stubs/mp-1.18-pico.txt0000644000076600000240000000053014417536743024033 0ustar00aivarannamaastaff__main__ _boot _onewire _rp2 _thread _uasyncio builtins cmath dht ds18x20 framebuf gc machine math micropython neopixel onewire rp2 uarray uasyncio/__init__ uasyncio/core uasyncio/event uasyncio/funcs uasyncio/lock uasyncio/stream ubinascii ucollections uctypes uerrno uhashlib uheapq uio ujson uos urandom ure uselect ustruct usys utime uzlib ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/plugins/rp2040/api_stubs/rp2.pyi0000644000076600000240000002251514417536743022576 0ustar00aivarannamaastafffrom typing import Any, Iterable, Sequence, Union from machine import Pin from uarray import array # make_stub_files: Wed 03 Feb 2021 at 08:12:32 class Flash: # Determined from: https://github.com/raspberrypi/micropython/blob/1196871a0f2f974b03915e08cfcc0433de4b8a64/ports/rp2/rp2_flash.c # Documentation put together via research and may be flawed! """ Flash storage functionality. """ CMD_INIT = 1 CMD_DEINIT = 2 CMD_SYNC = 3 CMD_BLOCK_COUNT = 4 CMD_BLOCK_SIZE = 5 CMD_BLOCK_ERASE = 6 def ioctl(self, cmd: int, offsetBlocks: int = None): """ Send a command to the Flash storage controller. """ def readblocks(self, offsetBlocks: int, buffer: bytearray): """ Read data from the Flash storage. """ def writeblocks(self, offsetBlocks: int, buffer: bytearray): """ Write data to the Flash storage. """ class PIO: # Determined from: https://github.com/raspberrypi/micropython/blob/1196871a0f2f974b03915e08cfcc0433de4b8a64/ports/rp2/rp2_pio.c # Documentation put together via research and may be flawed! """ Programmable I/O (PIO) functionality. The Pico has two PIO blocks that each have four state machines. These are really stripped-down processing cores that can be used to handle data coming in or out of the microcontroller, and offload some of the processing requirement for implementing communications protocols. """ IN_HIGH = 1 IN_LOW = 0 IRQ_SM0 = 256 IRQ_SM1 = 512 IRQ_SM2 = 1024 IRQ_SM3 = 2048 OUT_HIGH = 3 OUT_LOW = 2 SHIFT_LEFT = 0 SHIFT_RIGHT = 1 JOIN_NONE = 0 JOIN_TX = 1 JOIN_RX = 2 def __init__(self, pin:int) -> None: ... def add_program(self, prog): """ Adds program data to the PIO instruction memory. """ def irq(self, handler=None, trigger=IRQ_SM0|IRQ_SM1|IRQ_SM2|IRQ_SM3, hard=False): """ Execute assembly code when triggered. """ def remove_program(self, prog = None): """ Default to removing all programs from the PIO instruction memory, but will remove a specific program if passed as a parameter. """ def state_machine(self, id, prog, freq=-1, *, set=None) -> StateMachine: """ Returns the StateMachine object. """ class PIOASMError(Exception): ... class PIOASMEmit: def __init__(self) -> None: ... def start_pass(self, pass_: Any) -> None: ... def __getitem__(self, key: Any) -> Any: ... # 0: return self.delay(key) # ? 0: return self.delay(key) def delay(self, delay: int) -> PIOASMEmit: ... # 0: return self # ? 0: return self def side(self, value: Any) -> Any: ... # 0: return self # ? 0: return self def wrap_target(self) -> None: ... def wrap(self) -> None: ... def label(self, label: Any) -> None: ... def word(self, instr: Any, label: Any=None) -> Any: ... # 0: return self # ? 0: return self def nop(self) -> Any: ... # 0: return self.word() # ? 0: return self.word() def jmp(self, cond: Any, label: Any=None) -> Any: ... # 0: return self.word(|cond<<,label) # ? 0: return self.word(|cond<<, label) def wait(self, polarity: Any, src: Any, index: Any) -> Any: ... # 0: return self.word(|polarity<<|src<<|index) # ? 0: return self.word(|polarity<<|src<<|index) def in_(self, src: Any, data: Any) -> Any: ... # 0: return self.word(|src<<|data&) # ? 0: return self.word(|src<<|data&) def out(self, dest: Any, data: Any) -> Any: ... # 0: return self.word(|dest<<|data&) # ? 0: return self.word(|dest<<|data&) def push(self, value: Any=0, value2: Any=0) -> Any: ... # 0: return self.word(|value&) # ? 0: return self.word(|value&) def pull(self, value: Any=0, value2: Any=0) -> Any: ... # 0: return self.word(|value&) # ? 0: return self.word(|value&) def mov(self, dest: Any, src: Any) -> Any: ... # 0: return self.word(|dest<<|src) # ? 0: return self.word(|dest<<|src) def irq(self, mod: Any, index: Any=None) -> Any: ... # 0: return self.word(|mod&|index) # ? 0: return self.word(|mod&|index) def set(self, dest: Any, data: Any) -> Any: ... # 0: return self.word(|dest<<|data) # ? 0: return self.word(|dest<<|data) class StateMachine: # Determined from: https://github.com/raspberrypi/micropython/blob/1196871a0f2f974b03915e08cfcc0433de4b8a64/ports/rp2/rp2_pio.c # Documentation put together via research and may be flawed! def __init__(self, id, prog, freq: int=-1, *, in_base: Pin=None, out_base: Pin=None, set_base: Pin=None, jmp_pin: Pin=None, sideset_base: Pin=None, in_shiftdir: int=None, out_shiftdir: int=None, push_thresh: int=None, pull_thresh: int=None): """ Create a new StateMachine containing two First-In-First-Out (FIFO) structures: one for incoming data and another for outgoing data. The input FIFO is known as the RX FIFO and the output FIFO is known as the TX FIFO. Each FIFO can contain up to four words of data (each 32 bits) and can be linked to Direct Memory Access (DMA). The FIFO structures are linked to the state machine via the input and output shift registers called X and Y. These are for storing temporary data. A Pico board has 8 available state machines. - *id* should be a number between 0 and 7 (the Pico has 8 machines). - *prog* is the assembly code to execute (decorated by ``@asm_pio``). - *freq* is the frequency at which the code should be executed (in milliseconds). """ def init(self, id, prog, freq: int=-1, *, in_base: Pin=None, out_base: Pin=None, set_base: Pin=None, jmp_pin: Pin=None, sideset_base: Pin=None, in_shiftdir: int=None, out_shiftdir: int=None, push_thresh: int=None, pull_thresh: int=None): """ Create a new StateMachine containing two First-In-First-Out (FIFO) structures: one for incoming data and another for outgoing data. The input FIFO is known as the RX FIFO and the output FIFO is known as the TX FIFO. Each FIFO can contain up to four words of data (each 32 bits) and can be linked to Direct Memory Access (DMA). The FIFO structures are linked to the state machine via the input and output shift registers called X and Y. These are for storing temporary data. A Pico board has 8 available state machines. - *id* should be a number between 0 and 7 (the Pico has 8 machines). - *prog* is the assembly code to execute (decorated by ``@asm_pio``). - *freq* is the frequency at which the code should be executed (in milliseconds). """ def exec(self, instr: str): """ Run an execution instruction. """ def irq(self, handler=None, trigger=0|1, hard=False): """ Set an IRQ handler. """ def active(self, value: int): """ Set the ``StateMachine`` to be active. - *value* should be 1 for active. """ def get(self, buf: bytes=None, shift: int=0): """ Get data from the ``StateMachine``. - *buf* are optional bytes - *shift* is an optional number of places to shift. """ def put(self, value: Union[bytes, int | array[int]], shift: int=0): """ Sets data within the ``StateMachine``. - *buf* are optional bytes - *shift* is an optional number of places to shift. """ def restart(self): """ ``Restarts`` the state machine. - it resets the statemachine to the initial state without the need to re-instantiation. - It also makes PIO code easier, because then stalling as error state can be unlocked. """ def rx_fifo(self) -> int: """ Return the number of ``RX FIFO`` items. 0 if empty - rx_fifo() is also useful, for MP code to check for data & timeout if no data arrived. """ def tx_fifo(self) -> int: """ Return the number of ``TX FIFO`` items. 0 if empty - tx_fifo() can be useful to check states where data is not processed. """ def asm_pio( out_init: int = None, set_init: int = None, sideset_init: int = None, in_shiftdir: int = 0, out_shiftdir: int = 0, autopush: bool = False, autopull: bool = False, push_thresh: int = 32, pull_thresh: int = 32, fifo_join=0, ) -> Any: """ This decorator lets MicroPython know that the method is written in PIO assembly. You should disable linting since the content isn't written in Python. In Pylance, move any assembly code into a separate file and ensure the first line of that file reads: ``# type: ignore``. In Pylint, add a comment that reads ``# pylint: disable=E,W,C,R`` at the beginning of the method. """ # 0: return emit.prog # ? 0: return emit.prog # 1: return dec # ? 1: return dec def asm_pio_encode(instr: str, sideset_count: int) -> Any: ... # 0: return emit.prog[_PROG_DATA][] # ? 0: return emit.prog[_PROG_DATA][] def const(value:Any) -> Any: pass././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/rp2040/rp2040_back.py0000644000076600000240000000157314730022736021627 0ustar00aivarannamaastaffimport os.path import sys from logging import getLogger from typing import List, Optional # make sure thonny folder is in sys.path (relevant in dev) thonny_container = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) if thonny_container not in sys.path: sys.path.insert(0, thonny_container) from thonny.plugins.micropython.bare_metal_backend import ( BareMetalMicroPythonBackend, launch_bare_metal_backend, ) # Can't use __name__, because it will be "__main__" logger = getLogger("thonny.plugins.micropython.rp2040_backend") class RP2040Backend(BareMetalMicroPythonBackend): def _get_sys_path_for_analysis(self) -> Optional[List[str]]: return [ os.path.join(os.path.dirname(__file__), "api_stubs"), ] + super()._get_sys_path_for_analysis() if __name__ == "__main__": launch_bare_metal_backend(RP2040Backend) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3301775 thonny-4.1.7/thonny/plugins/rpi_pico/0000755000076600000240000000000014730055627020222 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/plugins/rpi_pico/__init__.py0000644000076600000240000000372314417536743022345 0ustar00aivarannamaastafffrom logging import getLogger from typing import Optional from thonny import get_workbench, ui_utils from thonny.plugins.micropython import add_micropython_backend from thonny.plugins.micropython.mp_common import RAW_PASTE_SUBMIT_MODE from thonny.plugins.micropython.mp_front import get_uart_adapter_vids_pids from thonny.plugins.micropython.uf2dialog import Uf2FlashingDialog from thonny.plugins.rp2040 import RP2040BackendConfigPage, RP2040BackendProxy from thonny.ui_utils import show_dialog logger = getLogger(__name__) class RaspberryPiPicoBackendProxy(RP2040BackendProxy): @classmethod def should_consider_unknown_devices(cls): return False @classmethod def get_known_usb_vids_pids(cls): # https://github.com/raspberrypi/usb-pid return {(0x2E8A, 0x0005)} @classmethod def get_node_label(self): return "Raspberry Pi Pico" class RaspberryPiPicoBackendConfigPage(RP2040BackendConfigPage): pass def load_plugin(): add_micropython_backend( "RPiPico", RaspberryPiPicoBackendProxy, "MicroPython (Raspberry Pi Pico)", RaspberryPiPicoBackendConfigPage, bare_metal=True, sort_key="32", validate_time=False, sync_time=True, submit_mode=RAW_PASTE_SUBMIT_MODE, write_block_size=64, ) # Don't consider Pico in generic backends # The main reason is to reduce the number of items in the backend switcher menu import thonny.plugins.circuitpython import thonny.plugins.esp import thonny.plugins.micropython thonny.plugins.circuitpython.cirpy_front.VIDS_PIDS_TO_AVOID.update( RaspberryPiPicoBackendProxy.get_known_usb_vids_pids() ) thonny.plugins.micropython.mp_front.VIDS_PIDS_TO_AVOID_IN_GENERIC_BACKEND.update( RaspberryPiPicoBackendProxy.get_known_usb_vids_pids() ) thonny.plugins.esp.VIDS_PIDS_TO_AVOID_IN_ESP_BACKENDS.update( RaspberryPiPicoBackendProxy.get_known_usb_vids_pids() ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/run_debug_config_page.py0000644000076600000240000000575314730022736023270 0ustar00aivarannamaastafffrom tkinter import ttk from thonny import get_workbench from thonny.config_ui import ConfigurationPage from thonny.languages import tr class RunDebugConfigurationPage(ConfigurationPage): def __init__(self, master): super().__init__(master) self.add_checkbox( "run.allow_running_unnamed_programs", tr("Allow running unnamed programs"), row=3, columnspan=3, ) self.add_checkbox( "run.auto_cd", tr("Change working directory to script directory on Run / Debug"), row=5, columnspan=3, ) self.add_checkbox( "run.warn_module_shadowing", tr("Warn if a user module shadows a library module"), row=6, columnspan=3, pady=(0, 20), ) self.add_checkbox( "debugger.frames_in_separate_windows", tr("Show function calls (frames) in separate windows"), tooltip=tr("Uncheck if you want more traditional experience."), row=10, columnspan=3, ) self.add_checkbox( "debugger.automatic_stack_view", tr("Open and close Stack view automatically"), tooltip=tr( "Opens the Stack view on first call and " + "closes it when program returns to main frame." ), row=20, columnspan=3, ) self.add_checkbox( "debugger.allow_stepping_into_libraries", tr("Allow stepping into libraries (ie. outside of main script directory)"), tooltip=tr("May make debugging slower."), row=30, columnspan=3, ) default_label = ttk.Label(self, text=tr("Preferred debugger"), anchor="w") default_label.grid(row=40, column=0, sticky="w", pady=(15, 0)) self.add_combobox( "debugger.preferred_debugger", ["nicer", "faster", "birdseye"], width=8, row=40, column=1, padx=5, pady=(15, 0), ) default_comment_label = ttk.Label( self, text=tr("(used when clicking Debug toolbar button)"), anchor="w" ) default_comment_label.grid(row=40, column=2, sticky="w", pady=(15, 0)) if get_workbench().get_option("run.birdseye_port", None): port_label = ttk.Label(self, text=tr("Birdseye port"), anchor="w") port_label.grid(row=50, column=0, sticky="w", pady=(5, 0)) self.add_entry("run.birdseye_port", row=50, column=1, width=5, pady=(5, 0), padx=5) port_comment_label = ttk.Label( self, text=tr("(restart Thonny after changing this)"), anchor="w" ) port_comment_label.grid(row=50, column=2, sticky="w", pady=(5, 0)) self.columnconfigure(2, weight=1) def load_plugin(): get_workbench().add_configuration_page("run", tr("Run & Debug"), RunDebugConfigurationPage, 50) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/shell_config_page.py0000644000076600000240000000500414730022736022412 0ustar00aivarannamaastaffimport tkinter as tk from logging import getLogger from tkinter import ttk from thonny import get_workbench from thonny.config_ui import ConfigurationPage from thonny.languages import tr class ShellConfigurationPage(ConfigurationPage): def __init__(self, master): ConfigurationPage.__init__(self, master) self.columnconfigure(1, weight=1) self.add_checkbox( "shell.clear_for_new_process", tr("Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)"), 5, 0, columnspan=2, pady=(0, 10), ) self.add_checkbox( "shell.tty_mode", tr("Terminal emulation") + " (" + tr("supports basic ANSI-colors and styles") + ", \\a, \\r, \\b)", 10, 0, columnspan=2, pady=(0, 10), ) max_lines_var = get_workbench().get_variable("shell.max_lines") max_lines_label = ttk.Label( self, text=tr( tr("Maximum number of lines to keep.") + "\n" + tr("NB! Large values may cause poor performance!") ), ) max_lines_label.grid(row=20, column=0, sticky=tk.W) max_lines_combo = ttk.Combobox( self, width=9, exportselection=False, textvariable=max_lines_var, state="readonly", values=[100, 500, 1000, 5000, 10000, 50000, 100000], ) max_lines_combo.grid(row=20, column=1, sticky=tk.W, padx=10) squeeze_var = get_workbench().get_variable("shell.squeeze_threshold") squeeze_label = ttk.Label( self, text=tr("Maximum length of line fragments before squeezing") ) squeeze_label.grid(row=22, column=0, sticky="w") squeeze_combo = ttk.Combobox( self, width=9, exportselection=False, textvariable=squeeze_var, state="readonly", values=[500, 1000, 1500, 2000, 3000, 4000, 5000, 10000], ) squeeze_combo.grid(row=22, column=1, sticky=tk.W, padx=10, pady=10) self.add_checkbox( "shell.auto_inspect_values", tr("Open evaluated values in Object inspector"), 30, 0, columnspan=2, pady=(0, 10), ) def load_plugin() -> None: get_workbench().add_configuration_page("shell", tr("Shell"), ShellConfigurationPage, 70) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/plugins/shell_macro.py0000644000076600000240000000665114626075445021274 0ustar00aivarannamaastaffimport tkinter as tk from tkinter import ttk from thonny import get_runner, get_workbench, misc_utils, ui_utils from thonny.codeview import CodeView from thonny.ui_utils import CommonDialog class ShellMacroDialog(CommonDialog): def __init__(self, master): super().__init__(master) self.title("Configure shell macro") if misc_utils.running_on_mac_os(): self.configure(background="systemSheetBackground") self.transient(master) self.grab_set() # to make it active # self.grab_release() # to allow eg. copy something from the editor self._create_widgets() self.bind("", self._on_close, True) self.protocol("WM_DELETE_WINDOW", self._on_close) self.main_command_text.focus_set() def _create_widgets(self): bg = "#ffff99" banner_frame = tk.Frame(self, background=bg) banner_frame.grid(row=0, column=0, sticky="nsew") banner_frame.rowconfigure(0, weight=1) banner_frame.columnconfigure(0, weight=1) banner_text = tk.Label( banner_frame, text="These\nare\ninstructions asdfa afs fa sfasdf", background=bg, justify="left", ) banner_text.grid(column=0, row=0, pady=10, padx=10, sticky="nsew") main_frame = ttk.Frame(self) main_frame.grid(row=1, column=0, sticky=tk.NSEW, padx=15, pady=15) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.main_command_text = CodeView(main_frame, height=5) self.main_command_text.grid(column=0, row=1, sticky="nsew") # main_command_text["relief"] = "groove" main_frame.rowconfigure(1, weight=1) main_frame.columnconfigure(0, weight=1) button_frame = ttk.Frame(main_frame) button_frame.grid(row=2, column=0, sticky="nsew") run_button = ttk.Button(button_frame, text="Save and execute", command=self._save_exec) run_button.grid(row=0, column=1, sticky="nsew") ok_button = ttk.Button(button_frame, text="Save", command=self._save) ok_button.grid(row=0, column=2, sticky="nsew") cancel_button = ttk.Button(button_frame, text="Cancel", command=self._cancel) cancel_button.grid(row=0, column=3, sticky="nsew") button_frame.columnconfigure(0, weight=1) def _on_close(self, event=None): self.destroy() def _save_exec(self, event=None): self._save(event) execute_macro() def _save(self, event=None): source = self.main_command_text.text.get("1.0", "end") get_workbench().set_option("run.shell_macro_main", repr(source)) self.destroy() def _cancel(self, event=None): self.destroy() def show_dialog(): dlg = ShellMacroDialog(get_workbench()) ui_utils.show_dialog(dlg) def execute_macro(): if get_runner().is_waiting_toplevel_command(): source = get_workbench().get_option("run.shell_macro_main") if source is not None: shell = get_workbench().show_view("ShellView") shell.submit_python_code(source.strip() + "\n") def _load_plugin(): get_workbench().set_default("run.shell_macro_main", None) get_workbench().add_command( "configure_shell_macro", "run", "Configure shell macro...", show_dialog ) get_workbench().add_command( "execute_shell_macro", "run", "Execute shell macro", execute_macro, default_sequence="" ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/plugins/statement_boxes.py0000644000076600000240000002040114730041235022157 0ustar00aivarannamaastaff""" NB! Stippling doesn't work on mac: http://wiki.tcl.tk/44444 http://rkeene.org/projects/tcl/tk.fossil/tkthistory/2954673 """ import os.path from logging import getLogger from tkinter import font import thonny from thonny import get_workbench from thonny.codeview import get_syntax_options_for_tag def create_bitmap_file(width, height, predicate, name): cache_dir = os.path.join(thonny.THONNY_USER_DIR, "image_cache") name = "%s_%d_%d.xbm" % (name, width, height) filename = os.path.join(cache_dir, name) # if os.path.exists(filename): # return filename hex_lines = [] if width % 8 == 0: row_size = width else: # need to pad row size so that it is multiple of 8 row_size = width + 8 - (width % 8) for y in range(height): byte_hexes = [] for byte_index in range(row_size // 8): byte = 0 for bit_index in range(7, -1, -1): x = byte_index * 8 + bit_index byte <<= 1 if predicate(x, y): byte |= 1 byte_hexes.append(format(byte, "#04x")) hex_lines.append(",".join(byte_hexes)) data = ( "#define im_width %d\n" % width + "#define im_height %d\n" % height + "static char im_bits[] = {\n" + "%s\n" % ",\n".join(hex_lines) + "};" ) os.makedirs(cache_dir, exist_ok=True) with open(filename, "w") as fp: fp.write(data) return filename def configure_text(text): spacing1 = 2 spacing3 = 3 text_font = text["font"] text.configure(spacing1=spacing1, spacing3=spacing3) text.master._gutter.configure(spacing1=spacing1, spacing3=spacing3) if isinstance(text_font, str): text_font = font.nametofont(text_font) indent_width = text_font.measure(" ") bbox = text.bbox("1.0") if bbox is None or bbox[3] < 5: # text not ready yet # TODO: Text in Tk 8.6 has sync method return False line_height = bbox[3] + spacing1 + spacing3 print(indent_width, line_height) def ver(x: int, y: int, top: bool, bottom: bool) -> bool: # tells where to show pixels in vertical border of the statement # It would be convenient if tiling started from the start of # 1st char, but it is offset a bit # In order to make computation easier, I'm offsetting x as well x = (x - 5) % indent_width stripe_width = 8 gap = 3 left = indent_width - stripe_width - gap return ( left <= x < left + stripe_width or top and y == 0 and x >= left or bottom and y == line_height - 1 and x >= left ) def hor(x: int, y: int, top: bool, bottom: bool) -> bool: # tells where to show pixels in statement line return top and y == 0 or bottom and y == line_height - 1 color = get_syntax_options_for_tag("GUTTER").get("background", "gray") for orient, base_predicate in [("hor", hor), ("ver", ver)]: for top in [False, True]: for bottom in [False, True]: def predicate( x, y, # need to make base_predicate, top and bottom local base_predicate=base_predicate, top=top, bottom=bottom, ): return base_predicate(x, y, top, bottom) tag_name = "%s_%s_%s" % (orient, top, bottom) bitmap_path = create_bitmap_file(indent_width, line_height, predicate, tag_name) text.tag_configure(tag_name, background=color, bgstipple="@" + bitmap_path) return True def print_tree(node, level=0): from parso.python import tree as python_tree indent = " " * level # if (isinstance(node, python_tree.PythonNode) and node.type == "sim" if node.type in ("simple_stmt",) or isinstance(node, python_tree.Flow): print(indent, node.type, node.start_pos, node.end_pos) if hasattr(node, "children"): for child in node.children: print_tree(child, level + 1) def clear_tags(text): for pos in ["ver", "hor"]: for top in [True, False]: for bottom in [True, False]: text.tag_remove("%s_%s_%s" % (pos, top, bottom), "1.0", "end") def add_tags(text): source = text.get("1.0", "end") clear_tags(text) # tree = jedi_ utils.parse_source(source) print_tree(tree) last_line = 0 last_col = 0 def tag_tree(node): nonlocal last_line, last_col from parso.python import tree as python_tree if node.type == "simple_stmt" or isinstance(node, (python_tree.Flow, python_tree.Scope)): start_line, start_col = node.start_pos end_line, end_col = node.end_pos # Before dealing with this node, # handle the case, where last vertical tag was meant for # same column, but there were empty or comment lines between if start_col == last_col: for i in range(last_line + 1, start_line): # NB! tag not visible when logically empty line # doesn't have indent prefix text.tag_add( "ver_False_False", "%d.%d" % (i, last_col - 1), "%d.%d" % (i, last_col) ) print("ver_False_False", "%d.%d" % (i, last_col - 1), "%d.%d" % (i, last_col)) print(node) # usually end_col is 0 # exceptions: several statements on the same line (semicoloned statements) # also unclosed parens in if-header for lineno in range(start_line, end_line if end_col == 0 else end_line + 1): top = lineno == start_line and lineno > 1 bottom = False # start_line == end_line-1 # horizontal line (only for first or last line) if top or bottom: text.tag_add( "hor_%s_%s" % (top, bottom), "%d.%d" % (lineno, start_col), "%d.%d" % (lineno + 1 if end_col == 0 else lineno, 0), ) print( "hor_%s_%s" % (top, bottom), "%d.%d" % (lineno, start_col), "%d.%d" % (lineno + 1, 0), ) # vertical line (only for indented statements) # Note that I'm using start col for all lines # (statement's indent shouldn't decrease in continuation lines) if start_col > 0: text.tag_add( "ver_%s_%s" % (top, bottom), "%d.%d" % (lineno, start_col - 1), "%d.%d" % (lineno, start_col), ) print( "ver_%s_%s" % (top, bottom), "%d.%d" % (lineno, start_col - 1), "%d.%d" % (lineno, start_col), ) last_line = lineno last_col = start_col # Recurse if node.type != "simple_stmt" and hasattr(node, "children"): for child in node.children: tag_tree(child) tag_tree(tree) def handle_editor_event(event): configure_and_add_tags(event.editor.get_text_widget()) def handle_events(event): if hasattr(event, "text_widget"): text = event.text_widget else: text = event.widget configure_and_add_tags(text) def configure_and_add_tags(text): if not getattr(text, "structure_tags_configured", False): try: if configure_text(text): text.structure_tags_configured = True else: text.after(500, lambda: configure_and_add_tags(text)) return except Exception: logger.exception("Problem with defining structure tags") return add_tags(text) def _load_plugin() -> None: wb = get_workbench() wb.set_default("view.program_structure", False) wb.bind("Save", handle_editor_event, True) wb.bind("Open", handle_editor_event, True) wb.bind_class("EditorCodeViewText", "<>", handle_events, True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/stdlib_error_helpers.py0000644000076600000240000006243014730022736023204 0ustar00aivarannamaastaffimport builtins import os.path import re import token from thonny import assistance from thonny.assistance import ( ErrorHelper, HelperNotSupportedError, Suggestion, add_error_helper, name_similarity, ) from thonny.misc_utils import running_on_windows class SyntaxErrorHelper(ErrorHelper): def __init__(self, error_info): import tokenize super().__init__(error_info) self.tokens = [] self.token_error = None if self.error_info["message"] == "EOL while scanning string literal": self.intro_text = ( "You haven't properly closed the string on line %s." % self.error_info["lineno"] + "\n(If you want a multi-line string, then surround it with" + " `'''` or `\"\"\"` at both ends.)" ) elif self.error_info["message"] == "EOF while scanning triple-quoted string literal": # lineno is not useful, as it is at the end of the file and user probably # didn't want the string to end there self.intro_text = "You haven't properly closed a triple-quoted string" else: if self.error_info["filename"] and os.path.isfile(self.error_info["filename"]): with open(self.error_info["filename"], mode="rb") as fp: try: for t in tokenize.tokenize(fp.readline): self.tokens.append(t) except tokenize.TokenError as e: self.token_error = e except IndentationError as e: self.indentation_error = e if not self.tokens or self.tokens[-1].type not in [ token.ERRORTOKEN, token.ENDMARKER, ]: self.tokens.append(tokenize.TokenInfo(token.ERRORTOKEN, "", None, None, "")) else: self.tokens = [] unbalanced = self._sug_unbalanced_parens() if unbalanced: self.intro_text = ( "Unbalanced parentheses, brackets or braces:\n\n" + unbalanced.body ) self.intro_confidence = 5 else: self.intro_text = "Python doesn't know how to read your program." if "^" in str(self.error_info): self.intro_text += ( "\n\nSmall `^` in the original error message shows where it gave up," + " but the actual mistake can be before this." ) self.suggestions = [self._sug_missing_or_misplaced_colon()] def _sug_missing_or_misplaced_colon(self): import tokenize i = 0 title = "Did you forget the colon?" relevance = 0 body = "" while i < len(self.tokens) and self.tokens[i].type != token.ENDMARKER: t = self.tokens[i] if t.string in [ "if", "elif", "else", "while", "for", "with", "try", "except", "finally", "class", "def", ]: keyword_pos = i while ( self.tokens[i].type not in [ token.NEWLINE, token.ENDMARKER, token.COLON, # colon may be OP token.RBRACE, ] and self.tokens[i].string != ":" ): old_i = i if self.tokens[i].string in "([{": i = self._skip_braced_part(i) assert i > old_i if i == len(self.tokens): return None else: i += 1 if self.tokens[i].string != ":": relevance = 9 body = "`%s` header must end with a colon." % t.string break # Colon was present, but maybe it should have been right # after the keyword. if ( t.string in ["else", "try", "finally"] and self.tokens[keyword_pos + 1].string != ":" ): title = "Incorrect use of `%s`" % t.string body = "Nothing is allowed between `%s` and colon." % t.string relevance = 9 if ( self.tokens[keyword_pos + 1].type not in (token.NEWLINE, tokenize.COMMENT) and t.string == "else" ): body = "If you want to specify a condition, then use `elif` or nested `if`." break i += 1 return Suggestion("missing-or-misplaced-colon", title, body, relevance) def _sug_unbalanced_parens(self): problem = self._find_first_braces_problem() if not problem: return None return Suggestion("missing-or-misplaced-colon", "Unbalanced brackets", problem[1], 8) def _sug_wrong_increment_op(self): pass def _sug_wrong_decrement_op(self): pass def _sug_wrong_comparison_op(self): pass def _sug_switched_assignment_sides(self): pass def _skip_braced_part(self, token_index): assert self.tokens[token_index].string in ["(", "[", "{"] level = 1 token_index += 1 while token_index < len(self.tokens): if self.tokens[token_index].string in ["(", "[", "{"]: level += 1 elif self.tokens[token_index].string in [")", "]", "}"]: level -= 1 token_index += 1 if level <= 0: return token_index assert token_index == len(self.tokens) return token_index def _find_first_braces_problem(self): # closers = {'(':')', '{':'}', '[':']'} openers = {")": "(", "}": "{", "]": "["} brace_stack = [] for t in self.tokens: if t.string in ["(", "[", "{"]: brace_stack.append(t) elif t.string in [")", "]", "}"]: if not brace_stack: return ( t, "Found '`%s`' at `line %d <%s>`_ without preceding matching '`%s`'" % ( t.string, t.start[0], assistance.format_file_url( self.error_info["filename"], t.start[0], t.start[1] ), openers[t.string], ), ) elif brace_stack[-1].string != openers[t.string]: return ( t, "Found '`%s`' at `line %d <%s>`__ when last unmatched opener was '`%s`' at `line %d <%s>`__" % ( t.string, t.start[0], assistance.format_file_url( self.error_info["filename"], t.start[0], t.start[1] ), brace_stack[-1].string, brace_stack[-1].start[0], assistance.format_file_url( self.error_info["filename"], brace_stack[-1].start[0], brace_stack[-1].start[1], ), ), ) else: brace_stack.pop() if brace_stack: return ( brace_stack[-1], "'`%s`' at `line %d <%s>`_ is not closed by the end of the program" % ( brace_stack[-1].string, brace_stack[-1].start[0], assistance.format_file_url( self.error_info["filename"], brace_stack[-1].start[0], brace_stack[-1].start[1], ), ), ) return None class NameErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) names = re.findall(r"\'.*\'", error_info["message"]) assert len(names) == 1 self.name = names[0].strip("'") self.intro_text = "Python doesn't know what `%s` stands for." % self.name self.suggestions = [ self._sug_bad_spelling(), self._sug_missing_quotes(), self._sug_missing_import(), self._sug_local_from_global(), self._sug_not_defined_yet(), ] def _sug_missing_quotes(self): if self._is_attribute_value() or self._is_call_function() or self._is_subscript_value(): relevance = 0 else: relevance = 5 return Suggestion( "missing-quotes", "Did you actually mean string (text)?", 'If you didn\'t mean a variable but literal text "%s", then surround it with quotes.' % self.name, relevance, ) def _sug_bad_spelling(self): # Yes, it would be more proper to consult builtins from the backend, # but it's easier this way... all_names = {name for name in dir(builtins) if not name.startswith("_")} all_names |= {"pass", "break", "continue", "return", "yield"} if self.last_frame.globals is not None: all_names |= set(self.last_frame.globals.keys()) if self.last_frame.locals is not None: all_names |= set(self.last_frame.locals.keys()) similar_names = {self.name} if all_names: relevance = 0 for name in all_names: sim = name_similarity(name, self.name) if sim > 4: similar_names.add(name) relevance = max(sim, relevance) else: relevance = 3 if len(similar_names) > 1: body = "I found similar names. Are all of them spelled correctly?\n\n" for name in sorted(similar_names, key=lambda x: x.lower()): # TODO: add location info body += "* `%s`\n\n" % name else: body = ( "Compare the name with corresponding definition / assignment / documentation." + " Don't forget that case of the letters matters!" ) return Suggestion("bad-spelling-name", "Did you misspell it (somewhere)?", body, relevance) def _sug_missing_import(self): likely_importable_functions = { "math": {"ceil", "floor", "sqrt", "sin", "cos", "degrees"}, "random": {"randint"}, "turtle": { "left", "right", "forward", "fd", "goto", "setpos", "Turtle", "penup", "up", "pendown", "down", "color", "pencolor", "fillcolor", "begin_fill", "end_fill", "pensize", "width", }, "re": {"search", "match", "findall"}, "datetime": {"date", "time", "datetime", "today"}, "statistics": { "mean", "median", "median_low", "median_high", "mode", "pstdev", "pvariance", "stdev", "variance", }, "os": {"listdir"}, "time": {"time", "sleep"}, } body = None if self._is_call_function(): relevance = 5 for mod in likely_importable_functions: if self.name in likely_importable_functions[mod]: relevance += 3 body = ( "If you meant `%s` from module `%s`, then add\n\n`from %s import %s`\n\nto the beginning of your script." % (self.name, mod, mod, self.name) ) break elif self._is_attribute_value(): relevance = 5 body = ( "If you meant module `%s`, then add `import %s` to the beginning of your script" % (self.name, self.name) ) if self.name in likely_importable_functions: relevance += 3 elif self._is_subscript_value() and self.name != "argv": relevance = 0 elif self.name == "pi": body = "If you meant the constant π, then add `from math import pi` to the beginning of your script." relevance = 8 elif self.name == "argv": body = "If you meant the list with program arguments, then add `from sys import argv` to the beginning of your script." relevance = 8 else: relevance = 3 if body is None: body = "Some functions/variables need to be imported before they can be used." return Suggestion("missing-import", "Did you forget to import it?", body, relevance) def _sug_local_from_global(self): import ast relevance = 0 body = None if self.last_frame.code_name == "" and self.last_frame_module_ast is not None: function_names = set() for node in ast.walk(self.last_frame_module_ast): if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): if self.name in map(lambda x: x.arg, node.args.args): function_names.add(node.name) # TODO: varargs, kw, ... declared_global = False for localnode in ast.walk(node): # print(node.name, localnode) if ( isinstance(localnode, ast.Name) and localnode.id == self.name and isinstance(localnode.ctx, ast.Store) ): function_names.add(node.name) elif isinstance(localnode, ast.Global) and self.name in localnode.names: declared_global = True if node.name in function_names and declared_global: function_names.remove(node.name) if function_names: relevance = 9 body = ( ( "Name `%s` defined in `%s` is not accessible in the global/module level." % (self.name, " and ".join(function_names)) ) + "\n\nIf you need that data at the global level, then consider changing the function so that it `return`-s the value." ) return Suggestion( "local-from-global", "Are you trying to access a local variable outside of the function?", body, relevance, ) def _sug_not_defined_yet(self): return Suggestion( "not-defined-yet", "Has Python executed the definition?", ( "Don't forget that name becomes defined when corresponding definition ('=', 'def' or 'import') gets executed." + " If the definition comes later in code or is inside an if-statement, Python may not have executed it (yet)." + "\n\n" + "Make sure Python arrives to the definition before it arrives to this line. When in doubt, " + "`use the debugger `_." ), 2, ) def _sug_maybe_attribute(self): "TODO:" def _sug_synonym(self): "TODO:" def _is_call_function(self): return self.name + "(" in ( self.error_info["line"].replace(" ", "").replace("\n", "").replace("\r", "") ) def _is_subscript_value(self): return self.name + "[" in ( self.error_info["line"].replace(" ", "").replace("\n", "").replace("\r", "") ) def _is_attribute_value(self): return self.name + "." in ( self.error_info["line"].replace(" ", "").replace("\n", "").replace("\r", "") ) class AttributeErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) names = re.findall(r"\'.*?\'", error_info["message"]) if len(names) != 2: # Can happen eg. in PGZero # https://github.com/thonny/thonny/issues/1535 raise HelperNotSupportedError() self.type_name = names[0].strip("'") self.att_name = names[1].strip("'") self.intro_text = ( "Your program tries to " + ("call method " if self._is_call_function() else "access attribute ") + "`%s` of " % self.att_name + _get_phrase_for_object(self.type_name) + ", but this type doesn't have such " + ("method." if self._is_call_function() else "attribute.") ) self.suggestions = [ self._sug_wrong_attribute_instead_of_len(), self._sug_bad_spelling(), self._sug_bad_type(), ] def _sug_wrong_attribute_instead_of_len(self): if self.type_name == "str": goal = "length" elif self.type_name == "bytes": goal = "number of bytes" elif self.type_name == "list": goal = "number of elements" elif self.type_name == "tuple": goal = "number of elements" elif self.type_name == "set": goal = "number of elements" elif self.type_name == "dict": goal = "number of entries" else: return None return Suggestion( "wrong-attribute-instead-of-len", "Did you mean to ask the %s?" % goal, "This can be done with function `len`, eg:\n\n`len(%s)`" % _get_sample_for_type(self.type_name), (9 if self.att_name.lower() in ("len", "length", "size") else 0), ) def _sug_bad_spelling(self): # TODO: compare with attributes of known types return Suggestion( "bad-spelling-attribute", "Did you misspell the name?", "Don't forget that case of the letters matters too!", 3, ) def _sug_bad_type(self): if self._is_call_function(): action = "call this function on" else: action = "ask this attribute from" return Suggestion( "wrong-type-attribute", "Did you expect another type?", "If you didn't mean %s %s, " % (action, _get_phrase_for_object(self.type_name)) + "then step through your program to see " + "why this type appears here.", 3, ) def _is_call_function(self): return "." + self.att_name + "(" in ( self.error_info["line"].replace(" ", "").replace("\n", "").replace("\r", "") ) class OSErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) if "Address already in use" in self.error_info["message"]: self.intro_text = "Your programs tries to listen on a port which is already taken." self.suggestions = [ Suggestion( "kill-by-port-type-error", "Want to close the other process?", self.get_kill_process_instructions(), 5, ), Suggestion( "use-another-type-error", "Can you use another port?", "If you don't want to mess with the other process, then check whether" + " you can configure your program to use another port.", 3, ), ] else: self.intro_text = "No specific information is available for this error." def get_kill_process_instructions(self): s = ( "Let's say you need port 5000. If you don't know which process is using it," + " then enter following system command into Thonny's Shell:\n\n" ) if running_on_windows(): s += ( "``!netstat -ano | findstr :5000``\n\n" + "You should see the process ID in the last column.\n\n" ) else: s += ( "``!lsof -i:5000``\n\n" + "You should see the process ID under the heading PID.\n\n" ) s += ( "Let's pretend the ID is 12345." " You can try hard-killing the process with following command:\n\n" ) if running_on_windows(): s += "``!tskill 12345``\n" else: s += ( "``!kill -9 12345``\n\n" + "Both steps can be combined into single command:\n\n" + "``!kill -9 $(lsof -t -i:5000)``\n\n" ) return s class TypeErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) self.intro_text = ( "Python was asked to do an operation with an object which " + "doesn't support it." ) self.suggestions = [ Suggestion( "step-to-find-type-error", "Did you expect another type?", "Step through your program to see why this type appears here.", 3, ), Suggestion( "look-documentation-type-error", "Maybe you forgot some details about this operation?", "Look up the documentation or perform a web search with the error message.", 2, ), ] # overwrite / add for special cases # something + str or str + something for r, string_first in [ (r"unsupported operand type\(s\) for \+: '(.+?)' and 'str'", False), (r"^Can't convert '(.+?)' object to str implicitly$", True), # Python 3.5 (r"^must be str, not (.+)$", True), # Python 3.6 (r'^can only concatenate str (not "(.+?)") to str$', True), # Python 3.7 ]: m = re.match(r, error_info["message"], re.I) # @UndefinedVariable if m is not None: self._bad_string_concatenation(m.group(1), string_first) return # TODO: other operations, when one side is string def _bad_string_concatenation(self, other_type_name, string_first): self.intro_text = "Your program is trying to put together " + ( "a string and %s." if string_first else "%s and a string." ) % _get_phrase_for_object(other_type_name) self.suggestions.append( Suggestion( "convert-other-operand-to-string", "Did you mean to treat both sides as text and produce a string?", "In this case you should apply function `str` to the %s " % _get_phrase_for_object(other_type_name, False) + "in order to convert it to string first, eg:\n\n" + ("`'abc' + str(%s)`" if string_first else "`str(%s) + 'abc'`") % _get_sample_for_type(other_type_name), 8, ) ) if other_type_name in ("float", "int"): self.suggestions.append( Suggestion( "convert-other-operand-to-number", "Did you mean to treat both sides as numbers and produce a sum?", "In this case you should first convert the string to a number " + "using either function `float` or `int`, eg:\n\n" + ("`float('3.14') + 22`" if string_first else "`22 + float('3.14')`"), 7, ) ) def _get_phrase_for_object(type_name, with_article=True): friendly_names = { "str": "a string", "int": "an integer", "float": "a float", "list": "a list", "tuple": "a tuple", "dict": "a dictionary", "set": "a set", "bool": "a boolean", } result = friendly_names.get(type_name, "an object of type '%s'" % type_name) if with_article: return result else: _, rest = result.split(" ", maxsplit=1) return rest def _get_sample_for_type(type_name): if type_name == "int": return "42" elif type_name == "float": return "3.14" elif type_name == "str": return "'abc'" elif type_name == "bytes": return "b'abc'" elif type_name == "list": return "[1, 2, 3]" elif type_name == "tuple": return "(1, 2, 3)" elif type_name == "set": return "{1, 2, 3}" elif type_name == "dict": return "{1 : 'one', 2 : 'two'}" else: return "..." def load_plugin(): for name in globals(): if name.endswith("ErrorHelper") and not name.startswith("_"): type_name = name[: -len("Helper")] add_error_helper(type_name, globals()[name]) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3310266 thonny-4.1.7/thonny/plugins/system_shell/0000755000076600000240000000000014730055627021131 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/plugins/system_shell/__init__.py0000644000076600000240000000420714417536743023252 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import os import platform import sys from thonny import get_runner, get_workbench, terminal from thonny.common import get_augmented_system_path, get_exe_dirs from thonny.languages import tr from thonny.misc_utils import inside_flatpak, show_command_not_available_in_flatpak_message from thonny.running import get_environment_overrides_for_python_subprocess def _open_system_shell(): """Main task is to modify path and open terminal window. Bonus (and most difficult) part is executing a script in this window for recommending commands for running given python and related pip""" if inside_flatpak(): show_command_not_available_in_flatpak_message() return cwd = get_workbench().get_local_cwd() proxy = get_runner().get_backend_proxy() if proxy and proxy.has_custom_system_shell(): proxy.open_custom_system_shell() return if proxy and proxy.has_local_interpreter(): target_executable = proxy.get_target_executable() else: target_executable = sys.executable exe_dirs = get_exe_dirs() if hasattr(proxy, "get_exe_dirs") and proxy.get_exe_dirs(): # use both backend and frontend exe dirs exe_dirs = proxy.get_exe_dirs() + exe_dirs env_overrides = get_environment_overrides_for_python_subprocess(target_executable) env_overrides["PATH"] = get_augmented_system_path(exe_dirs) explainer = os.path.join(os.path.dirname(__file__), "explain_environment.py") cmd = [target_executable, explainer] activate = os.path.join( os.path.dirname(target_executable), "activate.bat" if sys.platform == "win32" else "activate", ) if os.path.isfile(activate): del env_overrides["PATH"] if sys.platform == "win32": cmd = [activate, "&"] + cmd else: cmd = ["source", activate, ";"] + cmd return terminal.run_in_terminal(cmd, cwd, env_overrides, True) def load_plugin() -> None: get_workbench().add_command( "OpenSystemShell", "tools", tr("Open system shell..."), _open_system_shell, group=80, image="terminal", ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/system_shell/explain_environment.py0000755000076600000240000001240114730022736025563 0ustar00aivarannamaastaffimport os.path import platform import sys import warnings def _clear_screen(): if sys.platform == "win32": os.system("cls") else: os.system("clear") def equivalent_realpath(p): pdir = os.path.dirname(p) if os.path.isfile(os.path.join(pdir, "activate")): # it's a virtual environment # can use realpath only if it doesn't move out of its dir real = os.path.realpath(p) if os.path.dirname(real) == pdir: return real try: link = os.readlink(p) if not os.path.isabs(link): link = os.path.join(pdir, link) link = os.path.normpath(link) if os.path.dirname(link) == pdir: return link return p except Exception: return p else: return os.path.realpath(p) def is_virtual_exe(p): pdir = os.path.dirname(p) return os.path.exists(os.path.join(pdir, "activate")) or os.path.exists( os.path.join(pdir, "activate.bat") ) def is_private_exe(p): pdir = os.path.dirname(p) return os.path.exists(os.path.join(pdir, "thonny_python.ini")) def list_commands(prefix, highlighted_reals, highlighted_dirs): for suffix in ["", "3", "3.8", "3.9", "3.10", "3.11", "3.12"]: cmd = prefix + suffix import shutil target = shutil.which(cmd) if target is not None: target = os.path.abspath(target) target = normpath_with_actual_case(target) real = equivalent_realpath(target) if target == real: relation = "==" else: relation = "->" line = " - " + cmd.ljust(9) + " " + relation + " " + real if ( real in highlighted_reals or os.path.dirname(real) in highlighted_dirs or os.path.dirname(target) in highlight_dirs ): print(wrap_in_ansi_code(line, "1")) else: print(wrap_in_ansi_code(line, "2")) def wrap_in_ansi_code(text, code): if can_use_ansi_codes(): return "\033[" + code + "m" + text + "\033[0m" else: return text def can_use_ansi_codes(): if sys.platform == "win32": ver = platform.win32_ver() try: return float(ver[0]) >= 10 except Exception: warnings.warn("Can't determine Windows version %s" % (ver,)) return False else: return True def normpath_with_actual_case(name): """In Windows return the path with the case it is stored in the filesystem""" # copied from thonny.common to make this script independent assert os.path.isabs(name) or os.path.ismount(name), "Not abs nor mount: " + name assert os.path.exists(name), "Not exists: " + name if os.name == "nt": # https://stackoverflow.com/questions/2113822/python-getting-filename-case-as-stored-in-windows/2114975 name = os.path.normpath(name) from ctypes import create_unicode_buffer, windll buf = create_unicode_buffer(512) # GetLongPathNameW alone doesn't fix filename part windll.kernel32.GetShortPathNameW(name, buf, 512) # @UndefinedVariable windll.kernel32.GetLongPathNameW(buf.value, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != name.casefold(): # Sometimes GetShortPathNameW + GetLongPathNameW doesn't work # see eg. https://github.com/thonny/thonny/issues/925 windll.kernel32.GetLongPathNameW(name, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != name.casefold(): result = name if result[1] == ":": # ensure drive letter is capital return result[0].upper() + result[1:] else: return result else: # easy on Linux # too difficult on mac # https://stackoverflow.com/questions/14515073/in-python-on-osx-with-hfs-how-can-i-get-the-correct-case-of-an-existing-filenam # Hopefully only correct case comes into Thonny (eg. via open dialog) return os.path.normpath(name) if __name__ == "__main__": _clear_screen() print("*" * 80) print("Some Python commands in the PATH of this session:") sys_real = normpath_with_actual_case(equivalent_realpath(sys.executable)) sys_executable = normpath_with_actual_case(sys.executable) if is_virtual_exe(sys_executable) or is_private_exe(sys_executable): highlight_dirs = [os.path.dirname(sys_executable)] else: highlight_dirs = [] if sys.platform == "win32": # Add Scripts for pip highlight_dirs.append(os.path.join(os.path.dirname(sys_real), "Scripts")) highlight_dirs.append(os.path.join(os.path.dirname(sys_executable), "Scripts")) list_commands("python", [sys_real], highlight_dirs) likely_pips = [] if sys_real[-9:-1] == "python3.": likely_pips.append(sys_real[:-9] + "pip3." + sys_real[-1]) if sys_executable.endswith("/python3"): # This is not as likely match as previous, but still quite likely likely_pips.append(sys_executable.replace("/python3", "/pip3")) list_commands("pip", likely_pips, highlight_dirs) print("") print("*" * 80) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/terminal_config_page.py0000644000076600000240000000253714730022736023126 0ustar00aivarannamaastafffrom tkinter import ttk from thonny import get_workbench from thonny.config_ui import ConfigurationPage from thonny.languages import tr from thonny.misc_utils import running_on_mac_os class TerminalConfigurationPage(ConfigurationPage): def __init__(self, master): super().__init__(master) runscript_label = ttk.Label(self, text=tr("Running current script in terminal") + ":") runscript_label.grid(row=0, column=0, sticky="w") self.add_checkbox( "run.run_in_terminal_python_repl", tr("Present Python REPL after program ends"), row=1, padx=(12, 0), ) self.add_checkbox( "run.run_in_terminal_keep_open", tr("Keep terminal window open after Python process ends"), row=2, padx=(12, 0), ) exit_remark = " " if running_on_mac_os(): exit_remark = tr( "NB! Automatic closing needs to be enabled in Terminal's settings\n" + "(Profiles → Shell → When the shell exits)" ) remark_label = ttk.Label(self, text=exit_remark) remark_label.grid(row=3, column=0, sticky="w", padx=(12, 0), pady=(0, 10)) def load_plugin(): get_workbench().add_configuration_page( "terminal", tr("Terminal"), TerminalConfigurationPage, 60 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/theme_and_font_config_page.py0000644000076600000240000002206314730022736024261 0ustar00aivarannamaastaffimport textwrap import tkinter as tk from tkinter import font as tk_font from tkinter import ttk from thonny import get_workbench, tktextext, ui_utils from thonny.codeview import CodeView from thonny.config_ui import ConfigurationPage from thonny.languages import tr from thonny.shell import BaseShellText from thonny.ui_utils import create_string_var, scrollbar_style class ThemeAndFontConfigurationPage(ConfigurationPage): def __init__(self, master): ConfigurationPage.__init__(self, master) self._init_themes() self._init_fonts() self._init_previews() self.columnconfigure(2, weight=1) self.columnconfigure(4, weight=1) self.rowconfigure(31, weight=1) self.rowconfigure(21, weight=1) def _init_themes(self): self._original_ui_theme = get_workbench().get_option("view.ui_theme") self._original_syntax_theme = get_workbench().get_option("view.syntax_theme") self._ui_theme_variable = create_string_var( self._original_ui_theme, modification_listener=self._update_appearance ) self._syntax_theme_variable = create_string_var( self._original_syntax_theme, modification_listener=self._update_appearance ) ttk.Label(self, text=tr("UI theme")).grid( row=1, column=1, sticky="w", pady=(0, 10), padx=(0, 5) ) self._ui_theme_combo = ttk.Combobox( self, exportselection=False, textvariable=self._ui_theme_variable, state="readonly", height=15, values=get_workbench().get_usable_ui_theme_names(), ) self._ui_theme_combo.grid(row=1, column=2, sticky="nwe", pady=(0, 5)) ttk.Label(self, text=tr("Syntax theme")).grid( row=2, column=1, sticky="w", pady=(0, 10), padx=(0, 5) ) self._syntax_theme_combo = ttk.Combobox( self, exportselection=False, textvariable=self._syntax_theme_variable, state="readonly", height=15, values=get_workbench().get_syntax_theme_names(), ) self._syntax_theme_combo.grid(row=2, column=2, sticky="nwe", pady=(0, 5)) def _init_fonts(self): self._original_editor_family = get_workbench().get_option("view.editor_font_family") self._original_editor_size = get_workbench().get_option("view.editor_font_size") self._original_io_family = get_workbench().get_option("view.io_font_family") self._original_io_size = get_workbench().get_option("view.io_font_size") self._editor_family_variable = create_string_var( self._original_editor_family, modification_listener=self._update_appearance ) self._editor_size_variable = create_string_var( self._original_editor_size, modification_listener=self._update_appearance ) self._io_family_variable = create_string_var( self._original_io_family, modification_listener=self._update_appearance ) self._io_size_variable = create_string_var( self._original_io_size, modification_listener=self._update_appearance ) ttk.Label(self, text=tr("Editor font")).grid( row=1, column=3, sticky="w", pady=(0, 5), padx=(25, 5) ) editor_family_combo = ttk.Combobox( self, exportselection=False, state="readonly", height=15, textvariable=self._editor_family_variable, values=self._get_families_to_show(), ) editor_family_combo.grid(row=1, column=4, sticky="nwe", pady=(0, 5)) editor_size_combo = ttk.Combobox( self, width=4, exportselection=False, textvariable=self._editor_size_variable, state="readonly", height=15, values=[str(x) for x in range(3, 73)], ) editor_size_combo.grid(row=1, column=5, sticky="nwe", pady=(0, 5), padx=(5, 0)) ttk.Label(self, text=tr("IO font")).grid( row=2, column=3, sticky="w", pady=(0, 5), padx=(25, 5) ) io_family_combo = ttk.Combobox( self, exportselection=False, state="readonly", height=15, textvariable=self._io_family_variable, values=self._get_families_to_show(), ) io_family_combo.grid(row=2, column=4, sticky="nwe", pady=(0, 5)) io_size_combo = ttk.Combobox( self, width=4, exportselection=False, textvariable=self._io_size_variable, state="readonly", height=15, values=[str(x) for x in range(3, 73)], ) io_size_combo.grid(row=2, column=5, sticky="nwe", pady=(0, 5), padx=(5, 0)) def _init_previews(self): ttk.Label(self, text=tr("Preview")).grid( row=20, column=1, sticky="w", pady=(5, 2), columnspan=5 ) self._preview_codeview = CodeView( self, height=6, width=30, font="EditorFont", relief="groove", borderwidth=1, line_numbers=True, ) self._preview_codeview.set_content( textwrap.dedent( """ def foo(bar): if bar is None: # """ + tr("This is a comment") + """ print('""" + tr("The answer is") + """', 33) """ + tr("unclosed_string") + ''' = "''' + tr("blah, blah") + "\n" ).strip() ) self._preview_codeview.grid(row=21, column=1, columnspan=5, sticky=tk.NSEW) self._shell_preview = tktextext.TextFrame( self, text_class=BaseShellText, height=4, width=30, vertical_scrollbar_style=scrollbar_style("Vertical"), horizontal_scrollbar_style=scrollbar_style("Horizontal"), horizontal_scrollbar_class=ui_utils.AutoScrollbar, relief="groove", borderwidth=1, font="EditorFont", ) self._shell_preview.grid(row=31, column=1, columnspan=5, sticky=tk.NSEW, pady=(5, 5)) self._shell_preview.text.set_read_only(True) self._insert_shell_text() ttk.Label( self, text=tr("NB! Some style elements change only after restarting Thonny!"), font="BoldTkDefaultFont", ).grid(row=40, column=1, columnspan=5, sticky="w", pady=(5, 0)) def apply(self): # don't do anything, as preview already did the thing return def cancel(self): if ( getattr(self._editor_family_variable, "modified") or getattr(self._editor_size_variable, "modified") or getattr(self._ui_theme_variable, "modified") or getattr(self._syntax_theme_variable, "modified") ): get_workbench().set_option("view.ui_theme", self._original_ui_theme) get_workbench().set_option("view.syntax_theme", self._original_syntax_theme) get_workbench().set_option("view.editor_font_size", self._original_editor_size) get_workbench().set_option("view.editor_font_family", self._original_editor_family) get_workbench().set_option("view.io_font_size", self._original_io_size) get_workbench().set_option("view.io_font_family", self._original_io_family) get_workbench().reload_themes() get_workbench().update_fonts() def _update_appearance(self): get_workbench().set_option("view.ui_theme", self._ui_theme_variable.get()) get_workbench().set_option("view.syntax_theme", self._syntax_theme_variable.get()) get_workbench().set_option("view.editor_font_size", int(self._editor_size_variable.get())) get_workbench().set_option("view.editor_font_family", self._editor_family_variable.get()) get_workbench().set_option("view.io_font_size", int(self._io_size_variable.get())) get_workbench().set_option("view.io_font_family", self._io_family_variable.get()) get_workbench().reload_themes() get_workbench().update_fonts() def _insert_shell_text(self): text = self._shell_preview.text text._insert_prompt() text.direct_insert("end", "%Run demo.py\n", ("magic", "before_io")) text.tag_add("before_io", "1.0", "1.0 lineend") text.direct_insert("end", tr("Enter an integer") + ": ", ("io", "stdout")) text.direct_insert("end", "2.5\n", ("io", "stdin")) text.direct_insert( "end", "ValueError: invalid literal for int() with base 10: '2.5'\n", ("io", "stderr") ) def _get_families_to_show(self): # In Linux, families may contain duplicates (actually different fonts get same names) return sorted(set(filter(lambda name: name[0].isalpha(), tk_font.families()))) def load_plugin() -> None: get_workbench().add_configuration_page( "theme", tr("Theme & Font"), ThemeAndFontConfigurationPage, 40 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/thonny_folders.py0000644000076600000240000000137314730022736022024 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- """Adds commands for opening certain Thonny folders""" from thonny import THONNY_USER_DIR, get_workbench from thonny.languages import tr from thonny.ui_utils import open_path_in_system_file_manager def load_plugin() -> None: def cmd_open_data_dir(): open_path_in_system_file_manager(THONNY_USER_DIR) def cmd_open_program_dir(): open_path_in_system_file_manager(get_workbench().get_package_dir()) get_workbench().add_command( "open_program_dir", "tools", tr("Open Thonny program folder..."), cmd_open_program_dir, group=110, ) get_workbench().add_command( "open_data_dir", "tools", tr("Open Thonny data folder..."), cmd_open_data_dir, group=110 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/todo_view.py0000644000076600000240000001076714730022736020775 0ustar00aivarannamaastaffimport re import time import tkinter as tk from logging import getLogger from thonny import get_workbench, ui_utils from thonny.languages import tr from thonny.ui_utils import ems_to_pixels logger = getLogger(__name__) INFO_TEXT = "---" class TodoView(ui_utils.TreeFrame): def __init__(self, master): ui_utils.TreeFrame.__init__( self, master, columns=("line_no", "todo_text"), displaycolumns=(0, 1), ) self._current_code_view = None self._current_source = None self.tree.bind("<>", self._on_click, True) self.tree.bind("", self._update, True) get_workbench().bind("WorkbenchReady", self._update, True) get_workbench().bind("Save", self._update, True) get_workbench().bind("SaveAs", self._update, True) get_workbench().bind_class("Text", "", self._update, True) get_workbench().bind_class("Text", "<>", self._update, True) get_workbench().get_editor_notebook().bind("<>", self._update, True) get_workbench().bind_class("EditorCodeViewText", "<>", self._text_change, True) self.tree.column("line_no", width=ems_to_pixels(4), anchor=tk.W) self.tree.column("todo_text", width=ems_to_pixels(100), anchor=tk.W) self.tree.heading("line_no", text=tr("Line"), anchor=tk.W) self.tree.heading("todo_text", text=tr("Info"), anchor=tk.W) self.tree["show"] = ["headings"] self._update(None) def _last_op_delta(self): last_op = self._current_code_view.text.get_last_operation_time() now = time.time() return now - last_op def _text_change(self, event): if self._current_code_view is None: return if not hasattr(self._current_code_view, "_update_already_scheduled"): self._current_code_view._update_already_scheduled = False if self._current_code_view._update_already_scheduled: return if self._last_op_delta() < 0.3: self._current_code_view._update_already_scheduled = True def delay_update(): if self._last_op_delta() < 0.3: # still typing self._current_code_view.text.after(100, delay_update) return self._current_code_view._update_already_scheduled = False self._update(None) self._current_code_view.text.after_idle(delay_update) else: self._update(event) def _update(self, event): if not self.winfo_ismapped(): return editor = get_workbench().get_editor_notebook().get_current_editor() if editor is None: self._current_code_view = None self._current_source = None return new_codeview = editor.get_code_view() new_source = new_codeview.get_content() if self._current_code_view == new_codeview and self._current_source == new_source: return self.clear() self._current_code_view = new_codeview self._current_source = new_source # todo support of other file types and introducing comment tags r_ex = r"^.*((#.*[\t ]*(TODO|BUG|FIXME|ERROR|NOTE|REMARK)([:\t ]*))(.*))$" r_match = re.compile(r_ex, re.IGNORECASE | re.MULTILINE) line_no = 0 for line in new_source.splitlines(): line_no += 1 matches = r_match.finditer(line) if matches: for m in matches: todo_text = m.groups()[0] self.tree.insert("", "end", values=(line_no, todo_text)) if len(self.tree.get_children()) == 0: # todo enhance the regex so that a todo within quotes is not shown in the list # low prio self.tree.insert("", "end", values=(INFO_TEXT, tr("No line marked with #todo found"))) def clear(self): self.tree.delete(*self.tree.get_children()) def _on_click(self, event): if self._current_code_view is None: return iid = self.tree.focus() if iid != "": values = self.tree.item(iid)["values"] line_no = values[0] if line_no and line_no != INFO_TEXT: editor = get_workbench().get_editor_notebook().get_current_editor() editor.select_line(line_no) def load_plugin() -> None: get_workbench().add_view(TodoView, tr("TODO"), "s") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/plugins/tomorrow_syntax_theme.py0000644000076600000240000001426714417536743023467 0ustar00aivarannamaastafffrom thonny import get_workbench from thonny.workbench import SyntaxThemeSettings def tomorrow() -> SyntaxThemeSettings: # https://github.com/chriskempson/tomorrow-theme/blob/master/GEdit/Tomorrow.xml normal_fg = "#4D4D4C" string_fg = "#718C00" return { "TEXT": {"foreground": normal_fg, "insertbackground": normal_fg, "background": "#FFFFFF"}, "GUTTER": {"foreground": "#4d4d4c", "background": "#efefef"}, "current_line": {"background": "#efefef"}, "sel": {"foreground": "#4D4D4C", "background": "#D6D6D6"}, "number": {"foreground": "#718c00"}, "definition": {"foreground": "#4271AE", "font": "BoldEditorFont"}, "string": {"foreground": string_fg}, "string3": {"foreground": string_fg}, "open_string": {"foreground": string_fg}, "open_string3": {"foreground": string_fg}, "keyword": {"foreground": "#8959A8", "font": "BoldEditorFont"}, "builtin": {"foreground": "#4271ae"}, "comment": {"foreground": "#8E908C"}, } def tomorrow_night() -> SyntaxThemeSettings: # https://github.com/chriskempson/tomorrow-theme/blob/master/GEdit/Tomorrow-Night.xml normal_fg = "#c5c8c6" string_fg = "#b5bd68" string3_fg = string_fg return { "TEXT": {"foreground": normal_fg, "insertbackground": normal_fg, "background": "#1d1f21"}, "GUTTER": {"foreground": "#c5c8c6", "background": "#282a2e"}, "sel": {"foreground": "#c5c8c6", "background": "#373b41"}, "current_line": {"background": "#282a2e"}, "number": {"foreground": "#de935f"}, "definition": {"foreground": "#81a2be", "font": "BoldEditorFont"}, "string": {"foreground": string_fg}, "string3": {"foreground": string_fg}, "open_string": {"foreground": string3_fg}, "open_string3": {"foreground": string3_fg}, "keyword": {"foreground": "#b294bb", "font": "BoldEditorFont"}, "builtin": {"foreground": "#81a2be"}, "comment": {"foreground": "#969896"}, # paren matcher "surrounding_parens": { "background": "#373b41", "foreground": "white", "font": "BoldEditorFont", }, } def tomorrow_night_blue() -> SyntaxThemeSettings: # https://github.com/chriskempson/tomorrow-theme/blob/master/GEdit/Tomorrow-Night-Blue.xml normal_fg = "#ffffff" string_fg = "#d1f1a9" string3_fg = string_fg return { "TEXT": {"foreground": normal_fg, "insertbackground": normal_fg, "background": "#002451"}, "GUTTER": {"foreground": "#ffffff", "background": "#00346e"}, "sel": {"foreground": "#ffffff", "background": "#003f8e"}, "current_line": {"background": "#00346e"}, "number": {"foreground": "#ffc58f"}, "definition": {"foreground": "#bbdaff", "font": "BoldEditorFont"}, "string": {"foreground": string_fg}, "string3": {"foreground": string_fg}, "open_string": {"foreground": string3_fg}, "open_string3": {"foreground": string3_fg}, "keyword": {"foreground": "#ebbbff", "font": "BoldEditorFont"}, "builtin": {"foreground": "#bbdaff"}, "comment": {"foreground": "#7285b7"}, # paren matcher "surrounding_parens": { "background": "#00346e", "foreground": "white", "font": "BoldEditorFont", }, } def tomorrow_night_bright() -> SyntaxThemeSettings: # https://github.com/chriskempson/tomorrow-theme/blob/master/GEdit/Tomorrow-Night-Bright.xml normal_fg = "#dedede" string_fg = "#b9ca4a" string3_fg = string_fg return { "TEXT": {"foreground": normal_fg, "insertbackground": normal_fg, "background": "#000000"}, "GUTTER": {"foreground": "#dedede", "background": "#2a2a2a"}, "current_line": {"background": "#2a2a2a"}, "sel": {"foreground": "#dedede", "background": "#424242"}, "number": {"foreground": "#e78c45"}, "definition": {"foreground": "#7aa6da", "font": "BoldEditorFont"}, "string": {"foreground": string_fg}, "string3": {"foreground": string_fg}, "open_string": {"foreground": string3_fg}, "open_string3": {"foreground": string3_fg}, "keyword": {"foreground": "#c397d8", "font": "BoldEditorFont"}, "builtin": {"foreground": "#7aa6da"}, "comment": {"foreground": "#969896"}, # paren matcher "surrounding_parens": { "background": "#2a2a2a", "foreground": "white", "font": "BoldEditorFont", }, } def tomorrow_night_eighties() -> SyntaxThemeSettings: # https://github.com/chriskempson/tomorrow-theme/blob/master/GEdit/Tomorrow-Night-Eighties.xml normal_fg = "#cccccc" string_fg = "#99cc99" string3_fg = string_fg return { "TEXT": {"foreground": normal_fg, "insertbackground": normal_fg, "background": "#2d2d2d"}, "GUTTER": {"foreground": "#cccccc", "background": "#393939"}, "current_line": {"background": "#393939"}, "sel": {"foreground": "#cccccc", "background": "#515151"}, "number": {"foreground": "#f99157"}, "definition": {"foreground": "#6699cc", "font": "BoldEditorFont"}, "string": {"foreground": string_fg}, "string3": {"foreground": string_fg}, "open_string": {"foreground": string3_fg}, "open_string3": {"foreground": string3_fg}, "keyword": {"foreground": "#cc99cc", "font": "BoldEditorFont"}, "builtin": {"foreground": "#6699cc"}, "comment": {"foreground": "#999999"}, # paren matcher "surrounding_parens": { "background": "#393939", "foreground": "white", "font": "BoldEditorFont", }, } def load_plugin() -> None: get_workbench().add_syntax_theme("Tomorrow", "Default Light", tomorrow) get_workbench().add_syntax_theme("Tomorrow Night", "Default Dark", tomorrow_night) get_workbench().add_syntax_theme("Tomorrow Night Blue", "Tomorrow Night", tomorrow_night_blue) get_workbench().add_syntax_theme( "Tomorrow Night Bright", "Tomorrow Night", tomorrow_night_bright ) get_workbench().add_syntax_theme( "Tomorrow Night Eighties", "Tomorrow Night", tomorrow_night_eighties() ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/plugins/variables.py0000644000076600000240000001244314730022736020737 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- from logging import getLogger from tkinter import messagebox, ttk from thonny import get_runner, get_workbench from thonny.common import InlineCommand from thonny.languages import tr from thonny.memory import VariablesFrame logger = getLogger(__name__) class VariablesView(VariablesFrame): # TODO: Indicate invalid state when program or debug command is running more than a second def __init__(self, master): super().__init__(master) ttk.Style().configure("Centered.TButton", justify="center") self.back_button = ttk.Button( self.tree, style="Centered.TButton", text=tr("Back to\ncurrent frame"), command=self._handle_back_button, width=15, ) get_workbench().bind("BackendRestart", self._handle_backend_restart, True) get_workbench().bind("ToplevelResponse", self._handle_toplevel_response, True) # get_workbench().bind("DebuggerResponse", self._debugger_response, True) get_workbench().bind("get_frame_info_response", self._handle_frame_info_event, True) get_workbench().bind("get_globals_response", self._handle_get_globals_response, True) # records last info from progress messages self._last_active_info = None def _update_back_button(self, visible): if visible: assert self._last_active_info is not None self.back_button.configure(text=tr("Back to\n%s") % self._last_active_info[-1]) self.back_button.place(relx=1, x=-5, y=5, anchor="ne") else: self.back_button.place_forget() def _handle_back_button(self): assert self._last_active_info is not None if len(self._last_active_info) == 2: self.show_globals(*self._last_active_info) else: assert len(self._last_active_info) == 4 self.show_frame_variables(*self._last_active_info) def _handle_backend_restart(self, event): self._clear_tree() def _handle_get_globals_response(self, event): if "error" in event: self._handle_error_response(event["error"]) elif "globals" not in event: self._handle_error_response(str(event)) else: self.show_globals(event["globals"], event["module_name"]) def _handle_error_response(self, error_msg): self._clear_tree() logger.error("Error querying globals: %s", error_msg) self.show_error("Could not query global variables: " + str(error_msg)) def _handle_toplevel_response(self, event): if "globals" in event: self.show_globals(event["globals"], "__main__") else: # MicroPython get_runner().send_command(InlineCommand("get_globals", module_name="__main__")) def show_globals(self, globals_, module_name, is_active=True): self.clear_error() # TODO: update only if something has changed self.update_variables(globals_) if module_name == "__main__": self._set_tab_caption(tr("Variables")) else: self._set_tab_caption(tr("Variables") + " (%s)" % module_name) if is_active: self._last_active_info = (globals_, module_name) self._update_back_button(not is_active) def show_frame_variables(self, locals_, globals_, freevars, frame_name, is_active=True): # TODO: update only if something has changed actual_locals = {} nonlocals = {} for name in locals_: if name in freevars: nonlocals[name] = locals_[name] else: actual_locals[name] = locals_[name] groups = [("LOCALS", actual_locals), ("GLOBALS", globals_)] if nonlocals: groups.insert(1, ("NONLOCALS", nonlocals)) self.update_variables(groups) self._set_tab_caption("Variables (%s)" % frame_name) if is_active: self._last_active_info = (locals_, globals_, freevars, frame_name) self._update_back_button(not is_active) def _handle_frame_info_event(self, frame_info): if frame_info.get("error"): "probably non-existent frame" return else: is_active = frame_info[ "location" ] == "stack" or ( # same __main__ globals can be in different frames frame_info["code_name"] == "" and frame_info["module_name"] == "__main__" and self._last_active_info[-1] == "__main__" and self._last_active_info[0] == frame_info["globals"] ) if frame_info["code_name"] == "": self.show_globals(frame_info["globals"], frame_info["module_name"], is_active) else: self.show_frame_variables( frame_info["locals"], frame_info["globals"], frame_info["freevars"], frame_info["code_name"], is_active, ) def _set_tab_caption(self, text): # pylint: disable=no-member if self.hidden: return self.home_widget.master.tab(self.home_widget, text=text) def load_plugin() -> None: get_workbench().add_view(VariablesView, tr("Variables"), "ne", default_position_key="AAA") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3856473 thonny-4.1.7/thonny/res/0000755000076600000240000000000014730055627015526 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/16x16-blank.gif0000644000076600000240000000150014417536743020070 0ustar00aivarannamaastaffGIF89aiACw %!5!mUku]-!57ߏ% 53%#yoW{a#!;=w!症))#]Wgcyc-)%!瓁sYg?COK#ua#99}{e}#+#kek o w_77'?7yo[=?!雋+'1-#}ekA?{ 3+w}u_-#߯''qY##;=陉)#ic--%!s[?COI#mgm 79'?7{!#}g!,H*\ȰÇ#JHŁ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/1x1-white.gif0000644000076600000240000000144714417536743017757 0ustar00aivarannamaastaffGIF89a3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ3f3f++3+f+++UU3UfUUU3f3f3fՙ3f!,;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/PrintLnkTarget.vbs0000644000076600000240000000041614417536743021160 0ustar00aivarannamaastaff' used for getting path of network location from shortcut set WshShell = WScript.CreateObject("WScript.Shell") set Lnk = WshShell.Createshortcut(WScript.Arguments(0)) WScript.Echo Lnk.TargetPath ' usage cscript /Nologo PrintTarget.vbs .\shortcutname\target.lnk ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/Ukraine.png0000644000076600000240000000025314417536743017637 0ustar00aivarannamaastaffPNG  IHDRasRGBgAMA a pHYs%%IR$@IDAT8Ocdȼ1=(De F 0HO" h $ 9.9IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/Ukraine_2x.png0000644000076600000240000001246614417536743020261 0ustar00aivarannamaastaffPNG  IHDR szzzTXtRaw profile type exifxڭW[( grx,Jt; "XxحU%RrJ5P).ɧ]+]4Ex-5aj!P~3~("C1@ ϵ!uyI9~Ί~i$dCXG /P()V8nk(c r/O׫t醕klpOIW{geCϩp>ڡ:?e~3FRF9Pv ~]XZ#.PT).D)m @La 0B܍%JaD/M$8ccӞbbm z@FWo 6| Bd1g%T ܟ/5A,Hl?Bt?+ADG821I)B 0 EL^B"$!1 !ŘM 5^ڮڱ 9 TƑ3g.\S朳d[DINXJ,pEJ)jĢ5WlvCk=Sgs^zm@># y(6ÌSfuE RZiKVYu54:MʚUhvekt6S(W*r Aq‚K(q 9׀Y 8d(҅;F_$eu/2{Mۆf옅T1F9UsYTfta\OZ]9G!A04HMpv/y^=\#G6 #g!fVH/"uM,`*g{!wnV "J2`sVUng4l% se!FS^'N@R_HOy&suk{jMjȟ05Sb#[UlmZYr`)qMqҲmf 8uBQСȱ&lF }SQ/ztPXXDylbʲmUИXFNKøx-^t5Bz;$KjCK $^yÀVm*`;)wmoӆ8-)Z s4N3proZrZ"_], qT {9 p7PO06 xo ` j.K{5ߥ݂0a134^$a,瑲+@؀ Es%iCCPICC profilex}=H@_S"vqP,&U,Vh/hҐ8 ?.κ: "ƃ~{ Sͮq@,#ܪ ?B`c3Dz1u_<ܟOɛ sL7, MKOf%I!>'5ď\]~\tXa#'; x8 Y[J_k+iBKH 2j( QZ5RLh?tIr*cU?,LNIb@.Ьm7O3p0IzEm⺭{0KH~B7-лoC`HtV?rN iTXtXML:com.adobe.xmp PbKGDC pHYs+tIME %M?V|IDATXcdPPePb5i YqL  F0Q:``bf;`0e`Y< rD8Q:`x02j0 HkPyIIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/_create_disabled_variants.py0000644000076600000240000000125214417536743023245 0ustar00aivarannamaastaffimport os.path from PIL import Image d = os.path.dirname(__file__) """ for name in os.listdir(d): full_path = os.path.join(d, name) if full_path.endswith(".gif") and os.path.isfile(full_path.replace(".gif", ".png")): os.remove(full_path) """ os.chdir(d) for name in os.listdir(d): if (name.endswith(".gif") or name.endswith(".png")) and "_disabled_" not in name: im = Image.open(name) trans_brightness = 160 trans = Image.new( "RGBA", im.size, (trans_brightness, trans_brightness, trans_brightness, 0) ) im = im.convert("RGBA") im = Image.blend(trans, im, 0.4) im.save("_disabled_" + name) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_16x16-blank.gif0000644000076600000240000000150014543327645022055 0ustar00aivarannamaastaffGIF89a```!,@H*\ȰÇ#JHŁ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_1x1-white.gif0000644000076600000240000000144714543327645021744 0ustar00aivarannamaastaffGIF89a!,;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_arrow-down.gif0000644000076600000240000000150514543327645022307 0ustar00aivarannamaastaffGIF89aċ!," X8p 2LC/bTH0 ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_birdseye.png0000644000076600000240000000133614543327613022032 0ustar00aivarannamaastaffPNG  IHDRaIDATxOOFS9 JlOHt(/wK.\@]Jw7 C@RQVꜟ7oގ3Mʶj:E~xR^. ĥyqFn `ZZ?e2r.Tu@JitkkkR`}HKR>ˋe0bQT*\׍ V`]:^KDFуSrWq10,o!q4!@oU a}]JimoMh`8M1w‚|G f:O(5=L$@Qi(0;rYx݂&HJPt]("JquuLFV*P @.?ٙ}}ww<;;;eRX%4jKrl8Wbww!ϕRJuܟ-7aoIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxdot.png0000644000076600000240000000030714543327613021520 0ustar00aivarannamaastaffPNG  IHDR ;*2IDATxcLHH`````=? Ç+m g1>|xϯK?õk]"΄Sl7[% d1lŸ?l%0wM<`D2GhIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxdot_light.png0000644000076600000240000000025114543327613022705 0ustar00aivarannamaastaffPNG  IHDR ;*2pIDATx ! NۋH7!+X^'aMD4.[k<'T @fnߛM[REOܖ6~1M0;$! sےNJ\O['~1%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxminus.png0000644000076600000240000000030014543327613022056 0ustar00aivarannamaastaffPNG  IHDR ;*2IDATxcLHH`````=? Ç+m g1>|xϯK?õk]"΄SbX9~b8p "s<^?UMza xQ u,DƂuIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxminus_light.png0000644000076600000240000000024014543327613023250 0ustar00aivarannamaastaffPNG  IHDR ;*2gIDATxQ 0 3]2P٦mT}PCvZ+ "@ұE׌H"HU $! T4x)03Hj[*ߠUn0 $,v4IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxplus.png0000644000076600000240000000032414543327613021714 0ustar00aivarannamaastaffPNG  IHDR ;*2IDATxcLHH`````=? Ç+m g1>|xϯK?õk]"΄KîpFdί_| s<^8&a ' l%ڎ<N"ARBUy%a LOig~2d`I4I*lo{ } *, U$x3 I"ɥ7iIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxx.png0000644000076600000240000000034014543327613021176 0ustar00aivarannamaastaffPNG  IHDR ;*2IDATx!@D_<]'X[@r $+,e?OEQsC DQ+gpnky1cB?&U-x | ,M,M6wmO&m>B5Zk7ZZoQ@70RIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_boxx_light.png0000644000076600000240000000026314543327613022371 0ustar00aivarannamaastaffPNG  IHDR ;*2zIDATx Aǖ{ (jf.$vs wL^;AQB\]b֠ҺId&Of"DfGo3;{ٞPe1ܽ:3viIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_broken.png0000644000076600000240000000161414543327613021503 0ustar00aivarannamaastaffPNG  IHDRfOVSIDATxMOfuEfHlJݢ¡K%@eXêa]i9CJMNUІ8a!]'%` lqsw))NXiZX,)@+j5Y,atqq񩪪(ҿva ;;;qttDѠX,~S*>*Iݽ0} (R!VKEQX ]gEL~p8 NNNfY!#ܕ\UŗD8l6m[)$<=<߀3I۶, h9H)v ~7о#|I^gmmm uq])%y|~6F~}6t۶Vsmo {>y@wqMbsfʄ:O&IED?;=׬ k678[[[ bK$nmxji/ qn]I)gC 1;, fJROcih"jsHHz'| a|?m_ODVRx\Eu2LrBFϘyOyrT (ʭFAݞ~$ߤ*-X^^:Naf$ZwXRW02+a1}% dwwq0ME!NguJ:4M4Mae0Ms,IZzw=u3jr\vMٜzj(Jq.uL*ɍ>v'Rid<+$;cIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_closed-folder.gif0000644000076600000240000000162514543327645022735 0ustar00aivarannamaastaffGIF89aŹpÚabzĴůŠ! ,@rH  !C 0 h8B qAn4 40In(NgB  Q *jT6[j,P@Wr4;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_debug-current-script.png0000644000076600000240000000110114543327613024262 0ustar00aivarannamaastaffPNG  IHDRaIDATxkQ}of4ߙjR@wڂu.("dTqta]t')f L4f5J2Jouޥr44 V\0ӸL筈Y W*:iH>3 5XP0A; /,X%0GC80wp(N0-6հw Rq+v f0?lwhu~t]{[vV\N8{EݙIow:u$"+g9;O?^!ZCbΉ?DlZG&mZ ,X%(3hbϤ␂`5ħHFjG*!+|uxz~~V  vcC 29hÓ#)+\RȈBFD.ʅUHZ魽j m8VW@ Zg`}`5)6iwNT"w1yf2D$!Y`F IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_debug-current-script_2x.png0000644000076600000240000000245014543327613024703 0ustar00aivarannamaastaffPNG  IHDR szzIDATxŖMsTE&$Ac@DبUK5_pÏh CWn,$LCd} Duw~缧ٳu:'{;v@i:?Ng=(?ugtlA4}z΀V*_WOE4&wQ;Rt?تջaNo| ˝xqCxy dF~)FNw=4NV!Ze11ݜ;zbSWlTH[DCΔg{`çۧ FDW^qW~ ZXD ˝G[K ce1-"EC8O?߉8_IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_delete.gif0000644000076600000240000000155514543327645021457 0ustar00aivarannamaastaffGIF89aa`aqata!,@JH aÁ L EjP@ł+^ԸbF#|H0GY.H2$B#TX#J;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_folder.gif0000644000076600000240000000161314543327645021463 0ustar00aivarannamaastaffGIF89aø|Ƨ!,@h@A   H!Ç $8@G=R iѢƑ%HѠ%nH`̅ST2N)UBsH <ʒ#A "ѣզ6 ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_generic-file.gif0000644000076600000240000000156114543327645022543 0ustar00aivarannamaastaffGIF89aƧ!,@NH`XȰ! .@bD !T(Q!bxqÒ#51J[n49%FMyr&M =;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_hard-drive.gif0000644000076600000240000000157714543327645022246 0ustar00aivarannamaastaffGIF89aƶ!,@\H (\P! 8(jРǁdx1(STǗ0 jldȄI*U)fÖ'Xtî;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_harddisk.png0000644000076600000240000000105114543327613022007 0ustar00aivarannamaastaffPNG  IHDRaIDATxNPz@ )5eDQx4/X_!2|:WƘi0 +֢{OUUEbpN]4;Y5(*5MLE(,ၳ3Cryy9Crsl`|}rBS78CDHd¡6VK}~!e})r;PU ?^t&_EIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_harddisk_2x.png0000644000076600000240000000223114543327613022421 0ustar00aivarannamaastaffPNG  IHDR szz`IDATx]kF3WnqCS:nMhC~Aoʏ ^4)Vbwd@irF3:y=gfѣGOSyۮvww :~/eryB@ !@XB޹? ^a) e""!B9Z{^5"?}'OAXF<ʲLf3s+-:9 "TUEUUu?`Fn8@? 3Iw:{ж-M5Z%vwwaȽ{ww6!Gumuι~QuB sBXkx! +,5sw4 m.&+շi$:6V6QDqI44MCucVh1iڷHe뺮Y Rn޼9 "鵩TUE۶+ilF]u ȡ5M%MXh/iv(J?Ջ2Y1^qR Smj|Ʀ}G)@&֚Wuz,#24%IWF/"t]ܸqcHQwk*Ҕ)J>!C ñZV%m۲< (+vB4(+}Xd1uPkֺfY8禓$3Gyu0V:c > },juUUBb&"hL&shnnlQJQ|%>~kɲ˰szzt:4MS8ב)Ʉ4M{ XYmcKsμx9=dӟZ;I=Z#JY0c]+^qѶ-UUsv~Fv!ZzA666|}]GmrYMR>ݿkN^֘w7'l9y\ToeaQՉFɣH'blIƓZ ;.-: wX6шUvސ7`^ICo4Ox`St\[}V94Tw<@D0FOȮ)QdqB ZZ:kv6}5ta!sm"J)D"x/0FBkAd5DdQD#?h-8 TG\ 1JU: چ[M7A.mG60FZc$cQ^5r.R7_\U~xxB|M>ŋ`,+Rwmb{﷍7 &@kz2Gm=7{mk~1Lш>n:҉(gtSr*W?aRE8+:چ?j /IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_help_2x.png0000644000076600000240000000355114543327613021566 0ustar00aivarannamaastaffPNG  IHDR szz0IDATxŗrA(:RdYnd+Sem^o1^ʊ z}8n~Y<Іrgk_KArGH`v`.-Lȑ9Nl;oݣ Okq_Ȗ Lw|r(RGg]tp\^Lldf%ytwNޚxXrY]?²t]Ҍa6B^ c s3I|x~;<0MU5'|_ !9vAJ0«FhR"ɫ=vRvŸ>S*x5|)ͮ}5YV,U [Ǽ^ Ex/BAt_k44O8.X^1="XˋWqSJ;Ջc!ë4bSʥ(lRIdWRkt;i -4Zkvؖ˷f?}y/=7ģ/Ƭlʢ첱[ 8s9 $Ʉi$/4E61UsqIYܜ % @lJ%bX4(^ܶL <bnLJ)nf4ʣyL1๐q(5w=03d6RJЊH[-bΦ<Ǎ9`[hD8:"XJX۪q[fąINm*#&ū"Ԍi@Ń""q}N2CmEʰ7@@-ScWɔ\@d@8%"Rb WZS="e!9Dp| Pրʥ4S@#{m:=):P @krwi`a"a%,,Z'H ^6F#}vD֜4z~\;B\fXB$՛ݠ@v PHbFCH6BK't` l4秋hQ?64$#H=DjftqZoL=5u)RdmZݫFրe#}⠵7riL8cu<ַ?D1Rjf~jDEAk L)sU >(JS ,ZZ{IC6|pҌ8W"Jupz nsxՊVW^af?cqgaR_ioj}!~XkHHr{gmw]Κ]>p@xeM:WZ>O_yz9k:K/߽wό7\"J|lΩޫZoy2?ݩ|cn|1SEcvĊqޫfsm~sOpw~♔y" k|޹׽87kZn |S ЄR7{uA0/OD# !oǿ Y IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_information.png0000644000076600000240000000121614543327613022546 0ustar00aivarannamaastaffPNG  IHDRaUIDATx}MOSA;s?J[AM{%H h+7.ʸ0ƵѸ$hE1B)-m۹ mfsM_9'gp׺z+Dβ,z98m a *Fx: TRinϤS?6<\ʃe?N%Jydq2N,-TQ 2bA0@qg_(ױ-(6&<wJT%zRJHa "lFRRI˶֚( Xp(l)5E* O2gah[ EǶ^uK^>e D4^('灐sbՅ:h~IlCe6OI ^ȶfW_n؏ < DyV.e"+k2F\Z18|ӿg^ugYoVXg1 _{iL6~o,_Z6_@$o>.9[hf>,xIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_information_2x.png0000644000076600000240000000302314543327613023155 0ustar00aivarannamaastaffPNG  IHDR szzIDATxŖ[o3go\RbY˺uEZ裟ۗ@-ZjMڑlYwZ)^~f C$ 0س؝̜;3''D3P)Tvm _&\Na)08I狽o7>x ˿`׳O Xh"Js D ;o~<3(׳ÔE1yVfRkYa*h988|9m=ǛM7>* 3>*؀鋵'ĴT0J> 4 LK2_^&\SVܪ VL:in1Q2P.Fʀ%bX Ôe4U +3Q~LfdP6->^SP*a"@B;D@ PQPjEL wl" $^W MDޓ] (45L %(P"ŹR;.$EHE4܊ jl;d%⋱TݳRKtj¯8 J3etܶ̾ i3Qx1 Sa ߝ梲=6v: lh(-JBѴKReI'Y9GEgjW+kbl?;xmYsS-yi7i"IϩV`:R-_5Z9Ң8ƙM lgo8ofYW7Ÿ^5E/Owo#25HEH5\k6/@䈪Q Qe~@NoVf* Bj!w:{q_kOV T?ix no_vmcu\ LgVZ-E }?;VA^5WV_6e<I Ic4/h_owT߳;!Ir(\,HMun  rj;X[ٹY*$E,:dCrS0U& y(K8:j݅ @D`yg 4Qt:}LMMa^1`n{ q#I^NY@y=@CPw<>=MVu.@P([I`8I uldxaduuΎ9::0aP;L;U|ٜ('''G`T6*kme%U8+P-AW(ٍ G6Wﯕ|&,(IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_nav-backward.png0000644000076600000240000000065414543327613022566 0ustar00aivarannamaastaffPNG  IHDRasIDATxSMKA~ffw"`ZPd5Bj?ԏ{CYR dA%))" vfw:T(ma/ezy^о^)U' :~/p8Ѥ#^:rIUe4_0)"ŒH<#|1.UDwbۭ&ڞzw aw+NQzt"j^) a[]!T@6*N'9U,Pk?EA*Lś)֯zĽ0וA[د ?\;.)ytIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_nav-backward_2x.png0000644000076600000240000000136414543327613023176 0ustar00aivarannamaastaffPNG  IHDR szzIDATxKOa 3! n b [B_`1^\L 47XB܏RPJ lx4_'}LG:^ 5rtJ7C8<*]^] tJB!Seٌ9f gS2% =jLwpB Ҭ ,ifd*3I"P2axnuEed;0?tTр.{I0PyScFG~&tRė@< >@ºO3m{1G @:Yd84?46:Kza&u3)Uӹ50(5ֵ?ePRoIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_nav-forward.png0000644000076600000240000000064414543327613022453 0ustar00aivarannamaastaffPNG  IHDRakIDATxOKA;ft:t)H9]6/jP v>iʱmedM4r8y'L G~ڇ~:r{mN-`e2N,+D-d׏uhz7U&;Keq'VĊ%\THʱZ"I#BV`&W{Of&YGG9y"V6E15̻ؖ"fA<V&oJmd{c,x5Zm7vmZ{sՓg4|_^(Qk~i;?57`~~ 3Bܚ3gIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_new-file.png0000644000076600000240000000050014543327613021722 0ustar00aivarannamaastaffPNG  IHDRaIDATxJA?s]"(;!M!,}X ;, ~'7»Xۙݹ?N]L(q?f@v(!;sV,#*̗ 4(&Y g'̗H#Pci@yd5~j6Oh!Е2:zcz u;]# -Q0/!(^ЎDFcVwj /m!UnTc=t [[~dKa?:oM[rHPXIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/_disabled_new-file_Linux.png0000644000076600000240000000057014730022736023104 0ustar00aivarannamaastaffPNG  IHDRa?IDATxNA;ÊQLjEi&P6 &F ~eg,%N2=i4wZ*$\P2W y, VbẃA b/U%RnnnE} 'F-V:vǸFƘw" sUݻo=/}1gQ{ WWWa[UڝV`#L@g@^_71vZ$ ,(O@pz 2}`~Y""ρrX!}}ƬRsW slķA,`;19 >*iDd}yz$4{oˌFlo4,.*9")0~ h@3qY)ib]R(:t8.R VOl?;pPAǠ5fv [=pqqsn<=g'Șls{nD`GPS Һ+.^%}v@PB&1ovEtp 4gR% H漃p7+OJoUPA~TAؔnM m:o uhNM*%QPxsG\^^IL!R|yWИNm?63jhk Д~'Vc{ .@ "a^Ӟ0do.)gp6KD1f. bv07 ^9)R۪lgU&o~9\R"?K?IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_open-file.png0000644000076600000240000000076614543327613022110 0ustar00aivarannamaastaffPNG  IHDRaIDATx?kA`|`p .U HC)|!&B]pC\gL3gfge!E'I&AWӣIgZEysC+Pz/kɊ ~`g0*GxFM*a?ctH2”#`he<_fՔSA5T"G,tpzr\)U3Wgx p]&0X.P".يCrIZJ' I:r{ нb·DnY^h-PE,2gAsR  kej3J*z>0KP𴎠K  %`#Zo "߶W[~VOTsnIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/_disabled_open-file_Linux.png0000644000076600000240000000075714730022736023263 0ustar00aivarannamaastaffPNG  IHDRaIDATxSQ3X ƈ.Z}WXX ZfmL\E4${|7&Ѡ8 3ߟl0Y@`/|jUczq|taf[য়Nǣ3%p z^S?2H)UEpby3?=e`>׃fF[m_LΟ f2NAR `f5IݶI~q_+Ewg4Xlْd`d% nYTh4@R84{0fc2~YfkEǏ:*Kg{|\4^ U K*aZYfNDBYL!B"ڰ\$) >]"9kkkzj U. ʊ4mF#qMU`v"'UT=|O ~ummͅpR7Mh7~ߘn/8k4esswիx z(朙"#3iʕ+WPǓ˗< ceTl{d7n,F0sUջ{Wչh EAQ9`fB:f"2ٳXSXdY2U׌n>Tjn`8jד,58j' d08@sx[T4,xq`ϨI>_Z>{69op Ǘ'Z+QﱲM/v1[\ujƍ4I,CG&*`:;ŷ_HQy(D=uqRgX#"5%Gm{G#*$^Fin !I*ԕaVUMYV] w|h3:*wBj{G%nAyp jUv~ XU5GK3T':TNEhjt!ޓjm]ښqrK2h \Ѭ#kґd:(QOj ٩搖oԨ mE)N&uP]h5::!FEykWuސjU~qyIQQ~vtdbS* "a0j6U4'^PZ.""TWgj5Guuc׀2F0)}y^ i t4Oz{NnRf10md0y Mu?TyPGy=O'θ zIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784357.0 thonny-4.1.7/thonny/res/_disabled_open_folder.gif0000644000076600000240000000164714543327645022513 0ustar00aivarannamaastaffGIF89aĭjŹÚpfġjfƭ!,@H Xhx@`92 hp 7ʌ9#!I XI#@زhJTP@ :" W^d0A5ԹS"LXk`Z`-;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_outline-class.png0000644000076600000240000000114514543327613023004 0ustar00aivarannamaastaffPNG  IHDRa,IDATx_OQwwnO>4Ƃ|H?>x Zh;>V"dLΙ3QFUNQfEfRZ9;ztUW{Ik8F^J{ Komm1*C9E͘ N5?7hFImBԬAΗ X4fJ^fu\q2|U\KQX)"rMs{\C,%gP\[&#oۜC|GDK: \ n@Huˢ17X bS; FccH⫃!&(ըKhV ZiTyL5=wIEx@{L|љUX~N5WP3#3@{A։lY * %H%aE띓Iz*& Qz\KMPg7]PDkh3t"T Gq&–nzLwY/]=M _ ~Yh6IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_outline-class_2x.png0000644000076600000240000000245414543327613023421 0ustar00aivarannamaastaffPNG  IHDR szzIDATxIo\Ezcgfl  B Y@# qcr$ K3؎g{kLKnݺe_m, r h)Z X@_jؗt>|6'ȤJe<E-nwzKXV |œPm"I~ 쇤F'jޝv#Kͺ՚/%SvA%Oin7X[_,k% lX+r)KXRFk[ l*̴9;1{)6jS/5):\ Di :$8`(6\pKFwF9b%FY(/#kT9*/>fRKlGcrTǵźyd%ًxf{Pa "p7O1wZi /ur;(%Ns53oNW!ҔQ`2J1J~ H ʂ=T}N-@c-F1Kyw}j"8FRBwxA (!.{^<*?A|i[qJ I;[ѡBު$|4:H +nEIwo&`lLAlZ^Ft{gs;ÃZ_OlOgqT q?y\Hf`3D8.NddN l>t-"HX6'xdq[,xj LLf7iѲA1k" L@3H47FX 4| u 𼌥k,Q8}lLtdz|Y~BߟIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_resume_2x.png0000644000076600000240000000156514543327613022141 0ustar00aivarannamaastaffPNG  IHDR szz oWƏEv`8 7ʛ;:|zQ?'261ΕA+onNO `)O|wo8n}fPONw^gHQ2XO5(XdueM|pgLYC \`"k }ZQkA\VS2p  FvęB2kE]:`Fp_W+o0LƖp@P1`79[:ӶP{־fr4,xyU|)UXa 1|clO1C9iF8]. Qq &>(o3c Reg30zEH_=yB _!t^EBeޛqe8t@DrI'4ސFUXgtv4pAԀ؄odD11EqѱIoPI~t1t f)38XͶŹtHDh_cq4 ˌG3蕈D"-111H +egwgPO}sə;&'/Ֆʭ($DD}{?{ټ[QD+ô;Xta%MTlx31w^^|_VՖO O%,M>ƴ?4E ςfP+&$ 3X`!I&0S|Vj1e_$LIїQb8{rQ:GHmOlnCgtu t&QQhEgm#A &2+8&:5rmۅ8>Ho83YKnt|skuӖ *BaEgn-? f7jIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_run-current-script_2x.png0000644000076600000240000000240114543327613024415 0ustar00aivarannamaastaffPNG  IHDR szzIDATxŗOWً@NM"ViqOm?ǪM M*Ub.!^6Ҫ?i3Μ3{Vnݺ)C{rN ||\BFA- j),׎xΩB3hS-"D!Q"[-=Qt)\orA"aZ.s]\ǒwi1/_7"lZRM ;?=%^stf #{1D 6wb^d9 埏j[xRp&ƲT "@@&|5Dcϕ'Cőz~Vr+8%1 j1;vbfuoŕ( 0UK7$_,L$91ce<1ӹD%PPn.^TOO[P2utqt#}~&\{XG(&S\pr6^^ {\.ٖکɌQ--gXpE>VsH2%~^^\nrh)\TK,Bd`2Жc9̗13~yh)-@.qHj579XZCj5PAi q(1`*i~Ei:aJY9P4ISy 5doDz\{UE2Pb;/Sgd@3:wח8 FQ r2~Ɔ\c_q2~ bQhOas&FEDR,}חpɎxܾ a}(&uLQ pe= X؎$#cQkkvL(,>zITq=66 6"('hۀ9#Q5Qp̝gwo ,ͦ`Obx)'"W5bCB#sg}zXD02:w,䇴`u7?}7AdF888N*7D u?"5Ǖ_NC헙ciU`D-TUqWt宿1,ƙF]-?P|"HEJn"3Nmx8PZ:A} ]|>4iyԲ?=00:KIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_run-to-cursor.png0000644000076600000240000000052314543327613022760 0ustar00aivarannamaastaffPNG  IHDRaIDATxcLHH`XN!ѕ`l xt,A06> ƜR> 57#g1'Y ,gc165,n|q-(%;wŀk*xvƿ ljϟ8b$g{6\ \ \INɀ?d``MGϯo=}A].x7 Ӂ+cS׀bu2@qfb4;b h>IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_run-to-cursor_2x.png0000644000076600000240000000114414543327613023371 0ustar00aivarannamaastaffPNG  IHDR szz+IDATxokPƟ6i [3EBn2E(7+?2lej]ǨnfiY5ٮk`ہ\dIV ۏrgܶw] 9$ (ξn9H.dz*WP=}hٱDB\aOrh? ~J"B2~x`zB [&$̹hV^z:((&yڭ )p Є"c@(\!jǕha^`kaFFcCՍ0t"&ꢶO `/VNzE Dr,a%U\sV/KZK'▦٬޿j7ׇ&윂Z@ݻ hVJ+A+kx| p[OaP fe|JVD|x4Ck_{}+z$opZ1@.g?NnFߎB\̥lIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_save-file.png0000644000076600000240000000071414543327613022076 0ustar00aivarannamaastaffPNG  IHDRaIDATxA^37+ Fj8`dc\rphlb jb$8PUNq=3^ ICW^qUWi3 iX n=5 ApA_i/15d x~-!Z'Gt"]P 0W,fWQ9̠ D0:%bY f5Qep)N^.LMja_ߞ,!@; ((#a{i vaD7XvBItg>XUwD0k(MwtFIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_save-file_2x_alt.png0000644000076600000240000000166014543327613023350 0ustar00aivarannamaastaffPNG  IHDR szzwIDATxn[EgqT,.Ȧy'^(^%H!UAB dǤ{g.^ǾN\MgaOf|;ߜ33s{P/ȗPk)ڟkh y~x݋x#E1M8<dp1 q 7\<{~)#|%B>gϞOtm,|7 :a9_;_͙\q}xva-3 a/kp"K34 m/B/pt#y!STH1 w pbNA 84kV? [q_,nP7_3c$QIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/_disabled_save-file_Linux.png0000644000076600000240000000113414730022736023246 0ustar00aivarannamaastaffPNG  IHDRa#IDATx[OA{.mK-&Hx,~cp'.Bʭ˖P;r&9eJ:Uh[xNZYir[ًPJ%ѹwRiNb: Nӹڷ˛]L洆XmSVCGDvr<" r]H [󺹷5/g+LOMR)H.Ab\bzryChOVD)!X#;"p]wP!Q7 b\Im,br?+R @C/ۤJSS")%]8C7)yl4%MӁ]Rضmη(hZqlյm<37ߨmۆٰ^NYyxGk ֈ 0\`i}}uaoMlMIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/_disabled_save-file_Linux_2x.png0000644000076600000240000000311314730022736023656 0ustar00aivarannamaastaffPNG  IHDR szzIDATxŖoçdzPN Ye |\˞Cl a#ѮЖ-Qgr9^  zUwz OPX߯ j[!ˠ4`D%3YZi ꋕB* Tɽ7Cዿ@֙[vVhl&4gݍ%P2\_`GZ/'ӥt=8qD\z"4>7$cLOw{bdwOQhV=Oc`#NTδ_}|_ync!p;^]__g>L X P>?N|wNxVdP+b&/^vi Js%i|+KxcNNc/\]](|7ߞy(zy5x3]@T*2rppй`jkkkqsF5xbxꔕ`r99g}~ "ch4>\YVfW05WptrF6#2·ËXOqd3P*HRfmZt"V\qt#bKde\&E1.{[(D$)b+++J)SV8("8dq>R-'=j,.zZ9sYqJ)1j5GHKKKk-J)s8bEnh1]P+=Bq0Z.`M9PJa%JQT'''JFAEIʀidMULz^DEl6sLf-c9Ǭ|O^2_hgs^9{goZKX$F.PJ4M= :>'/TJfR|Y{6 t 5Tʇ(Z#"u-"0R[jc \(8b&R 94{JeSJ%2 ZF:ۈJT8Fvρي-y櫔J25oqcADd2$7wݮw]/bx9G׻sһ0LAׯ_vz CqR51oaHEy& |(( L& Xk}k{]W'm2{J§llV׵}[ϳ-.O1r|巵 0R.R*0P, ƘϞ=R*g>`< >@x .eY X`4HCL!,ODlIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_save-file_alt.png0000644000076600000240000000100614543327613022731 0ustar00aivarannamaastaffPNG  IHDRaIDATxMnAc Xq~E"܄: b*F A#,۸gzXv`!zS^jN^z_|<8mJ o.130 )ߕՒ}; )NF"_gks.,i5I7o'}h!$M /gF˷9Kc0@\05@׾~^t6(zQwJR.oaGnaDQzY%OK@jo <0C`ۖ_˚و,Bcd㗑F08.&/ 6`ٚޙ(=)m[BaݚwòB`  Ap?-|18^\kej-qPUifF1:f5Yh}p|F~ PW9Ect8CdoY#IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_star.png0000644000076600000240000000114714543327613021175 0ustar00aivarannamaastaffPNG  IHDRa.IDATxnP9ۤu&$T VHPu`Puʢ;JQ+!^Ic 6ܚvHG8~|6Uk+*/c;I#2Z79{ycok_dV\ % 3Ƌ89=s\ĒyN6T8=1Q9Ae8fOVoV(שT0;c#eARb ~ce0 tpsr}'ڻE7.m,.. SDTffL>Hg^1 -zNIPyDY&2) N6HF>|ȧn(klgm1~O` D_;?*V6:7$q"Zskn|0lgzg39*@ۍG0U'4^ 4=~mgš3 Z7;~Ѭ[ ts]`N`1n4JZN9``w-prҿ^ @^;se@95\;%4:%f`$ƬtucfS p `7X? ίWpNs@Y5~"zwc .WpaFLgGj:1jjSdtưpheH ?&J2q ,,ղk3lk5{i%׭J nǏuL1ڿ~,J`[5/,C5·"ZoM4ptzfʹz2McVE^Mg鼳Mk?mi\\=! nӃGr$wަBԿVScC[ghZHGC+rlYx_}7+q1]oX3ҼpOe-vw_<{ &H 25vrT95o7,diiI~yOV``*8߳@F[ kEsh}V% B߿ ˳Jt6Dx^Q] kۉ*.vNOl|q&OǟW\;og"NQÙ7Hkqq1Q,OBcSh*~-WXDb+.ΥRGG푚=~R~|Wb+<M?R).\3'<ZZz (}+|gVT=![]=0% k&T|ͱ [㘝3:&J7JIBK3Uh@*yث!9RB.jy8%?շ6 IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_step-into_2x.png0000644000076600000240000000137014543327613022555 0ustar00aivarannamaastaffPNG  IHDR szzIDATxMOW;cR)DH"RVDXd$*;V(0$4 ֨% 6gyq,X+]׹y3gyβg(tvfJYCju{㓿: ]C1` iLڰ]dL\Os Ȍw{1of\(?\΅cE&&opy=UZs|:=GX(alt x՜c'O!?|&ww__aG 08;Jg ;#@Q Fw@yF|5NAzIYa_y~%0 < M$tJӍ~ g7\{LLjr L8;vsP"Ki`apW"B6Rt)mm&jha5<5ZDvPRn}$$a9դ2HwI k|e{cŌåa:'/ }0ZOVu.OIVlU8s [-tbד"qD˕;{"YYY:nYeM,mo,7$ySv}VS1f/yr󣟱 Zg!dZ>LZ0z r[Ir`LI`w׆?X qX&IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_step-out_2x.png0000644000076600000240000000132614543327613022414 0ustar00aivarannamaastaffPNG  IHDR szzIDATxMOQ;Sv.)`UIX?ʵ@6&$$*m {\L[J 0L2s<=gf2־f?B%|9%PJ-=mO6埉qy?9ZhJ (0; {ƻ8gⷯou';yz).1 @r"ZӀњ$ۮ9<H pɩig С<# RS.DS"rU'Zs;/YI uY'0 K TDCm +QP b@ 0:a sbka??O(k@mmΤ7ɬ|,tUj$Hkv}}ˇ+ 431T{05AJ}|3}B*e2YgnyD@@\@Rdҫ~$dheK7DP2;N&NۥNt9PN?8}%&bZ0ʵSR*e=RcS,L]%xW@RVDYMABDZA`;|*5 (XbّM¢fۗd-usƀAD)m+*:/4M誃7 ~҄`.IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_step-over.png0000644000076600000240000000102214543327613022140 0ustar00aivarannamaastaffPNG  IHDRaIDATxkQ{f21(Z$AQt"+?ͭC5ElU`[l]Ւ¦VK qwbaEo ='O6vrԉtʽڋ*@! :cg/%F.L. vKr}?p>12zM?T$#pO)KRjlko.{tb4#~*s( A+CKi:u,ؘ) @o `.Rt8|Tk!dD"!z@2WP%l`_(>l[5.4wGs;puVfi `xū ̤\Tjs #'sIӂ;ϖ Ap߱MN~a_Q|jPbBZN^(܂I0=^Dtbf< HLّg`tm߽!̗(O6jE}&l4ߘ<#1Sz@yfBֵ;HE> |}|:L&fH okcamH)Op3S8?07v&Yf'ᜫ~uOlqf<&tkL((GX\Ǣ}GGjEFtJS6ZLJ iy{sTi _:oj[_?l- IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_stop.png0000644000076600000240000000116614543327613021212 0ustar00aivarannamaastaffPNG  IHDRa=IDATxeMkSQ9MR~7 mB]A\ݵ+\  pFAP\.b[쇦I~{M:03sec8'P@],^1h ΢4a&/MjU\|FxQajyZ0P7#ހjN_G{WXxoq=4)9}E4E8Kv\^L):rrmuJ'IZI ZȚI` PrP 2cu;ӄf`I$an 91+pIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_stop_2x.png0000644000076600000240000000354014543327613021621 0ustar00aivarannamaastaffPNG  IHDR szz'IDATxr0:h`/C1 H~}"|a0 в@#@FHsJ_auUYeٳggtZ;]]k?4U44&^^5SW'Sc==g˿Qq]A罉Agp">FbK}cv DnZJ٧e xhwԶaMIv MTƺ^B;! LFؑo0SUq]&c/aO^BV;]y%̧Hȹs6 71J1o:?Yy5p\:9{,}T]t,Zvlc(}!Px4܏-&֙de\&F˩ (22qĂr@dk+X_o?@C!V?d~b +Bqli~^Ge$O*j-KFi-^w- bPE%bMfOl&\bb [[@ 'Qk&w"[^&?zV*DՠD\,5"s hł1US[Uܦ&qc E榍#a[[ǡ/Mἠ K?e$MǎMOe2` *rP ߝBwSxZAJ"Kee󗘿pN].LAkXoy*+Op2AnqTHxƪϣj Z~?@s'ŗf~}p]Lܣ];.QA$j*f>vOUO\J߄7ZK ȲF*NC1(&%6,7(01q z={{9U;vq){Kb_/PE0SrQEb1 OM`?ͩץ85ʫZL,&X5gE 'i;D|nG[3s`Lr#lJ)uD+3RφvB8P èq\<7Oc~6㐠,,1Nn1{ " Pؾ={R]'.+w 1UG`DPJ(b+wW/u{`{H$Nbb^{ďE"bsWTE$8%hKFۼG`<{dpXqr1;bn_:swzzDO:M_ a/U>,]7+żmJ&N~|aC+tvqEA;.(Ac( NGcnݼ5'qU?uIVvqc4@.l"@2a録yr SZJ߾ݚj$[UV$M^\aU(C0?,ٶEYR8GQ8W0!s~24#"viG R١ZT@qQIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1703784331.0 thonny-4.1.7/thonny/res/_disabled_terminal_2x.png0000644000076600000240000000234714543327613022453 0ustar00aivarannamaastaffPNG  IHDR szzIDATxŗQSEwNcS勚T`,?G7 ,|UߌʃpI cowۇ݃#$hjvggg{.Rw|9AvR\q07ppw-{{!3_.ܻC]*l6vaL$o/5ŋ#XX\^^iWEH&fdFK;OUƥsakkVr޿ )ID!wEAUih `( /*g`L=䯻s &'5oLp/5~Y[ PU\}*͜8E}0x>`3GD0S : YrT@JHByDQ9"ݬ`"v{HE:`YKTshLĨ&DQ04~%E xT}-\5\2"M0)x7$&N"TܪESK c LM̰NWfE!QHLhnNAf0 "ݘK7ثﰵ^ VWINV+m-jS[fi6UĎ^7"8?i,ss })d$p _&}.T8j mb Cc̔R6=D f@Gm|706:V;7ƨijlwGղp̕ \_IG+o㉧ɲoyI˫i?<M ]Ǐ0B:*3Y.P3?ϚM4 Ry"CyU-sYʀJrl\]>]?Sakφܿ.!&&t/>u&r J+UnjMN.}=4~ؼN2^v^&"RJe[_>&1@~4hAH$IHAY>lpΣ ^/ovD}gFJծ*!Z#qZ@zln|T](J%VJlŅ$[ޚݩMY~91wZ! Ct^jzsr =&30THo䥢@NW %X Se me>,M;ܭ*㾆OU* S(bZR.T*Rn|/PZ߰4h 9y}P`vvIiJ 靁7ž\ !'ccc It]?{^# \ u=bJ#YYYi| |@QRGwddUO<ʭ[#h>='׿0bxj),>SOm7.A_T*VVVJP/GI"\ zt ? y Q,P$'w'/w:.>4sM}f/YIE)s I>O./P,9rGXܷU2u7sieJ%[IN\;1Fv̅Htc sss>}z͵X= 럘i{#ֱvØ#J&]0PW) QyO3$SO H<22Ø\Vt{z,-X~ÖfxE sW|>r1;}oxE NJݝm[Ǔ.Sk(fT )d`mmV }=$LMM1>>N.kţG/_o6UD* >TjcLOOS*"r9JR-{k-}P@$ 3X^^6 Qfgg)Jټx\.$=9?Sc?0E4m;H@`lnnvbȡCx饗8|pOF|7xUA࿀iRD`&}b\y Zѣ\rr\0='?P' _$LX>G_oppwyᰗ,pxsyOYvhB4k/(s\U Ç{)ޔm ha?$  }io[onII 3]w澀J$] +wm$GzW*h =WM 7I꾀ȱcǬN sNSӣP(0==͉'b78VzE85PV/u'O͛7#-TUXXX`xx344044,׮]kSa Y&@t{1 yQ&Y__>ڵk;2,--*ɓ'5 x/H)@L1 $NMoKFp%;*"'Bo U3wi;kwC\\p!d˗[Y(j*C h||3gt~ іt΅ 299i1@xn [/9$ji  |Hg"mVU]Ёv[66<@tF+޽k6ڤiө߁0#EC?3}]ONN{XGΞ=tIӢ |jLq %M7n`c#Z6 tRD{ՌhQUݻ5\!iPVrJ!Ϸ >G)!բ߫YMꂠ6D%dnǧ0 v4Sx?4T )ܸq#ҁayy9rHOT Z, @t{;o>a}Q: {٩diYs)|(Úih7y hNIsWc)3B&5wYث hl7HvYU3Új:t? dGjsM ?Hqٸo& KEMfo9-{5vsƳZH~5pĤf@2u'W~f9lu e&X@l`U3l&6)dWg92u.m̦ZJi=&&&.|(Z,~U|?' YӅu=6]uCosY#"jJ {l ˻怃OZPHgRP66ۂ@&F3@M})7S,m ˻Nha4cʹ@ia||+cfcki[^nZ,;>@ /AESU̙3{h1P&BW^yツfTdƢVwn+EۂnzܹH!ہOAE}wnO&e(?~<_*Q( xlV4uF ibsYw>3324}.^ pVMEEV*(>#?PHZ 䨣2Qt.3WHf&ҿX4Qw,1byJй=+:"y+ 4lvCZx mQHRt4=k^H@k6{ϣM+S h,}6-߼nɕ'i dX__od)yjWӾ zj/K N\}z] xbeH<֜3lAP`nn7' W])e{CX>E@5D5T V z^ ,4l|3ok˒*>J3{EkEDK?k`j)7PSX kH,3gY1L~5Mc4ty n kRG(}U?<B(~OSvfMT ^I+t(JxvԹl)%m3 0 ۶ЂǃB\&$Q B8pPRʂ$I~OBuL<Ϥi|>Wir:0M)ʫ5u @, \0d%aHǘIedYFRZ1QJnzi!<j" CUjU B,²,>%:l6{Ri#V>yIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/arrow-down.gif0000644000076600000240000000150514417536743020322 0ustar00aivarannamaastaffGIF89aljl!,"X8p 2LC/bTH0 ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/birdseye.png0000644000076600000240000000231114417536743020044 0ustar00aivarannamaastaffPNG  IHDRagAMA a cHRMz&u0`:pQ< pHYs  YiTXtXML:com.adobe.xmp 1 L'YIDAT8mS]Ha~iYpiVJMP16ۅZ-ptj] ֨Av1^؈ Fr㘱4ޝiw~>ss>d( huvv&8RT,ZoW:6I SX,?.HkkZl]{T*rvsSN!2_ANMM'''>FV^  }d2N&&&Γ$@*|5LKAiks=D]H$B]],Zjtb[juvnaa^hP= e`O(f},ބQ*ʥF8teYJ^x~>(lnn\W{!Le?rDfT*L&#GGdl il4~} &D"2/X,Fr#~Am610r*`!Jtzz:#|>/<.S> !j6}hyޙc!=6 rP hصP8  XS 6ވԱY<0+I` r9Z_)®(+1bxcc#{rwvroꚚ-yuURiT*u~򳪪ZhA ;~_^xA?Uh5*IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxdot.png0000644000076600000240000000043214417536743017537 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME . >iTXtCommentCreated with GIMPd.e~IDAT(cd]ܾ~ }Z n. &N81Taĉ((,3goO1 a}0C M}hjiYntn:M-mq}MyIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxdot_light.png0000644000076600000240000000040214417536743020723 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME /4iTXtCommentCreated with GIMPd.efIDAT(ϥQ `47ӛf2Zvy1$T$QU5$l+`}2xj0nUﴁ$[1$K$!='|mOzo 2IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxminus.png0000644000076600000240000000042014417536743020101 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME 0/tEXtCommentCreated with GIMPWxIDAT(cd]ܾ~ }Z n. &N81Taĉ((#C\n E\x @VL }W16yꅁuM֭cF(GU[IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxminus_light.png0000644000076600000240000000222214417536743021272 0ustar00aivarannamaastaffPNG  IHDR ;*2zTXtRaw profile type exifxڭ[( EEI`8GUϠqs|*$ YZ߿FƐB\r3Wwn׃=rcӚ`1,yK^ ?JmMly,GB /neِP~_3 q, 7'RcƑS䭎@{-COPeMH,nD(_ddC{*S}!@z=>@ICE[VN.7gskďrQAm{.%csmdkoHh -$ Q& %b`RNm BtX3*F*I*PlotB+EC0Fxf(> h2B\<#䈌%T?|kp3v݆<7LE~/`Һ E#S F@8ހ ىA7Qy /M Xyu{({{A¨45SAU&&Jt5ƘbN'OSJ9i匷3rxm~ nqK[.lW| EK,U*긆5Ts\-4m;Zk=o֗ j$5F Rf Ǝ\k~KsqԮ>z[C~ZYy%ΗeLs߾c$y/,e߈'μ7M.ՇϤMoby\KDJ'曲S~]gk曲8/|Sęo89}"r2 =bKGD pHYs.#.#x?vtIME*Z3tEXtCommentCreated with GIMPW[IDAT(͒A @ YxЊe=8ХC@ U'h:L.IgؗwUۧ8lS-5ksIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxplus.png0000644000076600000240000000044014417536743017733 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME 2 BtEXtCommentCreated with GIMPWIDAT(cd]ܾ~ }Z n. &N81Taĉ(p@!`A|!l7+u8l7M }@ oh!- 4[o:Xn689`Q5*|IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxplus_light.png0000644000076600000240000000223314417536743021124 0ustar00aivarannamaastaffPNG  IHDR ;*2zTXtRaw profile type exifxڭm(Y.=gv0˟Wc{Vt ߝ1yR1:\>,䎫;;?;9&"EcK ˒e@n & IZP#Á[,C*˳?cY.dKK4W"݋3$@{-Ct bw?"TI q rJ!G% |.r:C_^FOзi&TBҿsv95{,uR{;VW|ĒZԹ965ߊh_pi${%*hGmh3 0vsm+BЋTQa,uqӬ;PVB*Xx];'B01^_>Q}l(| qibc&P+a&l f N ŀl2!`XAE1# B ;T !@6Y `yP?j >r(Qa1Z'j15o%V(i),Sɒ'n؏9Ko(ɦ7ҖRV_Cj]vݱ۞ | -6kV:Jk=ح }A5]Ajvq 3 J"K r˂]AgA }c /inh3W2?t: m8JEkGM|IݹίGh?1}}sG?-'7ЉdǣE~ؓ|h?I/|I#دbKGD pHYs.#.#x?vtIMEG*tEXtCommentCreated with GIMPWgIDAT(ϵK 0CЃf.˜1 I$X0p>6JRU]U݇ |åmU|?C=xFwQ̴IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxx.png0000644000076600000240000000047014417536743017222 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME 2niTXtCommentCreated with GIMPd.eIDAT(cd]ܾ~ }Z n. &N81Taĉ((X XB,Ȝϟ>20000,reXð.,Oqeu2ĕ&߾}g`````w8.O@dAuM֭cF"(ZfaGIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/boxx_light.png0000644000076600000240000000041014417536743020403 0ustar00aivarannamaastaffPNG  IHDR ;*2bKGD pHYs.#.#x?vtIME ,QiTXtCommentCreated with GIMPd.elIDAT(ϥ1P C?9YܡxXlEIĜ󷜠$&xCvmZE>OPUTC]C:z_9 ^IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/broken.png0000644000076600000240000000277714417536743017536 0ustar00aivarannamaastaffPNG  IHDRfOViCCPICC profile(}=H@_[E;8Dh,8jP! :\MGbYWWAqrtRtZxp܏wwTcP5H%B&*t!#(&9]gys@ xRf>Iз \\4ytɐ)@ӟgMY`Ys{kHSW-Pǻ{Lr%WbKGD pHYs.#.#x?vtIME ; 8ՙtEXtCommentCreated with GIMPWIDATHǵQH[g\o&$F&28"}sӘ{YuaުƐ'Y5i*v`lÖP{.x{fD=w=s9绂L1,---D"@YRQQ,1`X4`D.IAPUUfkommm/))ZQ 399L*333x<zzz_w;a:x<Du#Tttt *gEUU666vv3{nb@Qݲ,0P5ܽ;$A:r1::t`}k55JyߒH`aaylooGeX,eKTc|WI7z]BPYQh4JgggazCmnnfzzݎ`xx8vV: Z$A*2>>NCCGE1f`7ٱ{砒.|xQ>鱣zf_"I?LYy\ǧj˭[Wq\LMMe8"qo)$4:͊|!bD@D8$)c{2Q{:Ci[tYp1MP&sJHP,uwXDzSgُO #h͈o{3`#o^#tl6v)!Ϲa#zx?@^x`'r M͸MD"A"`hhp8(J"H{_R[WGEe%FcT4q2@$=\:si?o+*bnnӉf@Qcvp8u*:dJYYY,KV헗ZXSp8NMѯ`=<<mmmy? |@ @oo!@ccSkM&Sf39;MMMo˔FV<IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/closed-folder.gif0000644000076600000240000000212714417536743020746 0ustar00aivarannamaastaffGIF89acf]afkm lql prlp sw yx|~y}|"$  (.('), -Ï*/Ǝ-44˒'ӏ.̓9ϔ,ė2˖0ř0̗1Ж2ƚ/ə7Θ4͘<͙6Ә2Ý2ԙ51Ȟ2ؚ5՛8ʟ7ߨNݴKWgmWs`cuqwflvrmww~ru߃s{}yv|!Created with GIMP! ,]*fl.anµ2>jdץ\Ei-W``"R2X"V,Z5BT"OhkYMÇ *Xj ;qЙsXe4MjY6grq4lH@a )3D*HbyYu` $. 1[`Y 1h%1h`"$CM7n($`Y!"@r*O3`Y" 592$%FT`  < $ p[h =ŊT'Q$aRkYS]5RS.( ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/debug-current-script.png0000644000076600000240000000106314417536743022311 0ustar00aivarannamaastaffPNG  IHDRaIDATxc`0 O!al OP$vq7rMfpgtb"|^:A}]OU?~R?|ێD{xY7M `a[1;C|ųU-HqpmktRAO;X_'AA tvNO"wlWz{8z7t} yx+ۻ|9,@a` bFjf[~jmWVu+K}` 7 NJ|*K[Ohi2y0u^X F]_ \ D"sE| !QtW6&-o\?Yjm (Cct5bjIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/debug-current-script_2x.png0000644000076600000240000000265514417536743022732 0ustar00aivarannamaastaffPNG  IHDR szztIDATxWiPSWGÎ :"yIuCH C)SkepݸU[ۢ (*0( *R\@-Ψ=ewL&3;|9fРkB q3"0pl!`,!;Ӎby{<9% #G7+ 9Ɨ73|ɖHiMtPi Jxs^4]Gg5ōXʐ *jBPIJP #8$_g@lL:;pߔ(3󰻪w8Xwi+Dٟ K"I[:$Qmhz'$;`(@Tᒽ C/HbSrq 5k!@X-.JbGSr[pqR%Sm.$e€IuJl$9dnK(fp )Hpznmt޻ǯ8 |~r !7%B(+G4ОY*-Jo2=nǵ;ܾw|wRg8+Pv;ń>IoJ!SfX ujg Ρj%Z4~D#8|aRZ ,dj^3\֏9i{\?Cv9kXʯf l;-9pU&ͫ+O2dxq\Uw.r> 뎭AqJƱ8t[l?=D0w=}\gI8fӳe#wFԶ@CG oL[%[fA݂`_&l]UǗ`.X-c[i:6%+ylL+~h:GQMZ)#(:`f-jl%5˱#OB`:/%c#'*]rp1j3,M%;~"8zq 0X?cUYƥgsʌ-)^c+ dT/b_)֗Nf>wmP Z6˅k{Izx&rTO>$oVRiK>&hI>WSo +J _S0n\x$d`Dn߿7Y!%PB;D\1=i2'5&2 x0{z=MJ}ҀJ=<%pA|ƃwtI}ײ,4"A쑠]iu [T1,N[4B &L`,=N=uMvj.>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with GIMP! , HVMd~(۸xRCMpR~M"y&cȖA3tP[nܶkV'Y7dڕ -Z`fX7a"IDiHZzWAQER)#Sիbb*SȾJ7MZ4hΚ5[LY2dX4!@zQS&-ZV;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/harddisk.png0000644000076600000240000000151714417536743020036 0ustar00aivarannamaastaffPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleHard DriveO2tEXtAuthorJakub Steiner/#tEXtSourcehttp://tango.freedesktop.org}aIDAT8nQs!lg!$q@MH hR]J.R QЧHEXHo B4bfhDV>|p!\֎%iJ2H$'Wqm*?%$"Zp8Cӡ鰿{pM4Yu }9hbbk-I 1~ppt4.jJ.Û.bZK.wn(rYx1.s47BR G0/gff-T*Q.qz|0 ֞ @4=vwwi4c(WR$I2:cz8}!e{R!Fz$ mi8xRC0֪`6rJ$0f5R cui6!֢qEX[[3 X__'2!N˲,Z&M>{S.K88FIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/harddisk_2x.png0000644000076600000240000000275714417536743020456 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleHard DriveO2tEXtAuthorJakub Steiner/#tEXtSourcehttp://tango.freedesktop.org}IDATXW[O\U2s0# 0D[D)P"!  #/ՠ5M4}!1R51/Ř'䍐Hu0s׷q;Ʀvٗ}[k=hY6?'@|R‚v:yQaTo_?.p4oMÌi bD˕wӣOgZ hsss톡=ʴijja0i v~~ND"^.0/K_433@L%>lJ`RMI;;;l3ÊغTS+Z[IΆ :;;(~rr"rW$Buuu"{K;###QԎ |+1'Ǝ qDȹ/^KJx,V'_~6H$k(1GdBl&'j։C|q˲G[4 `DlY’2^$I6-4$nKpDZ*p701qkkFU[5sees"KKKUeI"Eo޼e444|$`J>\0P|ˢ|x}} SMC{{{U%iǼ]ݺa SSSx< eqFP$Y*x^{JdE#Bξ'B;tdz x;B-/=윊p=FO0kJxƵO@m {0tr߇.R:˖0$i`Yi {FR<ځc[2<AXke<z h·!\(OՌ_"8ap$MǟY^:9|O>[O8ΆXm}UOIX~7i<ۍ4$!R )/Zk,(d-WS:'X_},>V|hSep'{K!Lba`)1 iHCr)dҨ,+Jpɖk['>@.7ܒn=ʞaibYnpmƤIe0${E\[15ˊ3}sCC-L V˛vT2di PQ GnV:}aZ?A(V V$lݛr .^eûGw47߼zÐyL,Ϫٜj'.IIa8]0rM x]meʻm<8Ri;@LO(  3? ,ebY&4ؽ#4pk 4Z6[^],9K'A<s4 [q|?5; s{Mi \|?$!m\ttssʢk-n^[C1N 7I0xy,,ٮA)1KI, ƕ>!ŎhU45d*,$4ncY N"`͒TZs?ek֠¥!*K Z/ gN_n=Wrf*2 NsRJc8 4?2@m<\tkO nhg0iN`%1lO$ Ȝ̴Td7H!RLc8Ջ(PJa6u^1;NoLR 3S-HM( @ χ8I).+I/+82DWedR/G X8/Թ@ "UfRӍJ)"):{yGHy"CݱWt.MhLB<c4⟲ce=)HH5<thMɲX;'5^>֏Ra$va|FC~Ebu47Ԇ /uMuBיS{4VXXұDMV([9SwI۶d>c|?XWN՝pS">1ĄM"amlN=ZSFia.}wl8KMMhN3\ܪ, M=(ZH"kJs&a;>h&a+D%l]]JV`W}%훪7҄j`sH)q[fZ 7.%h` /5շ63 8 fW[FUK .+ 8o(@v'<#a,([+*0>a_k:v=>>gYHx|ƧW~^<ʩ~Z O0# 'K/\8s0?hSw{p_t-D ~Aov;7,~k+W^QˣE"ġ%ԤlbpaE1EM%It&JJ͊4Lqtwo5~s~s8T\L)%) 1ek^v}STޔ0bmeZqU7S{z?\!&,zIW׈%ooߓc,RFg}ZUYEӣm%Y{[n=v_0kEI珖D N Jhs;u&%srm'$=Wn/@ ,C-f PPn(.*rraB+YWUH43 sW߽%::6ilZN̾24PU}z YXXx(7VL6^|IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/information_2x.png0000644000076600000240000000356614417536743021211 0ustar00aivarannamaastaffPNG  IHDR szzbKGD pHYs  tIME38fIDATXŖ[lTgnό_0cCp 8$&R,RUmU+%@ EMUZE}$C%6JmriJۤb<_>s݇ <U}_3y੧B 2ܦ&r=j6yg{ZWS]V:4F=tqibV+/z BΘNiش6D9"!7Bٲ_ɹ?|p:3k՚칳 kO㤋7{(iM:41rAA2"D(/PWٜ9sd }ntscړ$HD0N6'KdrFVXxC(NlKslMun? l\U,l)@A9D9#1f2N,3s2U:^Δ}ݧ;߄Z E.É9Ĕd 3RW]cDŠ UV4u(E5S6LsBsal`A O|WT W7]|?Z71e'^Z!͈,8#sA*_Yӝw ""1ֽXESTw -Ze6ld&dh Gz%%̚U˛ZX&<.W67z\#b5D*ϕtN-V쉹9\1qY6b27h@h3 mTr_={jl i]koY昮,'BH%#-Mn\% Cx/Yр}bW^͟o՗u|H6u6 FJ  k_8t=ӆ7ėXXT-gIbL2];ڞ5Qڮ\&yv)sR\e ՆS}ᱯ]{.~rt'VJpb=N}>XJnm{۳cU%/L 8vn5+E:Uuzq;nX籇lAOZ4F#\# [;oС;6ڲنxO.J A>7/xMKY@z?]+= d YvՓ3 z@G"C])8qcSp]{;00ch\G….B[ugrwwӚaL\6ALCX蹏05y\RbPg29|Y q@EpzdNNf;;{essw?6mze;8rdj喝׃jPK Btz㞱Q?Ϗ?~yuT_s%^E Dhooo}g2bM`B`l [՜^PJqˍoMJ{fG=P}f,sk%t^*ng@[k>Z+~y})jonmRl%+AϚ|?]}S/~+/߮-u _WGk > Lj9f6ʇV~\ 0>l >g<7&T;uCRG6,f^yqθY:ʨnT?33U  Oo|SlE= q^:uLӲY~4 csF{n _ !EϣR4Kp; ɩB#`Ւ|}aSɀ'2Q_[0܉AIO N`vZ3؉0o\5BEx*kM㳺aVb_X\ӔD=CE.c)}S%_C.Ah%0^>&LZ3Ï5`v_Θ ~fqrGd ~17$z;}>sZ[ >glx%z%}Wb>fmJ#W:#^Ixeg붜*5Z?/tIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/nav-forward.png0000644000076600000240000000053014417536743020465 0ustar00aivarannamaastaffPNG  IHDRaIDATxc``oý-ow6je:/.E=Yl/,hH%CU}?:,d? R-{~viuhl(:m3oSlb%*/ T-?#__cؗU6p/_]}UtNחj&Vfg)j"A3, yUej9oeXFf68yIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/nav-forward_2x.png0000644000076600000240000000120414417536743021075 0ustar00aivarannamaastaffPNG  IHDR szzKIDATxOQpU7x)Cc&gʢp 뗫it]R02@5Xs\^m:l};l yw/VꈕP!5u6;j(qϱM 4NiU!>g6o!} 4%Dl8דZ&bMvBLY!=DMlk4 2դW !0wu|O\]px9B3 \lW ~6U3li 'g]' Һ4NALa4Z.rɴ๓V= ^٪8x#:G 9:NW݂l3FJ_HLXgA'{ݳak=CF7ٌҼ` Ftȇ#qb\j^[!bA }!nZo^)?F~;Wټ ]u| otA35;@c-k~V {~c5پ=^55ס0}yU]"թQ.ҔIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/new-file.png0000644000076600000240000000045314417536743017751 0ustar00aivarannamaastaffPNG  IHDR(-SEPLTEat-ԤԤ䔪4Jd䴺XtRNS@fbKGDH pHYs.#.#x?vtIME 9+hq/_IDATm EQR+ 1P{'eRpDsBE<`v(ۼQL4@F,]`@W?_W;niIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/new-file_Linux.png0000644000076600000240000000073514730022736021121 0ustar00aivarannamaastaffPNG  IHDRabKGDO4ױ pHYs  tIME&Ӷ)jIDAT8˭OK[QsV$}%[\f qYE޲w#ĂM7*RJRJIZEbwDž&Tz63 s3R.kZ\go˟oϾdRIxS/Oh缠'+⮶23l6 ! "=c~!"f L&jǷ[SW{jky`1*F_^^o: L8 n4Y:OPEi@дޛzƦ织'Z_YD)]Cu4VjD0fTm<еJD[< =$>֜#{/U@K8|1ཏUX#u[^csg zb&F 3yƂ zUFdoKqas/@RhBbj9<1jKԣJpݝ_/n 7AFSWrY?]W8i1iqs^E/Ӷ9&P? 2ŋHarfqL9B$7 œ=,7K/@Z ¬LUi&@ו۞ ig"@Jeh):FH<6660f0q4da^jee%bJR8I A՜3![RC0Ҭ,*H*Qz䁻[Y2F譌,UM(cNU\.Ag

9;c/ET4iu 6m"acӡ* )׽s-D+Z4{{h>ř5']5o)p @m{LS0bl4@"F?5mVpa>0Mӧ[ǷJ؀7IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/open-file_Linux.png0000644000076600000240000000124014730022736021261 0ustar00aivarannamaastaffPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KQ?}oIkRK?% rjХ7#M+hh!EB-siꛖ`p{9+CCCD͆."@Q""}ݸ\Uo/,-9s@D'&_Lslppp936&N3cxhͳ nTUnH)[fz+D07f cd "BUU]keY"=va#AUM5s}Eιvp5bPRJc MZd;8bL; y/qk"K;ʢX JJ_(H `|LH)YJ pJ[GDY Nq)%SMPPXlb{ט dr4f4ScD$mφI1s̝lNVJa.X33؎l7zԝ, ܉wgm`^Z?q!SKwY^ZôldoKu2IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/open-file_Linux_2x.png0000644000076600000240000000301614730022736021675 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŖ͏G13 L>8:bD!=ł+$$ BI-$$2N80H !h3;3Uag{gzfF#}DE|з(.T^ObAͦS3yn_zw;Y}'P.^(Ozq#s1q̷N#y{㵷k}3˾__./d!RBkRJBTU<U@eiV7oޤjcER$I?]#֎o(T8sAR:u c ys]w~g(1Ibiik-ι RJ^{UYyc<À PJaCt:ۍ .ƘdBiZ6V=J)jaͷˁ2A=?,رcIQ cc߇Rs#+eFCnmmO:jW.c EPrv]0??oVWW&>t\}!8 dWF{nuFΏ6_;oFz/_`105c ߒ#>3?&AU5YftYZlngz- w!@ &J*',Iާji. 5ޥh9M?35$g/nB@YKj<5pba71d#Ԓ81kmjGix@"n[K yTE?N3!\cc;&w(%X11H-xQ1P~ pԩO-֖̋jc8Y&NM]\hmkj ؐ1enzL^{1AQjƲӋjj!2unl؍ qf1ZNIFOs`0խ思SnČ$-;GAFߎuZIsnH;0dƍYu gDbl\JNr= %(Iw9..HM>+rPEt`CD,(gh:%ο%[2v =f{F<K'Ϡc$;YX׈2%]#VDXXIO-w4G!f-$;49hǥY^6=]_|@OAY5> x93pv-1 :[[&HH #$¼4 ct"ZҼ[{ /C2>h@C >%X&|ZZM^8LLAyM].5*ؘ̝bNQ}-hԂuy֬Y%-+Vݹ/a ,!74aT헔huY%mԧ͍C ǫc2`b7<2[ zf G+?dĦ( N^q;IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/outline-class_2x.png0000644000076600000240000000215114417536743021433 0ustar00aivarannamaastaffPNG  IHDR szz0IDATx]LTWy>YZlI&kޥE.X.W 6 )P0hk[Xm5e.-"JWKRQSqρhOeg9sΆ\l|S(9sh]n؋^ԱCt <PJ6ƍ7>6 nlnTfRfG߬=)@솪q䝓TF: `<Jx37ǎfc8u2i!ygq58L`ڙ–t(?=.[g`ޅ[uj.o-3Ǵ;O"׃Yy<㭡s2`F8Tdȶ3mELU? 5 H4s2Z#ܹ"c1ǽd!d@(Mq%) =ma-=.΍n.G eI, E闪-n%clc ِ {=)SvA,ܲ7i sҾ^釗SZ|MϜ˴D=9dcZ`R1^+[@kOLvIAR{,}\sy#E`vJOO\ Ȑ*qBbk8`,MvYGe`븎z5\Wˑ9*aE őȑCmu!Y}~ < 6p{#a'.xR }^խvna;n|* dAܙ )sR8ӷ:Ƭl.l FO-Tm8G* g pb-xz۠G9vۡ2$ET8`v[4a$;7NiЀE$թ/6C䦧iw.1rRc!f"!ԳMd^ dHܷ`uL3i;zcaE aE6?nHSx* ĩ?B'?k\7ёYb̋}җ=sNJXIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/outline-method.gif0000644000076600000240000000110214417536743021151 0ustar00aivarannamaastaffGIF89ahtɂЉӋE}MKNMQNRSS]`_badffnnv{~}͂ψґ֓זחךڨ۩۫ݱNORUUVW[]b_a۰߲!A,A??$$$4 &>& 4 -- +@@+"5*@@==;6 '@,@,@' 0(@//,.ɂ"3)@@:2%9=9<7# pah bX@я`H ŋ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/python-file.gif0000644000076600000240000000116214417536743020460 0ustar00aivarannamaastaffGIF89ao2l3l6p6q7r9u:v;w;x=y>{?}@}E}@~DDHMbUZ^fcÒltw͌ˠźϼMNPژRSY\TUWaX`Z\_]o`abdr}r!Created with GIMP! ,VJKORVWWXYZ`KGHD\PIK  ^``dTKMNV[bddgX& fCSiY e>Bƃ]QfgcF79l_ UE?<83.@`# f=:51+/Lnaa72jڬAC [Z$$'ܤ Q[6lpqFC3g>tDC0a;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/python-icon.gif0000644000076600000240000000203114417536743020465 0ustar00aivarannamaastaffGIF89a'Np'Oq(Oq(Or(Os(Pt)Ps*Pq*Ps)Qt)Qu-Ql*Rv+Ru,Ru+Sw-St-Su0Tk.Tv.Uy.V{0Vy1W{:Yd7\|8]}F_Z>a:dAe=nKoJqKwKyP}X~aZZ`_cf`;lmnoītrysuȻ{}zĠĠšššġšŢƢƣƣ ǣǤǤǤĤǤ Ȧɦ ɧǧɧɧɨɨȨċ˪˪̋ԏͭϰ%זҕؙ՗ۜոڝԹBݡ֢ۿ#ڿ,ڬ9==\QNL1TZU([/DN75Y]`Bc7a]cdfZ]Na`fa_\dXad`bex!Created with GIMP! ,  *:qX8p 8p3)2iH"VTh'K Jɿ %RD)ԤG-zD'@0ԉ0[P1PIK(U(sNFDH@E€;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/python-icon_2x.png0000644000076600000240000000457614417536743021135 0ustar00aivarannamaastaffPNG  IHDR szzbKGDC pHYsIIEIDATXíIWUu,nǎ=Nllj `",#BDNpHd\RB@dvd9ˌC,/x i~vgJGJ,ժT(kamRꑂp]Ozw'ߥ1/fS3n,_ώ޲*|fW R C'4;#2ccHpWb,u"?}JMrLDΆF>*H!]7s ;n"DR)ocR)sXQ?2u(ݴ dz|jz(gJe"W(sB6hA(vF%<~-!8iټyI-r={vOlܴjY4iQikCj=E١ҋƆ}@0(N/M &wn;o94>>MĊ4$*z71qHFFcA pFi -.LΜw_89QfX\ס!s6^Dp$Bd2 J%^,,kPc/|_! ݏy*ޛk0{AAL ے\sn0u<ҐQ1IgQo-/^QRJ!-xπ1\(xF:Pe̶-%ÁgV1zV~0G]\ݥӾ] "h(ދےWjvة66N9ƀzl#j5rE$r dw5O>)Jsw0\\Xg.Mc\o 'zW=;A8]=p<"-@J$[|D)[nFSt'%?x ڷ@aoŹwJQn ?Ýέ?UH0eYӄ@[޸Jym@C8aۼz:؀megEwfsp+_6;Dmّ ՚4i(A֘2zr-JV[<܊^w":`r_Q-D6*Hu?0-(0sSw{qbVڱYœeLx97sǿ'bF/;r.\%"KSVp&^ Bjo TxӍNNІNN}h ܜIsKuѱ9m rqk[LTڝnmW}}z4%_wYBt~vr Clm(nx!鄄^Dì캵ʺ!ts9n Y-kż/ț/Sꨴ_">tEXtAuthorJakub Steiner/%tEXtdate:create2012-10-06T18:48:38+02:00D%tEXtdate:modify2010-11-14T05:57:55+01:00'3tEXtLicensehttp://creativecommons.org/licenses/by/3.0/VtEXtSoftwarewww.inkscape.org<tEXtSourceTango harm-on-icons1JtEXtSource_URLhttp://gnome-look.org/content/show.php/Tango+mine?content=76316u9tEXtTitleGeneric Text6IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/quit.png0000644000076600000240000000106114417536743017221 0ustar00aivarannamaastaffPNG  IHDRasBIT|d pHYs  IDAT8AoQދ3D-[ uA ҍ;\huAg]M*: (0PHLmMwܓqc EJ) ^=#yW}խZ`/" j|c޳3+!e# -{{ h`>P:|V*frbam}{;;l{v߮ôPt)V\.gl$8p7(&[2~3߇+:ma% t+N70\VHsu\i_Q4;lS BI苬.q&6j>mq1Kt"`6S C>Zpȝ(Z EZ~r9Tҽ0sYGQB}IIu,AC\d%b.c{i:kkwn ;3'MIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/quit_2x.png0000644000076600000240000000173014417536743017635 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|d pHYs  zIDATXoE?c;MXD(^H4pE؎Ҟ{ilV)H $(I]﮽.c:k_id~ߛff1p7$H־>='n2y=*xK8Lp\{_n&b,Pdr2IBQD܇Zn2ЕgcaD7YJ:TH2WJP~|R2>K{avM?spiD]u?*tS)\ i+%buOgPZ@w.oL%lvR)#%ruBX<Λ^,ҍg@U:\ya/J`>^_\bڵ @"B z|rY:ͦOD{l[]cC!40TGh7kiiZ~~9LJ ;$U& 1߹Vc1 T:48F͎?NlFy?jW4`ŕܿ5UKש ]*7!(V[.esZN>'IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/resume_2x.png0000644000076600000240000000202614417536743020152 0ustar00aivarannamaastaffPNG  IHDR szzIDATx]lSuƹ DEk+zYY׮ka|%Y2Ǻp̡Bdl> 75/jCb0+wn{|v:䗾}.ZYY3vQL&Vt MIs+AR56C8{@fz2驿f,b&*3`&'F ~H3kv0C-(ٍuNMklY *0 0rt0Ϭ _Ւ ׄt9jުU``_CEA;gք/LUw'aKu^Dg?}IhfM"_c!ݨ\Bav1R Y*r%ãw-pe9 GBޑfք/k-`0/JҺ"_m 7/ Av̚E^Ue̟78|A7iSN,o]}/{̚E*8c.BAٗ۷ `ˤ h\&v~`Yȯ,vʐ/2gĮP0LB3kUT[g}Yh3u13\ț} z< &v䟛k̚E>g(: %{Åfp6AeIxs.H3m' ͬ KS9K}BJHxaw`)ߏ@B7$5|W4ĶW '^j}SN&TnqsYȯ#N:'v v`u+=ei=V? &>=m b{̚E^GlwxBwQr<uu3E^.bw@:|ŏ 6^-:]y:gI~=sǹ.[ESVo E%k 9#PL#nſg{xL8Ob{6$uj!Y +mivϜx؜=&`DA_٫x Z ߚDsi-U<:RMx2  B[vv8ED:X<\T߬GV7rFl\nf8ʙ ߀+alNM;#~17f棈wW"th|}@|5Т:>z%)Z?= 7OC;D:4Ll4 FڸIjӠb( +&¡ƜePwP;QJ%Is9=gvr6"f+';@çj@r9ByH0x l>VH=} b?r?FHуp N.I'$4A%ϳ!W<*]}|8SHl-Q8` g Nu|/D*n\hķ}%:JP>lhuP4fyҐܡ.^s>oC# /׭R-;2 9ƚLz.4$` '%ٟk9(㓟!N z0b*Gj$O^nH#+R%rT"QgHȓof`7P D!+,GZπ@>U?[GnBy} I(oɂl N.~ < dumΰL{g&Mtũ\BY`f$^lM_>hX=,.GguTTY%;%`]vN(zo aI$G.U'9yԕ1I2򦿔gԐnS@,38TWp6a XX>i5"3W 3a<Ңt{O2\?Rʾ,촜W{TȔzX7).H9_/ M[Q-IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/run-to-cursor.png0000644000076600000240000000037414417536743021004 0ustar00aivarannamaastaffPNG  IHDRaIDATxc`'[dD͍X6`S AT,64Htn~ |sVH8 yGzZÀU}9~oUbWU\e\}=]f}Kp`Yחz({Dā@\R(/!+(NHe&d % IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/run-to-cursor_2x.png0000644000076600000240000000075414417536743021417 0ustar00aivarannamaastaffPNG  IHDR szzIDATxc`4y#cB4Q2|Ibf$rX} ]Q? nXAn >:xpco()8`}o֩P'~}UIXW+V?9`{X^T(\Z3'v _r|IYT hЗs¿o;2 뀕b*DtZ}@fo N+E?r/ʽZAT"\Y&L?9m`ۻV>z̀pYzo_ߠ,V,|q!jWZ(E)] %QUYMkUojqk03p_@L^i>BϞH鷙0;tUp] MԢt6YĕyFB橓L}qNU"}B:&&VY~{/ "Ɗ `iwpI ?x衅F*3`Bn&=~=3o~wƩ_]119$3ZMgyT&jmݜ{g(aU9jQ-` EUpu*(Z]w۰ɢqN )*1fk@qMմ xрן@IAЉ8-(u4ӻv)^<^pS7@Y~hiLf)nɀxE$p$q{<޻ gsE)~D x*][!RL4$Z/AWLc:`|iπR3?$+h 6/YD=CWEwȄhq$pnD%bp>DmֱdOҡ=a}]<T|K="  ,~x_N3}'^y UED(ʒ̩s\;6"O:#i?WZCc$\G2눻9 6/ɭe2)lIw`ʚq:=j_it,5zCB kTSV;R%YcIf9yV1Nq*&f".DڴQ%vq UfL9-H'9Yۚ4ϨEǘQ@DQ%"h+KzbC[9cKK:diNQՔu *xD8+*XYQ.>2b3K҉:̀ Kɐ<U&c[ J]9-IgH=q YjEfC*;b$y,%_FDDdsZzD/Hϫ/.wY%<r$qDxXBAA(W'n۱wp=/x|vl_PPP#wҘX̌M4єXi^"2"0e1.XͻǪ Q_ͭ{h\Î,4M9H*|!mkص)i8(m41MCRO-hm aPYYޚ <۶qy!<]s?D30DQ,@.x]:R,Fs4_;3L"bmIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/save-file_Linux_2x.png0000644000076600000240000000366314730022736021702 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|djIDATXŗ}pTn6k@0 !"hXc3֑q?ڙRgNu--B:h &;޽}MH̜ys=wE\i̵wh#6Ia"p0⹾=[_ԯ|2mo؂ymӪ5`Hqʿ3Wniϙ?JH1=b[X,)R 9~F$_ ̭vumW7Q63<͊ؕӧ+IKJBCTd볽ySyr+_,17z~zW:{/)(1t_= O 9caNZ18@ߟvpp2ʶ$~)g I ڈ+~H$IJ ~kndvj,ʢg_|/TWJ)w]={';Z[٦Mvvv" 74Ɛwܶi/hmIv;wb3˖-F"͗Xd-|>mcPJ*D9wfO#+(7w\0(#u]:::l߾]^N,Z6P(RQ,)h7sv#ϞF,­sy^cqpyAmxG2dΜ93>"!V\I. 1&D,Ï6si92ϑ`g3>RJRhq]ŋcY֖ ֭^Ѐ8(H)Rrooohw` Ch(++CA.CkMPή֯_o"Q|'HljF!,[CSlJSDQ8dd2y8)%H .Å: u%222 ¶eY$I`ߜN4PQn#Dkz,_ߑRJ{R!L2dddgϢFʱ,+4ԏb1=g!8ZkL@ @8\ Z%>/oX]xIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/save-file_alt.png0000644000076600000240000000115114417536743020752 0ustar00aivarannamaastaffPNG  IHDRa pHYs  ~IDAT8˥OKTQ)clTF!܄ڟMZ m[*Oa}A ]-[dA*u"wѹc3sg{:; }<ENֳn:?_~|Xk> |ݓN6s8ʋ u:u864n 'Ņ,/QE@Quh,^5' Fגs7||duKE<TwAՁ*b= Qa].O V'}] Y \F#(NNsu/Ai k{9A&Xg7 8PbonY8T5l# \ _#6;H[ml׸I4Mo3 N$bCjL?Tk7 : |,XQWc$as7T5ZZ 뵖g@Xp R?jPTP4 Dk1^p:,o. ևדl4ݿTHs( ɺidM!iWj0wL>MLcIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/star.png0000644000076600000240000000166614417536743017223 0ustar00aivarannamaastaffPNG  IHDRasBIT|d pHYsSSbjtEXtSoftwarewww.inkscape.org< tEXtTitleobserveN;tEXtAuthorFranziska Sponselh'?tEXtCreation TimeMar 2011 RtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/3.0/^ZvIDAT8SOavnKօhjFRi1)$ŃzQg8/hDNG4Q11utnoxt~=_ ?" oWf,NdM2lw#c V}]`25S*  ۩[#X TWUM8< 60T_Y[[[MZ!fZ֗W̯9P}"p1-D$dDH$~#eWrCD$@Q7m%㚦lZT8HD \nX @I5~,Xb 9[r2v YWW3 m:cKev[1 Dkj-Uώ9IIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/star_2x.png0000644000076600000240000000341014417536743017621 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|d pHYs}8tEXtSoftwarewww.inkscape.org<IDATXŗ[lwffg{1`l vHHRŲ MTR%VڨjEK>o%jاJCd(dEi^ɪ 8 cR|k{9s>욬!iPawΙ]<ȋ5ר/ӗι'Wi=݃_>~㧧_}( plÃ`R*rQ}ؾ L"0*!ݵk3L"p>wĒ:7`YZ:2~xUw6 ƿgX-Yf\v[FB7v)hK[@LۅXK., KcrnxQؔ0M"y;8B4%sA 8n%2Z+ B^)&A  [ e3ڹoɎ, ć): A8J&*ysX[]K >=ٕ̖} RC<6ED4#` *P6@ #]@3gp壷 B"DxMDj=t3jǩVmmNTrnI[&\W+;jUKI_f 8;5B6쓋/,l~DzNl)M)ۘ'R$R ؘd:n'n5Z'D$ 'rvBސWhj2~6|߾nsHv#`^}0\[AO=0P&"-"Rtp!RlbXXY_(h;YcI oQDs(8"QKF\ZjYXt: d28NE(bG3-ϯ Kb N&Dɐ B@U:u]}B_4lr%v8h?lT(gD@[@D90j4V$P$f%ID"r- L@ DEHV@  xmdQ.LMMEX"P6GuM·dDI0qLD$lp@0{Fe!S"<mqs+&IȊ|FIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/step-into.png0000644000076600000240000000054414417536743020166 0ustar00aivarannamaastaffPNG  IHDRa+IDATxc``nN0Pi lk___g'ݩ};۵7JT#6 9Rwh XU4 xM**䟮Z߷* ⯮;@@K-VU)}}{ujoWya%R?痊JtŒ")Z?}3g+6jϋ <)>?;^uy9x4,+߷h +1eN9YXzM%L#>)EHOx30IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/step-into_2x.png0000644000076600000240000000137114417536743020576 0ustar00aivarannamaastaffPNG  IHDR szzIDATxKSQBwݵ ARKK+|q)kwa{Hד:E```e`B슏Ko  M"y{Ͻ GXN%x"Z =]D#skwJ!HK}ӎWY x!sN V ;ُh3Xϸ@딘 )OXA`h-1Jdcqoبߩg ߦ_]܃.>˴Q u A =D!sp4V.ڵx̃/]a}î"889Tؖ܃V5[Ռh0xv!N‡γXid[zDRʈVCl3ScVi?EN͂d7_(fbFl-y!>K36n[MDL'l:!k&$GlUr*-8o$ =SaX'QMBOLh,QK^7y"K[PA*igI7$ $Pnþsf:3 LumȎ\Oݨ_򺇋 +v s4i>]2~fC IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/step-out.png0000644000076600000240000000057314417536743020026 0ustar00aivarannamaastaffPNG  IHDRaBIDATxc`R`mG{~ &2@}DS@]j[oN[C-E>??_2Q^6J-jA_}˓t|T']׀u<SkӽwkP#YH0 VI|5!|?T B3,-β++,*Y^(iBt-Jd_UP4߯tߢt>L|^W'_\$Z[Ԃiť3˕R;p@nPIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/step-out_2x.png0000644000076600000240000000143614417536743020436 0ustar00aivarannamaastaffPNG  IHDR szzIDATxKSq"un* @HP’zU _0 ͇f4LJaZ>M]df$!9ӻosun(|=wwcٳKӧ M "o,s~5z(>Mr f0գey64)@1 c&\ZLt(#KB +A5$F[SƉz/MHSQ*MĊuM"/Lt*̝Jcya; ֟ݥh/P.24ԎnHs:]ﱁ|^8cxVz.ͅZsj} _ľ!_@Kʀc9!P#֬0VzkBՏI#p|0i[_'X`ܔ->'wœKrnjί@9kꍱ?(g|p9"n}6QÉy˯=곃O7@bfv8[QV0πB(g,n BB-;w  Cd4եxl>rf^Zπm |#(''g58UŸ#ϭמV@Ӄr<Pn"& 1:5|uj ,÷_v76`~㓵oOֽ~_z ͢w%{a 5>.D}[NDU BK3<iDWĊ E+Va#4*5*R;s`CZ]'=w}HHG<!nHXU+)8hnъE_TK#ZjՈ5UƏ*n)m,;İ0ګYt ACtլH?)MPW5 Gn"81oAˣLc%bA{،x.@X_b~tѯ77OZx:DS1[ J_(3& 6SiAŗMC_3rV `=3&Fl1fl4`T1iMEGT\_19\ >XdrnǬO"lEumNΫϤ@Jd_:%#+^Žs;&oNau wm#e0ڽ z ?c&RLg3j9ǧàV `%\㴂r ջ9#s*-Qv*=WEuWu2[>9GtsTUJv$XraMrDE*_<5ei_5O7da}F)kؑd}l. mToPd(+]cwe ' 6lB}{CL)sXT5$ƀ$#͏zrXwtO;f ݀*Z_^%Y0|QE@=~~0έi΀|ɕ?xO;/i[{?OtvU%t(UvѪ-am8=ΌGdKF>3gݖMMx>ӖY6mؼc@g棺.La36imlw*}8ڕc= ܷF.bd>k:a}֩ :??2lXXn=a;& 1x #@W}P@ui|[ d蔋5ĐF;c63wТnקNG%yv2`v;Ig)7pf1iLϢnufu @%fiXyO΃0ƕ!ҺS69H@4B8vX`40=sjZ6yC':ky PD>1@ J^Z}@kLSp0/GHk\"-UuE&z4DVlȷ={Z Rq✁0;"B9*I3.brss}7ln*jkj=)3#= q_Sǧ"! wDU>t͛,ٸqªcFVȣ;3Ɍwta޲Φ_XXs̔C#RO(HJ0Pi &8zs&8@0Mt·c~}v5O+|hl) &4h Dn@кR` 0-Bz<hpit',Nnx=HX8YxLp b~000WtLheD, .vH BLR `M'` uşS\SCqnaQͮ1NͧH|eA7QힽDDhj"";%s(ta"ךO9J"Bê$j(8oA1t3}""*3NF|F&5ʧB=N:Ri""T`ҕ嫉|ʇFsG0L*5.MDD2WgaqtH>qHJG8s2|~4 Ɲfo(@>ȶv .} G@ %A݊Bu5(CR6mg|wo v?f2 ѝH\3u01n@a9 H8Ap[="0!@~?*f'0쵕Tr qc|~\ hiz8Xp_+xAun87k,b޿JJ>T5 DNAzd_[?:sisZRS9z9&5xϛS>ayhkB![VbcvB+˲|춞`Bhm ;'@R61(#+D7"XiSdWn:"0Ya>(I}/</<&:*D(P$%H*ق_!A2pAJ NHJҜQ0Y$n}#7ZtL(hန6 =ҟ96wRZ!t0MI 0AiYHX8q?@:G8ǵ944z(q,jrAIh+]{"|-׀[,+ȍmyyσ "0Ct*-`B@;Spw@{B4-Tvf3[j̙m=iRф= [ciMH<, fɸͦEwwvB;K5-DCjqmϤCŋf;*裍',&ֽBw!,,[ַlsxw髥riKͫ $/Lz%#QX^!uvCjhJ0o]߼Xm+W~r4\.t5Q7uհd}ժS] n2vˡ)D_GM"aɨ#畦)Փp9:jnٺe`Lz]/.y'VcKd"8GK<ɴ k7\E){xnԴT[I\0bJ4eǑ#)޽{)##A?PbSGdIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/tab-close-active-clam-dark.gif0000644000076600000240000000007214730022736023162 0ustar00aivarannamaastaffGIF89a ! ,  dLj;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/tab-close-active-clam.gif0000644000076600000240000000007214730022736022243 0ustar00aivarannamaastaffGIF89a ! ,  dLj;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/tab-close-active.gif0000644000076600000240000000007214730022736021331 0ustar00aivarannamaastaffGIF89a ! , { dLj;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/tab-close-clam.gif0000644000076600000240000000151214730022736020772 0ustar00aivarannamaastaffGIF89a 3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ! , ' HT@2OY& N4"Ə;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/res/tab-close.gif0000644000076600000240000000151214730022736020060 0ustar00aivarannamaastaffGIF89a 3f++3+f+++UU3UfUUU3f3f3fՙ3f3333f3333+3+33+f3+3+3+3U3U33Uf3U3U3U3333f3333333f3333333f3ՙ333333f333ff3ffffff+f+3f+ff+f+f+fUfU3fUffUfUfUff3fffffff3fffffff3fffՙffff3fffff3f̙++3+f++̙+UU3UfUU̙U3f̙3f̙3fՙ̙3f̙3f++3+f+++UU3UfUUÙ̀3̀f̪̪̀̀̀3̪f̪̪̪3fՙ! , ' HT@2OY& N4"Ə;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/terminal.png0000644000076600000240000000123414417536743020054 0ustar00aivarannamaastaffPNG  IHDRabKGD pHYs  tIME %F)IDAT8}KTQ?w|3*dA W\E6jA`6JEb-%¢4P#+}_gF-s?{稡81Tbl9qgzǏMzN3uOޱ^,_7O[̦N?M$m=)/!"xqxIyAὣB?BDyYὔ@my uZ465$x%@lח 7 8vD3 y9K!Im&J%x!ë7/Gam~A@m @)]/yVˏP po'' ))W;E:KW/(x7>S:9.JqJBR((n Qo>B]#p67mll4(!aFEkb'Z5hYY)hi 䗾_6d֕Q6 e5FX;$"עMIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/terminal_2x.png0000644000076600000240000000272014417536743020466 0ustar00aivarannamaastaffPNG  IHDR szzsBIT|dIDATX]E?3sv/KقH*mIȊZ5jW`b|a !"?^@ ?\kBD(Bn-l*w3gf_s=wƔ_=s3y3sOvF&JFDO^B}iqם |ͺ߼uڑU$|"^CQklKя^epxhX{,IF.Zv|s??ܘxK.9:o@tBkcL/3\a=AXhnHT$ZLLI@ /mO"BWz?v.|=Fk @n!R(?F5l4yXh q"1whm/Zq.ID:H Lq1"Y(욃>`9Kz& $f`+ ̤WU+q$bL@ i`)`XvR=f/8h4kU:KԗN1͛0hdfXBLiԫTiz>U1g-sxv0d |[oa6[/235E>ѐ6+1}ɥ9RE(j ZZ\} @DPIĘsāMח8,3CV_B00OsEG1`9WL6i!M= K81^_m;3k5 ;װyQJt,JkDDxDDeer~,} ^Uk-N1 O _z!c7lcbE#14t%ʻ}lp+HĹ 1`M y&܋{S1]W~%,@X6۴'~]1_+ثP|lYg-^X0Z#6WvHcAkݓֲHҮ Eh!HjWmW[sՆN?`=AJv DRPZ{~ wB_ĝy=_gNr4#ۯd &FYi=|0~ULM.5^K9$IZkyUɴ6]ļ44$IrOc.k.k/k?e=f6lDj9rCoHoOqNtMvRvD}L{SwQxTxUxSyTyUyTyVyWyTzR{VzWzXzOZzZzX{LZ{N[{Z{U}Z|\|Z|[|[~[~]URW_Zhccorsty€ʆϊьЕŘəȘ͝ʝ͞ˡ̞ΠϣͣΦϧΩѭּ޹پ!Created with GIMP! ,S_^WUQLB`vyrmgbM<.]wztplfVOaZw \|XYw|[keDTw +3@IR{qd Kw%&/761Hc Gзun Ew'#$,=>Ni yoFlE2,@Asѐ}i((ȝ8tAF%j(q%K ;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/thonny.ico0000644000076600000240000004041414417536743017551 0ustar00aivarannamaastaff00F  h) ,(0`VVVUUUTTT???~~~ttt222EEEdddyyyUUUjjj޵888aaa^^^oooDDDmmm444ooozzz]]]WWWuuu555CCCaaa>>>dddwww@@@;;;MMM:::dddgggSSSmmmCCC999ccckkkTTTAAAAAAQQQ```TTTYYYggg999nnnQQQfff111qqqBBBrrrHHH444UUUVVVEEEmmmoooBBBTTT222MMMQQQ𶶶www333JJJttt뙙VVVIII...aaa~~~hhhIIIrrr===UUU}}}IIIJJJlll~~~pppPPPUUU{{{YYYOOO@@@|||YYY⹹999NNN|||{{{QQQ<<<]]]```uuurrrrrrjjjQQQ<<<333333888AAA;;;~~~---===FFF[[[eee~~~bbbǵӼhhhfffaaaEEEHHHQQQvvvbbb񈈈eeepppYYYQQQOOOQQQbbbkkk[[[TTTXXXhhhkkkPPP___...KKK????????????????( @ ;;;;;;;;;;;;;;;;;;mmmmmmiiimmmiiizzziiizzzhhhzzzdddzzzdddzzzAAAzzzdddzzzdddzzz___zzzdddzzzdddzzzdddzzzdddzzzzzzdddzzzdddzzzfffdddyyydddzzzssssssssssssssssssfffdddzzzzzzdddzzzmmmjjjjjjjjjjjjjjjmmmdddzzziiizzzfffdddzzzdddzzz:::dddzzzdddzzzdddzzzhhhzzzdddyyyfffdddzzz::::::dddzzzdddzzzhhhzzz888zzz;;;mmmssssssssssssssssssssssssssssssssssssssssssfff888;;;mmmjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjmmm?    ( @???PNG  IHDR\rfIDATx_ř cYb;S`<]dp:v<89 y#$:.ҝtIĂxPS#~u޾FǕ:O:.q|vhS|$6b@^CT}2ʕ+Zl?~\MNNnslIJAD#:=TpyՖ-[ڵkՒ%K*ӧ޽{:v{"$ta:iYJ&&&pG_l.ul.٨W^mVzYu!ϫSN޿rJbs }gSw}J ccUۧި; _|QY! Br2P|rsNqFh"WFpEMPM[~ft`kBI@XוAN hko]]qEHޙMٯf*Dw$TɎaÆ9A۷`94h']u<{ M!T"x饗J=fhO6o9/@_ӱ[ RB;N `Yuv}K,58"@2AB@i !'C@`u@ҹ_=8dIqPPF`:+g:}Yʟs?gXT3i@m {ZzO/ge"+V|`P+6@j#On/,H oAyɤҷ࣏>R\rI'jؓo[nԓ'{zgJ=Bؓc-ARG@ {D'@dRx=N((M2z[vFYG#cb:r {RrRxDn"M:' l/GѦ;:=8 .wz? طh"ɥC9 KߓjjjLwd { PS~c {r)P 3,k-Ɖ 5<*W80 2 :K :k0 `GGu С  2Nt :8\ Wu A `A3#*@D#W@xg;Y9^H"ؑ@' *@D)4"3X~@= 2M)YA  `GS.Y {@d ;R@ct)@d ;@1 2ŐD"A P )@d ;@1 S{ᓭ>3j4RbDdֱIǭ:nбL4Nz̢*y[g[|_ǫ:8I `Ŋر,?' #K)pݼ|$V@Ez"ԲeJ=^J'''THktkƥ4h'W[lQk׮UKٳСCjǎw)/&8?`q AVZo߮e] +j֭C+Ѹ@n.l";:Ez+gΜQ<:p@:Qͬ@vdlL5\V^~auM7նϧ|/`Gf]J=>i!>|aLNju+ur@;wN v@<u+u TJH@~0'.urn*ϟ[ou{.wo9u+c]@!̅ O. }'.[hϞ=;0ĉj͚5R) {@dv .[T:!_~j޽jtt4 -cҥFO0`@ijXi`2vak}cӪF'OT^{%V@ybQzk tUf``@>|Ǹ{_^D7@ybQzؚzUV@y2םM6Jf7@y2gr)g}}}]Ȥnzd|GYgpU&! 0#3|||\t}B fMQpM(B`F\ޓ4 <111F9L8&#^lj'Ԛ5kok!dgzS6lP:uJ۷OvڄXlr,!! 0:~M8&'dKBrm ;^Աt ##& 6Rm򬎻 {TNbޑ&@nl񨎫{<5pœ܃Xw& ;F?q0Z:>=ľ#5M "bޑ$@'ؑ$ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 agKYIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/thonny.png0000644000076600000240000001201614417536743017560 0ustar00aivarannamaastaffPNG  IHDR\rfIDATx_ř cYb;S`<]dp:v<89 y#$:.ҝtIĂxPS#~u޾FǕ:O:.q|vhS|$6b@^CT}2ʕ+Zl?~\MNNnslIJAD#:=TpyՖ-[ڵkՒ%K*ӧ޽{:v{"$ta:iYJ&&&pG_l.ul.٨W^mVzYu!ϫSN޿rJbs }gSw}J ccUۧި; _|QY! Br2P|rsNqFh"WFpEMPM[~ft`kBI@XוAN hko]]qEHޙMٯf*Dw$TɎaÆ9A۷`94h']u<{ M!T"x饗J=fhO6o9/@_ӱ[ RB;N `Yuv}K,58"@2AB@i !'C@`u@ҹ_=8dIqPPF`:+g:}Yʟs?gXT3i@m {ZzO/ge"+V|`P+6@j#On/,H oAyɤҷ࣏>R\rI'jؓo[nԓ'{zgJ=Bؓc-ARG@ {D'@dRx=N((M2z[vFYG#cb:r {RrRxDn"M:' l/GѦ;:=8 .wz? طh"ɥC9 KߓjjjLwd { PS~c {r)P 3,k-Ɖ 5<*W80 2 :K :k0 `GGu С  2Nt :8\ Wu A `A3#*@D#W@xg;Y9^H"ؑ@' *@D)4"3X~@= 2M)YA  `GS.Y {@d ;R@ct)@d ;@1 2ŐD"A P )@d ;@1 S{ᓭ>3j4RbDdֱIǭ:nбL4Nz̢*y[g[|_ǫ:8I `Ŋر,?' #K)pݼ|$V@Ez"ԲeJ=^J'''THktkƥ4h'W[lQk׮UKٳСCjǎw)/&8?`q AVZo߮e] +j֭C+Ѹ@n.l";:Ez+gΜQ<:p@:Qͬ@vdlL5\V^~auM7նϧ|/`Gf]J=>i!>|aLNju+ur@;wN v@<u+u TJH@~0'.urn*ϟ[ou{.wo9u+c]@!̅ O. }'.[hϞ=;0ĉj͚5R) {@dv .[T:!_~j޽jtt4 -cҥFO0`@ijXi`2vak}cӪF'OT^{%V@ybQzk tUf``@>|Ǹ{_^D7@ybQzؚzUV@y2םM6Jf7@y2gr)g}}}]Ȥnzd|GYgpU&! 0#3|||\t}B fMQpM(B`F\ޓ4 <111F9L8&#^lj'Ԛ5kok!dgzS6lP:uJ۷OvڄXlr,!! 0:~M8&'dKBrm ;^Աt ##& 6Rm򬎻 {TNbޑ&@nl񨎫{<5pœ܃Xw& ;F?q0Z:>=ľ#5M "bޑ$@'ؑ$ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 a@ A $ H0 agKYIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/thonny_small.ico0000644000076600000240000000157614417536743020747 0ustar00aivarannamaastaffh( ``???././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/res/zoom.png0000644000076600000240000000072414417536743017230 0ustar00aivarannamaastaffPNG  IHDRaIDATx^?AaƯsLJ> h0Ȩ̊d0`S(jc${zN2~u:yx~ ~OXk`Od2eYr|ŽaԸzN s=QV"z6E`0@:]/ TUv;vWZ"064@:1/ bQiBzT9kĀR1z1q:$HМ.T*qEٔn74#N m4nJ%t]4vh&f3 4|d2.&3PB@xT^AOSw_.n/ +|>uph @uF d.l6 X J./3B8x'3jcya#IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/roughparse.py0000644000076600000240000010173114730041235017457 0ustar00aivarannamaastaff"""Facilities for learning the structure of incomplete Python code Mostly copied/adapted from idlelib.HyperParser and idlelib.PyParse """ import re import string from collections.abc import Mapping from keyword import iskeyword from typing import Dict # @UnusedImport NUM_CONTEXT_LINES = (50, 500, 5000000) # Reason last stmt is continued (or C_NONE if it's not). (C_NONE, C_BACKSLASH, C_STRING_FIRST_LINE, C_STRING_NEXT_LINES, C_BRACKET) = range(5) # Find what looks like the start of a popular stmt. _synchre = re.compile( r""" ^ [ \t]* (?: while | else | def | return | assert | break | class | continue | elif | try | except | raise | import | yield ) \b """, re.VERBOSE | re.MULTILINE, ).search # Match blank line or non-indenting comment line. _junkre = re.compile( r""" [ \t]* (?: \# \S .* )? \n """, re.VERBOSE, ).match # Match any flavor of string; the terminating quote is optional # so that we're robust in the face of incomplete program text. _match_stringre = re.compile( r""" \""" [^"\\]* (?: (?: \\. | "(?!"") ) [^"\\]* )* (?: \""" )? | " [^"\\\n]* (?: \\. [^"\\\n]* )* "? | ''' [^'\\]* (?: (?: \\. | '(?!'') ) [^'\\]* )* (?: ''' )? | ' [^'\\\n]* (?: \\. [^'\\\n]* )* '? """, re.VERBOSE | re.DOTALL, ).match # Match a line that starts with something interesting; # used to find the first item of a bracket structure. _itemre = re.compile( r""" [ \t]* [^\s#\\] # if we match, m.end()-1 is the interesting char """, re.VERBOSE, ).match # Match start of stmts that should be followed by a dedent. _closere = re.compile( r""" \s* (?: return | break | continue | raise | pass ) \b """, re.VERBOSE, ).match # Chew up non-special chars as quickly as possible. If match is # successful, m.end() less 1 is the index of the last boring char # matched. If match is unsuccessful, the string starts with an # interesting char. _chew_ordinaryre = re.compile( r""" [^[\](){}#'"\\]+ """, re.VERBOSE, ).match class StringTranslatePseudoMapping(Mapping): r"""Utility class to be used with str.translate() This Mapping class wraps a given dict. When a value for a key is requested via __getitem__() or get(), the key is looked up in the given dict. If found there, the value from the dict is returned. Otherwise, the default value given upon initialization is returned. This allows using str.translate() to make some replacements, and to replace all characters for which no replacement was specified with a given character instead of leaving them as-is. For example, to replace everything except whitespace with 'x': >>> whitespace_chars = ' \t\n\r' >>> preserve_dict = {ord(c): ord(c) for c in whitespace_chars} >>> mapping = StringTranslatePseudoMapping(preserve_dict, ord('x')) >>> text = "a + b\tc\nd" >>> text.translate(mapping) 'x x x\tx\nx' """ def __init__(self, non_defaults, default_value): self._non_defaults = non_defaults self._default_value = default_value def _get(key, _get=non_defaults.get, _default=default_value): return _get(key, _default) self._get = _get def __getitem__(self, item): return self._get(item) def __len__(self): return len(self._non_defaults) def __iter__(self): return iter(self._non_defaults) def get(self, key, default=None): return self._get(key) class RoughParser: def __init__(self, indent_width, tabwidth): self.indent_width = indent_width self.tabwidth = tabwidth def set_str(self, s): assert len(s) == 0 or s[-1] == "\n" self.str = s self.study_level = 0 # Return index of a good place to begin parsing, as close to the # end of the string as possible. This will be the start of some # popular stmt like "if" or "def". Return None if none found: # the caller should pass more prior context then, if possible, or # if not (the entire program text up until the point of interest # has already been tried) pass 0 to set_lo. # # This will be reliable iff given a reliable is_char_in_string # function, meaning that when it says "no", it's absolutely # guaranteed that the char is not in a string. def find_good_parse_start(self, is_char_in_string=None, _synchre=_synchre): # pylint: disable=redefined-builtin str, pos = self.str, None # @ReservedAssignment if not is_char_in_string: # no clue -- make the caller pass everything return None # Peek back from the end for a good place to start, # but don't try too often; pos will be left None, or # bumped to a legitimate synch point. limit = len(str) for _ in range(5): i = str.rfind(":\n", 0, limit) if i < 0: break i = str.rfind("\n", 0, i) + 1 # start of colon line m = _synchre(str, i, limit) if m and not is_char_in_string(m.start()): pos = m.start() break limit = i if pos is None: # Nothing looks like a block-opener, or stuff does # but is_char_in_string keeps returning true; most likely # we're in or near a giant string, the colorizer hasn't # caught up enough to be helpful, or there simply *aren't* # any interesting stmts. In any of these cases we're # going to have to parse the whole thing to be sure, so # give it one last try from the start, but stop wasting # time here regardless of the outcome. m = _synchre(str) if m and not is_char_in_string(m.start()): pos = m.start() return pos # Peeking back worked; look forward until _synchre no longer # matches. i = pos + 1 while 1: m = _synchre(str, i) if m: s, i = m.span() if not is_char_in_string(s): pos = s else: break return pos # Throw away the start of the string. Intended to be called with # find_good_parse_start's result. def set_lo(self, lo): assert lo == 0 or self.str[lo - 1] == "\n" if lo > 0: self.str = self.str[lo:] # Build a translation table to map uninteresting chars to 'x', open # brackets to '(', close brackets to ')' while preserving quotes, # backslashes, newlines and hashes. This is to be passed to # str.translate() in _study1(). _tran1 = {} # type: Dict[int, int] _tran1.update((ord(c), ord("(")) for c in "({[") _tran1.update((ord(c), ord(")")) for c in ")}]") _tran1.update((ord(c), ord(c)) for c in "\"'\\\n#") _tran = StringTranslatePseudoMapping(_tran1, default_value=ord("x")) # As quickly as humanly possible , find the line numbers (0- # based) of the non-continuation lines. # Creates self.{goodlines, continuation}. def _study1(self): # pylint: disable=redefined-builtin if self.study_level >= 1: return self.study_level = 1 # Map all uninteresting characters to "x", all open brackets # to "(", all close brackets to ")", then collapse runs of # uninteresting characters. This can cut the number of chars # by a factor of 10-40, and so greatly speed the following loop. str = ( self.str.translate(self._tran) # @ReservedAssignment .replace("xxxxxxxx", "x") .replace("xxxx", "x") .replace("xx", "x") .replace("xx", "x") .replace("\nx", "\n") ) # note that replacing x\n with \n would be incorrect, because # x may be preceded by a backslash # March over the squashed version of the program, accumulating # the line numbers of non-continued stmts, and determining # whether & why the last stmt is a continuation. continuation = C_NONE level = lno = 0 # level is nesting level; lno is line number self.goodlines = goodlines = [0] push_good = goodlines.append i, n = 0, len(str) while i < n: ch = str[i] i = i + 1 # cases are checked in decreasing order of frequency if ch == "x": continue if ch == "\n": lno = lno + 1 if level == 0: push_good(lno) # else we're in an unclosed bracket structure continue if ch == "(": level = level + 1 continue if ch == ")": if level: level = level - 1 # else the program is invalid, but we can't complain continue if ch == '"' or ch == "'": # consume the string quote = ch if str[i - 1 : i + 2] == quote * 3: quote = quote * 3 firstlno = lno w = len(quote) - 1 i = i + w while i < n: ch = str[i] i = i + 1 if ch == "x": continue if str[i - 1 : i + w] == quote: i = i + w break if ch == "\n": lno = lno + 1 if w == 0: # unterminated single-quoted string # It doesn't matter if we're in brackets, # this should lead to # SyntaxError: EOL while scanning string literal level = 0 push_good(lno) break continue if ch == "\\": assert i < n if str[i] == "\n": lno = lno + 1 i = i + 1 continue # else comment char or paren inside string else: # didn't break out of the loop, so we're still # inside a string if (lno - 1) == firstlno: # before the previous \n in str, we were in the first # line of the string continuation = C_STRING_FIRST_LINE else: continuation = C_STRING_NEXT_LINES continue # with outer loop if ch == "#": # consume the comment i = str.find("\n", i) assert i >= 0 continue assert ch == "\\" assert i < n if str[i] == "\n": lno = lno + 1 if i + 1 == n: continuation = C_BACKSLASH i = i + 1 # The last stmt may be continued for all 3 reasons. # String continuation takes precedence over bracket # continuation, which beats backslash continuation. if ( continuation != C_STRING_FIRST_LINE and continuation != C_STRING_NEXT_LINES and level > 0 ): continuation = C_BRACKET self.continuation = continuation # Push the final line number as a sentinel value, regardless of # whether it's continued. assert (continuation == C_NONE) == (goodlines[-1] == lno) if goodlines[-1] != lno: push_good(lno) def get_continuation_type(self): self._study1() return self.continuation # study1 was sufficient to determine the continuation status, # but doing more requires looking at every character. study2 # does this for the last interesting statement in the block. # Creates: # self.stmt_start, stmt_end # slice indices of last interesting stmt # self.stmt_bracketing # the bracketing structure of the last interesting stmt; # for example, for the statement "say(boo) or die", stmt_bracketing # will be [(0, 0), (3, 1), (8, 0)]. Strings and comments are # treated as brackets, for the matter. # self.lastch # last non-whitespace character before optional trailing # comment # self.lastopenbracketpos # if continuation is C_BRACKET, index of last open bracket def _study2(self): # pylint: disable=redefined-builtin if self.study_level >= 2: return self._study1() self.study_level = 2 # Set p and q to slice indices of last interesting stmt. str, goodlines = self.str, self.goodlines # @ReservedAssignment i = len(goodlines) - 1 p = len(str) # index of newest line while i: assert p # p is the index of the stmt at line number goodlines[i]. # Move p back to the stmt at line number goodlines[i-1]. q = p for _ in range(goodlines[i - 1], goodlines[i]): # @UnusedVariable # tricky: sets p to 0 if no preceding newline p = str.rfind("\n", 0, p - 1) + 1 # The stmt str[p:q] isn't a continuation, but may be blank # or a non-indenting comment line. if _junkre(str, p): i = i - 1 else: break if i == 0: # nothing but junk! assert p == 0 q = p self.stmt_start, self.stmt_end = p, q # Analyze this stmt, to find the last open bracket (if any) # and last interesting character (if any). lastch = "" stack = [] # stack of open bracket indices push_stack = stack.append bracketing = [(p, 0)] while p < q: # suck up all except ()[]{}'"#\\ m = _chew_ordinaryre(str, p, q) if m: # we skipped at least one boring char newp = m.end() # back up over totally boring whitespace i = newp - 1 # index of last boring char while i >= p and str[i] in " \t\n": i = i - 1 if i >= p: lastch = str[i] p = newp if p >= q: break ch = str[p] if ch in "([{": push_stack(p) bracketing.append((p, len(stack))) lastch = ch p = p + 1 continue if ch in ")]}": if stack: del stack[-1] lastch = ch p = p + 1 bracketing.append((p, len(stack))) continue if ch == '"' or ch == "'": # consume string # Note that study1 did this with a Python loop, but # we use a regexp here; the reason is speed in both # cases; the string may be huge, but study1 pre-squashed # strings to a couple of characters per line. study1 # also needed to keep track of newlines, and we don't # have to. bracketing.append((p, len(stack) + 1)) lastch = ch p = _match_stringre(str, p, q).end() bracketing.append((p, len(stack))) continue if ch == "#": # consume comment and trailing newline bracketing.append((p, len(stack) + 1)) p = str.find("\n", p, q) + 1 assert p > 0 bracketing.append((p, len(stack))) continue assert ch == "\\" p = p + 1 # beyond backslash assert p < q if str[p] != "\n": # the program is invalid, but can't complain lastch = ch + str[p] p = p + 1 # beyond escaped char # end while p < q: self.lastch = lastch if stack: self.lastopenbracketpos = stack[-1] self.stmt_bracketing = tuple(bracketing) # Assuming continuation is C_BRACKET, return the number # of spaces the next line should be indented. def compute_bracket_indent(self): # pylint: disable=redefined-builtin self._study2() assert self.continuation == C_BRACKET j = self.lastopenbracketpos str = self.str # @ReservedAssignment n = len(str) origi = i = str.rfind("\n", 0, j) + 1 j = j + 1 # one beyond open bracket # find first list item; set i to start of its line while j < n: m = _itemre(str, j) if m: j = m.end() - 1 # index of first interesting char extra = 0 break else: # this line is junk; advance to next line i = j = str.find("\n", j) + 1 else: # nothing interesting follows the bracket; # reproduce the bracket line's indentation + a level j = i = origi while str[j] in " \t": j = j + 1 extra = self.indent_width return len(str[i:j].expandtabs(self.tabwidth)) + extra # Return number of physical lines in last stmt (whether or not # it's an interesting stmt! this is intended to be called when # continuation is C_BACKSLASH). def get_num_lines_in_stmt(self): self._study1() goodlines = self.goodlines return goodlines[-1] - goodlines[-2] # Assuming continuation is C_BACKSLASH, return the number of spaces # the next line should be indented. Also assuming the new line is # the first one following the initial line of the stmt. def compute_backslash_indent(self): # pylint: disable=redefined-builtin self._study2() assert self.continuation == C_BACKSLASH str = self.str # @ReservedAssignment i = self.stmt_start while str[i] in " \t": i = i + 1 startpos = i # See whether the initial line starts an assignment stmt; i.e., # look for an = operator endpos = str.find("\n", startpos) + 1 found = level = 0 while i < endpos: ch = str[i] if ch in "([{": level = level + 1 i = i + 1 elif ch in ")]}": if level: level = level - 1 i = i + 1 elif ch == '"' or ch == "'": i = _match_stringre(str, i, endpos).end() elif ch == "#": break elif ( level == 0 and ch == "=" and (i == 0 or str[i - 1] not in "=<>!") and str[i + 1] != "=" ): found = 1 break else: i = i + 1 if found: # found a legit =, but it may be the last interesting # thing on the line i = i + 1 # move beyond the = found = re.match(r"\s*\\", str[i:endpos]) is None if not found: # oh well ... settle for moving beyond the first chunk # of non-whitespace chars i = startpos while str[i] not in " \t\n": i = i + 1 return len(str[self.stmt_start : i].expandtabs(self.tabwidth)) + 1 # Return the leading whitespace on the initial line of the last # interesting stmt. def get_base_indent_string(self): self._study2() i, n = self.stmt_start, self.stmt_end j = i str_ = self.str while j < n and str_[j] in " \t": j = j + 1 return str_[i:j] # Did the last interesting stmt open a block? def is_block_opener(self): self._study2() return self.lastch == ":" # Did the last interesting stmt close a block? def is_block_closer(self): self._study2() return _closere(self.str, self.stmt_start) is not None # index of last open bracket ({[, or None if none lastopenbracketpos = None def get_last_open_bracket_pos(self): self._study2() return self.lastopenbracketpos # the structure of the bracketing of the last interesting statement, # in the format defined in _study2, or None if the text didn't contain # anything stmt_bracketing = None def get_last_stmt_bracketing(self): self._study2() return self.stmt_bracketing # all ASCII chars that may be in an identifier _ASCII_ID_CHARS = frozenset(string.ascii_letters + string.digits + "_") # all ASCII chars that may be the first char of an identifier _ASCII_ID_FIRST_CHARS = frozenset(string.ascii_letters + "_") # lookup table for whether 7-bit ASCII chars are valid in a Python identifier _IS_ASCII_ID_CHAR = [(chr(x) in _ASCII_ID_CHARS) for x in range(128)] # lookup table for whether 7-bit ASCII chars are valid as the first # char in a Python identifier _IS_ASCII_ID_FIRST_CHAR = [(chr(x) in _ASCII_ID_FIRST_CHARS) for x in range(128)] class HyperParser: """Provide advanced parsing abilities for ParenMatch and other extensions. HyperParser uses PyParser. PyParser mostly gives information on the proper indentation of code. HyperParser gives additional information on the structure of code. """ def __init__(self, text, index): "To initialize, analyze the surroundings of the given index." self.text = text parser = RoughParser(text.indent_width, text.tabwidth) def index2line(index): return int(float(index)) lno = index2line(text.index(index)) for context in NUM_CONTEXT_LINES: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" stopatindex = "%d.end" % lno # We add the newline because PyParse requires a newline # at end. We add a space so that index won't be at end # of line, so that its status will be the same as the # char before it, if should. parser.set_str(text.get(startatindex, stopatindex) + " \n") bod = parser.find_good_parse_start(_build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break parser.set_lo(bod or 0) # We want what the parser has, minus the last newline and space. self.rawtext = parser.str[:-2] # Parser.str apparently preserves the statement we are in, so # that stopatindex can be used to synchronize the string with # the text box indices. self.stopatindex = stopatindex self.bracketing = parser.get_last_stmt_bracketing() # find which pairs of bracketing are openers. These always # correspond to a character of rawtext. self.isopener = [ i > 0 and self.bracketing[i][1] > self.bracketing[i - 1][1] for i in range(len(self.bracketing)) ] self.set_index(index) def set_index(self, index): """Set the index to which the functions relate. The index must be in the same statement. """ indexinrawtext = len(self.rawtext) - len(self.text.get(index, self.stopatindex)) if indexinrawtext < 0: raise ValueError("Index %s precedes the analyzed statement" % index) self.indexinrawtext = indexinrawtext # find the rightmost bracket to which index belongs self.indexbracket = 0 while ( self.indexbracket < len(self.bracketing) - 1 and self.bracketing[self.indexbracket + 1][0] < self.indexinrawtext ): self.indexbracket += 1 if ( self.indexbracket < len(self.bracketing) - 1 and self.bracketing[self.indexbracket + 1][0] == self.indexinrawtext and not self.isopener[self.indexbracket + 1] ): self.indexbracket += 1 def is_in_string(self): """Is the index given to the HyperParser in a string?""" # The bracket to which we belong should be an opener. # If it's an opener, it has to have a character. return self.isopener[self.indexbracket] and self.rawtext[ self.bracketing[self.indexbracket][0] ] in ('"', "'") def is_in_code(self): """Is the index given to the HyperParser in normal code?""" return not self.isopener[self.indexbracket] or self.rawtext[ self.bracketing[self.indexbracket][0] ] not in ("#", '"', "'") def get_surrounding_brackets(self, openers="([{", mustclose=False): """Return bracket indexes or None. If the index given to the HyperParser is surrounded by a bracket defined in openers (or at least has one before it), return the indices of the opening bracket and the closing bracket (or the end of line, whichever comes first). If it is not surrounded by brackets, or the end of line comes before the closing bracket and mustclose is True, returns None. """ bracketinglevel = self.bracketing[self.indexbracket][1] before = self.indexbracket while ( not self.isopener[before] or self.rawtext[self.bracketing[before][0]] not in openers or self.bracketing[before][1] > bracketinglevel ): before -= 1 if before < 0: return None bracketinglevel = min(bracketinglevel, self.bracketing[before][1]) after = self.indexbracket + 1 while after < len(self.bracketing) and self.bracketing[after][1] >= bracketinglevel: after += 1 beforeindex = self.text.index( "%s-%dc" % (self.stopatindex, len(self.rawtext) - self.bracketing[before][0]) ) if after >= len(self.bracketing) or self.bracketing[after][0] > len(self.rawtext): if mustclose: return None afterindex = self.stopatindex else: # We are after a real char, so it is a ')' and we give the # index before it. afterindex = self.text.index( "%s-%dc" % (self.stopatindex, len(self.rawtext) - (self.bracketing[after][0] - 1)) ) return beforeindex, afterindex # the set of built-in identifiers which are also keywords, # i.e. keyword.iskeyword() returns True for them _ID_KEYWORDS = frozenset({"True", "False", "None"}) @classmethod def _eat_identifier(cls, s, limit, pos): """Given a string and pos, return the number of chars in the identifier which ends at pos, or 0 if there is no such one. This ignores non-identifier eywords are not identifiers. """ is_ascii_id_char = _IS_ASCII_ID_CHAR # Start at the end (pos) and work backwards. i = pos # Go backwards as long as the characters are valid ASCII # identifier characters. This is an optimization, since it # is faster in the common case where most of the characters # are ASCII. while i > limit and (ord(s[i - 1]) < 128 and is_ascii_id_char[ord(s[i - 1])]): i -= 1 # If the above loop ended due to reaching a non-ASCII # character, continue going backwards using the most generic # test for whether a string contains only valid identifier # characters. if i > limit and ord(s[i - 1]) >= 128: while i - 4 >= limit and ("a" + s[i - 4 : pos]).isidentifier(): i -= 4 if i - 2 >= limit and ("a" + s[i - 2 : pos]).isidentifier(): i -= 2 if i - 1 >= limit and ("a" + s[i - 1 : pos]).isidentifier(): i -= 1 # The identifier candidate starts here. If it isn't a valid # identifier, don't eat anything. At this point that is only # possible if the first character isn't a valid first # character for an identifier. if not s[i:pos].isidentifier(): return 0 elif i < pos: # All characters in str[i:pos] are valid ASCII identifier # characters, so it is enough to check that the first is # valid as the first character of an identifier. if not _IS_ASCII_ID_FIRST_CHAR[ord(s[i])]: return 0 # All keywords are valid identifiers, but should not be # considered identifiers here, except for True, False and None. if i < pos and (iskeyword(s[i:pos]) and s[i:pos] not in cls._ID_KEYWORDS): return 0 return pos - i # This string includes all chars that may be in a white space _whitespace_chars = " \t\n\\" def get_expression(self): """Return a string with the Python expression which ends at the given index, which is empty if there is no real one. """ if not self.is_in_code(): raise ValueError("get_expression should only be called" "if index is inside a code.") rawtext = self.rawtext bracketing = self.bracketing brck_index = self.indexbracket brck_limit = bracketing[brck_index][0] pos = self.indexinrawtext last_identifier_pos = pos postdot_phase = True while 1: # Eat whitespaces, comments, and if postdot_phase is False - a dot while 1: if pos > brck_limit and rawtext[pos - 1] in self._whitespace_chars: # Eat a whitespace pos -= 1 elif not postdot_phase and pos > brck_limit and rawtext[pos - 1] == ".": # Eat a dot pos -= 1 postdot_phase = True # The next line will fail if we are *inside* a comment, # but we shouldn't be. elif ( pos == brck_limit and brck_index > 0 and rawtext[bracketing[brck_index - 1][0]] == "#" ): # Eat a comment brck_index -= 2 brck_limit = bracketing[brck_index][0] pos = bracketing[brck_index + 1][0] else: # If we didn't eat anything, quit. break if not postdot_phase: # We didn't find a dot, so the expression end at the # last identifier pos. break ret = self._eat_identifier(rawtext, brck_limit, pos) if ret: # There is an identifier to eat pos = pos - ret last_identifier_pos = pos # Now, to continue the search, we must find a dot. postdot_phase = False # (the loop continues now) elif pos == brck_limit: # We are at a bracketing limit. If it is a closing # bracket, eat the bracket, otherwise, stop the search. level = bracketing[brck_index][1] while brck_index > 0 and bracketing[brck_index - 1][1] > level: brck_index -= 1 if bracketing[brck_index][0] == brck_limit: # We were not at the end of a closing bracket break pos = bracketing[brck_index][0] brck_index -= 1 brck_limit = bracketing[brck_index][0] last_identifier_pos = pos if rawtext[pos] in "([": # [] and () may be used after an identifier, so we # continue. postdot_phase is True, so we don't allow a dot. pass else: # We can't continue after other types of brackets if rawtext[pos] in "'\"": # Scan a string prefix while pos > 0 and rawtext[pos - 1] in "rRbBuU": pos -= 1 last_identifier_pos = pos break else: # We've found an operator or something. break return rawtext[last_identifier_pos : self.indexinrawtext] def _is_char_in_string(text_index): # in idlelib.EditorWindow this used info from colorer # to speed up things, but I dont want to rely on this return 1 def _build_char_in_string_func(startindex): # copied from idlelib.EditorWindow (Python 3.4.2) # Our editwin provides a _is_char_in_string function that works # with a Tk text index, but PyParse only knows about offsets into # a string. This builds a function for PyParse that accepts an # offset. def inner(offset, _startindex=startindex, _icis=_is_char_in_string): return _icis(_startindex + "+%dc" % offset) return inner ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/rst_utils.py0000644000076600000240000004213114730022736017333 0ustar00aivarannamaastaffimport tkinter as tk import traceback from logging import getLogger from thonny import get_workbench, ui_utils from thonny.codeview import get_syntax_options_for_tag from thonny.tktextext import TweakableText from thonny.ui_utils import get_hyperlink_cursor logger = getLogger(__name__) class RstText(TweakableText): def __init__(self, master=None, cnf={}, read_only=False, **kw): super().__init__( master=master, cnf=cnf, read_only=read_only, **{ "font": "TkDefaultFont", # "cursor" : "", **kw, }, ) self.configure_tags() self._visitor = None def configure_tags(self): main_font = tk.font.nametofont("TkDefaultFont") bold_font = main_font.copy() bold_font.configure(weight="bold", size=main_font.cget("size")) italic_font = main_font.copy() italic_font.configure(slant="italic", size=main_font.cget("size")) h1_font = main_font.copy() h1_font.configure(size=main_font.cget("size") * 2, weight="bold") h2_font = main_font.copy() h2_font.configure(size=round(main_font.cget("size") * 1.5), weight="bold") h3_font = main_font.copy() h3_font.configure(size=main_font.cget("size"), weight="bold") small_font = main_font.copy() small_font.configure(size=round(main_font.cget("size") * 0.8)) small_italic_font = italic_font.copy() small_italic_font.configure(size=round(main_font.cget("size") * 0.8)) # Underline on font looks better than underline on tag underline_font = main_font.copy() underline_font.configure(underline=True) self.tag_configure("h1", font=h1_font, spacing3=5) self.tag_configure("h2", font=h2_font, spacing3=5) self.tag_configure("h3", font=h3_font, spacing3=5) self.tag_configure("p", spacing1=0, spacing3=10, spacing2=0) self.tag_configure("line_block", spacing1=0, spacing3=10, spacing2=0) self.tag_configure("em", font=italic_font) self.tag_configure("strong", font=bold_font) # TODO: hyperlink syntax options may require different background as well hyperlink_opts = get_syntax_options_for_tag("hyperlink") hyperlink_opts["underline"] = False hyperlink_opts["font"] = underline_font self.tag_configure("a", **hyperlink_opts) self.tag_configure("small", font=small_font) self.tag_configure("light", foreground="gray") self.tag_configure("remark", font=small_italic_font) self.tag_bind("a", "", self._hyperlink_enter) self.tag_bind("a", "", self._hyperlink_leave) self.tag_configure("topic_title", lmargin2=16, font=bold_font) self.tag_configure("topic_body", lmargin1=16, lmargin2=16) self.tag_configure( "code", font="TkFixedFont", # wrap="none", # TODO: needs automatic hor-scrollbar and better padding mgmt # background="#eeeeee" ) # if ui_utils.get_tk_version_info() >= (8,6,6): # self.tag_configure("code", lmargincolor=self["background"]) for i in range(1, 6): self.tag_configure("list%d" % i, lmargin1=i * 10, lmargin2=i * 10 + 10) toti_code_font = bold_font.copy() toti_code_font.configure( family=tk.font.nametofont("TkFixedFont").cget("family"), size=bold_font.cget("size") ) self.tag_configure("topic_title_code", font=toti_code_font) self.tag_raise("topic_title_code", "code") self.tag_raise("topic_title_code", "topic_title") self.tag_raise("a", "topic_title") # TODO: topic_title + em self.tag_raise("em", "topic_title") self.tag_raise("a", "em") self.tag_raise("a", "topic_body") self.tag_raise("a", "topic_title") if ui_utils.get_tk_version_info() >= (8, 6, 6): self.tag_configure("sel", lmargincolor=self["background"]) self.tag_raise("sel") def clear(self): self.direct_delete("1.0", "end") def load_rst(self, rst_source, global_tags=()): self.clear() self.append_rst(rst_source, global_tags) def append_rst(self, rst_source, global_tags=()): try: import docutils.core doc = docutils.core.publish_doctree(rst_source) doc.walkabout(self.create_visitor(doc, global_tags)) except Exception: self.direct_insert("end", "RST SOURCE:\n" + rst_source + "\n\n") self.direct_insert("end", traceback.format_exc()) # For debugging: # self.direct_insert("end", doc.pformat()) # self.direct_insert("end", rst_source) def create_visitor(self, doc, global_tags=()): # Pass unique tag count from previous visitor # to keep uniqueness if self._visitor is None: unique_tag_count = 0 else: unique_tag_count = self._visitor.unique_tag_count import docutils.nodes class TkTextRenderingVisitor(docutils.nodes.GenericNodeVisitor): def __init__(self, document, text, global_tags=(), unique_tag_count=0): super().__init__(document) self._context_tags = list(global_tags) self.text = text self.section_level = 0 self.in_topic = False self.in_paragraph = False self.in_title = False self.active_lists = [] self.unique_tag_count = unique_tag_count def visit_document(self, node): pass def visit_Text(self, node): self._append_text(self._node_to_text(node)) def visit_section(self, node): self.section_level += 1 def depart_section(self, node): self.section_level -= 1 def _get_title_tag(self): if self.in_topic: return "topic_title" else: return "h%d" % (self.section_level + 1) def visit_title(self, node): self.in_title = True self._add_tag(self._get_title_tag()) def depart_title(self, node): self.in_title = False self._append_text("\n") self._pop_tag(self._get_title_tag()) def visit_paragraph(self, node): self.in_paragraph = True if not self.active_lists: self._add_tag("p") def depart_paragraph(self, node): self.in_paragraph = False self._append_text("\n") if not self.active_lists: self._pop_tag("p") def visit_line_block(self, node): self._add_tag("line_block") def depart_line_block(self, node): self._pop_tag("line_block") def visit_line(self, node): pass def depart_line(self, node): self._append_text("\n") def visit_topic(self, node): self.in_topic = True if "toggle" in node.attributes["classes"]: return self._visit_toggle_topic(node) elif "empty" in node.attributes["classes"]: return self._visit_empty_topic(node) else: return self.default_visit(node) def _visit_toggle_topic(self, node): tag = self._create_unique_tag() title_id_tag = tag + "_title" body_id_tag = tag + "_body" def get_toggler_image_name(kind): if get_workbench().uses_dark_ui_theme(): return kind + "_light" else: return kind if "open" in node.attributes["classes"]: initial_image = get_toggler_image_name("boxminus") initial_elide = False else: initial_image = get_toggler_image_name("boxplus") initial_elide = True label = tk.Label( self.text, image=get_workbench().get_image(initial_image), borderwidth=0, background=self.text["background"], cursor="arrow", ) def toggle_body(event=None): elide = self.text.tag_cget(body_id_tag, "elide") if elide == "1": elide = True elif elide == "0": elide = False else: elide = bool(elide) elide = not elide self.text.tag_configure(body_id_tag, elide=elide) if self.text.has_selection(): self.text.tag_remove("sel", "1.0", "end") if elide: label.configure( image=get_workbench().get_image(get_toggler_image_name("boxplus")) ) else: label.configure( image=get_workbench().get_image(get_toggler_image_name("boxminus")) ) assert isinstance(node.children[0], docutils.nodes.title) # self.text.tag_bind(title_id_tag, "<1>", toggle_body, True) self._add_tag(title_id_tag) self._append_window(label) label.bind("<1>", toggle_body, True) node.children[0].walkabout(self) self._pop_tag(title_id_tag) self.text.tag_configure(body_id_tag, elide=initial_elide) self._add_tag(body_id_tag) self._add_tag("topic_body") for child in list(node.children)[1:]: child.walkabout(self) self._pop_tag("topic_body") self._pop_tag(body_id_tag) if "tight" not in node.attributes["classes"]: self._append_text("\n") raise docutils.nodes.SkipNode() def _visit_empty_topic(self, node): img = get_workbench().get_image( "boxdot_light" if get_workbench().uses_dark_ui_theme() else "boxdot" ) label = tk.Label( self.text, image=img, borderwidth=0, background=self.text["background"], cursor="arrow", ) self._append_window(label) assert isinstance(node.children[0], docutils.nodes.title) node.children[0].walkabout(self) if "tight" not in node.attributes["classes"]: self._append_text("\n") raise docutils.nodes.SkipNode() def depart_topic(self, node): # only for non-toggle topics self.in_topic = False self._append_text("\n") def visit_image(self, node): self._append_image(node.attributes["uri"]) if not self.in_paragraph and not self.in_title: self._append_text("\n") def visit_reference(self, node): tag = self._create_unique_tag() node.unique_tag = tag self._add_tag("a") self._add_tag(tag) def handle_click(event): get_workbench().open_url(node.attributes["refuri"]) self.text.tag_bind(tag, "", handle_click) def depart_reference(self, node): self._pop_tag("a") self._pop_tag(node.unique_tag) def visit_literal(self, node): self._add_tag("code") def depart_literal(self, node): self._pop_tag("code") def visit_inline(self, node): for cls in node.attributes["classes"]: self._add_tag(cls) def depart_inline(self, node): for cls in node.attributes["classes"]: self._pop_tag(cls) def visit_literal_block(self, node): self._add_tag("code") def depart_literal_block(self, node): self._pop_tag("code") self._append_text("\n\n") def visit_bullet_list(self, node): self.active_lists.append(node.attributes["bullet"]) def depart_bullet_list(self, node): self._append_text("\n") self.active_lists.pop() def visit_enumerated_list(self, node): self.active_lists.append(node.attributes["enumtype"]) def depart_enumerated_list(self, node): self._append_text("\n") self.active_lists.pop() def visit_list_item(self, node): if self.active_lists[-1] == "*": self._append_text("• ") elif self.active_lists[-1] == "arabic": for i, sib in enumerate(node.parent.children): if sib is node: self._append_text("%d. " % (i + 1)) break def visit_note(self, node): self._add_tag("em") def depart_note(self, node): self._pop_tag("em") def visit_target(self, node): pass def visit_substitution_definition(self, node): raise docutils.nodes.SkipNode() def visit_system_message(self, node): logger.warning("docutils message: '%s'. Context: %s" % (node.astext(), node.parent)) raise docutils.nodes.SkipNode def visit_emphasis(self, node): self._add_tag("em") def depart_emphasis(self, node): self._pop_tag("em") def visit_strong(self, node): self._add_tag("strong") def depart_strong(self, node): self._pop_tag("strong") def visit_block_quote(self, node): self._add_tag("code") def depart_block_quote(self, node): self._pop_tag("code") def default_visit(self, node): self._append_text(self._node_to_text(node)) print("skipping children", type(node), node) raise docutils.nodes.SkipChildren() def default_departure(self, node): # Pass all other nodes through. pass def _create_unique_tag(self): self.unique_tag_count += 1 return "_UT_%s" % self.unique_tag_count def _node_to_text(self, node): if node.parent.attributes.get("xml:space") == "preserve": return node.astext() else: return node.astext().replace("\r", "").replace("\n", " ") def _add_tag(self, tag): self._context_tags.append(tag) def _pop_tag(self, tag): self._context_tags.remove(tag) def _append_text(self, chars, extra_tags=()): # print("APPP", chars, tags) self.text.direct_insert("end", chars, self._get_effective_tags(extra_tags)) def _append_image(self, name, extra_tags=()): index = self.text.index("end-1c") self.text.image_create(index, image=get_workbench().get_image(name)) for tag in self._get_effective_tags(extra_tags): self.text.tag_add(tag, index) def _append_window(self, window, extra_tags=()): index = self.text.index("end-1c") self.text.window_create(index, window=window) for tag in self._get_effective_tags(extra_tags): self.text.tag_add(tag, index) def _get_effective_tags(self, extra_tags): tags = set(extra_tags) | set(self._context_tags) if self.active_lists: tags.add("list%d" % min(len(self.active_lists), 5)) # combine tags if "code" in tags and "topic_title" in tags: tags.remove("code") tags.remove("topic_title") tags.add("topic_title_code") return tuple(sorted(tags)) self._visitor = TkTextRenderingVisitor(doc, self, global_tags, unique_tag_count) return self._visitor def _hyperlink_enter(self, event): self.config(cursor=get_hyperlink_cursor()) def _hyperlink_leave(self, event): self.config(cursor="") def escape(s): return ( s.replace("\\", "\\\\") .replace("*", "\\*") .replace("`", "\\`") .replace("_", "\\_") .replace("..", "\\..") ) def create_title(text, line_symbol="="): text = text.replace("\r\n", "\n").replace("\n", " ").strip() return text + "\n" + line_symbol * len(text) + "\n" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/running.py0000644000076600000240000016142714730041235016770 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- """Code for maintaining the background process and for running user programs Commands get executed via shell, this way the command line in the shell becomes kind of title for the execution. """ import collections import os.path import re import shlex import subprocess import sys import time import tkinter as tk import traceback import warnings from abc import ABC, abstractmethod from logging import getLogger from threading import Thread from time import sleep from tkinter import messagebox, ttk from typing import Any, Callable, Dict, List, Optional, Set, Union # @UnusedImport; @UnusedImport import thonny from thonny import ( THONNY_USER_DIR, common, get_runner, get_shell, get_version, get_workbench, report_time, ) from thonny.common import ( PROCESS_ACK, BackendEvent, CommandToBackend, DebuggerCommand, DebuggerResponse, EOFCommand, InlineCommand, InlineResponse, InputSubmission, MessageFromBackend, ToplevelCommand, ToplevelResponse, UserError, is_same_path, parse_message, path_startswith, read_one_incoming_message_str, serialize_message, universal_relpath, update_system_path, ) from thonny.editors import ( extract_target_path, get_current_breakpoints, get_saved_current_script_filename, get_target_dirname_from_editor_filename, is_local_path, is_remote_path, ) from thonny.languages import tr from thonny.misc_utils import ( construct_cmd_line, inside_flatpak, running_on_mac_os, running_on_windows, show_command_not_available_in_flatpak_message, ) from thonny.ui_utils import select_sequence, show_dialog from thonny.workdlg import WorkDialog logger = getLogger(__name__) WINDOWS_EXE = "python.exe" OUTPUT_MERGE_THRESHOLD = 1000 RUN_COMMAND_LABEL = "" # init later when gettext is ready RUN_COMMAND_CAPTION = "" EDITOR_CONTENT_TOKEN = "$EDITOR_CONTENT" INTERRUPT_SEQUENCE = "" CSI_TERMINATOR = re.compile("[@-~]") OSC_TERMINATOR = re.compile(r"\a|\x1B\\") # other components may turn it on in order to avoid grouping output lines into one event io_animation_required = False _console_allocated = False BASE_MODULES = [ "_abc", "_codecs", "_collections_abc", "_distutils_hack", "_frozen_importlib", "_frozen_importlib_external", "_imp", "_io", "_signal", "_sitebuiltins", "_stat", "_thread", "_warnings", "_weakref", "_winapi", "abc", "builtins", "codecs", "encodings", "genericpath", "io", "marshal", "nt", "ntpath", "os", "site", "stat", "sys", "time", "winreg", "zipimport", ] class Runner: def __init__(self) -> None: get_workbench().set_default("run.allow_running_unnamed_programs", True) get_workbench().set_default("run.auto_cd", True) get_workbench().set_default("run.warn_module_shadowing", True) self._init_commands() self._state = "starting" self._proxy: Optional[BackendProxy] = None self._publishing_events = False self._polling_after_id = None self._postponed_commands = [] # type: List[CommandToBackend] self._last_accepted_backend_command = None def start(self) -> None: global _console_allocated try: self._check_alloc_console() _console_allocated = True except Exception: logger.exception("Problem allocating console") _console_allocated = False self.restart_backend(False, True) def _init_commands(self) -> None: global RUN_COMMAND_CAPTION, RUN_COMMAND_LABEL RUN_COMMAND_LABEL = tr("Run current script") RUN_COMMAND_CAPTION = tr("Run") get_workbench().set_default("run.run_in_terminal_python_repl", False) get_workbench().set_default("run.run_in_terminal_keep_open", True) try: import thonny.plugins.debugger # @UnusedImport debugger_available = True except ImportError: debugger_available = False get_workbench().add_command( "run_current_script", "run", RUN_COMMAND_LABEL, caption=RUN_COMMAND_CAPTION, handler=self.cmd_run_current_script, default_sequence="", extra_sequences=[select_sequence("", "")], tester=self.cmd_run_current_script_enabled, group=10, image="run-current-script", include_in_toolbar=not (get_workbench().in_simple_mode() and debugger_available), show_extra_sequences=True, ) get_workbench().add_command( "run_current_script_in_terminal", "run", tr("Run current script in terminal"), caption="RunT", handler=self._cmd_run_current_script_in_terminal, default_sequence="", extra_sequences=["<>"], tester=self._cmd_run_current_script_in_terminal_enabled, group=35, image="terminal", ) get_workbench().add_command( "restart", "run", tr("Stop/Restart backend"), caption=tr("Stop"), handler=self.cmd_stop_restart, default_sequence="", group=100, image="stop", include_in_toolbar=True, ) get_workbench().add_command( "interrupt", "run", tr("Interrupt execution"), handler=self._cmd_interrupt, tester=self._cmd_interrupt_enabled, default_sequence=INTERRUPT_SEQUENCE, skip_sequence_binding=True, # Sequence will be bound differently group=100, bell_when_denied=False, ) get_workbench().bind(INTERRUPT_SEQUENCE, self._cmd_interrupt_with_shortcut, True) get_workbench().add_command( "ctrld", "run", tr("Send EOF / Soft reboot"), self.ctrld, self.ctrld_enabled, group=100, default_sequence="", extra_sequences=["<>"], ) get_workbench().add_command( "disconnect", "run", tr("Disconnect"), self.disconnect, self.disconnect_enabled, group=100, ) def get_state(self) -> str: """State is one of "running", "waiting_debugger_command", "waiting_toplevel_command" """ return self._state def _set_state(self, state: str) -> None: if self._state != state: logger.debug("Runner state changed: %s ==> %s" % (self._state, state)) self._state = state def is_running(self): return self._state == "running" def is_waiting(self): return self._state.startswith("waiting") def is_waiting_toplevel_command(self): return self._state == "waiting_toplevel_command" def is_waiting_debugger_command(self): return self._state == "waiting_debugger_command" def get_sys_path(self) -> List[str]: return self._proxy.get_sys_path() def send_command(self, cmd: CommandToBackend) -> None: if self._proxy is None: return if self._publishing_events: # allow all event handlers to complete before sending the commands # issued by first event handlers self._postpone_command(cmd) return # First sanity check if ( isinstance(cmd, ToplevelCommand) and not self.is_waiting_toplevel_command() and cmd.name not in ["Reset", "Run", "Debug"] or isinstance(cmd, DebuggerCommand) and not self.is_waiting_debugger_command() ): get_workbench().bell() logger.warning("RUNNER: Command %s was attempted at state %s" % (cmd, self.get_state())) return # Attach extra info if "debug" in cmd.name.lower(): cmd["breakpoints"] = get_current_breakpoints() if "id" not in cmd: cmd["id"] = generate_command_id() cmd["local_cwd"] = get_workbench().get_local_cwd() if self._proxy.running_inline_command and isinstance(cmd, InlineCommand): self._postpone_command(cmd) return # Offer the command logger.debug("RUNNER Sending: %s, %s", cmd.name, cmd) response = self._proxy.send_command(cmd) if response == "discard": return None elif response == "postpone": self._postpone_command(cmd) return else: assert response is None get_workbench().event_generate("CommandAccepted", command=cmd) self._last_accepted_backend_command = cmd if isinstance(cmd, InlineCommand): self._proxy.running_inline_command = True if isinstance(cmd, (ToplevelCommand, DebuggerCommand)): self._set_state("running") if cmd.name[0].isupper(): # This may be only logical restart, which does not look like restart to the runner get_workbench().event_generate("BackendRestart", full=False) def send_command_and_wait(self, cmd: InlineCommand, dialog_title: str) -> MessageFromBackend: dlg = InlineCommandDialog(get_workbench(), cmd, title=dialog_title + " ...") show_dialog(dlg) return dlg.response def _postpone_command(self, cmd: CommandToBackend) -> None: # in case of InlineCommands, discard older same type command if isinstance(cmd, InlineCommand): for older_cmd in self._postponed_commands: if older_cmd.name == cmd.name: self._postponed_commands.remove(older_cmd) if len(self._postponed_commands) > 10: logger.warning("Can't pile up too many commands. This command will be just ignored") else: self._postponed_commands.append(cmd) def _send_postponed_commands(self) -> None: todo = self._postponed_commands self._postponed_commands = [] for cmd in todo: # logger.debug("Sending postponed command: %s", cmd) # too much spam self.send_command(cmd) def send_program_input(self, data: str) -> None: assert self.is_running() self._proxy.send_program_input(data) def execute_via_shell( self, cmd_line: Union[str, List[str]], working_directory: Optional[str] = None, ) -> None: if working_directory and self._proxy.get_cwd() != working_directory: # create compound command # start with %cd cd_cmd_line = construct_cd_command(working_directory) + "\n" else: # create simple command cd_cmd_line = "" if not isinstance(cmd_line, str): cmd_line = construct_cmd_line(cmd_line) # submit to shell (shell will execute it) get_shell().submit_magic_command(cd_cmd_line + cmd_line) def execute_script( self, script_path: str, args: List[str], working_directory: Optional[str], command_name: str = "Run", ) -> None: rel_filename = universal_relpath(script_path, working_directory) cmd_parts = ["%" + command_name, rel_filename] + args cmd_line = construct_cmd_line(cmd_parts, [EDITOR_CONTENT_TOKEN]) self.execute_via_shell(cmd_line, working_directory) def execute_editor_content(self, command_name, args): if command_name.lower() in ["debug", "fastdebug"]: messagebox.showinfo( tr("Information"), tr("For debugging the program must be saved first."), master=get_workbench(), ) return get_shell().submit_magic_command( construct_cmd_line( ["%" + command_name, "-c", EDITOR_CONTENT_TOKEN] + args, [EDITOR_CONTENT_TOKEN] ) ) def execute_current(self, command_name: str) -> None: """ This method's job is to create a command for running/debugging current file/script and submit it to shell """ if not self._proxy: return assert ( command_name[0].isupper() or command_name == "run" and not self._proxy.should_restart_interpreter_before_run() ) if not self.is_waiting_toplevel_command(): logger.info("Trying to execute current but runner is %r", self.get_state()) self._proxy.interrupt() try: self._wait_for_prompt(1) except TimeoutError: # turtle.mainloop, for example, is not easy to interrupt. get_shell().print_error("Could not interrupt current process. ") wait_instructions = "Please wait, try again or select Stop/Restart!" if self._proxy.stop_restart_kills_user_program(): get_shell().print_error("Forcing the program to stop.\n") self.cmd_stop_restart() try: self._wait_for_prompt(1) except TimeoutError: get_shell().print_error( "Could not force-stop the program. " + wait_instructions + "\n" ) else: # For some back-ends (e.g. BareMetalMicroPython) killing is not an option. # Besides, they may be configured to avoid refreshing the environment # before run (for performance reasons). get_shell().print_error(wait_instructions + "\n") return editor = get_workbench().get_editor_notebook().get_current_editor() if not editor: return UNTITLED = "" if editor.get_filename() or not get_workbench().get_option( "run.allow_running_unnamed_programs" ): if editor.get_filename() and not editor.is_modified(): # Don't attempt to save as the file may be read-only logger.debug("Not saving read only file %s", editor.get_filename()) filename = editor.get_filename() else: filename = editor.save_file() if not filename: # user has cancelled file saving return else: filename = UNTITLED if not self._proxy: # Saving the file may have killed the proxy return if ( is_remote_path(filename) and not self._proxy.can_run_remote_files() or is_local_path(filename) and not self._proxy.can_run_local_files() or filename == UNTITLED ): self.execute_editor_content(command_name, self._get_active_arguments()) else: if get_workbench().get_option("run.auto_cd") and command_name[0].isupper(): working_directory = get_target_dirname_from_editor_filename(filename) else: working_directory = self._proxy.get_cwd() if is_local_path(filename): target_path = filename else: target_path = extract_target_path(filename) self.execute_script( target_path, self._get_active_arguments(), working_directory, command_name ) def _wait_for_prompt(self, timeout) -> None: start_time = time.time() while time.time() - start_time <= timeout: if self.is_waiting_toplevel_command(): return get_workbench().update() sleep(0.01) raise TimeoutError("Backend did not respond in time") def _get_active_arguments(self): if get_workbench().get_option("view.show_program_arguments"): args_str = get_workbench().get_option("run.program_arguments") get_workbench().log_program_arguments_string(args_str) return shlex.split(args_str) else: return [] def cmd_run_current_script_enabled(self) -> bool: return ( self._proxy and get_workbench().get_editor_notebook().get_current_editor() is not None ) def _cmd_run_current_script_in_terminal_enabled(self) -> bool: return ( self._proxy and self._proxy.can_run_in_terminal() and self.cmd_run_current_script_enabled() ) def cmd_run_current_script(self) -> None: if get_workbench().in_simple_mode(): get_workbench().hide_view("VariablesView") report_time("Before Run") if self._proxy and self._proxy.should_restart_interpreter_before_run(): self.execute_current("Run") else: self.execute_current("run") report_time("After Run") def _cmd_run_current_script_in_terminal(self) -> None: if inside_flatpak(): show_command_not_available_in_flatpak_message() return filename = get_saved_current_script_filename() if not filename: return self._proxy.run_script_in_terminal( filename, self._get_active_arguments(), get_workbench().get_option("run.run_in_terminal_python_repl"), get_workbench().get_option("run.run_in_terminal_keep_open"), ) def _cmd_interrupt(self) -> None: if self._proxy is not None: if _console_allocated: self._proxy.interrupt() else: messagebox.showerror( "No console", "Can't interrupt as console was not allocated.\n\nUse Stop/Restart instead.", master=self, ) else: logger.warning("User tried interrupting without proxy") def _cmd_interrupt_with_shortcut(self, event=None): if not self._cmd_interrupt_enabled(): return None if not running_on_mac_os(): # on Mac Ctrl+C is not used for Copy. # Disable Ctrl+C interrupt in editor and shell, when some text is selected # (assuming user intended to copy instead of interrupting) widget = get_workbench().focus_get() if isinstance(widget, tk.Text): if len(widget.tag_ranges("sel")) > 0: # this test is reliable, unlike selection_get below return None elif isinstance(widget, (tk.Listbox, ttk.Entry, tk.Entry, tk.Spinbox)): try: # NB! On Linux, selection_get() gives X selection # i.e. it may be from another application when Thonny has nothing selected selection = widget.selection_get() if isinstance(selection, str) and len(selection) > 0: # Assuming user meant to copy, not interrupt # (IDLE seems to follow same logic) # NB! This is not perfect, as in Linux the selection can be in another app # ie. there may be no selection in Thonny actually. # In other words, Ctrl+C interrupt may be dropped without reason # when given inside the widgets listed above. return None except Exception: # widget either doesn't have selection_get or it # gave error (can happen without selection on Ubuntu) pass self._cmd_interrupt() return "break" def _cmd_interrupt_enabled(self) -> bool: return self._proxy and self._proxy.is_connected() def cmd_stop_restart(self) -> None: if get_workbench().in_simple_mode(): get_workbench().hide_view("VariablesView") self.restart_backend(clean=True) def disconnect(self): proxy = self.get_backend_proxy() assert hasattr(proxy, "disconnect") proxy.disconnect() def disconnect_enabled(self): return hasattr(self.get_backend_proxy(), "disconnect") def ctrld(self): proxy = self.get_backend_proxy() if not proxy: return if get_shell().has_pending_input(): messagebox.showerror( "Can't perform this action", "Ctrl+D only has effect on an empty line / prompt.\n" + "Submit current input (press ENTER) and try again", master=get_workbench(), ) return proxy.send_command(EOFCommand()) self._set_state("running") def ctrld_enabled(self): proxy = self.get_backend_proxy() return proxy and proxy.is_connected() def _poll_backend_messages(self) -> None: """I chose polling instead of event_generate in listener thread, because event_generate across threads is not reliable http://www.thecodingforums.com/threads/more-on-tk-event_generate-and-threads.359615/ """ self._polling_after_id = None if self._pull_backend_messages() is False: return self._polling_after_id = get_workbench().after(20, self._poll_backend_messages) def _pull_backend_messages(self): # Don't process too many messages in single batch, allow screen updates # and user actions between batches. # Mostly relevant when backend prints a lot quickly. msg_count = 0 max_msg_count = 10 while self._proxy is not None and msg_count < max_msg_count: try: msg = self._proxy.fetch_next_message() if not msg: break logger.debug( "RUNNER GOT: %s, %s in state: %s", msg.event_type, msg, self.get_state() ) msg_count += 1 except BackendTerminatedError as exc: self._handle_backend_termination(exc.returncode) return False # change state if isinstance(msg, ToplevelResponse): self._set_state("waiting_toplevel_command") elif isinstance(msg, DebuggerResponse): self._set_state("waiting_debugger_command") elif isinstance(msg, InlineResponse): # next inline command won't be sent before response from the last has arrived self._proxy.running_inline_command = False else: "other messages don't affect the state" # Publish the event # NB! This may cause another command to be sent before we get to postponed commands. try: self._publishing_events = True class_event_type = type(msg).__name__ get_workbench().event_generate(class_event_type, event=msg) # more general event if msg.event_type != class_event_type: # more specific event get_workbench().event_generate(msg.event_type, event=msg) finally: self._publishing_events = False # TODO: is it necessary??? # https://stackoverflow.com/a/13520271/261181 # get_workbench().update() self._send_postponed_commands() def _handle_backend_termination(self, returncode: int) -> None: err = f"Process ended with exit code {returncode}." try: faults_file = os.path.join(THONNY_USER_DIR, "backend_faults.log") if os.path.exists(faults_file): with open(faults_file, encoding="ASCII", errors="replace") as fp: err += fp.read() except Exception: logger.exception("Failed retrieving backend faults") get_workbench().event_generate("ProgramOutput", stream_name="stderr", data="\n" + err) get_workbench().become_active_window(False) self.destroy_backend() if self._should_restart_after_command(self._last_accepted_backend_command): self.restart_backend(clean=True, automatic=True) def _should_restart_after_command(self, cmd: CommandToBackend): if cmd is None or not hasattr(cmd, "name"): return False return cmd.name in ["Run", "run", "Debug", "debug", "execute_source"] def restart_backend(self, clean: bool, first: bool = False, automatic: bool = False) -> None: """Recreate (or replace) backend proxy / backend process.""" was_running = self.is_running() self.destroy_backend() self._last_accepted_backend_command = None backend_name = get_workbench().get_option("run.backend_name") if backend_name not in get_workbench().get_backends(): raise UserError( f"Unknown interpreter kind '{backend_name}'. Please select another interpreter from options" ) backend_class = get_workbench().get_backends()[backend_name].proxy_class self._set_state("running") self._proxy = None self._proxy = backend_class(clean) self._poll_backend_messages() if not first: get_shell().restart(automatic=automatic, was_running=was_running) get_shell().update_idletasks() get_workbench().event_generate("BackendRestart", full=True) def destroy_backend(self, for_restart: bool = False) -> None: if self._polling_after_id is not None: get_workbench().after_cancel(self._polling_after_id) self._polling_after_id = None self._postponed_commands = [] if self._proxy: self._proxy.destroy(for_restart=for_restart) self._proxy = None get_workbench().event_generate("BackendTerminated") def get_backend_proxy(self) -> "BackendProxy": return self._proxy def _check_alloc_console(self) -> None: if sys.executable.endswith("pythonw.exe"): # These don't have console allocated. # Console is required for sending interrupts. # AllocConsole would be easier but flashes console window import ctypes kernel32 = ctypes.WinDLL("kernel32", use_last_error=True) exe = sys.executable.replace("pythonw.exe", "python.exe") cmd = [exe, "-c", "print('Hi!'); input()"] child = subprocess.Popen( cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, ) child.stdout.readline() result = kernel32.AttachConsole(child.pid) if not result: err = ctypes.get_last_error() logger.info("Could not allocate console. Error code: " + str(err)) child.stdin.write(b"\n") try: child.stdin.flush() except Exception: # May happen eg. when installation path has "&" in it # See https://bitbucket.org/plas/thonny/issues/508/cant-allocate-windows-console-when # Without flush the console window becomes visible, but Thonny can be still used logger.exception("Problem with finalizing console allocation") def ready_for_remote_file_operations(self, show_message=False): if not self._proxy or not self.supports_remote_files(): return False ready = self._proxy.ready_for_remote_file_operations() if not ready and show_message: if not self._proxy.is_connected(): msg = "Device is not connected" else: msg = ( "Device is busy -- can't perform this action now." + "\nPlease wait or cancel current work and try again!" ) messagebox.showerror("Can't complete", msg, master=get_workbench()) return ready def supports_remote_files(self): if self._proxy is None: return False else: return self._proxy.supports_remote_files() def supports_remote_directories(self): if self._proxy is None: return False else: return self._proxy.supports_remote_directories() def get_node_label(self): if self._proxy is None: return "Back-end" else: return self._proxy.get_node_label() def using_venv(self) -> bool: from thonny.plugins.cpython_frontend import LocalCPythonProxy from thonny.plugins.cpython_ssh.cps_front import SshCPythonProxy return ( isinstance(self._proxy, (LocalCPythonProxy, SshCPythonProxy)) and self._proxy._in_venv ) class BackendProxy(ABC): """Communicates with backend process. All communication methods must be non-blocking, ie. suitable for calling from GUI thread.""" # backend_name will be overwritten on Workbench.add_backend # Subclasses don't need to worry about it. backend_name = None backend_description = None def __init__(self, clean: bool) -> None: """Initializes (or starts the initialization of) the backend process. Backend is considered ready when the runner gets a ToplevelResponse with attribute "welcome_text" from fetch_next_message. """ self.running_inline_command = False @abstractmethod def send_command(self, cmd: CommandToBackend) -> Optional[str]: """Send the command to backend. Return None, 'discard' or 'postpone'""" @abstractmethod def send_program_input(self, data: str) -> None: """Send input data to backend""" @abstractmethod def fetch_next_message(self): """Read next message from the queue or None if queue is empty""" @abstractmethod def get_sys_path(self): "backend's sys.path" ... def get_backend_name(self): return type(self).backend_name def get_pip_gui_class(self): return None @abstractmethod def interrupt(self): """Tries to interrupt current command without resetting the backend""" ... @abstractmethod def destroy(self, for_restart: bool = False): """Called when Thonny no longer needs this instance (Thonny gets closed or new backend gets selected) """ ... @abstractmethod def is_connected(self): ... @abstractmethod def has_local_interpreter(self): ... @abstractmethod def get_target_executable(self) -> Optional[str]: """Returns `sys.executable` if the interpreter has it.""" def get_node_label(self): """Used as files caption if back-end has separate files, also when choosing file save target""" return "Back-end" def get_full_label(self): return self.get_node_label() def supports_remote_files(self): """Whether remote file browser should be presented with this back-end""" return False def uses_local_filesystem(self): """Whether it runs code from local files""" return True def should_restart_interpreter_before_run(self) -> bool: return True def stop_restart_kills_user_program(self) -> bool: return True def supports_remote_directories(self): return False def supports_trash(self): return True def can_run_remote_files(self): raise NotImplementedError() def can_run_local_files(self): raise NotImplementedError() @abstractmethod def can_debug(self) -> bool: ... def ready_for_remote_file_operations(self): return False def get_cwd(self) -> Optional[str]: return None @abstractmethod def get_current_switcher_configuration(self) -> Dict[str, Any]: """returns the dict of configuration entries that distinguish current backend conf from other items in the backend switcher. Also used for collecting last used configurations.""" @classmethod @abstractmethod def get_switcher_configuration_label(cls, conf: Dict[str, Any]) -> str: """Formats configuration for menu item""" @classmethod @abstractmethod def get_switcher_entries(cls): """ Each returned entry creates one item in the backend switcher menu. """ @abstractmethod def can_run_in_terminal(self) -> bool: ... def run_script_in_terminal(self, script_path, args, interactive, keep_open): raise NotImplementedError() def has_custom_system_shell(self): return False def open_custom_system_shell(self) -> None: raise NotImplementedError() class SubprocessProxy(BackendProxy, ABC): def __init__(self, clean: bool, mgmt_executable: Optional[str] = None) -> None: super().__init__(clean) if mgmt_executable: self._mgmt_executable = mgmt_executable else: self._mgmt_executable = get_front_interpreter_for_subprocess() if ".." in self._mgmt_executable: self._mgmt_executable = os.path.normpath(self._mgmt_executable) self._welcome_text = "" self._proc = None self._response_queue = None self._sys_path = [] self._usersitepackages = None self._externally_managed = None self._reported_executable = None self._gui_update_loop_id = None self._in_venv = None self._cwd = self._get_initial_cwd() # pylint: disable=assignment-from-none self._start_background_process(clean=clean) self._have_check_remembered_current_configuration = False def _check_remember_current_configuration(self) -> None: current_configuration = self.get_current_switcher_configuration() if not self._should_remember_configuration(current_configuration): return last_configurations = self.get_last_configurations() if current_configuration in last_configurations: last_configurations.remove(current_configuration) last_configurations.insert(0, current_configuration) # remove non-valid last_configurations = [ conf for conf in last_configurations if self.is_valid_configuration(conf) ] # Remember only last 5 last_configurations = last_configurations[:5] self.set_last_configurations(last_configurations) def _should_remember_configuration(self, configuration: Dict[str, Any]) -> bool: return True @classmethod def get_last_configurations(cls) -> List[Dict]: return get_workbench().get_option(f"{cls.backend_name}.last_configurations") @classmethod def set_last_configurations(cls, value: List[Dict[str, Any]]) -> None: return get_workbench().set_option(f"{cls.backend_name}.last_configurations", value) @classmethod @abstractmethod def is_valid_configuration(cls, conf: Dict[str, Any]) -> bool: """Returns whether it makes sense to present this configuration in the switcher""" ... def _get_initial_cwd(self): return None def _get_environment(self): env = get_environment_for_python_subprocess(self._mgmt_executable) # variables controlling communication with the back-end process env["PYTHONIOENCODING"] = "utf-8" # because cmd line option -u won't reach child processes # see https://github.com/thonny/thonny/issues/808 env["PYTHONUNBUFFERED"] = "1" # Let back-end know about plug-ins env["THONNY_USER_DIR"] = THONNY_USER_DIR env["THONNY_FRONTEND_SYS_PATH"] = repr(sys.path) env["THONNY_LANGUAGE"] = get_workbench().get_option("general.language") env["THONNY_VERSION"] = get_version() if thonny.in_debug_mode(): env["THONNY_DEBUG"] = "1" elif "THONNY_DEBUG" in env: del env["THONNY_DEBUG"] return env def _start_background_process(self, clean=None, extra_args=[]): # deque, because in one occasion I need to put messages back self._response_queue = collections.deque() if not os.path.exists(self._mgmt_executable): get_shell().print_error( f"Interpreter {self._mgmt_executable!r} not found.\nPlease select another!" ) return cmd_line = ( [ self._mgmt_executable, "-u", # unbuffered IO "-B", # don't write pyo/pyc files # (to avoid problems when using different Python versions without write permissions) ] + self._get_launcher_with_args() + extra_args ) if self.can_be_isolated(): cmd_line.insert(1, "-s") creationflags = 0 if running_on_windows(): creationflags = subprocess.CREATE_NEW_PROCESS_GROUP logger.info("Starting the backend: %s %s", cmd_line, get_workbench().get_local_cwd()) self._proc = subprocess.Popen( cmd_line, executable=cmd_line[0], bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self._get_launch_cwd(), env=self._get_environment(), universal_newlines=True, creationflags=creationflags, encoding="utf-8", ) # read success acknowledgement ack = self._proc.stdout.readline() # setup asynchronous output listeners Thread(target=self._listen_stdout, args=(self._proc.stdout,), daemon=True).start() Thread(target=self._listen_stderr, args=(self._proc.stderr,), daemon=True).start() # only attempt initial input if process started nicely, # otherwise can't read the error from stderr if ack.strip() == PROCESS_ACK: self._send_initial_input() else: get_shell().print_error( f"INTERNAL ERROR, got {ack!r} instead of {PROCESS_ACK!r}\n---\n" ) def _send_initial_input(self) -> None: # Used for sending data sending for startup, which can't be send by other means # (e.g. don't want the password to end up in logs) pass def _get_launch_cwd(self): return get_workbench().get_local_cwd() def _get_launcher_with_args(self): raise NotImplementedError() def send_command(self, cmd: CommandToBackend) -> Optional[str]: """Send the command to backend. Return None, 'discard' or 'postpone'""" if isinstance(cmd, ToplevelCommand) and cmd.name[0].isupper(): self._prepare_clean_launch() logger.info("Prepared clean state for executing %r", cmd) if isinstance(cmd, ToplevelCommand): # required by SshCPythonBackend for creating fresh target process cmd["expected_cwd"] = self._cwd method_name = "_cmd_" + cmd.name if hasattr(self, method_name): getattr(self, method_name)(cmd) else: self._send_msg(cmd) def _send_msg(self, msg): if not self._proc: logger.warning("Ignoring command without active backend process") return self._proc.stdin.write(serialize_message(msg) + "\n") self._proc.stdin.flush() def _prepare_clean_launch(self): pass def send_program_input(self, data): self._send_msg(InputSubmission(data)) def process_is_alive(self): return self._proc is not None and self._proc.poll() is None def is_terminated(self): return not self.process_is_alive() def is_connected(self): return self.process_is_alive() def get_sys_path(self): return self._sys_path def destroy(self, for_restart: bool = False): self._close_backend() def _close_backend(self): if self._proc is not None and self._proc.poll() is None: logger.info("Killing backend process") self._proc.kill() self._proc = None self._response_queue = None def _listen_stdout(self, stdout): # will be called from separate thread # allow self._response_queue to be replaced while processing message_queue = self._response_queue def publish_as_msg(data): msg = parse_message(data) if "cwd" in msg: self.cwd = msg["cwd"] message_queue.append(msg) if len(message_queue) > 10: # Probably backend runs an infinite/long print loop. # Throttle message throughput in order to keep GUI thread responsive. while len(message_queue) > 0: sleep(0.005) while True: try: data = read_one_incoming_message_str(stdout.readline) except IOError: # TODO: What's this ??? sleep(0.1) continue # debug("... read some stdout data", repr(data)) if data == "": logger.info("Reader got EOF") break else: try: publish_as_msg(data) except Exception: # Can mean the line was from subprocess, # which can't be captured by stream faking. # NB! If subprocess printed it without linebreak, # then the suffix can be thonny message parts = data.rsplit(common.MESSAGE_MARKER, maxsplit=1) # print first part as it is message_queue.append( BackendEvent("ProgramOutput", data=parts[0], stream_name="stdout") ) if len(parts) == 2: second_part = common.MESSAGE_MARKER + parts[1] try: publish_as_msg(second_part) except Exception: # just print ... message_queue.append( BackendEvent( "ProgramOutput", data=second_part, stream_name="stdout" ) ) def _listen_stderr(self, stderr): while True: data = read_one_incoming_message_str(stderr.readline) if data == "": break else: self._response_queue.append( BackendEvent("ProgramOutput", stream_name="stderr", data=data) ) def _store_state_info(self, msg): if "cwd" in msg: self._cwd = msg["cwd"] self._publish_cwd(msg["cwd"]) if msg.get("welcome_text"): self._welcome_text = msg["welcome_text"] if "in_venv" in msg: self._in_venv = msg["in_venv"] if "sys_path" in msg: self._sys_path = msg["sys_path"] if "usersitepackages" in msg: self._usersitepackages = msg["usersitepackages"] if "externally_managed" in msg: self._externally_managed = msg["externally_managed"] if "prefix" in msg: self._sys_prefix = msg["prefix"] if "exe_dirs" in msg: self._exe_dirs = msg["exe_dirs"] if msg.get("executable"): self._reported_executable = msg["executable"] def _publish_cwd(self, cwd): if self.uses_local_filesystem(): get_workbench().set_local_cwd(cwd) def get_site_packages(self): # NB! site.sitepackages may not be present in virtualenv for d in self._sys_path: if d.endswith("site-packages") and path_startswith(d, self._sys_prefix): return d return None def get_user_site_packages(self): return self._usersitepackages def is_externally_managed(self): return self._externally_managed or False def get_cwd(self): return self._cwd def get_exe_dirs(self): return self._exe_dirs def can_be_isolated(self) -> bool: """Says whether the backend may be launched with -I switch""" return True def fetch_next_message(self): if not self._response_queue or len(self._response_queue) == 0: if self.is_terminated(): raise BackendTerminatedError(self._proc.returncode if self._proc else None) else: return None msg = self._response_queue.popleft() if isinstance(msg, ToplevelResponse): self._store_state_info(msg) if not self._have_check_remembered_current_configuration: self._check_remember_current_configuration() self._have_check_remembered_current_configuration = True if msg.event_type == "ProgramOutput": # combine available small output messages to one single message, # in order to put less pressure on UI code wait_time = 0.01 total_wait_time = 0 while True: if len(self._response_queue) == 0: if _ends_with_incomplete_ansi_code(msg["data"]) and total_wait_time < 0.1: # Allow reader to send the remaining part sleep(wait_time) total_wait_time += wait_time continue else: return msg else: next_msg = self._response_queue.popleft() if ( next_msg.event_type == "ProgramOutput" and next_msg["stream_name"] == msg["stream_name"] and ( len(msg["data"]) + len(next_msg["data"]) <= OUTPUT_MERGE_THRESHOLD and ("\n" not in msg["data"] or not io_animation_required) or _ends_with_incomplete_ansi_code(msg["data"]) ) ): msg["data"] += next_msg["data"] else: # not to be sent in the same block, put it back self._response_queue.appendleft(next_msg) return msg else: return msg def _ends_with_incomplete_ansi_code(data): pos = max(data.rfind("\033["), data.rfind("\033]")) if pos == -1: return False if len(data) < 3: return True # note CSI_TERMINATOR also includes [ params_and_terminator = data[pos + 2 :] if data[1] == "[": return not CSI_TERMINATOR.search(params_and_terminator) elif data[1] == "]": return not OSC_TERMINATOR.search(params_and_terminator) def create_frontend_python_process( args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, environment_extras: Optional[Dict[str, str]] = None, ): """Used for running helper commands (eg. for installing plug-ins on by the plug-ins)""" if _console_allocated: python_exe = get_front_interpreter_for_subprocess().replace("pythonw.exe", "python.exe") else: python_exe = get_front_interpreter_for_subprocess().replace("python.exe", "pythonw.exe") env = get_environment_for_python_subprocess(python_exe) env["PYTHONIOENCODING"] = "utf-8" env["PYTHONUNBUFFERED"] = "1" if environment_extras is not None: env.update(environment_extras) return _create_python_process(python_exe, args, stdin, stdout, stderr, env=env) def _create_python_process( python_exe, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False, env=None, universal_newlines=True, ): cmd = [python_exe] + args if running_on_windows(): creationflags = subprocess.CREATE_NEW_PROCESS_GROUP startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW else: startupinfo = None creationflags = 0 proc = subprocess.Popen( cmd, stdin=stdin, stdout=stdout, stderr=stderr, shell=shell, env=env, universal_newlines=universal_newlines, startupinfo=startupinfo, creationflags=creationflags, ) proc.cmd = cmd return proc class BackendTerminatedError(Exception): def __init__(self, returncode=None): Exception.__init__(self) self.returncode = returncode def is_venv_interpreter_of_current_interpreter(executable): for location in ["..", "."]: cfg_path = os.path.join(os.path.dirname(executable), location, "pyvenv.cfg") if os.path.isfile(cfg_path): with open(cfg_path) as fp: content = fp.read() for line in content.splitlines(): if line.replace(" ", "").startswith("home="): _, home = line.split("=", maxsplit=1) home = home.strip() if os.path.isdir(home) and ( is_same_path(home, sys.prefix) or is_same_path(home, os.path.join(sys.prefix, "bin")) or is_same_path(home, os.path.join(sys.prefix, "Scripts")) ): return True return False def get_environment_for_python_subprocess(target_executable) -> Dict[str, str]: overrides = get_environment_overrides_for_python_subprocess(target_executable) return get_environment_with_overrides(overrides) def get_environment_with_overrides(overrides): env = os.environ.copy() for key in overrides: if overrides[key] is None and key in env: del env[key] else: assert isinstance(overrides[key], str) if key.upper() == "PATH": update_system_path(env, overrides[key]) else: env[key] = overrides[key] return env def get_environment_overrides_for_python_subprocess(target_executable): """Take care of not not confusing different interpreter with variables meant for bundled interpreter""" # At the moment I'm tweaking the environment only if current # exe is bundled for Thonny. # In remaining cases it is user's responsibility to avoid # calling Thonny with environment which may be confusing for # different Pythons called in a subprocess. this_executable = sys.executable.replace("pythonw.exe", "python.exe") target_executable = target_executable.replace("pythonw.exe", "python.exe") interpreter_specific_keys = [ "TCL_LIBRARY", "TK_LIBRARY", "LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH", "SSL_CERT_DIR", "SSL_CERT_FILE", "PYTHONHOME", "PYTHONPATH", "PYTHONNOUSERSITE", "PYTHONUSERBASE", ] result = {} if os.path.samefile( target_executable, this_executable ) or is_venv_interpreter_of_current_interpreter(target_executable): # bring out some important variables so that they can # be explicitly set in macOS Terminal # (If they are set then it's most likely because current exe is in Thonny bundle) for key in interpreter_specific_keys: if key in os.environ: result[key] = os.environ[key] # never pass some variables to different interpreter # (even if it's venv or symlink to current one) if not is_same_path(target_executable, this_executable): for key in ["PYTHONPATH", "PYTHONHOME", "PYTHONNOUSERSITE", "PYTHONUSERBASE"]: if key in os.environ: result[key] = None else: # interpreters are not related # interpreter specific keys most likely would confuse other interpreter for key in interpreter_specific_keys: if key in os.environ: result[key] = None # some keys should be never passed for key in [ "PYTHONSTARTUP", "PYTHONBREAKPOINT", "PYTHONDEBUG", "PYTHONNOUSERSITE", "PYTHONASYNCIODEBUG", ]: if key in os.environ: result[key] = None # venv may not find (correct) Tk without assistance (eg. in Ubuntu) if is_venv_interpreter_of_current_interpreter(target_executable): try: if "TCL_LIBRARY" not in os.environ or "TK_LIBRARY" not in os.environ: result["TCL_LIBRARY"] = get_workbench().tk.exprstring("$tcl_library") result["TK_LIBRARY"] = get_workbench().tk.exprstring("$tk_library") except Exception: logger.exception("Can't compute Tcl/Tk library location") return result def construct_cd_command(path) -> str: return construct_cmd_line(["%cd", path]) _command_id_counter = 0 def generate_command_id(): global _command_id_counter _command_id_counter += 1 return "cmd_" + str(_command_id_counter) class InlineCommandDialog(WorkDialog): def __init__( self, master, cmd: Union[InlineCommand, Callable], title, instructions=None, output_prelude=None, autostart=True, ): self.response = None self._title = title self._instructions = instructions if "id" not in cmd: cmd["id"] = generate_command_id() self._cmd = cmd self.returncode = None get_shell().set_ignore_program_output(True) get_workbench().bind("InlineResponse", self._on_response, True) get_workbench().bind("InlineProgress", self._on_progress, True) get_workbench().bind("ProgramOutput", self._on_output, True) get_workbench().bind("BackendTerminated", self._on_backend_terminated, True) super().__init__(master, autostart=autostart) if output_prelude: self.append_text(output_prelude) def get_title(self): return self._title def get_instructions(self) -> Optional[str]: return self._instructions or self._cmd.get("description", "Working...") def _on_response(self, response): if response.get("command_id") == getattr(self._cmd, "id"): logger.debug("Dialog got response: %s", response) self.response = response self.returncode = response.get("returncode", None) success = ( not self.returncode and not response.get("error") and not response.get("errors") ) if success: self.set_action_text("Done!") else: self.set_action_text("Error") if response.get("error"): self.append_text("Error %s\n" % response["error"], stream_name="stderr") if response.get("errors"): self.append_text("Errors %s\n" % response["errors"], stream_name="stderr") if self.returncode: self.append_text( "Process returned with code %s\n" % self.returncode, stream_name="stderr" ) self.report_done(success) def _on_backend_terminated(self, msg): self.set_action_text("Error!") self.response = dict(error="Backend terminated") self.report_done(False) def _on_progress(self, msg): if msg.get("command_id") != getattr(self._cmd, "id"): return if msg.get("value", None) is not None and msg.get("maximum", None) is not None: self.report_progress(msg["value"], msg["maximum"]) if msg.get("description"): self.set_action_text(msg["description"]) def _on_output(self, msg): stream_name = msg.get("stream_name", "stdout") self.append_text(msg["data"], stream_name) self.set_action_text_smart(msg["data"]) def start_work(self): self.send_command_to_backend() def send_command_to_backend(self): if not isinstance(self._cmd, CommandToBackend): # it was a lazy definition try: self._cmd = self._cmd() except Exception as e: logger.error("Could not produce command for backend", self._cmd) self.set_action_text("Error!") self.append_text("Could not produce command for backend\n") self.append_text("".join(traceback.format_exc()) + "\n") self.report_done(False) return logger.debug("Starting command in dialog: %s", self._cmd) get_runner().send_command(self._cmd) def cancel_work(self): super(InlineCommandDialog, self).cancel_work() get_runner()._cmd_interrupt() def close(self): get_workbench().unbind("InlineResponse", self._on_response) get_workbench().unbind("InlineProgress", self._on_progress) super(InlineCommandDialog, self).close() get_shell().set_ignore_program_output(False) def get_frontend_python(): # TODO: deprecated (name can be misleading) warnings.warn("get_frontend_python is deprecated") return get_front_interpreter_for_subprocess(sys.executable) def get_front_interpreter_for_subprocess(candidate=None): if candidate is None: candidate = sys.executable pythonw = candidate.replace("python.exe", "pythonw.exe") if not _console_allocated and os.path.exists(pythonw): return pythonw else: return candidate.replace("pythonw.exe", "python.exe") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/shell.py0000644000076600000240000023421114730041235016407 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import os.path import re import tkinter as tk import traceback from logging import getLogger from tkinter import ttk from typing import cast from _tkinter import TclError from thonny import get_runner, get_shell, get_workbench, memory, roughparse, running, ui_utils from thonny.codeview import SyntaxText, get_syntax_options_for_tag, perform_python_return from thonny.common import ( OBJECT_LINK_END, OBJECT_LINK_START, REPL_PSEUDO_FILENAME, STRING_PSEUDO_FILENAME, InlineCommand, ToplevelCommand, ToplevelResponse, ) from thonny.languages import tr from thonny.misc_utils import construct_cmd_line, parse_cmd_line from thonny.running import EDITOR_CONTENT_TOKEN from thonny.tktextext import TextFrame, TweakableText, index2line from thonny.ui_utils import ( CommonDialog, EnhancedTextWithLogging, TextMenu, create_tooltip, ems_to_pixels, get_beam_cursor, get_hyperlink_cursor, lookup_style_option, replace_unsupported_chars, scrollbar_style, select_sequence, show_dialog, tr_btn, ) OBJECT_INFO_START_REGEX_STR = re.escape(OBJECT_LINK_START).replace("%d", r"-?\d+") OBJECT_INFO_START_REGEX = re.compile(OBJECT_INFO_START_REGEX_STR) OBJECT_INFO_END_REGEX_STR = re.escape(OBJECT_LINK_END) OBJECT_INFO_END_REGEX = re.compile(OBJECT_INFO_END_REGEX_STR) logger = getLogger(__name__) _CLEAR_SHELL_DEFAULT_SEQ = select_sequence("", "") # NB! Don't add parens without refactoring split procedure! TERMINAL_CONTROL_REGEX_STR = r"\x1B\[[0-?]*[ -/]*[@-~]|[\a\b\r]|\x1B\].+?(?:\a|\x1B\\)" TERMINAL_CONTROL_REGEX = re.compile(TERMINAL_CONTROL_REGEX_STR) OUTPUT_SPLIT_REGEX = re.compile( "(%s|%s|%s)" % (TERMINAL_CONTROL_REGEX_STR, OBJECT_INFO_START_REGEX_STR, OBJECT_INFO_END_REGEX_STR) ) NUMBER_SPLIT_REGEX = re.compile(r"((? str: result = tr("Shell") if self._osc_title: result += " • " + replace_unsupported_chars(self._osc_title) return result def set_osc_title(self, text: str) -> None: self._osc_title = text if not hasattr(self, "home_widget"): logger.warning("No home widget") return container = cast(ttk.Frame, getattr(self, "home_widget")) notebook = cast(ttk.Notebook, container.master) # Should update tab text only if the tab is present for tab in notebook.winfo_children(): try: if container == tab: notebook.tab(container, text=self.get_tab_text()) except TclError: logger.exception("Could not update tab title") def init_plotter(self): self.plotter = None get_workbench().set_default("view.show_plotter", False) get_workbench().set_default("view.shell_sash_position", 400) self.plotter_visibility_var = get_workbench().get_variable("view.show_plotter") def can_toggle(): return self.winfo_ismapped() get_workbench().add_command( "toggle_plotter", "view", tr("Plotter"), self.toggle_plotter, can_toggle, flag_name="view.show_plotter", group=11, ) self.update_plotter_visibility(True) def set_ignore_program_output(self, value): self.text._ignore_program_output = value def toggle_plotter(self): self.plotter_visibility_var.set(not self.plotter_visibility_var.get()) self.update_plotter_visibility() def update_plotter_visibility(self, initializing_shell_view=False): if self.plotter_visibility_var.get(): self.show_plotter(initializing_shell_view) else: self.hide_plotter() def show_plotter(self, initializing_shell_view=False): if not initializing_shell_view: get_workbench().show_view("ShellView", True) if self.plotter is None: self.plotter = PlotterCanvas(self, self.text) if not self.plotter.winfo_ismapped(): self.add(self.plotter, minsize=100) self.sash_place(0, get_workbench().get_option("view.shell_sash_position"), 0) running.io_animation_required = True self.update_plotter() def hide_plotter(self): if self.plotter is None or not self.plotter.winfo_ismapped(): return else: self.remove(self.plotter) running.io_animation_required = False def set_notice(self, text): if text is None: self.notice.grid_forget() else: self.notice["text"] = text if not self.notice.winfo_ismapped(): self.notice.grid(row=0, column=1, columnspan=2, sticky="nsew", pady=(0, 1)) # height of the text was reduced so adjust the scrolling # self.update() self.text.see("end") def print_error(self, txt): self.text._insert_text_directly(txt, ("io", "stderr")) self.text.see("end") def insert_command_link(self, txt, handler): self.text._insert_command_link(txt, handler) def focus_set(self): self.text.focus_set() def submit_python_code(self, cmd_line): self.text.submit_command(cmd_line, ()) def submit_magic_command(self, cmd_line): if isinstance(cmd_line, list): cmd_line = construct_cmd_line(cmd_line) if not cmd_line.endswith("\n"): cmd_line += "\n" self.text.submit_command(cmd_line, ("magic",)) def restart(self, automatic: bool = False, was_running: bool = False): self.text.restart(automatic, was_running) def clear_shell(self): self.text._clear_shell() def has_pending_input(self): return self.text.has_pending_input() def report_exception(self, prelude=None, conclusion=None): if prelude is not None: self.text.direct_insert("end", prelude + "\n", ("stderr",)) self.text.direct_insert("end", traceback.format_exc() + "\n", ("stderr",)) if conclusion is not None: self.text.direct_insert("end", conclusion + "\n", ("stderr",)) def set_scrollbar(self, *args): self.vert_scrollbar.set(*args) self.update_plotter() def text_deleted(self, event): if event.text_widget == self.text: self.update_plotter() def text_inserted(self, event): if ( event.text_widget == self.text and "\n" in event.text # only when scrollbar doesn't move, because otherwise # the update gets triggered by scrollbar anyway and self.vert_scrollbar.get() == (0.0, 1.0) ): self.update_plotter() def update_plotter(self): if self.plotter is not None and self.plotter.winfo_ismapped(): self.plotter.update_plot() def update_tabs(self): self.text.update_tabs() def resize_plotter(self): if len(self.panes()) > 1 and self.text.winfo_width() > 5: get_workbench().set_option("view.shell_sash_position", self.sash_coord(0)[0]) class ShellMenu(TextMenu): def __init__(self, target, view): self.view = view TextMenu.__init__(self, target) def add_extra_items(self): self.add_separator() self.add_command(label=tr("Clear"), command=self.text._clear_shell) def toggle_from_menu(): # I don't like that Tk menu toggles checbutton variable # automatically before calling the handler. # So I revert the toggle before calling the actual handler. # This way the handler doesn't have to worry whether it # needs to toggle the variable or not, and it can choose to # decline the toggle. self.view.plotter_visibility_var.set(not self.view.plotter_visibility_var.get()) self.view.toggle_plotter() self.add_checkbutton( label=tr("Show Plotter"), command=toggle_from_menu, variable=self.view.plotter_visibility_var, ) def selection_is_read_only(self): return not self.text.selection_is_writable() class BaseShellText(EnhancedTextWithLogging, SyntaxText): """Passive version of ShellText. Used also for preview""" def __init__(self, master, view=None, **kw): self.view = view self._ignore_program_output = False self._link_handler_count = 0 self._last_main_file = None kw["tabstyle"] = "wordprocessor" kw["cursor"] = get_beam_cursor() super().__init__(master, **kw) self._command_history = ( [] ) # actually not really history, because each command occurs only once self._command_history_current_index = None # logs of IO events for current toplevel block # (enables undoing and redoing the events) self._applied_io_events = [] self._queued_io_events = [] self._images = set() self._ansi_foreground = None self._ansi_background = None self._ansi_inverse = False self._ansi_intensity = None self._ansi_italic = False self._ansi_underline = False self._ansi_conceal = False self._ansi_strikethrough = False self._io_cursor_offset = 0 self._squeeze_buttons = set() self.update_tty_mode() self.bind("", self._arrow_up, True) self.bind("", self._arrow_down, True) self.bind("", self._text_key_press, True) self.bind("", self._text_key_release, True) prompt_font = tk.font.nametofont("BoldEditorFont") x_padding = 4 welcome_vert_spacing = x_padding io_vert_spacing = 10 io_indent = 16 + x_padding self.io_indent = io_indent code_indent = prompt_font.measure(">>> ") + x_padding self.tag_configure("command", lmargin1=code_indent, lmargin2=code_indent) self.tag_configure( "io", lmargin1=io_indent, lmargin2=io_indent, rmargin=io_indent, font="IOFont" ) self.update_margin_color() self.tag_configure("after_io_or_value", spacing1=io_vert_spacing) self.tag_configure("before_io", spacing3=io_vert_spacing) self.tag_configure("prompt", lmargin1=x_padding, lmargin2=x_padding) self.tag_configure("value", lmargin1=x_padding, lmargin2=x_padding) self.tag_configure("inactive_value", lmargin1=x_padding, lmargin2=x_padding) self.tag_configure("restart_line", wrap="none", lmargin1=x_padding, lmargin2=x_padding) self.tag_configure( "welcome", lmargin1=x_padding, lmargin2=x_padding, spacing1=welcome_vert_spacing, spacing3=welcome_vert_spacing, ) # Underline on the font looks better than underline on the tag, # therefore Shell doesn't use configured "hyperlink" style directly hyperlink_opts = get_syntax_options_for_tag("hyperlink").copy() if hyperlink_opts.get("underline"): hyperlink_opts["font"] = "UnderlineIOFont" del hyperlink_opts["underline"] self.tag_configure("io_hyperlink", **hyperlink_opts) self.tag_configure("stacktrace_hyperlink", **hyperlink_opts) # create 3 marks: input_start shows the place where user entered but not-yet-submitted # input starts, output_end shows the end of last output, # output_insert shows where next incoming program output should be inserted self.mark_set("input_start", "end-1c") self.mark_gravity("input_start", tk.LEFT) self.mark_set("output_end", "end-1c") self.mark_gravity("output_end", tk.LEFT) self.mark_set("output_insert", "end-1c") self.mark_gravity("output_insert", tk.RIGHT) self.mark_set("command_io_start", "1.0") self.mark_gravity("command_io_start", "left") self.active_extra_tags = [] self.update_tabs() self.tag_raise("io_hyperlink") self.tag_raise("stacktrace_hyperlink") self.tag_raise("underline") self.tag_raise("strikethrough") self.tag_raise("intense_io") self.tag_raise("italic_io") self.tag_raise("intense_italic_io") self.tag_raise("sel") def is_python_text(self): return True def submit_command(self, cmd_line, tags): # assert get_runner().is_waiting_toplevel_command() self.delete("input_start", "end") self.insert("input_start", cmd_line, tags) self.see("end") self.mark_set("insert", "end") self._try_submit_input() def _handle_input_request(self, msg): self._ensure_visible() self.focus_set() self.mark_set("insert", "end") self.tag_remove("sel", "1.0", tk.END) self._try_submit_input() # try to use leftovers from previous request self.see("end") def _handle_program_output(self, msg): if self._ignore_program_output: # This output will be handled elsewhere return # Discard but not too often, as toplevel response will discard anyway if int(float(self.index("end"))) > get_workbench().get_option("shell.max_lines") + 100: self._discard_old_content() self._ensure_visible() self._append_to_io_queue(msg.data, msg.stream_name) if not self._applied_io_events: # this is first line of io, add padding below command line self.tag_add("before_io", "output_insert -1 line linestart") self._update_visible_io(None) def _handle_toplevel_response(self, msg: ToplevelResponse) -> None: if msg.get("error"): self._ensure_visible() if "user_exception" in msg: self._show_user_exception(msg["user_exception"]) self._ensure_visible() welcome_text = msg.get("welcome_text") if welcome_text: preceding = self.get("output_insert -1 c", "output_insert") if preceding.strip() and not preceding.endswith("\n"): self._insert_text_directly("\n") self._insert_text_directly(welcome_text, ("welcome",)) self.see("end") self.mark_set("output_end", self.index("end-1c")) self._discard_old_content() self._update_visible_io(None) self._reset_ansi_attributes() self._io_cursor_offset = 0 self._insert_prompt() self._try_submit_input() # Trying to submit leftover code (eg. second magic command) self.see("end") # import os # import psutil # process = psutil.Process(os.getpid()) # print("MEM", process.memory_info().rss // (1024*1024)) def _handle_fancy_debugger_progress(self, msg): if msg.in_present or msg.io_symbol_count is None: self._update_visible_io(None) else: self._update_visible_io(msg.io_symbol_count) def _get_squeeze_threshold(self): return get_workbench().get_option("shell.squeeze_threshold") def _append_to_io_queue(self, data, stream_name): # Make sure ANSI CSI codes and object links are stored as separate events # TODO: try to complete previously submitted incomplete code parts = re.split(OUTPUT_SPLIT_REGEX, data) for part in parts: if part: # split may produce empty string in the beginning or start # split the data so that very long lines separated for block in re.split("(.{%d,})" % (self._get_squeeze_threshold() + 1), part): if block: self._queued_io_events.append((block, stream_name)) def _update_visible_io(self, target_num_visible_chars): current_num_visible_chars = sum(map(lambda x: len(x[0]), self._applied_io_events)) if ( target_num_visible_chars is not None and target_num_visible_chars < current_num_visible_chars ): # hard to undo complex renderings (squeezed texts and ANSI codes) # easier to clean everything and start again self._queued_io_events = self._applied_io_events + self._queued_io_events self._applied_io_events = [] self.direct_delete("command_io_start", "output_end") current_num_visible_chars = 0 self._reset_ansi_attributes() while self._queued_io_events and current_num_visible_chars != target_num_visible_chars: data, stream_name = self._queued_io_events.pop(0) if target_num_visible_chars is not None: leftover_count = current_num_visible_chars + len(data) - target_num_visible_chars if leftover_count > 0: # add suffix to the queue self._queued_io_events.insert(0, (data[-leftover_count:], stream_name)) data = data[:-leftover_count] self._apply_io_event(data, stream_name) current_num_visible_chars += len(data) self.mark_set("output_end", self.index("end-1c")) self.see("end") def _apply_io_event(self, data, stream_name): if not data: return original_data = data if self.tty_mode and re.match(TERMINAL_CONTROL_REGEX, data): if data == "\a": get_workbench().bell() elif data == "\b": self._change_io_cursor_offset(-1) elif data == "\r": self._change_io_cursor_offset("line") elif data.startswith("\x1B]"): self._handle_osc_sequence(data) elif data.endswith("D") or data.endswith("C"): self._change_io_cursor_offset_csi(data) elif stream_name == "stdout": # According to https://github.com/tartley/colorama/blob/master/demos/demo04.py # codes sent to stderr shouldn't affect later output in stdout # It makes sense, but Ubuntu terminal does not confirm it. # For now I'm just trimming stderr color codes self._update_ansi_attributes(data) else: logger.warning("Don't know what to do with %r" % data) elif re.match(OBJECT_INFO_START_REGEX, data): id_str = data[data.index("=") + 1 : data.index("]")] self.active_extra_tags.append("value") self.active_extra_tags.append(id_str) if get_workbench().get_option("shell.auto_inspect_values"): get_workbench().event_generate("ObjectSelect", object_id=int(id_str)) if get_workbench().in_heap_mode(): self._insert_text_directly( memory.format_object_id(int(id_str)), tuple(self.active_extra_tags) ) elif re.match(OBJECT_INFO_END_REGEX, data): try: self.active_extra_tags.pop() self.active_extra_tags.pop() except Exception as e: # This may fail, when the source code of Thonny's MP helper is printed # because of an error. logger.exception("Could not close object info", exc_info=e) elif "value" in self.active_extra_tags and get_workbench().in_heap_mode(): # id was already printed and value should be suppressed pass else: if "value" in self.active_extra_tags: tags = set(self.active_extra_tags) else: tags = set(self.active_extra_tags) | {"io", stream_name} if stream_name == "stdout" and self.tty_mode: tags |= self._get_ansi_tags() non_url_length = len(data) for url_match in SIMPLE_URL_SPLIT_REGEX.finditer(data): non_url_length -= url_match.end() - url_match.start() if ( non_url_length > self._get_squeeze_threshold() and "\n" not in data and not (data.startswith(OBJECT_LINK_START)) ): self._io_cursor_offset = 0 # ignore the effect of preceding \r and \b actual_text = data button_text = actual_text[:70] + " …" btn = tk.Label( self, text=button_text, # width=len(button_text), cursor="arrow", borderwidth=2, relief="raised", font="IOFont", ) btn.bind("<1>", lambda e: self._show_squeezed_text(btn), True) btn.contained_text = actual_text btn.tags = tags self._squeeze_buttons.add(btn) create_tooltip(btn, "%d characters squeezed. " % len(data) + "Click for details.") # TODO: refactor # (currently copied from insert_text_directly) self.mark_gravity("input_start", tk.RIGHT) self.mark_gravity("output_insert", tk.RIGHT) self.window_create("output_insert", window=btn) for tag_name in tags: self.tag_add(tag_name, "output_insert -1 chars") data = "" elif self._io_cursor_offset < 0: overwrite_len = min(len(data), -self._io_cursor_offset) if 0 <= data.find("\n") < overwrite_len: overwrite_len = data.find("\n") overwrite_data = data[:overwrite_len] self.direct_insert( "output_insert -%d chars" % -self._io_cursor_offset, overwrite_data, tuple(tags) ) del_start = self.index("output_insert -%d chars" % -self._io_cursor_offset) del_end = self.index( "output_insert -%d chars" % (-self._io_cursor_offset - overwrite_len) ) self.direct_delete(del_start, del_end) # compute leftover data to be printed normally data = data[overwrite_len:] if "\n" in data: # cursor offset doesn't apply on new line self._io_cursor_offset = 0 else: # offset becomes closer to 0 self._io_cursor_offset += overwrite_len elif self._io_cursor_offset > 0: # insert spaces before actual data # NB! Print without formatting tags self._insert_text_directly(" " * self._io_cursor_offset, ("io", stream_name)) self._io_cursor_offset = 0 if data: # if any data is still left, then this should be output normally self._insert_text_directly(data, tuple(tags)) self._applied_io_events.append((original_data, stream_name)) def _show_squeezed_text(self, button): dlg = SqueezedTextDialog(self, button) show_dialog(dlg) def _change_io_cursor_offset_csi(self, marker): ints = re.findall(INT_REGEX, marker) if len(ints) != 1: logger.warning("bad CSI cursor positioning: %s", marker) # do nothing return try: delta = int(ints[0]) except ValueError: logger.warning("bad CSI cursor positioning: %s", marker) return if marker.endswith("D"): delta = -delta self._change_io_cursor_offset(delta) def _change_io_cursor_offset(self, delta): line = self.get("output_insert linestart", "output_insert") if delta == "line": self._io_cursor_offset = -len(line) else: self._io_cursor_offset += delta if self._io_cursor_offset < -len(line): # cap self._io_cursor_offset = -len(line) def _reset_ansi_attributes(self): self._ansi_foreground = None self._ansi_background = None self._ansi_inverse = False self._ansi_intensity = None self._ansi_italic = False self._ansi_underline = False self._ansi_conceal = False self._ansi_strikethrough = False def _handle_osc_sequence(self, data: str) -> None: assert data.startswith("\x1b]") and (data.endswith("\a") or data.endswith("\x1b\\")) if data.endswith("\a"): inner = data[2:-1] else: inner = data[2:-2] # https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#window-title if inner[:2] in ["0;", "2;"]: get_shell().set_osc_title(inner[2:]) else: logger.warning("Unsupported OSC sequence %r", data) def _update_ansi_attributes(self, marker): if not marker.endswith("m"): # ignore return codes = re.findall(INT_REGEX, marker) if not codes: self._reset_ansi_attributes() while codes: code = codes.pop(0) if code == "0": self._reset_ansi_attributes() elif code in ["1", "2"]: self._ansi_intensity = code elif code == "3": self._ansi_italic = True elif code == "4": self._ansi_underline = True elif code == "7": self._ansi_inverse = True elif code == "8": self._ansi_conceal = True elif code == "9": self._ansi_strikethrough = True elif code == "22": self._ansi_intensity = None elif code == "23": self._ansi_italic = False elif code == "24": self._ansi_underline = False elif code == "27": self._ansi_inverse = False elif code == "28": self._ansi_conceal = False elif code == "29": self._ansi_strikethrough = False if code in [ "30", "31", "32", "33", "34", "35", "36", "37", "90", "91", "92", "93", "94", "95", "96", "97", ]: self._ansi_foreground = code elif code == "39": self._ansi_foreground = None elif code in [ "40", "41", "42", "43", "44", "45", "46", "47", "100", "101", "102", "103", "104", "105", "106", "107", ]: self._ansi_background = code elif code == "49": self._ansi_background = None elif code in ["38", "48"]: # multipart code, ignore for now, # but make sure all arguments are ignored if not codes: # nothing follows, ie. invalid code break mode = codes.pop(0) if mode == "5": # 256-color code, just ignore for now if not codes: break codes = codes[1:] elif mode == "2": # 24-bit code, ignore if len(codes) < 3: # invalid code break codes = codes[3:] else: # ignore other codes pass def _get_ansi_tags(self): result = set() if self._ansi_foreground: fg = ANSI_COLOR_NAMES[self._ansi_foreground[-1]] if self._ansi_intensity == "1" or self._ansi_foreground[0] == "9": fg = "bright_" + fg elif self._ansi_intensity == "2": fg = "dim_" + fg else: fg = "fore" if self._ansi_intensity == "1": fg = "bright_" + fg elif self._ansi_intensity == "2": fg = "dim_" + fg if self._ansi_background: bg = ANSI_COLOR_NAMES[self._ansi_background[-1]] if self._ansi_background.startswith("10"): bg = "bright_" + bg else: bg = "back" if self._ansi_inverse: result.add(fg + "_bg") result.add(bg + "_fg") else: if fg != "fore": result.add(fg + "_fg") if bg != "back": result.add(bg + "_bg") if self._ansi_intensity == "1" and self._ansi_italic: result.add("intense_italic_io") elif self._ansi_intensity == "1": result.add("intense_io") elif self._ansi_italic: result.add("italic_io") if self._ansi_underline: result.add("underline") if self._ansi_strikethrough: result.add("strikethrough") return result def _insert_prompt(self): # if previous output didn't put a newline, then do it now if not self.index("output_insert").endswith(".0"): self._insert_text_directly("\n", ("io",)) prompt_tags = ("toplevel", "prompt") # if previous line has value or io then add little space prev_line = self.index("output_insert - 1 lines") prev_line_tags = self.tag_names(prev_line) if "io" in prev_line_tags or "value" in prev_line_tags: prompt_tags += ("after_io_or_value",) self._insert_text_directly(">>> ", prompt_tags) self.edit_reset() def _ensure_visible(self): if self.winfo_ismapped(): return focused_view = get_workbench().focus_get() get_workbench().show_view("ShellView") if focused_view is not None: focused_view.focus() def update_tabs(self): tab_chars = 8 tab_pixels = tk.font.nametofont("IOFont").measure("n" * tab_chars) offset = self.io_indent tabs = [offset] for _ in range(20): offset += tab_pixels tabs.append(offset) self.tag_configure("io", tabs=tabs, tabstyle="wordprocessor") def restart(self, automatic: bool = False, was_running: bool = False): logger.info("BaseShellText.restart(%r)", automatic) self.set_read_only(False) if ( get_workbench().get_option("shell.clear_for_new_process") and not automatic and not was_running ): self._clear_content("end") else: if ( "restart_line" in self.tag_names("output_insert -2 chars") or not self.get("1.0", "3.0").strip() ): return self._insert_text_directly( # "\n============================== RESTART ==============================\n", "\n" + "─" * 200 + "\n", # "\n" + "═"*200 + "\n", ("magic", "restart_line"), ) self.see("end") get_shell().set_osc_title("") def intercept_insert(self, index, chars, tags=None, **kw): if tags is None: tags = () # pylint: disable=arguments-differ if self._editing_allowed() and self._in_current_input_range(index): # self._print_marks("before insert") # I want all marks to stay in place self.mark_gravity("input_start", tk.LEFT) self.mark_gravity("output_insert", tk.LEFT) if get_runner().is_waiting_toplevel_command(): tags = tags + ("toplevel", "command") else: tags = tags + ("io", "stdin") EnhancedTextWithLogging.intercept_insert(self, index, chars, tags) if not get_runner().is_waiting_toplevel_command(): if not self._applied_io_events: # tag preceding command line differently self.tag_add("before_io", "input_start -1 lines linestart") self._try_submit_input() self.see("insert") else: get_workbench().bell() def intercept_delete(self, index1, index2=None, **kw): if index1 == "sel.first" and index2 == "sel.last" and not self.has_selection(): return if ( self._editing_allowed() and self._in_current_input_range(index1) and (index2 is None or self._in_current_input_range(index2)) ): self.direct_delete(index1, index2, **kw) else: get_workbench().bell() def selection_is_writable(self): try: if not self.has_selection(): return self._in_current_input_range(self.index("insert")) else: return self._in_current_input_range( self.index("sel.first") ) and self._in_current_input_range(self.index("sel.last")) except TclError: return True def perform_return(self, event): if get_runner().is_running(): # if we are fixing the middle of the input string and pressing ENTER # then we expect the whole line to be submitted not linebreak to be inserted # (at least that's how IDLE works) self.mark_set("insert", "end") # move cursor to the end # Do the return without auto indent EnhancedTextWithLogging.perform_return(self, event) self._try_submit_input() elif get_runner().is_waiting_toplevel_command(): # Same with editin middle of command, but only if it's a single line command whole_input = self.get("input_start", "end-1c") # asking the whole input if "\n" not in whole_input and self._code_is_ready_for_submission(whole_input): self.mark_set("insert", "end") # move cursor to the end # Do the return without auto indent EnhancedTextWithLogging.perform_return(self, event) else: # Don't want auto indent when code is ready for submission source = self.get("input_start", "insert") tail = self.get("insert", "end") if self._code_is_ready_for_submission(source + "\n", tail): # No auto-indent EnhancedTextWithLogging.perform_return(self, event) else: # Allow auto-indent perform_python_return(self, event) self._try_submit_input() return "break" def on_secondary_click(self, event=None): super().on_secondary_click(event) if self.view: self.view.menu.tk_popup(event.x_root, event.y_root) def _in_current_input_range(self, index): try: return self.compare(index, ">=", "input_start") except Exception: return False def _insert_command_link(self, txt, handler): self._link_handler_count += 1 command_tag = "link_handler_%s" % self._link_handler_count self.direct_insert("output_insert", txt, ("io_hyperlink", command_tag)) self.tag_bind(command_tag, "<1>", handler) def _insert_text_directly(self, txt, tags=()): def _insert(txt, tags): if txt != "": self.direct_insert("output_insert", txt, tags) def _insert_and_highlight_urls(txt, tags): parts = SIMPLE_URL_SPLIT_REGEX.split(txt) for i, part in enumerate(parts): if i % 2 == 0: _insert(part, tags) else: if part.startswith("data:image/"): token = ";base64," data = part[part.index(token) + len(token) :] try: img = tk.PhotoImage(data=data) self._images.add(img) # to avoit it being gc-d""" self.image_create("output_insert", image=img) for tag in tags: self.tag_add(tag, "output_insert -1 chars") except TclError: _insert(part, tags + ("io_hyperlink",)) else: _insert(part, tags + ("io_hyperlink",)) # I want the insertion to go before marks # self._print_marks("before output") self.mark_gravity("input_start", tk.RIGHT) self.mark_gravity("output_insert", tk.RIGHT) tags = tuple(tags) # Make stacktrace clickable if "stderr" in tags or "error" in tags or ("File" in txt and "line" in txt): # show lines pointing to source lines as hyperlinks for line in txt.splitlines(True): parts = re.split(r"(File .* line \d+.*)$", line, maxsplit=1) if len(parts) == 3: _insert(parts[0], tags) if self._last_main_file or ( STRING_PSEUDO_FILENAME not in parts[1] and REPL_PSEUDO_FILENAME not in parts[1] ): link_tags = ("stacktrace_hyperlink",) else: link_tags = () _insert(parts[1], tags + link_tags) _insert(parts[2], tags) else: parts = re.split(r"(\'[^\']+\.pyw?\')", line, flags=re.IGNORECASE) if len(parts) == 3 and os.path.exists(os.path.expanduser(parts[1][1:-1])): match = re.search(r"\S", line) _insert(line[: match.start()], tags) _insert(line[match.start() :], tags + ("io_hyperlink",)) else: _insert_and_highlight_urls(line, tags) else: _insert_and_highlight_urls(txt, tags) # self._print_marks("after output") # output_insert mark will move automatically because of its gravity def has_pending_input(self): pending = self.get("input_start", "end-1c") return bool(pending) def _try_submit_input(self): # see if there is already enough inputted text to submit input_text = self.get("input_start", "insert") tail = self.get("insert", "end") # user may have pasted more text than necessary for this request submittable_text = self._extract_submittable_input(input_text, tail) if submittable_text is not None: if get_runner().is_waiting_toplevel_command(): # clean up the tail if len(tail) > 0: assert tail.strip() == "" self.delete("insert", "end-1c") # leftover text will be kept in widget, waiting for next request. start_index = self.index("input_start") end_index = self.index("input_start+{0}c".format(len(submittable_text))) # apply correct tags (if it's leftover then it doesn't have them yet) if get_runner().is_running(): self.tag_add("io", start_index, end_index) self.tag_add("stdin", start_index, end_index) else: self.tag_add("toplevel", start_index, end_index) self.tag_add("command", start_index, end_index) # update start mark for next input range self.mark_set("input_start", end_index) # Move output_insert mark after the requested_text # Leftover input, if any, will stay after output_insert, # so that any output that will come in before # next input request will go before leftover text self.mark_set("output_insert", end_index) # remove tags from leftover text for tag in ("io", "stdin", "toplevel", "command"): # don't remove magic, because otherwise I can't know it's auto self.tag_remove(tag, end_index, "end") self._submit_input(submittable_text) def _editing_allowed(self): return get_runner() is not None def _extract_submittable_input(self, input_text, tail): if get_runner().is_waiting_toplevel_command(): if input_text.endswith("\n"): if input_text.strip().startswith("%") or input_text.strip().startswith("!"): # if several magic command are submitted, then take only first return input_text[: input_text.index("\n") + 1] elif self._code_is_ready_for_submission(input_text, tail): return input_text else: return None else: return None elif get_runner().is_running(): i = 0 while True: if i >= len(input_text): return None elif input_text[i] == "\n": return input_text[: i + 1] else: i += 1 return None def _code_is_ready_for_submission(self, source, tail=""): # Ready to submit if ends with empty line # or is complete single-line code if tail.strip() != "": return False # First check if it has unclosed parens, unclosed string or ending with : or \ parser = roughparse.RoughParser(self.indent_width, self.tabwidth) parser.set_str(source.rstrip() + "\n") if parser.get_continuation_type() != roughparse.C_NONE or parser.is_block_opener(): return False # Multiline compound statements need to end with empty line to be considered # complete. lines = source.splitlines() # strip starting empty and comment lines while len(lines) > 0 and (lines[0].strip().startswith("#") or lines[0].strip() == ""): lines.pop(0) compound_keywords = ["if", "while", "for", "with", "try", "def", "class", "async", "await"] if len(lines) > 0: first_word = lines[0].strip().split()[0] if first_word in compound_keywords and not source.replace(" ", "").replace( "\t", "" ).endswith("\n\n"): # last line is not empty return False return True def _submit_input(self, text_to_be_submitted): logger.debug( "SHELL: submitting %r in state %s", text_to_be_submitted, get_runner().get_state() ) if get_runner().is_waiting_toplevel_command(): # register in history and count if text_to_be_submitted in self._command_history: self._command_history.remove(text_to_be_submitted) self._command_history.append(text_to_be_submitted) # meaning command selection is not in process self._command_history_current_index = None self.update_tty_mode() cmd_line = text_to_be_submitted.strip() try: if cmd_line.startswith("%"): parts = cmd_line.split(" ", maxsplit=1) if len(parts) == 2: args_str = parts[1].strip() else: args_str = "" argv = parse_cmd_line(cmd_line[1:]) command_name = argv[0] cmd_args = argv[1:] if command_name.lower() in ["run", "debug", "fastdebug"]: if len(cmd_args) >= 2 and cmd_args[0] == "-c": # move source argument to source attribute source = cmd_args[1] cmd_args = [cmd_args[0]] + cmd_args[2:] if source == EDITOR_CONTENT_TOKEN: editor = get_workbench().get_editor_notebook().get_current_editor() assert editor self._last_main_file = editor.get_identifier() source = editor.get_content() else: source = None self._last_main_file = cmd_args[0] else: source = None self._last_main_file = None if command_name[0].isupper() and get_workbench().get_option( "shell.clear_for_new_process" ): self._clear_shell() get_shell().set_osc_title("") get_workbench().event_generate("MagicCommand", cmd_line=text_to_be_submitted) get_runner().send_command( ToplevelCommand( command_name, args=cmd_args, args_str=args_str, cmd_line=cmd_line, tty_mode=self.tty_mode, source=source, ) ) elif cmd_line.startswith("!"): argv = parse_cmd_line(cmd_line[1:]) get_workbench().event_generate("SystemCommand", cmd_line=text_to_be_submitted) get_runner().send_command( ToplevelCommand( "execute_system_command", argv=argv, cmd_line=cmd_line, tty_mode=self.tty_mode, ) ) self._last_main_file = None else: get_runner().send_command( ToplevelCommand( "execute_source", source=text_to_be_submitted, tty_mode=self.tty_mode ) ) self._last_main_file = None # remember the place where the output of this command started self.mark_set("command_io_start", "output_insert") self.mark_gravity("command_io_start", "left") # discard old io events self._applied_io_events = [] self._queued_io_events = [] except Exception: get_workbench().report_exception() self._insert_prompt() self._invalidate_current_data() get_workbench().event_generate("ShellCommand", command_text=text_to_be_submitted) else: assert get_runner().is_running() get_runner().send_program_input(text_to_be_submitted) get_workbench().event_generate("ShellInput", input_text=text_to_be_submitted) self._applied_io_events.append((text_to_be_submitted, "stdin")) def _arrow_up(self, event): if not get_runner().is_waiting_toplevel_command(): return None if not self._in_current_input_range("insert"): return None insert_line = index2line(self.index("insert")) input_start_line = index2line(self.index("input_start")) if insert_line != input_start_line: # we're in the middle of a multiline command return None if len(self._command_history) == 0 or self._command_history_current_index == 0: # can't take previous command return "break" if self._command_history_current_index is None: self._command_history_current_index = len(self._command_history) - 1 else: self._command_history_current_index -= 1 cmd = self._command_history[self._command_history_current_index] if cmd[-1] == "\n": cmd = cmd[:-1] # remove the submission linebreak self._propose_command(cmd) return "break" def _arrow_down(self, event): if not get_runner().is_waiting_toplevel_command(): return None if not self._in_current_input_range("insert"): return None insert_line = index2line(self.index("insert")) last_line = index2line(self.index("end-1c")) if insert_line != last_line: # we're in the middle of a multiline command return None if ( len(self._command_history) == 0 or self._command_history_current_index is None or self._command_history_current_index >= len(self._command_history) - 1 ): # can't take next command self._command_history_current_index = len(self._command_history) self._propose_command("") return "break" if self._command_history_current_index is None: self._command_history_current_index = len(self._command_history) - 1 else: self._command_history_current_index += 1 self._propose_command( self._command_history[self._command_history_current_index].strip("\n") ) return "break" def _propose_command(self, cmd_line): self.delete("input_start", "end") self.intercept_insert("input_start", cmd_line) self.see("insert") def _text_key_press(self, event): # Ctrl should underline values # TODO: this underline may confuse, when user is just copying on pasting # try to add this underline only when mouse is over the value # TODO: take theme into account """ if event.keysym in ("Control_L", "Control_R", "Command"): # TODO: check in Mac self.tag_configure("value", foreground="DarkBlue", underline=1) """ def _text_key_release(self, event): # Remove value underlining # TODO: take theme into account """ if event.keysym in ("Control_L", "Control_R", "Command"): # TODO: check in Mac self.tag_configure("value", foreground="DarkBlue", underline=0) """ def _clear_shell(self): end_index = self.index("output_end") self._clear_content(end_index) def _on_backend_terminated(self, event=None): logger.info("BaseShellText._on_backend_terminated") # make sure dead values are not clickable anymore self._invalidate_current_data() self.set_read_only(True) get_shell().set_osc_title("") def compute_smart_home_destination_index(self): """Is used by EnhancedText""" if self._in_current_input_range("insert"): # on input line, go to just after prompt return "input_start" else: return super().compute_smart_home_destination_index() def _value_click(self, event): pos = "@%d,%d" % (event.x, event.y) tags = self.tag_names(pos) for tag in tags: if tag.isnumeric() or tag[0] == "-" and tag[1:].isnumeric(): get_workbench().show_view("ObjectInspector", set_focus=False) get_workbench().update_idletasks() get_workbench().event_generate("ObjectSelect", object_id=int(tag)) def _value_mouse_up(self, event): pos = "@%d,%d" % (event.x, event.y) rng = self.tag_prevrange("value", pos) if not rng: return # select whole value unless user has started a partial selection # if not self.tag_nextrange("sel", rng[0], rng[1]): # self.tag_remove("sel", "1.0", "end") # self.tag_add("sel", rng[0], rng[1]) def _handle_hyperlink(self, event): import webbrowser try: line = self.get("insert linestart", "insert lineend") # Python stacktrace matches = list(re.finditer(r'File "(?P[^"]+)", line (?P\d+)', line)) if not matches: # Friendly traceback matches = list( re.finditer( r"\b(?P\d+)\b.+'(?P[^\']+\.pyw?)'", line, flags=re.IGNORECASE ) ) if len(matches) == 1: filename = os.path.expanduser(matches[0].group("file")) lineno = int(matches[0].group("line")) if ( filename in (STRING_PSEUDO_FILENAME, REPL_PSEUDO_FILENAME) and self._last_main_file ): filename = self._last_main_file # NB! Don't attempt to check the existence of the file as it may be remote file # or editor id (of untitled editor) # TODO: handle remote files # TODO: better use events instead direct referencing get_workbench().get_editor_notebook().show_file(filename, lineno, set_focus=False) else: r = self.tag_prevrange("io_hyperlink", "@%d,%d" % (event.x, event.y)) if r and len(r) == 2: url = self.get(r[0], r[1]) if SIMPLE_URL_SPLIT_REGEX.match(url): webbrowser.open(url) except Exception as e: logger.exception("Could not handle hyperlink click", exc_info=e) def _show_user_exception(self, user_exception): for line, frame_id, *_ in user_exception["items"]: tags = ("io", "stderr") if frame_id is not None: frame_tag = "frame_%d" % frame_id def handle_frame_click(event, frame_id=frame_id): get_runner().send_command(InlineCommand("get_frame_info", frame_id=frame_id)) return "break" # TODO: put first line with frame tag and rest without tags += (frame_tag,) self.tag_bind(frame_tag, "", handle_frame_click, True) self._insert_text_directly(line, tags) def _discard_old_content(self): max_lines = max(get_workbench().get_option("shell.max_lines"), 0) proposed_cut = self.index("end -%d lines linestart" % max_lines) if proposed_cut == "1.0": return # would this keep current block intact? next_prompt = self.tag_nextrange("prompt", proposed_cut, "end") if not next_prompt: pass # TODO: disable stepping back self._clear_content(proposed_cut) def _clear_content(self, cut_idx): proposed_cut_float = float(self.index(cut_idx)) for btn in list(self._squeeze_buttons): try: idx = self.index(btn) if idx is None or idx == "" or float(idx) < proposed_cut_float: self._squeeze_buttons.remove(btn) # looks like the widgets are not fully GC-d. # At least avoid leaking big chunks of texts btn.contained_text = None btn.destroy() except Exception as e: logger.warning("Problem with a squeeze button, removing it", exc_info=e) if btn in self._squeeze_buttons: self._squeeze_buttons.remove(btn) self.direct_delete("0.1", cut_idx) def _on_mouse_move(self, event=None): tags = self.tag_names("@%d,%d" % (event.x, event.y)) if "value" in tags or "io_hyperlink" in tags or "stacktrace_hyperlink" in tags: if self.cget("cursor") != get_hyperlink_cursor(): self.config(cursor=get_hyperlink_cursor()) else: if self.cget("cursor") != get_beam_cursor(): self.config(cursor=get_beam_cursor()) def _invalidate_current_data(self): """ Grayes out input & output displayed so far """ end_index = self.index("output_end") self.tag_add("inactive", "1.0", end_index) # inactivate values pos = end_index while True: rng = self.tag_prevrange("value", pos) if rng: rng_start, rng_end = rng self.tag_remove("value", rng_start, rng_end) self.tag_add("inactive_value", rng_start, rng_end) pos = rng_start else: break self.tag_remove("value", "1.0", end_index) while len(self.active_extra_tags) > 0: self.tag_remove(self.active_extra_tags.pop(), "1.0", "end") def get_lines_above_viewport_bottom(self, tag_name, n): end_index = self.index("@%d,%d lineend" % (self.winfo_height(), self.winfo_height())) start_index = self.index(end_index + " -50 lines") result = "" while True: r = self.tag_nextrange(tag_name, start_index, end_index) if not r: break result += self.get(r[0], r[1]) start_index = r[1] return result def update_tty_mode(self): self.tty_mode = get_workbench().get_option("shell.tty_mode") def set_syntax_options(self, syntax_options): super().set_syntax_options(syntax_options) self.update_margin_color() def update_margin_color(self): if ui_utils.get_tk_version_info() >= (8, 6, 6): self.tag_configure("io", lmargincolor=get_syntax_options_for_tag("TEXT")["background"]) def _hide_trailing_output(self, text): pos = self.search(text, index="end", backwards=True) logger.debug("Position for trailing %r: %s", text, pos) if pos: end_pos = self.index("%s + %d chars" % (pos, len(text))) if end_pos == self.index("output_end"): self.direct_delete(pos, end_pos) else: logger.debug("end_pos %s, output_end %s", end_pos, self.index("output_end")) class ShellText(BaseShellText): def __init__(self, master, view, **kw): super().__init__(master, view, **kw) self.bindtags(self.bindtags() + ("ShellText",)) self.tag_bind("value", "<1>", self._value_click) self.tag_bind("value", "", self._value_mouse_up) self.tag_bind("io_hyperlink", "", self._handle_hyperlink) self.tag_bind("stacktrace_hyperlink", "", self._handle_hyperlink) self.bind("", self._on_mouse_move, True) get_workbench().bind("InputRequest", self._handle_input_request, True) get_workbench().bind("ProgramOutput", self._handle_program_output, True) get_workbench().bind("ToplevelResponse", self._handle_toplevel_response, True) get_workbench().bind("DebuggerResponse", self._handle_fancy_debugger_progress, True) get_workbench().bind("BackendTerminated", self._on_backend_terminated, True) get_workbench().bind( "HideTrailingOutput", lambda msg: self._hide_trailing_output(msg.text), True ) class SqueezedTextDialog(CommonDialog): def __init__(self, master: BaseShellText, button): super().__init__(master) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.button = button self.content = button.contained_text self.shell_text = master padding = 20 mainframe = ttk.Frame(self) mainframe.grid(row=0, column=0, sticky="nsew") mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(2, weight=1) explanation_label = ttk.Label( mainframe, text=tr( "For performance reasons, Shell avoids showing " + "very long lines in full (see Tools => Options => Shell).\n" + "Here you can interact with the original text fragment." ), ) explanation_label.grid(row=0, column=0, sticky="nsew", padx=padding, pady=padding) self._wrap_var = tk.BooleanVar(value=False) self.wrap_checkbox = ttk.Checkbutton( mainframe, text=tr("Wrap text (may be slow)"), variable=self._wrap_var, onvalue=True, offvalue=False, command=self._on_wrap_changed, ) self.wrap_checkbox.grid(row=1, padx=padding, pady=(0, padding // 2), sticky="w") self.text_frame = TextFrame( mainframe, text_class=TweakableText, height=10, width=80, relief="sunken", borderwidth=1, wrap="none", ) self.text_frame.grid(row=2, column=0, padx=padding, sticky="nsew") self.text_frame.text.insert("1.0", button.contained_text) self.text_frame.text.set_read_only(True) button_frame = ttk.Frame(mainframe) button_frame.grid(row=3, column=0, padx=padding, pady=padding, sticky="nswe") button_frame.columnconfigure(2, weight=1) copy_caption = tr_btn("Copy to clipboard") copy_button = ttk.Button( button_frame, text=copy_caption, width=len(copy_caption), command=self._on_copy ) copy_button.grid(row=0, column=1, sticky="w", padx=(0, padding)) expand_caption = tr_btn("Expand in Shell") expand_button = ttk.Button( button_frame, text=expand_caption, width=len(expand_caption), command=self._on_expand ) expand_button.grid(row=0, column=2, sticky="e", padx=padding) close_button = ttk.Button(button_frame, text=tr_btn("Close"), command=self._on_close) close_button.grid(row=0, column=3, sticky="e") self.bind("", self._on_close, True) self.protocol("WM_DELETE_WINDOW", self._on_close) self.title(tr("Squeezed text (%d characters)") % len(self.content)) def _on_wrap_changed(self): if self._wrap_var.get(): self.text_frame.text.configure(wrap="word") else: self.text_frame.text.configure(wrap="none") def _on_expand(self): index = self.shell_text.index(self.button) self.shell_text.direct_delete(index, index + " +1 chars") self.shell_text.direct_insert(index, self.content, tuple(self.button.tags)) self.destroy() # looks like the widgets are not fully GC-d. # At least avoid leaking big chunks of texts self.button.contained_text = None self.button.destroy() def _on_copy(self): self.clipboard_clear() self.clipboard_append(self.content) def _on_close(self, event=None): self.destroy() class PlotterCanvas(tk.Canvas): def __init__(self, master, text): self.master = master self.background = get_syntax_options_for_tag("TEXT")["background"] self.foreground = get_syntax_options_for_tag("TEXT")["foreground"] super().__init__( master, background=self.background, borderwidth=0, height=10000, # size of the virtual drawing area width=10000, highlightthickness=0, ) self.text = text self.x_scale = None self.x_scale = None self.range_start = -1 self.range_end = 2 self.range_block_size = 0 self.value_range = 2 self.last_legend = None self.font = tk.font.nametofont("TkDefaultFont") self.linespace = self.font.metrics("linespace") self.y_padding = self.linespace self.x_padding_left = -1 # makes sharper cut for partly hidden line self.x_padding_right = self.linespace self.fresh_range = True self.colors = [ "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf", ] self.range_block_sizes = [ 0.1, 0.25, 0.5, 1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, ] self.bind("", self.on_resize, True) self.bind("", self.reset_range, True) self.create_close_button() get_workbench().bind("SyntaxThemeChanged", self.reload_theme_options, True) def create_close_button(self): self.close_img = get_workbench().get_image("tab-close") self.close_active_img = get_workbench().get_image("tab-close-active") self.close_rect = self.create_rectangle( self.winfo_width() - self.close_img.width() - self.linespace, self.linespace / 2, self.winfo_width(), self.linespace / 2 + self.close_img.height(), fill=self.background, width=0, tags=("close",), ) self.close_button = self.create_image( self.winfo_width() - self.linespace / 2, self.linespace / 2, anchor="ne", image=self.close_img, activeimage=self.close_active_img, tags=("close",), ) self.tag_bind("close", "<1>", self.on_close) def update_close_button(self): self.coords( self.close_rect, self.winfo_width() - self.close_img.width() - self.linespace / 1.5, self.linespace / 2, self.winfo_width() - self.linespace / 2, self.linespace / 2 + self.close_img.height(), ) self.coords(self.close_button, self.winfo_width() - self.linespace / 2, self.linespace / 2) def on_close(self, event): assert isinstance(self.master, ShellView) self.master.toggle_plotter() def reset_range(self, event=None): self.fresh_range = True def get_num_steps(self): return 30 def update_plot(self, force_clean=False): data_lines = [] bottom_index = self.text.index( "@%d,%d" % (self.text.winfo_width(), self.text.winfo_height()) ) bottom_lineno = int(float(bottom_index)) for i in range(bottom_lineno - self.get_num_steps(), bottom_lineno + 1): line_start_index = "%d.0" % i if i < 1 or "stdout" not in self.text.tag_names(line_start_index): data_lines.append(([], [])) else: content = self.text.get(line_start_index, line_start_index + " lineend") data_lines.append(self.extract_pattern_and_numbers(content)) # data_lines need to be transposed segments_by_color = [] for i in range(100): segments = list(self.extract_series_segments(data_lines, i)) if segments: segments_by_color.append(segments) else: break self.delete("segment") self.update_range(segments_by_color, force_clean) segment_count = self.draw_segments(segments_by_color) self.update_legend(data_lines, force_clean) self.delete("info") if segment_count == 0: info_text = ( tr("Plotter visualizes series of\n" + "numbers printed to the Shell.") + "\n\n" + tr("See Help for details.") ) self.create_text_with_background( self.winfo_width() / 2, self.winfo_height() / 2, text=info_text, anchor="center", justify="center", tags=("info",), ) # self.delete("guide", "tick", "legend") # self.range_start = 0 # self.range_end = 0 self.tag_raise("info") self.fresh_range = False def update_legend(self, data_lines, force_clean=False): legend = None i = len(data_lines) - 2 # one before last while i >= 0: legend = data_lines[i][0] if legend and legend == data_lines[i + 1][0]: # found last legend, which covers at least 2 consecutive points break i -= 1 if self.last_legend == legend and not force_clean: # just make sure it remains topmost self.tag_raise("legend") return self.delete("legend") if legend is None: return # add horizontal padding # legend[0] = " " + legend[0] # legend[-1] = legend[-1] + " " marker = "●" # "●" "•" marker_width = self.font.measure(marker) full_text_width = self.font.measure(marker.join(legend)) y = self.winfo_height() - self.linespace // 2 x = self.winfo_width() - full_text_width - self.linespace self.create_rectangle( x - self.linespace // 4, y - self.linespace, x + full_text_width + self.linespace // 4, y, fill=self.background, width=0, tags=("legend",), ) for i, part in enumerate(legend): if i > 0: self.create_text( x, y, text=marker, anchor="sw", fill=self.colors[(i - 1) % len(self.colors)], tags=("legend",), ) x += marker_width self.create_text(x, y, text=part, anchor="sw", tags=("legend",), fill=self.foreground) x += self.font.measure(part) self.last_legend = legend def draw_segments(self, segments_by_color): count = 0 for color, segments in enumerate(segments_by_color): for pos, nums in segments: self.draw_segment(color, pos, nums) count += 1 # raise certain elements above segments self.tag_raise("tick") self.tag_raise("close") return count def draw_segment(self, color, pos, nums): x = self.x_padding_left + pos * self.x_scale args = [] for num in nums: y = self.y_padding + (self.range_end - num) * self.y_scale args.extend([x, y]) x += self.x_scale self.create_line( *args, width=2, fill=self.colors[color % len(self.colors)], tags=("segment",), # arrow may be confusing # and doesn't play nice with distinguising between # scrollback view and fresh_range view # arrow="last", # arrowshape=(3,5,3) ) # self.current_segment_ids.append(line_id) def update_range(self, segments_by_color, clean): if not segments_by_color: return range_start = 2**15 range_end = -(2**15) # if new block is using 3/4 of the width, # then don't consider old block's values anymore interest_position = 0 for start_pos, nums in reversed(segments_by_color[0]): if start_pos < self.get_num_steps() / 10: interest_position = start_pos break assert isinstance(interest_position, int) for segments in segments_by_color: for start_pos, nums in segments: if start_pos >= interest_position: range_start = min(range_start, *nums) range_end = max(range_end, *nums) if interest_position == 0 and not self.fresh_range: # meaning we still care about old line's values range_start = min(range_start, self.range_start) range_end = max(range_end, self.range_end) if range_end == range_start: range_end += 1 if ( not clean and not self.fresh_range and self.x_scale is not None and range_end == self.range_end and range_start == self.range_start ): # don't recompute as nothing was changed return value_range = range_end - range_start range_block_size = value_range // 4 # prefer round blocks for size in self.range_block_sizes: if size * 4 >= value_range: range_block_size = size break # extend to range block boundary if range_end % range_block_size != 0: range_end -= range_end % -range_block_size if range_start % range_block_size != 0: range_start -= range_start % range_block_size # not sure about these assertions when using floats # assert range_start % range_block_size == 0 # assert range_end % range_block_size == 0, "range_end: %s, bs: %s" % (range_end, range_block_size) # remember self.range_start = range_start self.range_end = range_end self.value_range = range_end - range_start self.range_block_size = range_block_size available_height = self.winfo_height() - 2 * self.y_padding available_width = self.winfo_width() - self.x_padding_left - self.x_padding_right num_steps = self.get_num_steps() self.x_scale = available_width / (num_steps - 1) self.y_scale = available_height / self.value_range self.update_guides_and_ticks() def update_guides_and_ticks(self): self.delete("guide", "tick") value = self.range_start while value <= self.range_end: y = self.y_padding + (self.range_end - value) * self.y_scale # guide self.create_line( 0, y, self.winfo_width(), y, tags=("guide",), dash=(2, 2), fill="#aaaaaa" ) # tick if value == int(value): value = int(value) caption = " " + str(value) + " " self.create_text_with_background( self.linespace // 2, y, caption, anchor="w", tags=("tick",) ) value += self.range_block_size def extract_pattern_and_numbers(self, line): parts = NUMBER_SPLIT_REGEX.split(line) if len(parts) < 2: return ([], []) assert len(parts) % 2 == 1 pattern = [] numbers = [] for i in range(0, len(parts), 2): pattern.append(parts[i]) for i in range(1, len(parts), 2): numbers.append(float(parts[i])) return (pattern, numbers) def extract_series_segments(self, data_lines, series_nr): """Yields numbers which form connected multilines on graph Each segment is pair of starting position and numbers""" segment = (0, []) prev_pattern = None for i, (pattern, nums) in enumerate(data_lines): if len(nums) <= series_nr or pattern != prev_pattern: # break the segment if len(segment[1]) > 1: yield segment segment = (i, []) if len(nums) > series_nr: segment[1].append(nums[series_nr]) prev_pattern = pattern if len(segment[1]) > 1: yield segment def create_text_with_background( self, x, y, text, anchor="w", justify="left", background=None, tags=() ): if background is None: background = self.background width = 0 lines = text.splitlines() for line in lines: width = max(width, self.font.measure(line)) height = len(lines) * self.linespace rect_x = x rect_y = y if anchor == "center": rect_x = x - width / 2 rect_y = y - height / 2 elif anchor == "w": rect_y = y - height / 2 else: "TODO:" self.create_rectangle( rect_x, rect_y, rect_x + width, rect_y + height, fill=background, width=0, tags=tags ) self.create_text( x, y, anchor=anchor, text=text, tags=tags, fill=self.foreground, justify=justify ) def reload_theme_options(self, event): self.background = get_syntax_options_for_tag("TEXT")["background"] self.foreground = get_syntax_options_for_tag("TEXT")["foreground"] self.configure(background=self.background) self.itemconfig(self.close_rect, fill=self.background) self.update_plot(True) def on_resize(self, event): if self.winfo_width() > 10: get_workbench().set_option("view.plotter_width", self.winfo_width()) self.update_plot(True) self.update_close_button() assert isinstance(self.master, ShellView) self.master.resize_plotter() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/terminal.py0000644000076600000240000001756014730022736017126 0ustar00aivarannamaastaffimport os.path import platform import shlex import subprocess import sys def run_in_terminal(cmd, cwd, env_overrides={}, keep_open=True, title=None): from thonny.running import get_environment_with_overrides env = get_environment_with_overrides(env_overrides) if not cwd or not os.path.exists(cwd): cwd = os.getcwd() if sys.platform == "win32": _run_in_terminal_in_windows(cmd, cwd, env, keep_open, title) elif sys.platform == "linux": _run_in_terminal_in_linux(cmd, cwd, env, keep_open) elif sys.platform == "darwin": _run_in_terminal_in_macos(cmd, cwd, env_overrides, keep_open) else: raise RuntimeError("Can't launch terminal in " + platform.system()) def open_system_shell(cwd, env_overrides={}): from thonny.running import get_environment_with_overrides env = get_environment_with_overrides(env_overrides) if sys.platform == "darwin": _run_in_terminal_in_macos([], cwd, env_overrides, True) elif sys.platform == "win32": cmd = "start cmd" subprocess.Popen(cmd, cwd=cwd, env=env, shell=True) elif sys.platform == "linux": cmd = _get_linux_terminal_command() subprocess.Popen(cmd, cwd=cwd, env=env, shell=True) else: raise RuntimeError("Can't launch terminal in " + platform.system()) def _add_to_path(directory, path): # Always prepending to path may seem better, but this could mess up other things. # If the directory contains only one Python distribution executables, then # it probably won't be in path yet and therefore will be prepended. if ( directory in path.split(os.pathsep) or sys.platform == "win32" and directory.lower() in path.lower().split(os.pathsep) ): return path else: return directory + os.pathsep + path def _run_in_terminal_in_windows(cmd, cwd, env, keep_open, title=None): if keep_open: # Yes, the /K argument has weird quoting. Can't explain this, but it works quoted_args = " ".join(map(lambda s: s if s == "&" else '"' + s + '"', cmd)) cmd_line = """start {title} /D "{cwd}" /W cmd /K "{quoted_args}" """.format( cwd=cwd, quoted_args=quoted_args, title='"' + title + '"' if title else "" ) subprocess.Popen(cmd_line, cwd=cwd, env=env, shell=True) else: subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE, cwd=cwd, env=env) def _run_in_terminal_in_linux(cmd, cwd, env, keep_open): def _shellquote(s): return subprocess.list2cmdline([s]) term_cmd = _get_linux_terminal_command() if isinstance(cmd, list): cmd = " ".join(map(_shellquote, cmd)) if keep_open: # http://stackoverflow.com/a/4466566/261181 core_cmd = "{cmd}; exec bash -i".format(cmd=cmd) in_term_cmd = "bash -c {core_cmd}".format(core_cmd=_shellquote(core_cmd)) else: in_term_cmd = cmd if term_cmd == "lxterminal": # https://www.raspberrypi.org/forums/viewtopic.php?t=221490 whole_cmd = "{term_cmd} --command={in_term_cmd}".format( term_cmd=term_cmd, in_term_cmd=_shellquote(in_term_cmd) ) else: whole_cmd = "{term_cmd} -e {in_term_cmd}".format( term_cmd=term_cmd, in_term_cmd=_shellquote(in_term_cmd) ) if term_cmd == "terminator" and "PYTHONPATH" in env: # it is written in Python 2 and the PYTHONPATH of Python 3 will confuse it # https://github.com/thonny/thonny/issues/1129 del env["PYTHONPATH"] subprocess.Popen(whole_cmd, cwd=cwd, env=env, shell=True) def _run_in_terminal_in_macos(cmd, cwd, env_overrides, keep_open): _shellquote = shlex.quote cmds = "clear; cd " + _shellquote(cwd) # osascript "tell application" won't change Terminal's env # (at least when Terminal is already active) # At the moment I just explicitly set some important variables for key in env_overrides: if env_overrides[key] is None: cmds += "; unset " + key else: value = env_overrides[key] if key == "PATH": value = _normalize_path(value) cmds += "; export {key}={value}".format(key=key, value=_shellquote(value)) if cmd: if isinstance(cmd, list): cmd = " ".join(map(_shellquote, cmd)) cmds += "; " + cmd if not keep_open: cmds += "; exit" # try to shorten to avoid too long line https://github.com/thonny/thonny/issues/1529 common_prefix = os.path.normpath(sys.prefix).rstrip("/") cmds = ( " export THOPR=" + common_prefix + " ; " + cmds.replace(common_prefix + "/", "$THOPR" + "/") ) print(cmds) # The script will be sent to Terminal with 'do script' command, which takes a string. # We'll prepare an AppleScript string literal for this # (http://stackoverflow.com/questions/10667800/using-quotes-in-a-applescript-string): cmd_as_apple_script_string_literal = ( '"' + cmds.replace("\\", "\\\\").replace('"', '\\"').replace("$", "\\$") + '"' ) # When Terminal is not open, then do script opens two windows. # do script ... in window 1 would solve this, but if Terminal is already # open, this could run the script in existing terminal (in undesirable env on situation) # That's why I need to prepare two variations of the 'do script' command doScriptCmd1 = """ do script %s """ % cmd_as_apple_script_string_literal doScriptCmd2 = """ do script %s in window 1 """ % cmd_as_apple_script_string_literal # The whole AppleScript will be executed with osascript by giving script # lines as arguments. The lines containing our script need to be shell-quoted: quotedCmd1 = subprocess.list2cmdline([doScriptCmd1]) quotedCmd2 = subprocess.list2cmdline([doScriptCmd2]) # Now we can finally assemble the osascript command line cmd_line = ( "osascript" + """ -e 'if application "Terminal" is running then ' """ + """ -e ' tell application "Terminal" ' """ + """ -e """ + quotedCmd1 + """ -e ' activate ' """ + """ -e ' end tell ' """ + """ -e 'else ' """ + """ -e ' tell application "Terminal" ' """ + """ -e """ + quotedCmd2 + """ -e ' activate ' """ + """ -e ' end tell ' """ + """ -e 'end if ' """ ) subprocess.Popen(cmd_line, cwd=cwd, shell=True) def _get_linux_terminal_command(): import shutil xte = shutil.which("x-terminal-emulator") if xte: if os.path.realpath(xte).endswith("/lxterminal") and shutil.which("lxterminal"): # need to know exact program, because it needs special treatment return "lxterminal" elif os.path.realpath(xte).endswith("/terminator") and shutil.which("terminator"): # https://github.com/thonny/thonny/issues/1129 return "terminator" else: return "x-terminal-emulator" # Older konsole didn't pass on the environment elif shutil.which("konsole"): if ( shutil.which("gnome-terminal") and "gnome" in os.environ.get("DESKTOP_SESSION", "").lower() ): return "gnome-terminal" else: return "konsole" elif shutil.which("gnome-terminal"): return "gnome-terminal" elif shutil.which("xfce4-terminal"): return "xfce4-terminal" elif shutil.which("lxterminal"): return "lxterminal" elif shutil.which("xterm"): return "xterm" else: raise RuntimeError("Don't know how to open terminal emulator") def _normalize_path(s): parts = s.split(os.pathsep) return os.pathsep.join([os.path.normpath(part) for part in parts]) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3861852 thonny-4.1.7/thonny/test/0000755000076600000240000000000014730055627015714 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/test/__init__.py0000644000076600000240000000002114417536743020023 0ustar00aivarannamaastaff# package marker ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3877575 thonny-4.1.7/thonny/test/plugins/0000755000076600000240000000000014730055627017375 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/test/plugins/__init__.py0000644000076600000240000000002114417536743021504 0ustar00aivarannamaastaff# package marker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717074725.0 thonny-4.1.7/thonny/test/plugins/test_locals_marker.py0000644000076600000240000000112614626075445023630 0ustar00aivarannamaastaffimport tkinter from thonny.plugins.locals_marker import LocalsHighlighter TEST_STR1 = """num_cars = 3 def foo(): print(num_cars + num_cars) def too(): num_cars = 4 print(num_cars + num_cars) def joo(): global num_cars num_cars = 2 """ def test_regular_closed(): expected_local = {("5.4", "5.12"), ("6.10", "6.18"), ("6.21", "6.29")} text_widget = tkinter.Text() text_widget.insert("end", TEST_STR1) highlighter = LocalsHighlighter(text_widget) actual_local = highlighter.get_positions() assert actual_local == expected_local print("Passed.") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/test/plugins/test_name_highlighter.py0000644000076600000240000000644014417536743024315 0ustar00aivarannamaastaffimport sys import tkinter import warnings from typing import Sequence, Set # @UnusedImport from thonny.plugins.highlight_names import OccurrencesHighlighter TEST_STR1 = """def foo(): foo() pass def boo(narg): foo = 2 # line 5 boo = foo + 4 print(narg + 2) for i in range(5): boo() narg = 2 # line 10 def bar(): x + x def blarg(): x = 2 """ # tuple of tuples, where an inner tuple corresponds to a group of insert positions # that should produce the same output (corresponding expected output is in the # expected_indices tuple at the same index) # # consider TEST_STR1: # # The first group is four indices, where we would expect the two locations of the name "foo" # to be returned. Those expected two locations are specified at index 0 of tuple expected_indices. # # Second tuple is a group of one index, where we would expect output with the locations for "boo" # And if the insert location is at "pass", we would expect an empty set for output CURSOR_POSITIONS1 = ( ("1.4", "1.5", "1.7", "2.5"), ("4.6",), ("3.4",), ("5.7", "6.12"), ("4.10", "7.11"), ("10.2",), ("12.5", "12.9"), ("14.5",), ) EXPECTED_INDICES1 = [ {("1.4", "1.7"), ("2.4", "2.7")}, {("4.4", "4.7"), ("9.4", "9.7")}, set(), {("5.4", "5.7"), ("6.10", "6.13")}, {("4.8", "4.12"), ("7.10", "7.14")}, {("10.0", "10.4")}, {("12.4", "12.5"), ("12.8", "12.9")}, {("14.4", "14.5")}, ] # type: Sequence[Set[Sequence[str]]] TEST_STR2 = """import too def foo(): foo = too + 4 x = foo + bow # 5 class TestClass: def foo(self): pass def add3(self): self.foo() # 10 foo() """ CURSOR_POSITIONS2 = (("1.8", "3.10"), ("2.4", "2.5", "11.10"), ("3.5", "4.9")) EXPECTED_INDICES2 = ( {("1.7", "1.10"), ("3.10", "3.13")}, {("2.4", "2.7"), ("11.8", "11.11")}, {("3.4", "3.7"), ("4.8", "4.11")}, ) TEST_GROUPS = ( (CURSOR_POSITIONS1, EXPECTED_INDICES1, TEST_STR1), (CURSOR_POSITIONS2, EXPECTED_INDICES2, TEST_STR2), ) def test_all(): if sys.version_info >= (3, 8): warnings.warn("Skipping name matcher tests in Python above 3.7") return import jedi if ( jedi.__version__.startswith("0.13.") or jedi.__version__.startswith("0.14.") or jedi.__version__.startswith("0.15.") or jedi.__version__.startswith("0.16.") ): warnings.warn("Skipping name matcher tests for Jedi " + jedi.__version__) return for i, test in enumerate(TEST_GROUPS): print("Running test group %d: " % (i + 1)) _assert_returns_correct_indices(test[0], test[1], test[2]) def _assert_returns_correct_indices(insert_pos_groups, expected_indices, input_str): text_widget = tkinter.Text() text_widget.insert("end", input_str) nh = OccurrencesHighlighter(text_widget) for i, group in enumerate(insert_pos_groups): for insert_pos in group: text_widget.mark_set("insert", insert_pos) actual = nh.get_positions() expected = expected_indices[i] assert actual == expected, ( "\nInsert position: %s" "\nExpected: %s" "\nGot: %s" % (insert_pos, expected, actual) ) print("\rPassed %d of %d" % (i + 1, len(insert_pos_groups)), end="") print() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/test/plugins/test_pip_gui.py0000644000076600000240000000052014417536743022444 0ustar00aivarannamaastafffrom thonny.plugins.pip_gui import _EXTRA_MARKER_RE def test_extra_marker_re() -> None: for text in [ "extra == 'dev'", r"extra == 'dev \' with quote'", " extra == 'dev' ", 'extra == "dev"', r'extra == "dev \"with quote"', ]: assert _EXTRA_MARKER_RE.match(text) is not None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/test/test_common.py0000644000076600000240000000222514417536743020623 0ustar00aivarannamaastaffimport os from thonny.common import path_startswith def test_path_startswith(): assert path_startswith("/kala/pala", "/kala") assert path_startswith("/kala/pala", "/kala/") assert not path_startswith("/kala/pala", "/pala") assert not path_startswith("/kalapala/pala", "/kala") if os.name == "nt": assert path_startswith("/kala/pala", "/KALA") else: assert not path_startswith("/kala/pala", "/KALA") if os.name == "nt": assert path_startswith("C:\\foo\\bar", "C:\\foo") assert path_startswith("C:\\foo", "C:\\") assert path_startswith("C:/foo", "C:\\") assert path_startswith("C:\\foo", "C:/") assert path_startswith("C:\\foo\\dir\\file", "C:\\foo") assert path_startswith("C:/foo\\dir\\file", "c:\\FOO") assert path_startswith("c:\\FOO\\dir\\file", "C:/foo") assert path_startswith("C:\\FOO\\dir\\dir2\\..\\ee", "C:/foo/dir/ee") assert path_startswith("c:\\foo\\bar.txt/kala\\pala", "C:\\foo\\bar.txt/kala") assert path_startswith("c:\\foo\\bar.txt/kala\\pala", "C:\\") assert not path_startswith("C:\\kalapala\\pala", "C:\\kala") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/tktextext.py0000644000076600000240000013041514730022736017352 0ustar00aivarannamaastaff# coding=utf-8 """Extensions for tk.Text""" import sys import time import tkinter import tkinter as tk from logging import getLogger from tkinter import TclError from tkinter import font as tkfont from tkinter import ttk from typing import Optional logger = getLogger(__name__) class TweakableText(tk.Text): """Allows intercepting Text commands at Tcl-level""" def __init__(self, master=None, cnf={}, read_only=False, **kw): super().__init__(master=master, cnf=cnf, **kw) self._read_only = read_only self._suppress_events = False self._edit_count: int = 0 self._last_operation_time: float = time.time() self._original_widget_name = self._w + "_orig" self.tk.call("rename", self._w, self._original_widget_name) self.tk.createcommand(self._w, self._dispatch_tk_operation) self._tk_proxies = {} self._original_insert = self._register_tk_proxy_function("insert", self.intercept_insert) self._original_delete = self._register_tk_proxy_function("delete", self.intercept_delete) self._original_mark = self._register_tk_proxy_function("mark", self.intercept_mark) def _register_tk_proxy_function(self, operation, function): self._tk_proxies[operation] = function setattr(self, operation, function) def original_function(*args): self.tk.call((self._original_widget_name, operation) + args) return original_function def _dispatch_tk_operation(self, operation, *args): f = self._tk_proxies.get(operation) try: if f: return f(*args) else: return self.tk.call((self._original_widget_name, operation) + args) except TclError as e: # Some Tk internal actions (eg. paste and cut) can cause this error if ( str(e).lower() == '''text doesn't contain any characters tagged with "sel"''' and operation in ["delete", "index", "get"] and args in [("sel.first", "sel.last"), ("sel.first",)] ): pass # Don't worry about hitting ends of undo/redo stacks elif ( operation == "edit" and args in [("undo",), ("redo",)] and str(e).lower() == "nothing to " + args[0] ): pass else: logger.exception( "[_dispatch_tk_operation] operation: " + operation + ", args:" + repr(args) ) # traceback.print_exc() return "" # Taken from idlelib.WidgetRedirector except Exception as e: # Need to catch to avoid the crash? logger.exception("Exception in _dispatch_tk_operation") from tkinter import messagebox messagebox.showerror( "Internal error", "Error in _dispatch_tk_operation\n" + str(e), parent=tkinter._default_root, ) def set_read_only(self, value): self._read_only = value def is_read_only(self): return self._read_only def get_edit_count(self) -> int: return self._edit_count def get_last_operation_time(self) -> float: """Returns the timestamp of the widget creation or time or the last time the text or cursor location was changed""" return self._last_operation_time def set_content(self, chars): self.direct_delete("1.0", tk.END) self.direct_insert("1.0", chars) def set_insertwidth(self, new_width): """Change cursor width NB! Need to be careful with setting text["insertwidth"]! My first straightforward solution caused unexplainable infinite loop of insertions and deletions in the text (Repro: insert a line and a word, select that word and then do Ctrl-Z). This solution seems safe but be careful! """ if self._suppress_events: return if self["insertwidth"] != new_width: old_suppress = self._suppress_events try: self._suppress_events = True self.config(insertwidth=new_width) finally: self._suppress_events = old_suppress def intercept_mark(self, *args): self.direct_mark(*args) def intercept_insert(self, index, chars, tags=None, **kw): assert isinstance(chars, str) if chars >= "\uf704" and chars <= "\uf70d": # Function keys F1..F10 in Mac cause these pass elif self.is_read_only(): self.bell() else: self.direct_insert(index, chars, tags, **kw) def intercept_delete(self, index1, index2=None, **kw): if index1 == "sel.first" and index2 == "sel.last" and not self.has_selection(): return if self.is_read_only(): self.bell() elif self._is_erroneous_delete(index1, index2): pass else: self.direct_delete(index1, index2, **kw) def _is_erroneous_delete(self, index1, index2): """Paste can cause deletes where index1 is sel.start but text has no selection. This would cause errors""" return index1.startswith("sel.") and not self.has_selection() def direct_mark(self, *args): self._original_mark(*args) self._last_operation_time = time.time() if args[:2] == ("set", "insert") and not self._suppress_events: self.event_generate("<>") def index_sel_first(self): # Tk will give error without this check if self.tag_ranges("sel"): return self.index("sel.first") else: return None def index_sel_last(self): if self.tag_ranges("sel"): return self.index("sel.last") else: return None def has_selection(self): return len(self.tag_ranges("sel")) > 0 def get_selection_indices(self): # If a selection is defined in the text widget, return (start, # end) as Tkinter text indices, otherwise return (None, None) if self.has_selection(): return self.index("sel.first"), self.index("sel.last") else: return None, None def direct_insert(self, index, chars, tags=None, **kw): self._original_insert(index, chars, tags, **kw) self._edit_count += 1 self._last_operation_time = time.time() if not self._suppress_events: self.event_generate("<>") def direct_delete(self, index1, index2=None, **kw): self._original_delete(index1, index2, **kw) self._edit_count += 1 self._last_operation_time = time.time() if not self._suppress_events: self.event_generate("<>") class EnhancedText(TweakableText): """Text widget with extra navigation and editing aids. Provides more comfortable deletion, indentation and deindentation, and undo handling. Not specific to Python code. Most of the code is adapted from idlelib.EditorWindow. """ def __init__(self, master=None, style="Text", tag_current_line=False, cnf={}, **kw): # Parent class shouldn't autoseparate # TODO: take client provided autoseparators value into account kw["autoseparators"] = False self._style = style self._original_options = kw.copy() super().__init__(master=master, cnf=cnf, **kw) self.tabwidth = 4 self.indent_width = 4 self._last_event_kind = None self._last_key_time = None self._bind_keypad() self._bind_editing_aids() self._bind_movement_aids() self._bind_selection_aids() self._bind_undo_aids() self._bind_mouse_aids() self._ui_theme_change_binding = self.bind( "<>", self._reload_theme_options, True ) self._initial_configuration = self.configure() self._regular_insertwidth = self["insertwidth"] self._reload_theme_options() self._should_tag_current_line = tag_current_line if tag_current_line: self.bind("<>", self._tag_current_line, True) self.bind("<>", self._tag_current_line, True) self._tag_current_line() def should_indent_with_tabs(self): return True def _bind_mouse_aids(self): if _running_on_mac(): self.bind("", self.on_secondary_click) self.bind("", self.on_secondary_click) else: self.bind("", self.on_secondary_click) def _bind_editing_aids(self): def if_not_readonly(fun): def dispatch(event): if not self.is_read_only(): return fun(event) else: return "break" return dispatch self.bind("", if_not_readonly(self.delete_word_left), True) self.bind("", if_not_readonly(self.delete_word_right), True) self.bind("", self._redirect_ctrld, True) self.bind("", self._redirect_ctrlt, True) self.bind("", self._redirect_ctrlf, True) self.bind("", self._redirect_shift_control_space, True) self.bind("", if_not_readonly(self.perform_smart_backspace), True) self.bind("", if_not_readonly(self.perform_return), True) self.bind("", if_not_readonly(self.perform_return), True) self.bind("", if_not_readonly(self.perform_tab), True) try: # Is needed on eg. Ubuntu with Estonian keyboard self.bind("", if_not_readonly(self.perform_tab), True) except Exception: pass if sys.platform == "win32": self.bind("", self._insert_untypable_characters_on_windows, True) def _bind_keypad(self): """Remap keypad movement events to non-keypad equivalents""" # https://github.com/thonny/thonny/issues/1106 kmap = { "": "", "": "", "": "", "": "", "": "", "": "", "": "", "": "", "": "", } for from_key in kmap: def mfunc(event, key=from_key): self.event_generate(kmap[key], **{"state": event.state}) return "break" try: self.bind(from_key, mfunc) except TclError: pass def _bind_movement_aids(self): self.bind("", self.perform_smart_home, True) self.bind("", self.move_to_edge_if_selection(0), True) self.bind("", self.move_to_edge_if_selection(1), True) self.bind("", self.perform_page_down, True) self.bind("", self.perform_page_up, True) def _bind_selection_aids(self): self.bind("" if _running_on_mac() else "", self.select_all, True) def _bind_undo_aids(self): self.bind("<>", self._on_undo, True) self.bind("<>", self._on_redo, True) self.bind("<>", self._on_cut, True) self.bind("<>", self._on_copy, True) self.bind("<>", self._on_paste, True) self.bind("", self._on_get_focus, True) self.bind("", self._on_lose_focus, True) self.bind("", self._on_key_press, True) self.bind("<1>", self._on_mouse_click, True) self.bind("<2>", self._on_mouse_click, True) self.bind("<3>", self._on_mouse_click, True) if _running_on_x11() or _running_on_mac(): def custom_redo(event): self.event_generate("<>") return "break" self.bind("", custom_redo, True) def _redirect_ctrld(self, event): # I want to disable the deletion effect of Ctrl-D in the text but still # keep the event for other purposes self.event_generate("<>") return "break" def _redirect_shift_control_space(self, event): # I want to disable the effect of Shift-Control-space in the text but still # keep the event for other purposes self.event_generate("<>") return "break" def _redirect_ctrlt(self, event): # I want to disable the swap effect of Ctrl-T in the text but still # keep the event for other purposes self.event_generate("<>") return "break" def _redirect_ctrlf(self, event): # I want to disable the Tk effect of Ctrl-T in the text but still # keep the event for other purposes self.event_generate("<>") return "break" def tag_reset(self, tag_name): empty_conf = {key: "" for key in self.tag_configure(tag_name)} self.tag_configure(empty_conf) def select_lines(self, first_line, last_line): self.tag_remove("sel", "1.0", tk.END) self.tag_add("sel", "%s.0" % first_line, "%s.end" % last_line) def delete_word_left(self, event): self.event_generate("") self.edit_separator() return "break" def delete_word_right(self, event): self.event_generate("") self.edit_separator() return "break" def perform_smart_backspace(self, event): self._log_keypress_for_undo(event) text = self first, last = self.get_selection_indices() if first and last: text.delete(first, last) text.mark_set("insert", first) return "break" # Delete whitespace left, until hitting a real char or closest # preceding virtual tab stop. chars = text.get("insert linestart", "insert") if chars == "": if text.compare("insert", ">", "1.0"): # easy: delete preceding newline text.delete("insert-1c") else: text.bell() # at start of buffer return "break" if ( chars.strip() != "" ): # there are non-whitespace chars somewhere to the left of the cursor # easy: delete preceding real char text.delete("insert-1c") self._log_keypress_for_undo(event) return "break" # Ick. It may require *inserting* spaces if we back up over a # tab character! This is written to be clear, not fast. have = len(chars.expandtabs(self.tabwidth)) assert have > 0 want = ((have - 1) // self.indent_width) * self.indent_width # Debug prompt is multilined.... # if self.context_use_ps1: # last_line_of_prompt = sys.ps1.split('\n')[-1] # else: last_line_of_prompt = "" ncharsdeleted = 0 while 1: if chars == last_line_of_prompt: break chars = chars[:-1] ncharsdeleted = ncharsdeleted + 1 have = len(chars.expandtabs(self.tabwidth)) if have <= want or chars[-1] not in " \t": break text.delete("insert-%dc" % ncharsdeleted, "insert") if have < want: text.insert("insert", " " * (want - have)) return "break" def perform_midline_tab(self, event=None): "autocompleter can put its magic here" # by default return self.perform_dumb_tab(event) def perform_dumb_tab(self, event=None): self._log_keypress_for_undo(event) self.insert("insert", "\t") return "break" def perform_smart_tab(self, event=None): self._log_keypress_for_undo(event) # if intraline selection: # delete it # elif multiline selection: # do indent-region # else: # indent one level first, last = self.get_selection_indices() if first and last: if index2line(first) != index2line(last): return self.indent_region(event) self.delete(first, last) self.mark_set("insert", first) prefix = self.get("insert linestart", "insert") raw, effective = classifyws(prefix, self.tabwidth) if raw == len(prefix): # only whitespace to the left self._reindent_to(effective + self.indent_width) else: # tab to the next 'stop' within or to right of line's text: if self.should_indent_with_tabs(): pad = "\t" else: effective = len(prefix.expandtabs(self.tabwidth)) n = self.indent_width pad = " " * (n - effective % n) self.insert("insert", pad) self.see("insert") return "break" def get_cursor_position(self): return map(int, self.index("insert").split(".")) def get_line_count(self): return list(map(int, self.index("end-1c").split(".")))[0] def perform_return(self, event): self.insert("insert", "\n") return "break" def perform_page_down(self, event): # if last line is visible then go to last line # (by default it doesn't move then) try: last_visible_idx = self.index("@0,%d" % self.winfo_height()) row, _ = map(int, last_visible_idx.split(".")) line_count = self.get_line_count() if row == line_count or row == line_count - 1: # otherwise tk doesn't show last line self.mark_set("insert", "end") except Exception as e: logger.exception("Could not perform page down", exc_info=e) def perform_page_up(self, event): # if first line is visible then go there # (by default it doesn't move then) try: first_visible_idx = self.index("@0,0") row, _ = map(int, first_visible_idx.split(".")) if row == 1: self.mark_set("insert", "1.0") except Exception as e: logger.exception("Could not perform page up", exc_info=e) def compute_smart_home_destination_index(self): """Is overridden in shell""" line = self.get("insert linestart", "insert lineend") for insertpt in range(len(line)): if line[insertpt] not in (" ", "\t"): break else: insertpt = len(line) lineat = int(self.index("insert").split(".")[1]) if insertpt == lineat: insertpt = 0 return "insert linestart+" + str(insertpt) + "c" def perform_smart_home(self, event): if (event.state & 4) != 0 and event.keysym == "Home": # state&4==Control. If , use the Tk binding. return None dest = self.compute_smart_home_destination_index() if (event.state & 1) == 0: # shift was not pressed self.tag_remove("sel", "1.0", "end") else: if not self.index_sel_first(): # there was no previous selection self.mark_set("my_anchor", "insert") else: if self.compare(self.index_sel_first(), "<", self.index("insert")): self.mark_set("my_anchor", "sel.first") # extend back else: self.mark_set("my_anchor", "sel.last") # extend forward first = self.index(dest) last = self.index("my_anchor") if self.compare(first, ">", last): first, last = last, first self.tag_remove("sel", "1.0", "end") self.tag_add("sel", first, last) self.mark_set("insert", dest) self.see("insert") return "break" def move_to_edge_if_selection(self, edge_index): """Cursor move begins at start or end of selection When a left/right cursor key is pressed create and return to Tkinter a function which causes a cursor move from the associated edge of the selection. """ def move_at_edge(event): if ( self.has_selection() and (event.state & 5) == 0 ): # no shift(==1) or control(==4) pressed try: self.mark_set("insert", ("sel.first+1c", "sel.last-1c")[edge_index]) except tk.TclError: pass return move_at_edge def perform_tab(self, event=None): self._log_keypress_for_undo(event) if event.state & 0x0001: # shift is pressed (http://stackoverflow.com/q/32426250/261181) return self.dedent_region(event) else: # check whether there are letters before cursor on this line index = self.index("insert") left_text = self.get(index + " linestart", index) if left_text.strip() == "" or self.has_selection(): return self.perform_smart_tab(event) else: return self.perform_midline_tab(event) def indent_region(self, event=None): return self._change_indentation(True) def dedent_region(self, event=None): return self._change_indentation(False) def _change_indentation(self, increase=True): head, tail, chars, lines = self._get_region() # Text widget plays tricks if selection ends on last line # and content doesn't end with empty line, text_last_line = index2line(self.index("end-1c")) sel_last_line = index2line(tail) if sel_last_line >= text_last_line: while not self.get(head, "end").endswith("\n\n"): self.insert("end", "\n") for pos in range(len(lines)): line = lines[pos] if line: raw, effective = classifyws(line, self.tabwidth) if increase: effective = effective + self.indent_width else: effective = max(effective - self.indent_width, 0) lines[pos] = self._make_blanks(effective) + line[raw:] self._set_region(head, tail, chars, lines) return "break" def select_all(self, event): self.tag_remove("sel", "1.0", tk.END) self.tag_add("sel", "1.0", tk.END) def set_read_only(self, value): if value == self.is_read_only(): return TweakableText.set_read_only(self, value) self._reload_theme_options() if self._should_tag_current_line: self._tag_current_line() def _reindent_to(self, column): # Delete from beginning of line to insert point, then reinsert # column logical (meaning use tabs if appropriate) spaces. if self.compare("insert linestart", "!=", "insert"): self.delete("insert linestart", "insert") if column: self.insert("insert", self._make_blanks(column)) def _get_region(self): first, last = self.get_selection_indices() if first and last: head = self.index(first + " linestart") tail = self.index(last + "-1c lineend +1c") else: head = self.index("insert linestart") tail = self.index("insert lineend +1c") chars = self.get(head, tail) lines = chars.split("\n") return head, tail, chars, lines def _set_region(self, head, tail, chars, lines): newchars = "\n".join(lines) if newchars == chars: self.bell() return self.tag_remove("sel", "1.0", "end") self.mark_set("insert", head) self.delete(head, tail) self.insert(head, newchars) self.tag_add("sel", head, "insert") def _log_keypress_for_undo(self, e): if e is None: return # NB! this may not execute if the event is cancelled in another handler event_kind = self._get_event_kind(e) if ( event_kind != self._last_event_kind or e.char in ("\r", "\n", " ", "\t") or e.keysym in ["Return", "KP_Enter"] or time.time() - self._last_key_time > 2 ): self.edit_separator() self._last_event_kind = event_kind self._last_key_time = time.time() def _get_event_kind(self, event): if event.keysym in ("BackSpace", "Delete"): return "delete" elif event.char: return "insert" else: # eg. e.keysym in ("Left", "Up", "Right", "Down", "Home", "End", "Prior", "Next"): return "other_key" def _make_blanks(self, n): # Make string that displays as n leading blanks. if self.should_indent_with_tabs(): ntabs, nspaces = divmod(n, self.tabwidth) return "\t" * ntabs + " " * nspaces else: return " " * n def _on_undo(self, e): self._last_event_kind = "undo" def _on_redo(self, e): self._last_event_kind = "redo" def _on_cut(self, e): self._last_event_kind = "cut" self.edit_separator() def _on_copy(self, e): self._last_event_kind = "copy" self.edit_separator() def _on_paste(self, e): if self.is_read_only(): return try: if self.has_selection(): self.direct_delete("sel.first", "sel.last") except Exception: pass self._last_event_kind = "paste" self.edit_separator() self.see("insert") self.after_idle(lambda: self.see("insert")) def _on_get_focus(self, e): self._last_event_kind = "get_focus" self.edit_separator() def _on_lose_focus(self, e): self._last_event_kind = "lose_focus" self.edit_separator() def _on_key_press(self, e): return self._log_keypress_for_undo(e) def _on_mouse_click(self, event): self.edit_separator() def _tag_current_line(self, event=None): self.tag_remove("current_line", "1.0", "end") # Let's show current line only with readable text # (this fits well with Thonny debugger, # otherwise debugger focus box and current line interact in an ugly way) if self._should_tag_current_line and not self.is_read_only(): # we may be on the same line as with prev event but tag needs extension lineno = int(self.index("insert").split(".")[0]) self.tag_add("current_line", str(lineno) + ".0", str(lineno + 1) + ".0") def on_secondary_click(self, event=None): "Use this for invoking context menu" self.focus_set() if event: self.mark_set("insert", "@%d,%d" % (event.x, event.y)) def _reload_theme_options(self, event=None): style = ttk.Style() states = [] if self.is_read_only(): states.append("readonly") # Following crashes when a combobox is focused # if self.focus_get() == self: # states.append("focus") if "background" not in self._initial_configuration: background = style.lookup(self._style, "background", states) if background: self.configure(background=background) if "foreground" not in self._initial_configuration: foreground = style.lookup(self._style, "foreground", states) if foreground: self.configure(foreground=foreground) self.configure(insertbackground=foreground) def _insert_untypable_characters_on_windows(self, event): if event.state == 131084: # AltGr or Ctrl+Alt lang_id = get_keyboard_language() char = _windows_altgr_chars_by_lang_id_and_keycode.get(lang_id, {}).get( event.keycode, None ) if char is not None: self.insert("insert", char) def destroy(self): self.unbind("<>", self._ui_theme_change_binding) super().destroy() def direct_insert(self, index, chars, tags=None, **kw): super().direct_insert(index, chars, tags, **kw) class TextFrame(ttk.Frame): "Decorates text with scrollbars, listens for theme changes" def __init__( self, master, text_class=EnhancedText, horizontal_scrollbar=True, vertical_scrollbar=True, vertical_scrollbar_class=ttk.Scrollbar, horizontal_scrollbar_class=ttk.Scrollbar, vertical_scrollbar_style=None, horizontal_scrollbar_style=None, borderwidth=0, relief="sunken", **text_options, ): ttk.Frame.__init__(self, master=master, borderwidth=borderwidth, relief=relief) final_text_options = { "borderwidth": 0, "insertwidth": 2, "spacing1": 0, "spacing3": 0, "highlightthickness": 0, "inactiveselectbackground": "gray", "padx": 5, "pady": 5, } final_text_options.update(text_options) self.text = text_class(self, **final_text_options) if vertical_scrollbar: self._vbar = vertical_scrollbar_class( self, orient=tk.VERTICAL, style=vertical_scrollbar_style ) self._vbar["command"] = self._vertical_scroll self.text["yscrollcommand"] = self._vertical_scrollbar_update else: self._vbar = None if horizontal_scrollbar: self._hbar = horizontal_scrollbar_class( self, orient=tk.HORIZONTAL, style=horizontal_scrollbar_style ) self._hbar["command"] = self._horizontal_scroll self.text["xscrollcommand"] = self._horizontal_scrollbar_update else: self._hbar = None self.grid_main_widgets() self.columnconfigure(1, weight=1) self.rowconfigure(0, weight=1) self._ui_theme_change_binding = self.bind( "<>", self._reload_theme_options, True ) # TODO: add context menu? self._reload_theme_options(None) def grid_main_widgets(self): self.text.grid(row=0, column=1, sticky=tk.NSEW) if self._vbar: self._vbar.grid(row=0, column=2, sticky=tk.NSEW) if self._hbar: self._hbar.grid(row=1, column=0, sticky=tk.NSEW, columnspan=3) def focus_set(self): self.text.focus_set() def _vertical_scrollbar_update(self, *args): if not hasattr(self, "_vbar"): return self._vbar.set(*args) self.text.event_generate("<>") def _horizontal_scrollbar_update(self, *args): self._hbar.set(*args) def _vertical_scroll(self, *args): self.text.yview(*args) self.text.event_generate("<>") def _horizontal_scroll(self, *args): self.text.xview(*args) def _reload_theme_options(self, event=None): pass def destroy(self): self.unbind("<>", self._ui_theme_change_binding) super().destroy() class EnhancedTextFrame(TextFrame): "Adds line numbers and print margin" def __init__( self, master, line_numbers=False, line_length_margin=0, first_line_number=1, text_class=EnhancedText, horizontal_scrollbar=True, vertical_scrollbar=True, vertical_scrollbar_class=ttk.Scrollbar, horizontal_scrollbar_class=ttk.Scrollbar, vertical_scrollbar_style=None, horizontal_scrollbar_style=None, borderwidth=0, relief="sunken", gutter_background="#e0e0e0", gutter_foreground="#999999", **text_options, ): self._gutter = None super().__init__( master, text_class=text_class, horizontal_scrollbar=horizontal_scrollbar, vertical_scrollbar=vertical_scrollbar, vertical_scrollbar_class=vertical_scrollbar_class, horizontal_scrollbar_class=horizontal_scrollbar_class, vertical_scrollbar_style=vertical_scrollbar_style, horizontal_scrollbar_style=horizontal_scrollbar_style, borderwidth=borderwidth, relief=relief, **text_options, ) self._recommended_line_length = line_length_margin self._gutter = tk.Text( self, width=5, padx=0, pady=5, highlightthickness=0, bd=0, takefocus=False, font=self.text["font"], background="#e0e0e0", foreground=gutter_foreground, selectbackground=gutter_background, selectforeground=gutter_foreground, cursor="arrow", state="disabled", undo=False, wrap="none", ) if "height" in text_options: self._gutter.configure(height=text_options["height"]) self._gutter_is_gridded = False self._gutter.bind("", self.on_gutter_double_click, True) self._gutter.bind("", self.on_gutter_click, True) self._gutter.bind("", self.on_gutter_click, True) self._gutter.bind("", self.on_gutter_motion, True) self._gutter["yscrollcommand"] = self._gutter_scroll # need tags for justifying and rmargin self._gutter.tag_configure("content", justify="right", rmargin=3) # gutter will be gridded later assert first_line_number is not None self._first_line_number = first_line_number self.set_gutter_visibility(line_numbers) margin_line_color = ttk.Style().lookup("Gutter", "background", default="LightGray") self._margin_line = tk.Canvas( self.text, borderwidth=0, width=1, height=2000, highlightthickness=0, background=margin_line_color, ) self.update_margin_line() self.text.bind("<>", self._text_changed, True) self.text.bind("<>", self._cursor_moved, True) self._reload_gutter_theme_options() def set_gutter_visibility(self, value): if value and not self._gutter_is_gridded: self._gutter.grid(row=0, column=0, sticky=tk.NSEW) self._gutter_is_gridded = True elif not value and self._gutter_is_gridded: self._gutter.grid_forget() self._gutter_is_gridded = False else: return """ # insert first line number (NB! Without trailing linebreak. See update_gutter) self._gutter.config(state="normal") self._gutter.delete("1.0", "end") for content, tags in self.compute_gutter_line(self._first_line_number): self._gutter.insert("end", content, ("content",) + tags) self._gutter.config(state="disabled") """ self.update_gutter(True) def set_line_length_margin(self, value): self._recommended_line_length = value self.update_margin_line() def _gutter_scroll(self, *args): if not hasattr(self, "_vbar"): return try: self._vbar.set(*args) self.text.yview(tk.MOVETO, args[0]) except TclError: pass def _text_changed(self, event): self.update_gutter() def _cursor_moved(self, event): self._update_gutter_active_line() def update_gutter(self, clean=False): if clean: self._gutter.config(state="normal") self._gutter.delete("1.0", "end") # need to add first item separately, because Text can't report 0 rows for content, tags in self.compute_gutter_line(self._first_line_number): self._gutter.insert("end-1c", content, tags + ("content",)) self._gutter.config(state="disabled") text_line_count = int(self.text.index("end").split(".")[0]) gutter_line_count = int(self._gutter.index("end").split(".")[0]) if text_line_count != gutter_line_count: self._gutter.config(state="normal") # NB! Text acts weird with last symbol # (don't really understand whether it automatically keeps a newline there or not) # Following seems to ensure both Text-s have same height if text_line_count > gutter_line_count: delta = text_line_count - gutter_line_count start = gutter_line_count + self._first_line_number - 1 if not clean and text_line_count > 10 and gutter_line_count < 3: # probably initial load, do bulk insert parts = [] for i in range(start, start + delta): parts.append("\n") for content, tags in self.compute_gutter_line(i, plain=True): parts.append(content) self._gutter.insert("end-1c", "".join(parts), ("content",) + tags) else: for i in range(start, start + delta): self._gutter.insert("end-1c", "\n", ("content",)) for content, tags in self.compute_gutter_line(i): self._gutter.insert("end-1c", content, ("content",) + tags) else: self._gutter.delete(line2index(text_line_count) + "-1c", "end-1c") self._gutter.config(state="disabled") # synchronize gutter scroll position with text # https://mail.python.org/pipermail/tkinter-discuss/2010-March/002197.html first, _ = self.text.yview() self._gutter.yview_moveto(first) self._update_gutter_active_line() if text_line_count > 9998: self._gutter.configure(width=7) elif text_line_count > 998: self._gutter.configure(width=6) def _update_gutter_active_line(self): self._gutter.tag_remove("active", "1.0", "end") insert = self.text.index("insert") self._gutter.tag_add("active", insert + " linestart", insert + " lineend") def compute_gutter_line(self, lineno, plain=False): yield str(lineno), () def update_margin_line(self): if self._recommended_line_length == 0: self._margin_line.place_forget() else: try: self.text.update_idletasks() # How far left has text been scrolled first_visible_idx = self.text.index("@0,0") first_visible_col = int(first_visible_idx.split(".")[1]) bbox = self.text.bbox(first_visible_idx) first_visible_col_x = bbox[0] margin_line_visible_col = self._recommended_line_length - first_visible_col delta = first_visible_col_x except Exception: # fall back to ignoring scroll position margin_line_visible_col = self._recommended_line_length delta = 0 if margin_line_visible_col > -1: try: x = ( get_text_font(self.text).measure((margin_line_visible_col - 1) * "M") + delta + self.text["padx"] ) except TclError: logger.exception("Could not measure text") x = -10 else: x = -10 # print(first_visible_col, first_visible_col_x) self._margin_line.place(y=-10, x=x) def on_gutter_click(self, event=None): try: linepos = self._gutter.index("@%s,%s" % (event.x, event.y)).split(".")[0] self.text.mark_set("insert", "%s.0" % linepos) self._gutter.mark_set("gutter_selection_start", "%s.0" % linepos) if ( event.type == "4" ): # In Python 3.6 you can use tk.EventType.ButtonPress instead of "4" self.text.tag_remove("sel", "1.0", "end") except tk.TclError: logger.exception("on_gutter_click") def on_gutter_double_click(self, event=None): try: self._gutter.mark_unset("gutter_selection_start") self.text.tag_remove("sel", "1.0", "end") self._gutter.tag_remove("sel", "1.0", "end") except tk.TclError: logger.exception("on_gutter_click") def on_gutter_motion(self, event=None): try: if "gutter_selection_start" not in self._gutter.mark_names(): return linepos = int(self._gutter.index("@%s,%s" % (event.x, event.y)).split(".")[0]) gutter_selection_start = int(self._gutter.index("gutter_selection_start").split(".")[0]) self.text.select_lines( min(gutter_selection_start, linepos), max(gutter_selection_start - 1, linepos - 1) ) self.text.mark_set("insert", "%s.0" % linepos) self.text.focus_set() except tk.TclError: logger.exception("on_gutter_motion") def _vertical_scrollbar_update(self, *args): if not hasattr(self, "_vbar"): return super()._vertical_scrollbar_update(*args) self._gutter.yview(tk.MOVETO, args[0]) def _horizontal_scrollbar_update(self, *args): super()._horizontal_scrollbar_update(*args) self.update_margin_line() def _vertical_scroll(self, *args): super()._vertical_scroll(*args) self._gutter.yview(*args) def _horizontal_scroll(self, *args): super()._horizontal_scroll(*args) self.update_margin_line() def _reload_theme_options(self, event=None): super()._reload_theme_options(event) if self._gutter is not None: self._reload_gutter_theme_options(event) def _reload_gutter_theme_options(self, event=None): style = ttk.Style() background = style.lookup("GUTTER", "background") if background: self._gutter.configure(background=background, selectbackground=background) self._margin_line.configure(background=background) foreground = style.lookup("GUTTER", "foreground") if foreground: self._gutter.configure(foreground=foreground, selectforeground=foreground) def get_text_font(text): font = text["font"] if isinstance(font, str): return tkfont.nametofont(font) else: return font def classifyws(s, tabwidth): raw = effective = 0 for ch in s: if ch == " ": raw = raw + 1 effective = effective + 1 elif ch == "\t": raw = raw + 1 effective = (effective // tabwidth + 1) * tabwidth else: break return raw, effective def index2line(index): return int(float(index)) def line2index(line): return str(float(line)) def fixwordbreaks(root): # Adapted from idlelib.EditorWindow (Python 3.4.2) # Modified to include non-ascii chars # Make sure that Tk's double-click and next/previous word # operations use our definition of a word (i.e. an identifier) root.tk.call("tcl_wordBreakAfter", "a b", 0) # make sure word.tcl is loaded root.tk.call("set", "tcl_wordchars", r"\w") root.tk.call("set", "tcl_nonwordchars", r"\W") def rebind_control_a(root): # Tk 8.6 has <> event but 8.5 doesn't # http://stackoverflow.com/questions/22907200/remap-default-keybinding-in-tkinter def control_a(event): widget = event.widget if isinstance(widget, tk.Text): widget.tag_remove("sel", "1.0", "end") widget.tag_add("sel", "1.0", "end") root.bind_class("Text", "", control_a) def _running_on_mac(): return tk._default_root.call("tk", "windowingsystem") == "aqua" def _running_on_x11(): return tk._default_root.call("tk", "windowingsystem") == "x11" def get_keyboard_language(): # https://stackoverflow.com/a/42047820/261181 if sys.platform != "win32": raise NotImplementedError("Can provide keyboard language only on Windows") import ctypes user32 = ctypes.WinDLL("user32", use_last_error=True) curr_window = user32.GetForegroundWindow() thread_id = user32.GetWindowThreadProcessId(curr_window, 0) # Made up of 0xAAABBBB, AAA = HKL (handle object) & BBBB = language ID klid = user32.GetKeyboardLayout(thread_id) # Language ID -> low 10 bits, Sub-language ID -> high 6 bits # Extract language ID from KLID lid = klid & (2**16 - 1) return lid _windows_altgr_chars_by_lang_id_and_keycode = { # https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings 0x0425: {191: "^"} # AltGr+Ä } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/token_utils.py0000644000076600000240000000432614417536743017661 0ustar00aivarannamaastaffimport builtins import keyword def matches_any(name, alternates): "Return a named group pattern matching list of alternates." return "(?P<%s>" % name + "|".join(alternates) + ")" # not perfect, but hopefully good enough _SOFT_KEYWORD = [r"^[ \t]*(match|case)[ \t]+(?!=)"] KEYWORD = matches_any("keyword", [r"\b" + k + r"\b" for k in keyword.kwlist] + _SOFT_KEYWORD) _builtinlist = [ str(name) for name in dir(builtins) if not name.startswith("_") and name not in keyword.kwlist ] # Not really built-ins, but special names nevertheless _builtinlist.append("self") _builtinlist.append("cls") # TODO: move builtin handling to global-local BUILTIN = r"([^.'\"\\#]\b|^)" + matches_any("builtin", _builtinlist) + r"\b" NUMBER = matches_any( "number", [ r"\b0[bB][_0-1]+", r"\b0[oO][_0-7]+", r"\b0[xX][_0-9a-fA-F]+", r"\b(\d[_\d]*(\.[_\d]*)?|\.\d[_\d]*)([eE][+-]?[_\d]+)?j?", ], ) # TODO: would it make regex too slow? VARIABLE = matches_any("VARIABLE", [...]) METHOD_CALL = matches_any("method_call", [r"(?<=\.)([\w_]+)(?=\()"]) FUNCTION_CALL = matches_any("function_call", [r"(?:(?<=^)|(?<=[^._\w]))([\w_]+)(?=\()"]) COMMENT = matches_any("comment", [r"#[^\n]*"]) MAGIC_COMMAND = matches_any("magic", [r"^%[^\n]*"]) # used only in shell STRINGPREFIX = r"(\br|u|ur|R|U|UR|Ur|uR|b|B|br|Br|bR|BR|rb|rB|Rb|RB|f|F|fr|Fr|fR|FR|rf|rF|Rf|RF)?" SQSTRING_OPEN = STRINGPREFIX + r"'[^'\\\n]*(\\.[^'\\\n]*)*\n?" SQSTRING_CLOSED = STRINGPREFIX + r"'[^'\\\n]*(\\.[^'\\\n]*)*'" DQSTRING_OPEN = STRINGPREFIX + r'"[^"\\\n]*(\\.[^"\\\n]*)*\n?' DQSTRING_CLOSED = STRINGPREFIX + r'"[^"\\\n]*(\\.[^"\\\n]*)*"' SQ3STRING = STRINGPREFIX + r"'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?" DQ3STRING = STRINGPREFIX + r'"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?' SQ3DELIMITER = STRINGPREFIX + "'''" DQ3DELIMITER = STRINGPREFIX + '"""' COMMENT_WITH_Q3DELIMITER = matches_any("q3comment", [r"#[^\n]*('''|\"\"\")[^\n]*"]) STRING_OPEN = matches_any("open_string", [SQSTRING_OPEN, DQSTRING_OPEN]) STRING_CLOSED = matches_any("string", [SQSTRING_CLOSED, DQSTRING_CLOSED]) STRING3_DELIMITER = matches_any("DELIMITER3", [SQ3DELIMITER, DQ3DELIMITER]) STRING3 = matches_any("string3", [DQ3STRING, SQ3STRING]) TAB = matches_any("tab", "\t") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/udisks.py0000644000076600000240000001146214730022736016610 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import asyncio import os from logging import getLogger from typing import Sequence from dbus_next.aio import MessageBus from dbus_next.constants import BusType from dbus_next.errors import DBusError logger = getLogger(__name__) UDISKS2_BUS_NAME = "org.freedesktop.UDisks2" def list_volumes_sync() -> Sequence[str]: loop = asyncio.get_event_loop() return loop.run_until_complete(list_volumes()) async def list_volumes() -> Sequence[str]: bus = await MessageBus(bus_type=BusType.SYSTEM).connect() introspection = None with open( os.path.join(os.path.dirname(__file__), "dbus", "org.freedesktop.UDisks2.xml"), "r" ) as f: introspection = f.read() object_manager_introspection = None with open( os.path.join(os.path.dirname(__file__), "dbus", "org.freedesktop.DBus.ObjectManager.xml"), "r", ) as f: object_manager_introspection = f.read() proxy_object = bus.get_proxy_object( UDISKS2_BUS_NAME, "/org/freedesktop/UDisks2/Manager", introspection ) interface = proxy_object.get_interface("org.freedesktop.UDisks2.Manager") block_devices = await interface.call_get_block_devices({}) logger.debug(f"Block devices: {block_devices}") proxy_object = bus.get_proxy_object( UDISKS2_BUS_NAME, "/org/freedesktop/UDisks2", object_manager_introspection ) interface = proxy_object.get_interface("org.freedesktop.DBus.ObjectManager") managed_objects = await interface.call_get_managed_objects() logger.debug(f"Managed objects: {managed_objects}") # Find all drives drives = [] for device, values in managed_objects.items(): type = next(iter(values)) if type == "org.freedesktop.UDisks2.Drive": drives.append(device) logger.debug(f"\nDrives: {drives}\n") discovered_usb_drives = [] for a_drive in drives: proxy_object = bus.get_proxy_object(UDISKS2_BUS_NAME, a_drive, introspection) interface = proxy_object.get_interface("org.freedesktop.UDisks2.Drive") connection_bus = await interface.get_connection_bus() time_media_detected = await interface.get_time_media_detected() if connection_bus == "usb": discovered_usb_drives.append( { "drive": a_drive, "time_media_detected": time_media_detected, } ) logger.debug(f"\nUSB Drives: {discovered_usb_drives}\n") if len(discovered_usb_drives) == 0: logger.debug("No USB drive found") return [] # Find the block devices associated with each USB drive discovered_block_devices = [] for block_device in block_devices: proxy_object = bus.get_proxy_object(UDISKS2_BUS_NAME, block_device, introspection) interface = proxy_object.get_interface("org.freedesktop.UDisks2.Block") id_usage = await interface.get_id_usage() if id_usage != "filesystem": continue a_drive = await interface.get_drive() for dictionary in discovered_usb_drives: if dictionary["drive"] == a_drive: discovered_block_devices.append( { "block_device": block_device, "time_media_detected": dictionary["time_media_detected"], } ) break logger.debug(f"\nDiscovered Block Devices: {discovered_block_devices}\n") if len(discovered_block_devices) == 0: logger.debug("No block devices found") return [] # In case there are multiple block devices detected, sort by time the device was detected. # Most recently detected are placed first. discovered_block_devices = sorted( discovered_block_devices, key=lambda x: x.get("time_media_detected") ) discovered_block_devices = [i["block_device"] for i in discovered_block_devices] discovered_mount_points = [] for block_device in discovered_block_devices: # Make sure that the filesystem is mounted and get the mount point. proxy_object = bus.get_proxy_object(UDISKS2_BUS_NAME, block_device, introspection) interface = proxy_object.get_interface("org.freedesktop.UDisks2.Filesystem") mount_point = None try: mount_point = await interface.call_mount({}) except DBusError as error: if "is already mounted" not in error.text: raise mount_points = await interface.get_mount_points() # todo Double check that I don't need to account for endianess or other encoding formats here. mount_point = mount_points[0].decode("utf-8") discovered_mount_points.append(mount_point.rstrip("\x00")) logger.debug(f"\nFilesystem Mount Points: {discovered_mount_points}\n") return discovered_mount_points ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/ui_utils.py0000644000076600000240000024375714730041235017154 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import os import platform import re import subprocess import sys import textwrap import threading import time import tkinter as tk import tkinter.font import traceback from logging import getLogger from tkinter import filedialog, messagebox, ttk from typing import Any, Callable, Dict, List, Optional, Tuple, Union # @UnusedImport from _tkinter import TclError from thonny import get_workbench, misc_utils, tktextext from thonny.common import TextRange from thonny.languages import get_button_padding, tr from thonny.misc_utils import ( running_on_linux, running_on_mac_os, running_on_rpi, running_on_windows, ) from thonny.tktextext import TweakableText PARENS_REGEX = re.compile(r"[\(\)\{\}\[\]]") logger = getLogger(__name__) class CommonDialog(tk.Toplevel): def __init__(self, master=None, skip_tk_dialog_attributes=False, **kw): assert master super().__init__(master=master, class_="Thonny", **kw) self.withdraw() # remain invisible until size calculations are done # Opening a dialog and minimizing everything with Win-D in Windows makes the main # window and dialog stuck. This is a work-around. self.bind("", self._unlock_on_focus_in, True) if not skip_tk_dialog_attributes: # https://bugs.python.org/issue43655 if self._windowingsystem == "aqua": self.tk.call( "::tk::unsupported::MacWindowStyle", "style", self, "moveableModal", "" ) elif self._windowingsystem == "x11": self.wm_attributes("-type", "dialog") self.parent = master def _unlock_on_focus_in(self, event): if not self.winfo_ismapped(): focussed_widget = self.focus_get() self.deiconify() if focussed_widget: focussed_widget.focus_set() def get_large_padding(self): return ems_to_pixels(1.5) def get_medium_padding(self): return ems_to_pixels(1) def get_small_padding(self): return ems_to_pixels(0.6) def set_initial_focus(self, node=None) -> bool: if node is None: node = self if isinstance( node, ( ttk.Entry, ttk.Combobox, ttk.Treeview, tk.Text, ttk.Notebook, ttk.Button, tk.Listbox, ), ): node.focus_set() return True else: for child in node.winfo_children(): if self.set_initial_focus(child): return True return False class CommonDialogEx(CommonDialog): def __init__(self, master=None, **kw): super().__init__(master=master, **kw) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) # Need to fill the dialog with a frame to gain theme support self.main_frame = ttk.Frame(self) # ipady doesn't work right, at least on Linux (it only applies to the first gridded child) # therefore only providing common padding for left and right edges self.main_frame.grid(row=0, column=0, sticky="nsew", ipadx=self.get_large_padding()) self.main_frame.rowconfigure(0, weight=1) self.main_frame.columnconfigure(0, weight=1) self.bind("", self.on_close, True) self.protocol("WM_DELETE_WINDOW", self.on_close) def on_close(self, event=None): self.destroy() class QueryDialog(CommonDialogEx): def __init__( self, master, title: str, prompt: str, initial_value: str = "", options: List[str] = [], entry_width: Optional[int] = None, ): super().__init__(master) self.var = tk.StringVar(value=initial_value) self.result = None margin = self.get_large_padding() spacing = margin // 2 self.title(title) self.prompt_label = ttk.Label(self.main_frame, text=prompt) self.prompt_label.grid(row=1, column=1, columnspan=2, padx=margin, pady=(margin, spacing)) if options: self.entry_widget = ttk.Combobox( self.main_frame, textvariable=self.var, values=options, height=15, width=entry_width ) else: self.entry_widget = ttk.Entry(self.main_frame, textvariable=self.var, width=entry_width) self.entry_widget.bind("", self.on_ok, True) self.entry_widget.bind("", self.on_ok, True) self.entry_widget.grid( row=3, column=1, columnspan=2, sticky="we", padx=margin, pady=(0, margin) ) self.ok_button = ttk.Button( self.main_frame, text=tr("OK"), command=self.on_ok, default="active" ) self.ok_button.grid(row=5, column=1, padx=(margin, spacing), pady=(0, margin), sticky="e") self.cancel_button = ttk.Button(self.main_frame, text=tr("Cancel"), command=self.on_cancel) self.cancel_button.grid(row=5, column=2, padx=(0, margin), pady=(0, margin), sticky="e") self.main_frame.columnconfigure(1, weight=1) self.entry_widget.focus_set() def on_ok(self, event=None): self.result = self.var.get() self.destroy() def on_cancel(self, event=None): self.result = None self.destroy() def get_result(self) -> Optional[str]: return self.result def ask_string( title: str, prompt: str, initial_value: str = "", options: List[str] = [], entry_width: Optional[int] = None, master=None, ): dlg = QueryDialog( master, title, prompt, initial_value=initial_value, options=options, entry_width=entry_width ) show_dialog(dlg, master) return dlg.get_result() class CustomMenubar(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master, style="CustomMenubar.TFrame") self._menus = [] self._opened_menu = None ttk.Style().map( "CustomMenubarLabel.TLabel", background=[ ("!active", lookup_style_option("Menubar", "background", "gray")), ("active", lookup_style_option("Menubar", "activebackground", "LightYellow")), ], foreground=[ ("!active", lookup_style_option("Menubar", "foreground", "black")), ("active", lookup_style_option("Menubar", "activeforeground", "black")), ], ) def add_cascade(self, label, menu): label_widget = ttk.Label( self, style="CustomMenubarLabel.TLabel", text=label, padding=[6, 3, 6, 2], font="TkDefaultFont", ) if len(self._menus) == 0: padx = (6, 0) else: padx = 0 label_widget.grid(row=0, column=len(self._menus), padx=padx) def enter(event): label_widget.state(("active",)) # Don't know how to open this menu when another menu is open # another tk_popup just doesn't work unless old menu is closed by click or Esc # https://stackoverflow.com/questions/38081470/is-there-a-way-to-know-if-tkinter-optionmenu-dropdown-is-active # unpost doesn't work in Win and Mac: https://www.tcl.tk/man/tcl8.5/TkCmd/menu.htm#M62 # print("ENTER", menu, self._opened_menu) if self._opened_menu is not None: self._opened_menu.unpost() click(event) def leave(event): label_widget.state(("!active",)) def click(event): try: # print("Before") self._opened_menu = menu menu.tk_popup( label_widget.winfo_rootx(), label_widget.winfo_rooty() + label_widget.winfo_height(), ) finally: # print("After") self._opened_menu = None label_widget.bind("", enter, True) label_widget.bind("", leave, True) label_widget.bind("<1>", click, True) self._menus.append(menu) class AutomaticPanedWindow(tk.PanedWindow): """ Enables inserting panes according to their position_key-s. Automatically adds/removes itself to/from its master AutomaticPanedWindow. Fixes some style glitches. """ def __init__(self, master, position_key=None, preferred_size_in_pw=None, **kwargs): tk.PanedWindow.__init__(self, master, border=0, **kwargs) self._pane_minsize = 100 self.position_key = position_key self._restoring_pane_sizes = False self._last_window_size = (0, 0) self._full_size_not_final = True self._configure_binding = self.bind("", self._on_window_resize, True) self._update_appearance_binding = self.bind( "<>", self._update_appearance, True ) self.bind("", self._on_mouse_dragged, True) self._update_appearance() # should be in the end, so that it can be detected when # constructor hasn't completed yet self.preferred_size_in_pw = preferred_size_in_pw def insert(self, pos, child, **kw): kw.setdefault("minsize", self._pane_minsize) if pos == "auto": # According to documentation I should use self.panes() # but this doesn't return expected widgets for sibling in sorted( self.pane_widgets(), key=lambda p: p.position_key if hasattr(p, "position_key") else 0, ): if ( not hasattr(sibling, "position_key") or sibling.position_key == None or sibling.position_key > child.position_key ): pos = sibling break else: pos = "end" if isinstance(pos, tk.Widget): kw["before"] = pos self.add(child, **kw) def add(self, child, **kw): kw.setdefault("minsize", self._pane_minsize) tk.PanedWindow.add(self, child, **kw) self._update_visibility() self._check_restore_preferred_sizes() def remove(self, child): tk.PanedWindow.remove(self, child) self._update_visibility() self._check_restore_preferred_sizes() def forget(self, child): tk.PanedWindow.forget(self, child) self._update_visibility() self._check_restore_preferred_sizes() def destroy(self): self.unbind("", self._configure_binding) self.unbind("<>", self._update_appearance_binding) tk.PanedWindow.destroy(self) def is_visible(self): if not isinstance(self.master, AutomaticPanedWindow): return self.winfo_ismapped() else: return self in self.master.pane_widgets() def pane_widgets(self): result = [] for pane in self.panes(): # pane is not the widget but some kind of reference object assert not isinstance(pane, tk.Widget) result.append(self.nametowidget(str(pane))) return result def _on_window_resize(self, event): if event.width < 10 or event.height < 10: return window = self.winfo_toplevel() window_size = (window.winfo_width(), window.winfo_height()) initializing = hasattr(window, "initializing") and window.initializing if ( not initializing and not self._restoring_pane_sizes and (window_size != self._last_window_size or self._full_size_not_final) ): self._check_restore_preferred_sizes() self._last_window_size = window_size def _on_mouse_dragged(self, event): if event.widget == self and not self._restoring_pane_sizes: self._update_preferred_sizes() def _update_preferred_sizes(self): for pane in self.pane_widgets(): if getattr(pane, "preferred_size_in_pw", None) is not None: if self.cget("orient") == "horizontal": current_size = pane.winfo_width() else: current_size = pane.winfo_height() if current_size > 20: pane.preferred_size_in_pw = current_size # paneconfig width/height effectively puts # unexplainable maxsize to some panes # if self.cget("orient") == "horizontal": # self.paneconfig(pane, width=current_size) # else: # self.paneconfig(pane, height=current_size) # # else: # self.paneconfig(pane, width=1000, height=1000) def _check_restore_preferred_sizes(self): window = self.winfo_toplevel() if getattr(window, "initializing", False): return try: self._restoring_pane_sizes = True self._restore_preferred_sizes() finally: self._restoring_pane_sizes = False def _restore_preferred_sizes(self): total_preferred_size = 0 panes_without_preferred_size = [] panes = self.pane_widgets() for pane in panes: if not hasattr(pane, "preferred_size_in_pw"): # child isn't fully constructed yet return if pane.preferred_size_in_pw is None: panes_without_preferred_size.append(pane) # self.paneconfig(pane, width=1000, height=1000) else: total_preferred_size += pane.preferred_size_in_pw # Without updating pane width/height attribute # the preferred size may lose effect when squeezing # non-preferred panes too small. Also zooming/unzooming # changes the supposedly fixed panes ... # # but # paneconfig width/height effectively puts # unexplainable maxsize to some panes # if self.cget("orient") == "horizontal": # self.paneconfig(pane, width=pane.preferred_size_in_pw) # else: # self.paneconfig(pane, height=pane.preferred_size_in_pw) assert len(panes_without_preferred_size) <= 1 size = self._get_size() if size is None: return leftover_size = self._get_size() - total_preferred_size used_size = 0 for i, pane in enumerate(panes[:-1]): used_size += pane.preferred_size_in_pw or leftover_size self._place_sash(i, used_size) used_size += int(str(self.cget("sashwidth"))) def _get_size(self): if self.cget("orient") == tk.HORIZONTAL: result = self.winfo_width() else: result = self.winfo_height() if result < 20: # Not ready yet return None else: return result def _place_sash(self, i, distance): if self.cget("orient") == tk.HORIZONTAL: self.sash_place(i, distance, 0) else: self.sash_place(i, 0, distance) def _update_visibility(self): if not isinstance(self.master, AutomaticPanedWindow): return if len(self.panes()) == 0 and self.is_visible(): self.master.forget(self) if len(self.panes()) > 0 and not self.is_visible(): self.master.insert("auto", self) def _update_appearance(self, event=None): self.configure(sashwidth=lookup_style_option("Sash", "sashthickness", ems_to_pixels(0.6))) self.configure(background=lookup_style_option("TPanedWindow", "background")) class ClosableNotebook(ttk.Notebook): def __init__(self, master, style="ButtonNotebook.TNotebook", **kw): super().__init__(master, style=style, **kw) self.tab_menu = self.create_tab_menu() self._popup_index = None self.pressed_index = None self.bind("", self._letf_btn_press, True) self.bind("", self._left_btn_release, True) if running_on_mac_os(): self.bind("", self._right_btn_press, True) self.bind("", self._right_btn_press, True) self.bind("", self._middle_btn_press, True) else: self.bind("", self._right_btn_press, True) self.bind("", self._middle_btn_press, True) # self._check_update_style() def create_tab_menu(self): menu = tk.Menu(self.winfo_toplevel(), tearoff=False, **get_style_configuration("Menu")) menu.add_command(label=tr("Close"), command=self._close_tab_from_menu) menu.add_command(label=tr("Close others"), command=self._close_other_tabs) menu.add_command(label=tr("Close all"), command=self.close_tabs) return menu def _letf_btn_press(self, event): try: elem = self.identify(event.x, event.y) index = self.index("@%d,%d" % (event.x, event.y)) if "closebutton" in elem: self.state(["pressed"]) self.pressed_index = index except Exception: # may fail, if clicked outside of tab return def _left_btn_release(self, event): if not self.instate(["pressed"]): return try: elem = self.identify(event.x, event.y) index = self.index("@%d,%d" % (event.x, event.y)) except Exception: # may fail, when mouse is dragged return else: if "closebutton" in elem and self.pressed_index == index: self.close_tab(index) self.state(["!pressed"]) finally: self.pressed_index = None def _right_btn_press(self, event): try: index = self.index("@%d,%d" % (event.x, event.y)) self._popup_index = index self.tab_menu.tk_popup(*self.winfo_toplevel().winfo_pointerxy()) except Exception: logger.exception("Opening tab menu") def _middle_btn_press(self, event): try: index = self.index("@%d,%d" % (event.x, event.y)) self.close_tab(index) except Exception: logger.exception("Middle click on tab") def _close_tab_from_menu(self): self.close_tab(self._popup_index) def _close_other_tabs(self): self.close_tabs(except_index=self._popup_index) def close_tabs(self, except_index=None): for tab_index in reversed(range(len(self.winfo_children()))): if except_index is not None and tab_index == except_index: continue else: self.close_tab(tab_index) def close_tab(self, index): child = self.get_child_by_index(index) if hasattr(child, "close"): child.close() else: self.forget(index) child.destroy() def get_child_by_index(self, index): tab_id = self.tabs()[index] if tab_id: return self.nametowidget(tab_id) else: return None def get_current_child(self): child_id = self.select() if child_id: return self.nametowidget(child_id) else: return None def focus_set(self): editor = self.get_current_child() if editor: editor.focus_set() else: super().focus_set() def _check_update_style(self): style = ttk.Style() if "closebutton" in style.element_names(): # It's done already return # respect if required images have been defined already if "img_close" not in self.image_names(): img_dir = os.path.join(os.path.dirname(__file__), "res") ClosableNotebook._close_img = tk.PhotoImage( "img_tab_close", file=os.path.join(img_dir, "tab_close.gif") ) ClosableNotebook._close_active_img = tk.PhotoImage( "img_tab_close_active", file=os.path.join(img_dir, "tab_close_active.gif") ) style.element_create( "closebutton", "image", "img_tab_close", ("active", "pressed", "!disabled", "img_tab_close_active"), ("active", "!disabled", "img_tab_close_active"), border=8, sticky="", ) style.layout( "ButtonNotebook.TNotebook.Tab", [ ( "Notebook.tab", { "sticky": "nswe", "children": [ ( "Notebook.padding", { "side": "top", "sticky": "nswe", "children": [ ( "Notebook.focus", { "side": "top", "sticky": "nswe", "children": [ ( "Notebook.label", {"side": "left", "sticky": ""}, ), ( "Notebook.closebutton", {"side": "left", "sticky": ""}, ), ], }, ) ], }, ) ], }, ) ], ) def _check_remove_padding(self, kw): # Windows themes produce 1-pixel padding to the bottom of the pane # Don't know how to get rid of it using themes if "padding" not in kw and ttk.Style().theme_use().lower() in ( "windows", "xpnative", "vista", ): kw["padding"] = (0, 0, 0, -1) def add(self, child, **kw): self._check_remove_padding(kw) super().add(child, **kw) def insert(self, pos, child, **kw): self._check_remove_padding(kw) super().insert(pos, child, **kw) class AutomaticNotebook(ClosableNotebook): """ Enables inserting views according to their position keys. Remember its own position key. Automatically updates its visibility. """ def __init__(self, master, position_key, preferred_size_in_pw=None): if get_workbench().in_simple_mode(): style = "TNotebook" else: style = "ButtonNotebook.TNotebook" super().__init__(master, style=style, padding=0) self.position_key = position_key # should be in the end, so that it can be detected when # constructor hasn't completed yet self.preferred_size_in_pw = preferred_size_in_pw def add(self, child, **kw): super().add(child, **kw) self._update_visibility() def insert(self, pos, child, **kw): if pos == "auto": for sibling in map(self.nametowidget, self.tabs()): if ( not hasattr(sibling, "position_key") or sibling.position_key == None or sibling.position_key > child.position_key ): pos = sibling break else: pos = "end" super().insert(pos, child, **kw) self._update_visibility() def hide(self, tab_id): super().hide(tab_id) self._update_visibility() def forget(self, tab_id): if tab_id in self.tabs() or tab_id in self.winfo_children(): super().forget(tab_id) self._update_visibility() def is_visible(self): return self in self.master.pane_widgets() def get_visible_child(self): for child in self.winfo_children(): if str(child) == str(self.select()): return child return None def _update_visibility(self): if not isinstance(self.master, AutomaticPanedWindow): return if len(self.tabs()) == 0 and self.is_visible(): self.master.remove(self) if len(self.tabs()) > 0 and not self.is_visible(): self.master.insert("auto", self) class TreeFrame(ttk.Frame): def __init__( self, master, columns, displaycolumns="#all", show_scrollbar=True, show_statusbar=False, borderwidth=0, relief="flat", **tree_kw, ): ttk.Frame.__init__(self, master, borderwidth=borderwidth, relief=relief) # http://wiki.tcl.tk/44444#pagetoc50f90d9a self.vert_scrollbar = ttk.Scrollbar( self, orient=tk.VERTICAL, style=scrollbar_style("Vertical") ) if show_scrollbar: self.vert_scrollbar.grid( row=0, column=1, sticky=tk.NSEW, rowspan=2 if show_statusbar else 1 ) self.tree = ttk.Treeview( self, columns=columns, displaycolumns=displaycolumns, yscrollcommand=self.vert_scrollbar.set, **tree_kw, ) self.tree["show"] = "headings" self.tree.grid(row=0, column=0, sticky=tk.NSEW) self.vert_scrollbar["command"] = self.tree.yview self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.tree.bind("<>", self.on_select, "+") self.tree.bind("", self.on_double_click, "+") self.error_label = ttk.Label(self.tree) if show_statusbar: self.statusbar = ttk.Frame(self) self.statusbar.grid(row=1, column=0, sticky="nswe") else: self.statusbar = None def _clear_tree(self): for child_id in self.tree.get_children(): self.tree.delete(child_id) def clear(self): self._clear_tree() def on_select(self, event): pass def on_double_click(self, event): pass def show_error(self, error_text): self.error_label.configure(text=error_text) self.error_label.grid() def clear_error(self): self.error_label.grid_remove() def scrollbar_style(orientation): # In mac ttk.Scrollbar uses native rendering unless style attribute is set # see http://wiki.tcl.tk/44444#pagetoc50f90d9a # Native rendering doesn't look good in dark themes if running_on_mac_os() and get_workbench().uses_dark_ui_theme(): return orientation + ".TScrollbar" else: return None def sequence_to_accelerator(sequence): """Translates Tk event sequence to customary shortcut string for showing in the menu""" if not sequence: return "" if not sequence.startswith("<"): return sequence accelerator = ( sequence.strip("<>").replace("Key-", "").replace("KeyPress-", "").replace("Control", "Ctrl") ) # Tweaking individual parts parts = accelerator.split("-") # tkinter shows shift with capital letter, but in shortcuts it's customary to include it explicitly if len(parts[-1]) == 1 and parts[-1].isupper() and not "Shift" in parts: parts.insert(-1, "Shift") # even when shift is not required, it's customary to show shortcut with capital letter if len(parts[-1]) == 1: parts[-1] = parts[-1].upper() accelerator = "+".join(parts) # Post processing accelerator = ( accelerator.replace("Minus", "-") .replace("minus", "-") .replace("Plus", "+") .replace("plus", "+") .replace("space", "Space") ) return accelerator def get_zoomed(toplevel): if "-zoomed" in toplevel.wm_attributes(): # Linux return bool(toplevel.wm_attributes("-zoomed")) else: # Win/Mac return toplevel.wm_state() == "zoomed" def set_zoomed(toplevel, value): if "-zoomed" in toplevel.wm_attributes(): # Linux toplevel.wm_attributes("-zoomed", str(int(value))) else: # Win/Mac if value: toplevel.wm_state("zoomed") else: toplevel.wm_state("normal") class EnhancedTextWithLogging(tktextext.EnhancedText): def __init__(self, master=None, style="Text", tag_current_line=False, cnf={}, **kw): super().__init__( master=master, style=style, tag_current_line=tag_current_line, cnf=cnf, **kw ) self._last_event_changed_line_count = False def direct_insert(self, index, chars, tags=None, **kw): # try removing line numbers # TODO: shouldn't it take place only on paste? # TODO: does it occur when opening a file with line numbers in it? # if self._propose_remove_line_numbers and isinstance(chars, str): # chars = try_remove_linenumbers(chars, self) concrete_index = self.index(index) line_before = self.get(concrete_index + " linestart", concrete_index + " lineend") self._last_event_changed_line_count = "\n" in chars result = tktextext.EnhancedText.direct_insert(self, index, chars, tags=tags, **kw) line_after = self.get(concrete_index + " linestart", concrete_index + " lineend") trivial_for_coloring, trivial_for_parens = self._is_trivial_edit( chars, line_before, line_after ) get_workbench().event_generate( "TextInsert", index=concrete_index, text=chars, tags=tags, text_widget=self, trivial_for_coloring=trivial_for_coloring, trivial_for_parens=trivial_for_parens, ) return result def direct_delete(self, index1, index2=None, **kw): try: # index1 may be eg "sel.first" and it doesn't make sense *after* deletion concrete_index1 = self.index(index1) if index2 is not None: concrete_index2 = self.index(index2) else: concrete_index2 = None chars = self.get(index1, index2) self._last_event_changed_line_count = "\n" in chars line_before = self.get( concrete_index1 + " linestart", (concrete_index1 if concrete_index2 is None else concrete_index2) + " lineend", ) return tktextext.EnhancedText.direct_delete(self, index1, index2=index2, **kw) finally: line_after = self.get( concrete_index1 + " linestart", (concrete_index1 if concrete_index2 is None else concrete_index2) + " lineend", ) trivial_for_coloring, trivial_for_parens = self._is_trivial_edit( chars, line_before, line_after ) get_workbench().event_generate( "TextDelete", index1=concrete_index1, index2=concrete_index2, text_widget=self, trivial_for_coloring=trivial_for_coloring, trivial_for_parens=trivial_for_parens, ) def _is_trivial_edit(self, chars, line_before, line_after): # line is taken after edit for insertion and before edit for deletion if not chars.strip(): # linebreaks, including with automatic indent # check it doesn't break a triple-quote trivial_for_coloring = line_before.count("'''") == line_after.count( "'''" ) and line_before.count('"""') == line_after.count('"""') trivial_for_parens = trivial_for_coloring elif len(chars) > 1: # paste, cut, load or something like this trivial_for_coloring = False trivial_for_parens = False elif chars == "#": trivial_for_coloring = "''''" not in line_before and '"""' not in line_before trivial_for_parens = trivial_for_coloring and not re.search(PARENS_REGEX, line_before) elif chars in "()[]{}": trivial_for_coloring = line_before.count("'''") == line_after.count( "'''" ) and line_before.count('"""') == line_after.count('"""') trivial_for_parens = False elif chars == "'": trivial_for_coloring = "'''" not in line_before and "'''" not in line_after trivial_for_parens = False # can put parens into open string elif chars == '"': trivial_for_coloring = '"""' not in line_before and '"""' not in line_after trivial_for_parens = False # can put parens into open string elif chars == "\\": # can shorten closing quote trivial_for_coloring = '"""' not in line_before and '"""' not in line_after trivial_for_parens = False else: trivial_for_coloring = line_before.count("'''") == line_after.count( "'''" ) and line_before.count('"""') == line_after.count('"""') trivial_for_parens = trivial_for_coloring return trivial_for_coloring, trivial_for_parens class SafeScrollbar(ttk.Scrollbar): def __init__(self, master=None, **kw): super().__init__(master=master, **kw) def set(self, first, last): try: ttk.Scrollbar.set(self, first, last) except Exception: traceback.print_exc() class AutoScrollbar(SafeScrollbar): # http://effbot.org/zone/tkinter-autoscrollbar.htm # a vert_scrollbar that hides itself if it's not needed. only # works if you use the grid geometry manager. def __init__(self, master=None, **kw): self.hide_count = 0 self.gridded = False super().__init__(master=master, **kw) def set(self, first, last): if float(first) <= 0.0 and float(last) >= 1.0: # Need to accept 1 automatic hide, otherwise even narrow files # get horizontal scrollbar if self.gridded and self.hide_count < 2: self.grid_remove() elif float(first) > 0.001 or float(last) < 0.999: # with >0 and <1 it occasionally made scrollbar wobble back and forth if not self.gridded: self.grid() ttk.Scrollbar.set(self, first, last) def grid(self, *args, **kwargs): super().grid(*args, **kwargs) self.gridded = True def grid_configure(self, *args, **kwargs): super().grid_configure(*args, **kwargs) self.gridded = True def grid_remove(self): super().grid_remove() self.gridded = False self.hide_count += 1 def grid_forget(self): super().grid_forget() self.gridded = False self.hide_count += 1 def pack(self, **kw): raise tk.TclError("cannot use pack with this widget") def place(self, **kw): raise tk.TclError("cannot use place with this widget") def update_entry_text(entry, text): original_state = entry.cget("state") entry.config(state="normal") entry.delete(0, "end") entry.insert(0, text) entry.config(state=original_state) class VerticallyScrollableFrame(ttk.Frame): # http://tkinter.unpythonic.net/wiki/VerticalScrolledFrame def __init__(self, master): ttk.Frame.__init__(self, master) # set up scrolling with canvas vscrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL) self.canvas = tk.Canvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) vscrollbar.config(command=self.canvas.yview) self.canvas.xview_moveto(0) self.canvas.yview_moveto(0) self.canvas.grid(row=0, column=0, sticky=tk.NSEW) vscrollbar.grid(row=0, column=1, sticky=tk.NSEW) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.interior = ttk.Frame(self.canvas) self.interior_id = self.canvas.create_window(0, 0, window=self.interior, anchor=tk.NW) self.bind("", self._configure_interior, "+") self.bind("", self._expose, "+") def _expose(self, event): self.update_idletasks() self.update_scrollbars() def _configure_interior(self, event): self.update_scrollbars() def update_scrollbars(self): # update the scrollbars to match the size of the inner frame size = (self.canvas.winfo_width(), self.interior.winfo_reqheight()) self.canvas.config(scrollregion="0 0 %s %s" % size) if ( self.interior.winfo_reqwidth() != self.canvas.winfo_width() and self.canvas.winfo_width() > 10 ): # update the interior's width to fit canvas # print("CAWI", self.canvas.winfo_width()) self.canvas.itemconfigure(self.interior_id, width=self.canvas.winfo_width()) class ScrollableFrame(ttk.Frame): # http://tkinter.unpythonic.net/wiki/VerticalScrolledFrame def __init__(self, master): ttk.Frame.__init__(self, master) # set up scrolling with canvas vscrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL) hscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL) self.canvas = tk.Canvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) vscrollbar.config(command=self.canvas.yview) hscrollbar.config(command=self.canvas.xview) self.canvas.xview_moveto(0) self.canvas.yview_moveto(0) self.canvas.grid(row=0, column=0, sticky=tk.NSEW) vscrollbar.grid(row=0, column=1, sticky=tk.NSEW) hscrollbar.grid(row=1, column=0, sticky=tk.NSEW) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.interior = ttk.Frame(self.canvas) self.interior.columnconfigure(0, weight=1) self.interior.rowconfigure(0, weight=1) self.interior_id = self.canvas.create_window(0, 0, window=self.interior, anchor=tk.NW) self.bind("", self._configure_interior, "+") self.bind("", self._expose, "+") def _expose(self, event): self.update_idletasks() self._configure_interior(event) def _configure_interior(self, event): # update the scrollbars to match the size of the inner frame size = (self.canvas.winfo_reqwidth(), self.interior.winfo_reqheight()) self.canvas.config(scrollregion="0 0 %s %s" % size) class ThemedListbox(tk.Listbox): def __init__(self, master=None, cnf={}, **kw): super().__init__(master=master, cnf=cnf, **kw) self._ui_theme_change_binding = self.bind( "<>", self._reload_theme_options, True ) self._reload_theme_options() def _reload_theme_options(self, event=None): style = ttk.Style() states = [] if self["state"] == "disabled": states.append("disabled") # Following crashes when a combobox is focused # if self.focus_get() == self: # states.append("focus") opts = {} for key in [ "background", "foreground", "highlightthickness", "highlightcolor", "highlightbackground", ]: value = style.lookup(self.get_style_name(), key, states) if value: opts[key] = value self.configure(opts) def get_style_name(self): return "Listbox" def destroy(self): self.unbind("<>", self._ui_theme_change_binding) super().destroy() class ToolTip: """Taken from http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml""" def __init__(self, widget, options): self.widget: tk.Widget = widget self.tipwindow = None self.id = None self.x = self.y = 0 self.options = options self.focus_out_bind_ref = None def showtip(self, text): "Display text in tooltip window" self.text = text if self.tipwindow or not self.text: return x, y, _, cy = self.widget.bbox("insert") x = x + self.widget.winfo_rootx() + 27 y = y + cy + self.widget.winfo_rooty() + self.widget.winfo_height() + 2 self.tipwindow = tw = tk.Toplevel(self.widget) if running_on_mac_os(): try: # Must be the first thing to do after creating window # https://wiki.tcl-lang.org/page/MacWindowStyle tw.tk.call( "::tk::unsupported::MacWindowStyle", "style", tw._w, "help", "noActivates" ) if get_tk_version_info() >= (8, 6, 10) and running_on_mac_os(): tw.wm_overrideredirect(1) except tk.TclError: pass else: tw.wm_overrideredirect(1) tw.wm_geometry("+%d+%d" % (x, y)) if running_on_mac_os(): # TODO: maybe it's because of Tk 8.5, not because of Mac tw.wm_transient(self.widget) label = tk.Label(tw, text=self.text, **self.options) label.pack() self.focus_out_bind_ref = self.widget.winfo_toplevel().bind( "", self.hidetip, True ) def hidetip(self, event=None): tw = self.tipwindow self.tipwindow = None if self.tipwindow: self.widget.unbind("", self.focus_out_bind_ref) if tw: tw.destroy() def create_tooltip(widget, text, **kw): options = get_style_configuration("Tooltip").copy() options.setdefault("background", "#ffffe0") options.setdefault("foreground", "#000000") options.setdefault("relief", "solid") options.setdefault("borderwidth", 1) options.setdefault("padx", 1) options.setdefault("pady", 0) options.update(kw) toolTip = ToolTip(widget, options) def enter(event): toolTip.showtip(text) def leave(event): toolTip.hidetip() widget.bind("", enter) widget.bind("", leave) class NoteBox(CommonDialog): def __init__(self, master=None, max_default_width=300, **kw): super().__init__(master=master, highlightthickness=0, **kw) self._max_default_width = max_default_width self.wm_overrideredirect(True) if running_on_mac_os(): # TODO: maybe it's because of Tk 8.5, not because of Mac self.wm_transient(master) try: # For Mac OS self.tk.call( "::tk::unsupported::MacWindowStyle", "style", self._w, "help", "noActivates" ) except tk.TclError: pass self._current_chars = "" self._click_bindings = {} self.padx = 5 self.pady = 5 self.text = TweakableText( self, background="#ffffe0", borderwidth=1, relief="solid", undo=False, read_only=True, font="TkDefaultFont", highlightthickness=0, padx=self.padx, pady=self.pady, wrap="word", ) self.text.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.text.bind("", self.close, True) # tk._default_root.bind_all("<1>", self._close_maybe, True) # tk._default_root.bind_all("", self.close, True) self.withdraw() def clear(self): for tag in self._click_bindings: self.text.tag_unbind(tag, "<1>", self._click_bindings[tag]) self.text.tag_remove(tag, "1.0", "end") self.text.direct_delete("1.0", "end") self._current_chars = "" self._click_bindings.clear() def set_content(self, *items): self.clear() for item in items: if isinstance(item, str): self.text.direct_insert("1.0", item) self._current_chars = item else: assert isinstance(item, (list, tuple)) chars, *props = item if len(props) > 0 and callable(props[-1]): tags = tuple(props[:-1]) click_handler = props[-1] else: tags = tuple(props) click_handler = None self.append_text(chars, tags, click_handler) self.text.see("1.0") def append_text(self, chars, tags=(), click_handler=None): tags = tuple(tags) if click_handler is not None: click_tag = "click_%d" % len(self._click_bindings) tags = tags + (click_tag,) binding = self.text.tag_bind(click_tag, "<1>", click_handler, True) self._click_bindings[click_tag] = binding self.text.direct_insert("end", chars, tags) self._current_chars += chars def place(self, target, focus=None): # Compute the area that will be described by this Note focus_x = target.winfo_rootx() focus_y = target.winfo_rooty() focus_height = target.winfo_height() if isinstance(focus, TextRange): assert isinstance(target, tk.Text) topleft = target.bbox("%d.%d" % (focus.lineno, focus.col_offset)) if focus.end_col_offset == 0: botright = target.bbox( "%d.%d lineend" % (focus.end_lineno - 1, focus.end_lineno - 1) ) else: botright = target.bbox("%d.%d" % (focus.end_lineno, focus.end_col_offset)) if topleft and botright: focus_x += topleft[0] focus_y += topleft[1] focus_height = botright[1] - topleft[1] + botright[3] elif isinstance(focus, (list, tuple)): focus_x += focus[0] focus_y += focus[1] focus_height = focus[3] elif focus is None: pass else: raise TypeError("Unsupported focus") # Compute dimensions of the note font = self.text["font"] if isinstance(font, str): font = tk.font.nametofont(font) lines = self._current_chars.splitlines() max_line_width = 0 for line in lines: max_line_width = max(max_line_width, font.measure(line)) width = min(max_line_width, self._max_default_width) + self.padx * 2 + 2 self.wm_geometry("%dx%d+%d+%d" % (width, 100, focus_x, focus_y + focus_height)) self.update_idletasks() line_count = int(float(self.text.index("end"))) line_height = font.metrics()["linespace"] self.wm_geometry( "%dx%d+%d+%d" % (width, line_count * line_height, focus_x, focus_y + focus_height) ) # TODO: detect the situation when note doesn't fit under # the focus box and should be placed above self.deiconify() def show_note(self, *content_items: Union[str, List], target=None, focus=None) -> None: self.set_content(*content_items) self.place(target, focus) def _close_maybe(self, event): if event.widget not in [self, self.text]: self.close(event) def close(self, event=None): self.withdraw() def get_widget_offset_from_toplevel(widget): x = 0 y = 0 toplevel = widget.winfo_toplevel() while widget != toplevel: x += widget.winfo_x() y += widget.winfo_y() widget = widget.master return x, y class EnhancedVar(tk.Variable): def __init__(self, master=None, value=None, name=None, modification_listener=None): if master is not None and not isinstance(master, (tk.Widget, tk.Wm)): raise TypeError("First positional argument 'master' must be None, Widget or Wm") super().__init__(master=master, value=value, name=name) self.modified = False self.modification_listener = modification_listener if sys.version_info < (3, 6): self.trace("w", self._on_write) else: self.trace_add("write", self._on_write) def _on_write(self, *args): self.modified = True if self.modification_listener: try: self.modification_listener() except Exception: # Otherwise whole process will be brought down # because for some reason Tk tries to call non-existing method # on variable get_workbench().report_exception() class EnhancedStringVar(EnhancedVar, tk.StringVar): pass class EnhancedIntVar(EnhancedVar, tk.IntVar): pass class EnhancedBooleanVar(EnhancedVar, tk.BooleanVar): pass class EnhancedDoubleVar(EnhancedVar, tk.DoubleVar): pass def create_string_var(value, modification_listener=None) -> EnhancedStringVar: """Creates a tk.StringVar with "modified" attribute showing whether the variable has been modified after creation""" return EnhancedStringVar(None, value, None, modification_listener) def create_int_var(value, modification_listener=None) -> EnhancedIntVar: """See create_string_var""" return EnhancedIntVar(None, value, None, modification_listener) def create_double_var(value, modification_listener=None) -> EnhancedDoubleVar: """See create_string_var""" return EnhancedDoubleVar(None, value, None, modification_listener) def create_boolean_var(value, modification_listener=None) -> EnhancedBooleanVar: """See create_string_var""" return EnhancedBooleanVar(None, value, None, modification_listener) def shift_is_pressed(event: tk.Event) -> bool: # https://tkdocs.com/shipman/event-handlers.html # http://stackoverflow.com/q/32426250/261181 return event.state & 0x0001 def caps_lock_is_on(event: tk.Event) -> bool: # https://tkdocs.com/shipman/event-handlers.html # http://stackoverflow.com/q/32426250/261181 return event.state & 0x0002 def control_is_pressed(event: tk.Event) -> bool: # https://tkdocs.com/shipman/event-handlers.html # http://stackoverflow.com/q/32426250/261181 return event.state & 0x0004 def alt_is_pressed_without_char(event: tk.Event) -> bool: # https://tkdocs.com/shipman/event-handlers.html # http://stackoverflow.com/q/32426250/261181 # https://bugs.python.org/msg268429 if event.char: return False if running_on_windows(): return event.state & 0x20000 elif running_on_mac_os(): # combinations always produce a char or are consumed by the OS return False else: return event.state & 0x0010 def command_is_pressed(event: tk.Event) -> bool: # https://tkdocs.com/shipman/event-handlers.html # http://stackoverflow.com/q/32426250/261181 if not running_on_mac_os(): return False return event.state & 0x0008 def get_hyperlink_cursor() -> str: if running_on_mac_os(): return "pointinghand" else: return "hand2" def get_beam_cursor() -> str: if running_on_mac_os() or running_on_windows(): return "ibeam" else: return "xterm" def sequence_to_event_state_and_keycode(sequence: str) -> Optional[Tuple[int, int]]: # remember handlers for certain shortcuts which require # different treatment on non-latin keyboards if sequence[0] != "<": return None parts = sequence.strip("<").strip(">").split("-") # support only latin letters for now if parts[-1].lower() not in list("abcdefghijklmnopqrstuvwxyz"): return None letter = parts.pop(-1) if "Key" in parts: parts.remove("Key") if "key" in parts: parts.remove("key") modifiers = {part.lower() for part in parts} if letter.isupper(): modifiers.add("shift") if modifiers not in [{"control"}, {"control", "shift"}]: # don't support others for now return None event_state = 0 # https://tkdocs.com/shipman/event-handlers.html # https://stackoverflow.com/questions/32426250/python-documentation-and-or-lack-thereof-e-g-keyboard-event-state for modifier in modifiers: if modifier == "shift": event_state |= 0x0001 elif modifier == "control": event_state |= 0x0004 else: # unsupported modifier return None # for latin letters keycode is same as its ascii code return (event_state, ord(letter.upper())) def select_sequence(win_version, mac_version, linux_version=None): if running_on_windows(): return win_version elif running_on_mac_os(): return mac_version elif running_on_linux() and linux_version: return linux_version else: return win_version def try_remove_linenumbers(text, master): try: if has_line_numbers(text) and messagebox.askyesno( title="Remove linenumbers", message="Do you want to remove linenumbers from pasted text?", default=messagebox.YES, master=master, ): return remove_line_numbers(text) else: return text except Exception: traceback.print_exc() return text def has_line_numbers(text): lines = text.splitlines() return len(lines) > 2 and all([len(split_after_line_number(line)) == 2 for line in lines]) def split_after_line_number(s): parts = re.split(r"(^\s*\d+\.?)", s) if len(parts) == 1: return parts else: assert len(parts) == 3 and parts[0] == "" return parts[1:] def remove_line_numbers(s): cleaned_lines = [] for line in s.splitlines(): parts = split_after_line_number(line) if len(parts) != 2: return s else: cleaned_lines.append(parts[1]) return textwrap.dedent(("\n".join(cleaned_lines)) + "\n") # Place a toplevel window at the center of parent or screen # It is a Python implementation of ::tk::PlaceWindow. # Copied and adapted from tkinter.simpledialog of Python 3.10.2 def _place_window(w, parent=None, width=None, height=None): w.wm_withdraw() # Remain invisible while we figure out the geometry w.update_idletasks() # Actualize geometry information minwidth = width or w.winfo_reqwidth() minheight = height or w.winfo_reqheight() maxwidth = w.winfo_vrootwidth() maxheight = w.winfo_vrootheight() if parent is not None and parent.winfo_ismapped(): logger.info( f"Parent y: {parent.winfo_y()}, rooty: {parent.winfo_rooty()}, vrooty: {parent.winfo_vrooty()}" ) x = parent.winfo_rootx() + (parent.winfo_width() - minwidth) // 2 y = parent.winfo_y() + (parent.winfo_height() - minheight) // 2 vrootx = w.winfo_vrootx() vrooty = w.winfo_vrooty() x = min(x, vrootx + maxwidth - minwidth) x = max(x, vrootx) y = min(y, vrooty + maxheight - minheight) # don't allow the dialog go higher than parent. This way the title bar remains visible. y = max(y, vrooty, parent.winfo_y()) if w._windowingsystem == "aqua": # Avoid the native menu bar which sits on top of everything. y = max(y, ems_to_pixels(2)) if y + minheight > maxheight: logger.debug("Aligning top with parent (%s vs %s)", y + minheight, maxheight) y = parent.winfo_y() else: x = (w.winfo_screenwidth() - minwidth) // 2 y = (w.winfo_screenheight() - minheight) // 2 w.wm_maxsize(maxwidth, maxheight) if width and height: geometry = "%dx%d+%d+%d" % (width, height, x, y) else: geometry = "+%d+%d" % (x, y) logger.info(f"Placing {w} with geometry {geometry}") w.wm_geometry(geometry) w.wm_deiconify() # Become visible at the desired location class WaitingDialog(CommonDialog): def __init__(self, master, async_result, description, title="Please wait!", timeout=None): self._async_result = async_result super().__init__(master) if misc_utils.running_on_mac_os(): self.configure(background="systemSheetBackground") self.title(title) self.resizable(height=tk.FALSE, width=tk.FALSE) # self.protocol("WM_DELETE_WINDOW", self._close) self.desc_label = ttk.Label(self, text=description, wraplength=300) self.desc_label.grid(padx=20, pady=20) self.update_idletasks() self.timeout = timeout self.start_time = time.time() self.after(500, self._poll) def _poll(self): if self._async_result.ready(): self._close() elif self.timeout and time.time() - self.start_time > self.timeout: raise TimeoutError() else: self.after(500, self._poll) self.desc_label["text"] = self.desc_label["text"] + "." def _close(self): self.destroy() def run_with_waiting_dialog(master, action, args=(), description="Working"): # http://stackoverflow.com/a/14299004/261181 from multiprocessing.pool import ThreadPool pool = ThreadPool(processes=1) async_result = pool.apply_async(action, args) dlg = WaitingDialog(master, async_result, description=description) show_dialog(dlg, master) return async_result.get() class FileCopyDialog(CommonDialog): def __init__(self, master, source, destination, description=None, fsync=True): self._source = source self._destination = destination self._old_bytes_copied = 0 self._bytes_copied = 0 self._fsync = fsync self._done = False self._cancelled = False self._closed = False super().__init__(master) main_frame = ttk.Frame(self) # To get styled background main_frame.grid(row=0, column=0, sticky="nsew") self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.title(tr("Copying")) if description is None: description = tr("Copying\n %s\nto\n %s") % (source, destination) label = ttk.Label(main_frame, text=description) label.grid(row=0, column=0, columnspan=2, sticky="nw", padx=15, pady=15) self._bar = ttk.Progressbar(main_frame, maximum=os.path.getsize(source), length=200) self._bar.grid(row=1, column=0, columnspan=2, sticky="nsew", padx=15, pady=0) self._cancel_button = ttk.Button(main_frame, text=tr("Cancel"), command=self._cancel) self._cancel_button.grid(row=2, column=1, sticky="ne", padx=15, pady=15) self._bar.focus_set() main_frame.columnconfigure(0, weight=1) self._update_progress() self.bind("", self._cancel, True) # escape-close only if process has completed self.protocol("WM_DELETE_WINDOW", self._cancel) self._start() def _start(self): def work(): self._copy_progess = 0 with open(self._source, "rb") as fsrc: with open(self._destination, "wb") as fdst: while True: buf = fsrc.read(16 * 1024) if not buf: break fdst.write(buf) fdst.flush() if self._fsync: os.fsync(fdst) self._bytes_copied += len(buf) self._done = True threading.Thread(target=work, daemon=True).start() def _update_progress(self): if self._done: if not self._closed: self._close() return self._bar.step(self._bytes_copied - self._old_bytes_copied) self._old_bytes_copied = self._bytes_copied self.after(100, self._update_progress) def _close(self): self.destroy() self._closed = True def _cancel(self, event=None): self._cancelled = True self._close() class ChoiceDialog(CommonDialogEx): def __init__( self, master=None, title="Choose one", question: str = "Choose one:", choices=[], initial_choice_index=None, ) -> None: self.result = None super().__init__(master=master) self.title(title) self.resizable(False, False) self.main_frame.columnconfigure(0, weight=1) row = 0 question_label = ttk.Label(self.main_frame, text=question) question_label.grid(row=row, column=0, columnspan=2, sticky="w", padx=20, pady=20) row += 1 self.var = tk.StringVar(value="") if initial_choice_index is not None: self.var.set(choices[initial_choice_index]) for choice in choices: rb = ttk.Radiobutton(self.main_frame, text=choice, variable=self.var, value=choice) rb.grid(row=row, column=0, columnspan=2, sticky="w", padx=20) row += 1 ok_button = ttk.Button(self.main_frame, text=tr("OK"), command=self._ok, default="active") ok_button.grid(row=row, column=0, sticky="e", pady=20) cancel_button = ttk.Button(self.main_frame, text=tr("Cancel"), command=self._cancel) cancel_button.grid(row=row, column=1, sticky="e", padx=20, pady=20) self.bind("", self._cancel, True) self.bind("", self._ok, True) self.protocol("WM_DELETE_WINDOW", self._cancel) def _ok(self): self.result = self.var.get() if not self.result: self.result = None self.destroy() def _cancel(self): self.result = None self.destroy() class LongTextDialog(CommonDialog): def __init__(self, title, text_content, parent=None): if parent is None: parent = tk._default_root super().__init__(master=parent) self.title(title) main_frame = ttk.Frame(self) main_frame.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) default_font = tk.font.nametofont("TkDefaultFont") self._text = tktextext.TextFrame( main_frame, read_only=True, wrap="none", font=default_font, width=80, height=10, relief="sunken", borderwidth=1, ) self._text.grid(row=1, column=0, columnspan=2, sticky="nsew", padx=20, pady=20) self._text.text.direct_insert("1.0", text_content) self._text.text.see("1.0") copy_button = ttk.Button( main_frame, command=self._copy, text=tr("Copy to clipboard"), width=20 ) copy_button.grid(row=2, column=0, sticky="w", padx=20, pady=(0, 20)) close_button = ttk.Button( main_frame, command=self._close, text=tr("Close"), default="active" ) close_button.grid(row=2, column=1, sticky="w", padx=20, pady=(0, 20)) close_button.focus_set() main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(1, weight=1) self.protocol("WM_DELETE_WINDOW", self._close) self.bind("", self._close, True) def _copy(self, event=None): self.clipboard_clear() self.clipboard_append(self._text.text.get("1.0", "end")) def _close(self, event=None): self.destroy() def ask_one_from_choices( master=None, title="Choose one", question: str = "Choose one:", choices=[], initial_choice_index=None, ): dlg = ChoiceDialog(master, title, question, choices, initial_choice_index) show_dialog(dlg, master) return dlg.result def get_busy_cursor(): if running_on_windows(): return "wait" elif running_on_mac_os(): return "spinning" else: return "watch" def get_tk_version_str(): return tk._default_root.tk.call("info", "patchlevel") def get_tk_version_info(): result = [] for part in get_tk_version_str().split("."): try: result.append(int(part)) except Exception: result.append(0) return tuple(result) def get_style_configuration(style_name, default={}): style = ttk.Style() # NB! style.configure seems to reuse the returned dict # Don't change it without copying first result = style.configure(style_name) if result is None: return default else: return result def lookup_style_option(style_name, option_name, default=None): style = ttk.Style() setting = style.lookup(style_name, option_name) if setting in [None, ""]: return default elif setting == "True": return True elif setting == "False": return False else: return setting def scale(value): return get_workbench().scale(value) def open_path_in_system_file_manager(path): if running_on_mac_os(): # http://stackoverflow.com/a/3520693/261181 # -R doesn't allow showing hidden folders subprocess.Popen(["open", path]) elif running_on_linux(): subprocess.Popen(["xdg-open", path]) else: assert running_on_windows() subprocess.Popen(["explorer", path]) def _get_dialog_provider(): if platform.system() != "Linux" or get_workbench().get_option("file.avoid_zenity"): return filedialog import shutil if shutil.which("zenity"): return _ZenityDialogProvider # fallback return filedialog def try_restore_focus_after_file_dialog(dialog_parent): if dialog_parent is None: return logger.info("Restoring focus to %s", dialog_parent) old_focused_widget = dialog_parent.winfo_toplevel().focus_get() dialog_parent.winfo_toplevel().lift() dialog_parent.winfo_toplevel().focus_force() dialog_parent.winfo_toplevel().grab_set() if running_on_mac_os(): dialog_parent.winfo_toplevel().grab_release() if old_focused_widget is not None: try: old_focused_widget.focus_force() except TclError: logger.warning("Could not restore focus to %r", old_focused_widget) def asksaveasfilename(**options): # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm parent = _check_dialog_parent(options) try: return _get_dialog_provider().asksaveasfilename(**options) finally: try_restore_focus_after_file_dialog(parent) def askopenfilename(**options): # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm parent = _check_dialog_parent(options) try: return _get_dialog_provider().askopenfilename(**options) finally: try_restore_focus_after_file_dialog(parent) def askopenfilenames(**options): # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm parent = _check_dialog_parent(options) try: return _get_dialog_provider().askopenfilenames(**options) finally: try_restore_focus_after_file_dialog(parent) def askdirectory(**options): # https://tcl.tk/man/tcl8.6/TkCmd/chooseDirectory.htm parent = _check_dialog_parent(options) try: return _get_dialog_provider().askdirectory(**options) finally: try_restore_focus_after_file_dialog(parent) def _check_dialog_parent(options): if options.get("parent") and options.get("master"): parent = options["parent"].winfo_toplevel() master = options["master"].winfo_toplevel() if parent is not master: logger.warning( "Dialog with different parent/master toplevels:\n%s", "".join(traceback.format_stack()), ) elif options.get("parent"): parent = options["parent"].winfo_toplevel() master = options["parent"].winfo_toplevel() elif options.get("master"): parent = options["master"].winfo_toplevel() master = options["master"].winfo_toplevel() else: logger.warning("Dialog without parent:\n%s", "".join(traceback.format_stack())) parent = tk._default_root master = tk._default_root options["parent"] = parent options["master"] = master if running_on_mac_os(): # used to require master/parent (https://bugs.python.org/issue34927) # but this is deprecated in Catalina (https://github.com/thonny/thonny/issues/840) # TODO: Consider removing this when upgrading from Tk 8.6.8 del options["master"] del options["parent"] return parent class _ZenityDialogProvider: # https://www.writebash.com/bash-gui/zenity-create-file-selection-dialog-224.html # http://linux.byexamples.com/archives/259/a-complete-zenity-dialog-examples-1/ # http://linux.byexamples.com/archives/265/a-complete-zenity-dialog-examples-2/ # another possibility is to use PyGobject: https://github.com/poulp/zenipy @classmethod def askopenfilename(cls, **options): args = cls._convert_common_options("Open file", **options) return cls._call(args) @classmethod def askopenfilenames(cls, **options): args = cls._convert_common_options("Open files", **options) return cls._call(args + ["--multiple"]).split("|") @classmethod def asksaveasfilename(cls, **options): args = cls._convert_common_options("Save as", **options) args.append("--save") filename = cls._call(args) if not filename: return None return filename @classmethod def askdirectory(cls, **options): args = cls._convert_common_options("Select directory", **options) args.append("--directory") return cls._call(args) @classmethod def _convert_common_options(cls, default_title, **options): args = ["--file-selection", "--title=%s" % options.get("title", default_title)] filename = _options_to_zenity_filename(options) if filename: args.append("--filename=%s" % filename) parent = options.get("parent", options.get("master", None)) if parent is not None: args.append("--modal") for desc, pattern in options.get("filetypes", ()): # zenity requires star before extension pattern = pattern.replace(" .", " *.") if pattern.startswith("."): pattern = "*" + pattern if pattern == "*.*": # ".*" was provided to make the pattern safe for Tk dialog # not required with Zenity pattern = "*" args.append("--file-filter=%s | %s" % (desc, pattern)) return args @classmethod def _call(cls, args): args = ["zenity"] + args result = subprocess.run( args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True ) if result.returncode == 0: return result.stdout.strip() else: logger.warning( "Zenity returned code %r and stderr %r", result.returncode, result.stderr ) return None def _options_to_zenity_filename(options): if options.get("initialdir"): if options.get("initialfile"): return os.path.join(options["initialdir"], options["initialfile"]) else: return options["initialdir"] + os.path.sep return None def register_latin_shortcut( registry, sequence: str, handler: Callable, tester: Optional[Callable] ) -> None: res = sequence_to_event_state_and_keycode(sequence) if res is not None: if res not in registry: registry[res] = [] registry[res].append((handler, tester)) def handle_mistreated_latin_shortcuts(registry, event): # tries to handle Ctrl+LatinLetter shortcuts # given from non-Latin keyboards # See: https://bitbucket.org/plas/thonny/issues/422/edit-keyboard-shortcuts-ctrl-c-ctrl-v-etc # only consider events with Control held if not event.state & 0x04: return if running_on_mac_os(): return # consider only part of the state, # because at least on Windows, Ctrl-shortcuts' state # has something extra simplified_state = 0x04 if shift_is_pressed(event): simplified_state |= 0x01 # print(simplified_state, event.keycode) if (simplified_state, event.keycode) in registry: if event.keycode != ord(event.char) and event.keysym in (None, "??"): # keycode and char doesn't match, # this means non-latin keyboard for handler, tester in registry[(simplified_state, event.keycode)]: if tester is None or tester(): handler() def show_dialog(dlg, master=None, width=None, height=None, modal=True): if getattr(dlg, "closed", False): return if master is None: master = getattr(dlg, "parent", None) or getattr(dlg, "master", None) or tk._default_root master = master.winfo_toplevel() get_workbench().event_generate("WindowFocusOut") # following order seems to give most smooth appearance old_focused_widget = master.focus_get() if master.winfo_toplevel().winfo_viewable(): dlg.transient(master.winfo_toplevel()) saved_size = get_workbench().get_option(get_size_option_name(dlg)) if saved_size: width = min(max(saved_size[0], ems_to_pixels(10)), ems_to_pixels(500)) height = min(max(saved_size[1], ems_to_pixels(8)), ems_to_pixels(300)) _place_window(dlg, master, width=width, height=height) dlg.lift() try: dlg.wait_visibility() except tk.TclError as e: if "was deleted before its visibility changed" in str(e): return else: raise if modal: try: dlg.grab_set() except TclError as e: logger.warning("Can't grab: %s", e) dlg.update_idletasks() dlg.focus_set() if hasattr(dlg, "set_initial_focus"): dlg.set_initial_focus() dlg.wait_window(dlg) dlg.grab_release() master.winfo_toplevel().lift() master.winfo_toplevel().focus_force() master.winfo_toplevel().grab_set() if running_on_mac_os(): master.winfo_toplevel().grab_release() if old_focused_widget is not None: try: old_focused_widget.focus_force() except TclError: pass def popen_with_ui_thread_callback(*Popen_args, on_completion, poll_delay=0.1, **Popen_kwargs): if "encoding" not in Popen_kwargs: if "env" not in Popen_kwargs: Popen_kwargs["env"] = os.environ.copy() Popen_kwargs["env"]["PYTHONIOENCODING"] = "utf-8" if sys.version_info >= (3, 6): Popen_kwargs["encoding"] = "utf-8" proc = subprocess.Popen(*Popen_args, **Popen_kwargs) # Need to read in thread in order to avoid blocking because # of full pipe buffer (see https://bugs.python.org/issue1256) out_lines = [] err_lines = [] def read_stream(stream, target_list): while True: line = stream.readline() if line: target_list.append(line) else: break t_out = threading.Thread(target=read_stream, daemon=True, args=(proc.stdout, out_lines)) t_err = threading.Thread(target=read_stream, daemon=True, args=(proc.stderr, err_lines)) t_out.start() t_err.start() def poll(): if proc.poll() is not None: t_out.join(3) t_err.join(3) on_completion(proc, out_lines, err_lines) return tk._default_root.after(int(poll_delay * 1000), poll) poll() return proc class MenuEx(tk.Menu): def __init__(self, target): self._testers = {} super().__init__( target, tearoff=False, postcommand=self.on_post, **get_style_configuration("Menu") ) def on_post(self, *args): self.update_item_availability() def update_item_availability(self): for i in range(self.index("end") + 1): item_data = self.entryconfigure(i) if "label" in item_data: tester = self._testers.get(item_data["label"]) if tester and not tester(): self.entryconfigure(i, state=tk.DISABLED) else: self.entryconfigure(i, state=tk.NORMAL) def add(self, itemType, cnf={}, **kw): cnf = cnf or kw tester = cnf.get("tester") if "tester" in cnf: del cnf["tester"] super().add(itemType, cnf) itemdata = self.entryconfigure(self.index("end")) labeldata = itemdata.get("label") if labeldata: self._testers[labeldata] = tester class TextMenu(MenuEx): def __init__(self, target): self.text = target MenuEx.__init__(self, target) self.add_basic_items() self.add_extra_items() def add_basic_items(self): self.add_command(label=tr("Cut"), command=self.on_cut, tester=self.can_cut) self.add_command(label=tr("Copy"), command=self.on_copy, tester=self.can_copy) self.add_command(label=tr("Paste"), command=self.on_paste, tester=self.can_paste) def add_extra_items(self): self.add_separator() self.add_command(label=tr("Select All"), command=self.on_select_all) def on_cut(self): self.text.event_generate("<>") def on_copy(self): self.text.event_generate("<>") def on_paste(self): self.text.event_generate("<>") def on_select_all(self): self.text.event_generate("<>") def can_cut(self): return self.get_selected_text() and not self.selection_is_read_only() def can_copy(self): return self.get_selected_text() def can_paste(self): return not self.selection_is_read_only() def get_selected_text(self): try: return self.text.get("sel.first", "sel.last") except TclError: return "" def selection_is_read_only(self): if hasattr(self.text, "is_read_only"): return self.text.is_read_only() return False def create_url_label(master, url, text=None, **kw): import webbrowser return create_action_label(master, text or url, lambda _: webbrowser.open(url), **kw) def create_action_label(master, text, click_handler, **kw): url_font = tkinter.font.nametofont("TkDefaultFont").copy() url_font.configure(underline=1) url_label = ttk.Label( master, text=text, style="Url.TLabel", cursor=get_hyperlink_cursor(), font=url_font, **kw ) url_label.bind("", click_handler) return url_label def get_size_option_name(window): return "layout." + type(window).__name__ + "_size" def get_default_basic_theme(): if running_on_windows(): return "vista" else: return "clam" EM_WIDTH = None def ems_to_pixels(x: float) -> int: global EM_WIDTH if EM_WIDTH is None: EM_WIDTH = tkinter.font.nametofont("TkDefaultFont").measure("m") return int(EM_WIDTH * x) _btn_padding = None def set_text_if_different(widget, text) -> bool: if widget["text"] != text: widget["text"] = text return True else: return False def tr_btn(s): """Translates button caption, adds padding to make sure text fits""" global _btn_padding if _btn_padding is None: _btn_padding = get_button_padding() return _btn_padding + tr(s) + _btn_padding def add_messagebox_parent_checker(): def wrap_with_parent_checker(original): def wrapper(*args, **options): _check_dialog_parent(options) return original(*args, **options) return wrapper from tkinter import messagebox for name in [ "showinfo", "showwarning", "showerror", "askquestion", "askokcancel", "askyesno", "askyesnocancel", "askretrycancel", ]: fun = getattr(messagebox, name) setattr(messagebox, name, wrap_with_parent_checker(fun)) def replace_unsupported_chars(text: str) -> str: if get_tk_version_info() < (8, 6, 12): # can crash with emojis return "".join(c if c < "\U00010000" else "□" for c in text) else: return text def windows_known_extensions_are_hidden() -> bool: assert running_on_windows() import winreg reg_key = winreg.OpenKey( winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 0, winreg.KEY_READ, ) try: return winreg.QueryValueEx(reg_key, "HideFileExt")[0] == 1 finally: reg_key.Close() class MappingCombobox(ttk.Combobox): def __init__(self, master, mapping=None, **kw): super().__init__(master, **kw) if mapping is None: mapping = {} self.mapping: Dict[str, Any] self.set_mapping(mapping) self.mapping_desc_variable = tk.StringVar(value="") self.configure(textvariable=self.mapping_desc_variable) if kw.get("state", None) == "disabled": self.state(["readonly"]) else: self.state(["!disabled", "readonly"]) def set_mapping(self, mapping: Dict[str, Any]): self.mapping = mapping self["values"] = list(mapping) def get_selected_value(self) -> Any: desc = self.mapping_desc_variable.get() return self.mapping.get(desc, None) def select_value(self, value) -> None: for desc in self.mapping: if self.mapping[desc] == value: self.set(desc) def select_none(self) -> None: self.mapping_desc_variable.set("") class AdvancedLabel(ttk.Label): def __init__(self, master, **kw): self._default_font = tkinter.font.nametofont("TkDefaultFont") self._url_font = self._default_font.copy() self._url_font.configure(underline=1) self._url = None super().__init__(master, **kw) self.bind("", self._on_click, True) def set_url(self, url: Optional[str]) -> None: if self._url == url: return self._url = url if url: self.configure(style="Url.TLabel", cursor=get_hyperlink_cursor(), font=self._url_font) else: self.configure(style="TLabel", cursor="", font=self._default_font) def get_url(self) -> Optional[str]: return self._url def _on_click(self, *event): if self._url: if os.path.isdir(self._url): open_with_default_app(self._url) else: import webbrowser webbrowser.open(self._url) def open_with_default_app(path): if running_on_windows(): os.startfile(path) elif running_on_mac_os(): subprocess.run(["open", path]) else: subprocess.run(["xdg-open", path]) if __name__ == "__main__": print(windows_known_extensions_are_hidden()) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.388157 thonny-4.1.7/thonny/vendored_libs/0000755000076600000240000000000014730055627017554 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732960877.0 thonny-4.1.7/thonny/vendored_libs/.DS_Store0000644000076600000240000002400414722561155021236 0ustar00aivarannamaastaffBud1   dpyrig  @ @ @ @ basedpyrightbwspblobbplist00  ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar  _{{139, 265}, {920, 492}} #/;R_klmno basedpyrightvSrnlongfilelocklg1Scomp@bfilelockmoDDblob3ݝzAfilelockmodDblob3ݝzAfilelockph1Scomppipkinlg1Scomp0pipkinmoDDblob? ^dateLastOpenedCD ZshareOwnerHD _shareLastEditorL YdateAdded RS_invitationStatus#@*Tname#@0.@H\gp{ %&'05789BGIJKTZ\]^goqrs|(Y9seriallsvpblobbplist00 GGHIJ_useRelativeDates_showIconPreviewWcolumns_calculateAllSizesZaxTextSizeXtextSizeZsortColumnXiconSize_viewOptionsVersion  $).37 /  C E#@*Tname#@0.@H\gp{ #$'(*34679BCEFHQRTUW`acdfopqs|}KserialvSrnlong E DSDB `(0@ @ @L YdateAdded RS_invitationStatus#@*Tname#@0.@H\gp{ %&'05789BGIJKTZ\]^goqrs|(Y9seriallsvpblobbplist00 GGHIJ_useRelativeDates_showIconPreviewWcolumns_calculateAllSizesZaxTextSizeXtextSizeZsortColumnXiconSize_viewOptionsVersion  $).37 /  C E#@*Tname#@0././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3885128 thonny-4.1.7/thonny/vendored_libs/basedpyright/0000755000076600000240000000000014730055627022241 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732961521.0 thonny-4.1.7/thonny/vendored_libs/basedpyright/.DS_Store0000644000076600000240000001400414722562361023722 0ustar00aivarannamaastaffBud1%distdsclbooldsclbool  @ @ @ @ E%DSDB` @ @ @././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368151.388929 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/0000755000076600000240000000000014730055627023204 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732961981.0 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/.DS_Store0000644000076600000240000001400414722563275024672 0ustar00aivarannamaastaffBud1shed-ftypeshed-fallbackdsclbool  @ @ @ @ EDSDB ` @ @ @././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3892505 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/0000755000076600000240000000000014730055627026566 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732982169.0 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/.DS_Store0000644000076600000240000001400414722632631030245 0ustar00aivarannamaastaffBud1ibdsclboolstdlibdsclboolstubsdsclbool  @ @ @ @ EDSDB ` @ @ @././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1734368150.998304 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stdlib/0000755000076600000240000000000014730055627030047 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3895977 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stdlib/venv/0000755000076600000240000000000014730055627031025 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732958294.0 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stdlib/venv/__init__.pyi0000644000076600000240000000716514722554126033317 0ustar00aivarannamaastaffimport logging import sys from _typeshed import StrOrBytesPath from collections.abc import Iterable, Sequence from types import SimpleNamespace logger: logging.Logger if sys.version_info >= (3, 9): CORE_VENV_DEPS: tuple[str, ...] class EnvBuilder: system_site_packages: bool clear: bool symlinks: bool upgrade: bool with_pip: bool prompt: str | None if sys.version_info >= (3, 13): def __init__( self, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, upgrade: bool = False, with_pip: bool = False, prompt: str | None = None, upgrade_deps: bool = False, *, scm_ignore_files: Iterable[str] = ..., ) -> None: ... elif sys.version_info >= (3, 9): def __init__( self, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, upgrade: bool = False, with_pip: bool = False, prompt: str | None = None, upgrade_deps: bool = False, ) -> None: ... else: def __init__( self, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, upgrade: bool = False, with_pip: bool = False, prompt: str | None = None, ) -> None: ... def create(self, env_dir: StrOrBytesPath) -> None: ... def clear_directory(self, path: StrOrBytesPath) -> None: ... # undocumented def ensure_directories(self, env_dir: StrOrBytesPath) -> SimpleNamespace: ... def create_configuration(self, context: SimpleNamespace) -> None: ... def symlink_or_copy( self, src: StrOrBytesPath, dst: StrOrBytesPath, relative_symlinks_ok: bool = False ) -> None: ... # undocumented def setup_python(self, context: SimpleNamespace) -> None: ... def _setup_pip(self, context: SimpleNamespace) -> None: ... # undocumented def setup_scripts(self, context: SimpleNamespace) -> None: ... def post_setup(self, context: SimpleNamespace) -> None: ... def replace_variables(self, text: str, context: SimpleNamespace) -> str: ... # undocumented def install_scripts(self, context: SimpleNamespace, path: str) -> None: ... if sys.version_info >= (3, 9): def upgrade_dependencies(self, context: SimpleNamespace) -> None: ... if sys.version_info >= (3, 13): def create_git_ignore_file(self, context: SimpleNamespace) -> None: ... if sys.version_info >= (3, 13): def create( env_dir: StrOrBytesPath, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, with_pip: bool = False, prompt: str | None = None, upgrade_deps: bool = False, *, scm_ignore_files: Iterable[str] = ..., ) -> None: ... elif sys.version_info >= (3, 9): def create( env_dir: StrOrBytesPath, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, with_pip: bool = False, prompt: str | None = None, upgrade_deps: bool = False, ) -> None: ... else: def create( env_dir: StrOrBytesPath, system_site_packages: bool = False, clear: bool = False, symlinks: bool = False, with_pip: bool = False, prompt: str | None = None, ) -> None: ... def main(args: Sequence[str] | None = None) -> None: ... ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3900244 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stubs/0000755000076600000240000000000014730055627027726 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1732962193.0 thonny-4.1.7/thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stubs/.DS_Store0000644000076600000240000001400414722563621031407 0ustar00aivarannamaastaffBud1-extenmypy-extensionsdsclbool  @ @ @ @ EDSDB ` @ @ @././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.3938947 thonny-4.1.7/thonny/vendored_libs/filelock/0000755000076600000240000000000014730055627021344 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/__init__.py0000644000076600000240000000244314417536743023465 0ustar00aivarannamaastaff""" A platform independent file lock that supports the with-statement. .. autodata:: filelock.__version__ :no-value: """ from __future__ import annotations import sys import warnings from typing import TYPE_CHECKING from ._api import AcquireReturnProxy, BaseFileLock from ._error import Timeout from ._soft import SoftFileLock from ._unix import UnixFileLock, has_fcntl from ._windows import WindowsFileLock from .version import version #: version of the project as a string __version__: str = version if sys.platform == "win32": # pragma: win32 cover _FileLock: type[BaseFileLock] = WindowsFileLock else: # pragma: win32 no cover if has_fcntl: _FileLock: type[BaseFileLock] = UnixFileLock else: _FileLock = SoftFileLock if warnings is not None: warnings.warn("only soft file lock is available") #: Alias for the lock, which should be used for the current platform. On Windows, this is an alias for # :class:`WindowsFileLock`, on Unix for :class:`UnixFileLock` and otherwise for :class:`SoftFileLock`. if TYPE_CHECKING: FileLock = SoftFileLock else: FileLock = _FileLock __all__ = [ "__version__", "FileLock", "SoftFileLock", "Timeout", "UnixFileLock", "WindowsFileLock", "BaseFileLock", "AcquireReturnProxy", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_api.py0000644000076600000240000002130014417536743022627 0ustar00aivarannamaastafffrom __future__ import annotations import contextlib import logging import os import time import warnings from abc import ABC, abstractmethod from threading import Lock from types import TracebackType from typing import Any from ._error import Timeout _LOGGER = logging.getLogger("filelock") # This is a helper class which is returned by :meth:`BaseFileLock.acquire` and wraps the lock to make sure __enter__ # is not called twice when entering the with statement. If we would simply return *self*, the lock would be acquired # again in the *__enter__* method of the BaseFileLock, but not released again automatically. issue #37 (memory leak) class AcquireReturnProxy: """A context aware object that will release the lock file when exiting.""" def __init__(self, lock: BaseFileLock) -> None: self.lock = lock def __enter__(self) -> BaseFileLock: return self.lock def __exit__( self, exc_type: type[BaseException] | None, # noqa: U100 exc_value: BaseException | None, # noqa: U100 traceback: TracebackType | None, # noqa: U100 ) -> None: self.lock.release() class BaseFileLock(ABC, contextlib.ContextDecorator): """Abstract base class for a file lock object.""" def __init__(self, lock_file: str | os.PathLike[Any], timeout: float = -1) -> None: """ Create a new lock object. :param lock_file: path to the file :param timeout: default timeout when acquiring the lock, in seconds. It will be used as fallback value in the acquire method, if no timeout value (``None``) is given. If you want to disable the timeout, set it to a negative value. A timeout of 0 means, that there is exactly one attempt to acquire the file lock. """ # The path to the lock file. self._lock_file: str = os.fspath(lock_file) # The file descriptor for the *_lock_file* as it is returned by the os.open() function. # This file lock is only NOT None, if the object currently holds the lock. self._lock_file_fd: int | None = None # The default timeout value. self._timeout: float = timeout # We use this lock primarily for the lock counter. self._thread_lock: Lock = Lock() # The lock counter is used for implementing the nested locking mechanism. Whenever the lock is acquired, the # counter is increased and the lock is only released, when this value is 0 again. self._lock_counter: int = 0 @property def lock_file(self) -> str: """:return: path to the lock file""" return self._lock_file @property def timeout(self) -> float: """ :return: the default timeout value, in seconds .. versionadded:: 2.0.0 """ return self._timeout @timeout.setter def timeout(self, value: float | str) -> None: """ Change the default timeout value. :param value: the new value, in seconds """ self._timeout = float(value) @abstractmethod def _acquire(self) -> None: """If the file lock could be acquired, self._lock_file_fd holds the file descriptor of the lock file.""" raise NotImplementedError @abstractmethod def _release(self) -> None: """Releases the lock and sets self._lock_file_fd to None.""" raise NotImplementedError @property def is_locked(self) -> bool: """ :return: A boolean indicating if the lock file is holding the lock currently. .. versionchanged:: 2.0.0 This was previously a method and is now a property. """ return self._lock_file_fd is not None def acquire( self, timeout: float | None = None, poll_interval: float = 0.05, *, poll_intervall: float | None = None, blocking: bool = True, ) -> AcquireReturnProxy: """ Try to acquire the file lock. :param timeout: maximum wait time for acquiring the lock, ``None`` means use the default :attr:`~timeout` is and if ``timeout < 0``, there is no timeout and this method will block until the lock could be acquired :param poll_interval: interval of trying to acquire the lock file :param poll_intervall: deprecated, kept for backwards compatibility, use ``poll_interval`` instead :param blocking: defaults to True. If False, function will return immediately if it cannot obtain a lock on the first attempt. Otherwise this method will block until the timeout expires or the lock is acquired. :raises Timeout: if fails to acquire lock within the timeout period :return: a context object that will unlock the file when the context is exited .. code-block:: python # You can use this method in the context manager (recommended) with lock.acquire(): pass # Or use an equivalent try-finally construct: lock.acquire() try: pass finally: lock.release() .. versionchanged:: 2.0.0 This method returns now a *proxy* object instead of *self*, so that it can be used in a with statement without side effects. """ # Use the default timeout, if no timeout is provided. if timeout is None: timeout = self.timeout if poll_intervall is not None: msg = "use poll_interval instead of poll_intervall" warnings.warn(msg, DeprecationWarning, stacklevel=2) poll_interval = poll_intervall # Increment the number right at the beginning. We can still undo it, if something fails. with self._thread_lock: self._lock_counter += 1 lock_id = id(self) lock_filename = self._lock_file start_time = time.monotonic() try: while True: with self._thread_lock: if not self.is_locked: _LOGGER.debug("Attempting to acquire lock %s on %s", lock_id, lock_filename) self._acquire() if self.is_locked: _LOGGER.debug("Lock %s acquired on %s", lock_id, lock_filename) break elif blocking is False: _LOGGER.debug("Failed to immediately acquire lock %s on %s", lock_id, lock_filename) raise Timeout(self._lock_file) elif 0 <= timeout < time.monotonic() - start_time: _LOGGER.debug("Timeout on acquiring lock %s on %s", lock_id, lock_filename) raise Timeout(self._lock_file) else: msg = "Lock %s not acquired on %s, waiting %s seconds ..." _LOGGER.debug(msg, lock_id, lock_filename, poll_interval) time.sleep(poll_interval) except BaseException: # Something did go wrong, so decrement the counter. with self._thread_lock: self._lock_counter = max(0, self._lock_counter - 1) raise return AcquireReturnProxy(lock=self) def release(self, force: bool = False) -> None: """ Releases the file lock. Please note, that the lock is only completely released, if the lock counter is 0. Also note, that the lock file itself is not automatically deleted. :param force: If true, the lock counter is ignored and the lock is released in every case/ """ with self._thread_lock: if self.is_locked: self._lock_counter -= 1 if self._lock_counter == 0 or force: lock_id, lock_filename = id(self), self._lock_file _LOGGER.debug("Attempting to release lock %s on %s", lock_id, lock_filename) self._release() self._lock_counter = 0 _LOGGER.debug("Lock %s released on %s", lock_id, lock_filename) def __enter__(self) -> BaseFileLock: """ Acquire the lock. :return: the lock object """ self.acquire() return self def __exit__( self, exc_type: type[BaseException] | None, # noqa: U100 exc_value: BaseException | None, # noqa: U100 traceback: TracebackType | None, # noqa: U100 ) -> None: """ Release the lock. :param exc_type: the exception type if raised :param exc_value: the exception value if raised :param traceback: the exception traceback if raised """ self.release() def __del__(self) -> None: """Called when the lock object is deleted.""" self.release(force=True) __all__ = [ "BaseFileLock", "AcquireReturnProxy", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_error.py0000644000076600000240000000061714417536743023217 0ustar00aivarannamaastafffrom __future__ import annotations class Timeout(TimeoutError): """Raised when the lock could not be acquired in *timeout* seconds.""" def __init__(self, lock_file: str) -> None: #: The path of the file lock. self.lock_file = lock_file def __str__(self) -> str: return f"The file lock '{self.lock_file}' could not be acquired." __all__ = [ "Timeout", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_soft.py0000644000076600000240000000316214417536743023037 0ustar00aivarannamaastafffrom __future__ import annotations import os import sys from errno import EACCES, EEXIST, ENOENT from ._api import BaseFileLock from ._util import raise_on_exist_ro_file class SoftFileLock(BaseFileLock): """Simply watches the existence of the lock file.""" def _acquire(self) -> None: raise_on_exist_ro_file(self._lock_file) # first check for exists and read-only mode as the open will mask this case as EEXIST mode = ( os.O_WRONLY # open for writing only | os.O_CREAT | os.O_EXCL # together with above raise EEXIST if the file specified by filename exists | os.O_TRUNC # truncate the file to zero byte ) try: fd = os.open(self._lock_file, mode) except OSError as exception: if exception.errno == EEXIST: # expected if cannot lock pass elif exception.errno == ENOENT: # No such file or directory - parent directory is missing raise elif exception.errno == EACCES and sys.platform != "win32": # pragma: win32 no cover # Permission denied - parent dir is R/O raise # note windows does not allow you to make a folder r/o only files else: self._lock_file_fd = fd def _release(self) -> None: os.close(self._lock_file_fd) # type: ignore # the lock file is definitely not None self._lock_file_fd = None try: os.remove(self._lock_file) except OSError: # the file is already deleted and that's what we want pass __all__ = [ "SoftFileLock", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_unix.py0000644000076600000240000000305214417536743023045 0ustar00aivarannamaastafffrom __future__ import annotations import os import sys from typing import cast from ._api import BaseFileLock #: a flag to indicate if the fcntl API is available has_fcntl = False if sys.platform == "win32": # pragma: win32 cover class UnixFileLock(BaseFileLock): """Uses the :func:`fcntl.flock` to hard lock the lock file on unix systems.""" def _acquire(self) -> None: raise NotImplementedError def _release(self) -> None: raise NotImplementedError else: # pragma: win32 no cover try: import fcntl except ImportError: pass else: has_fcntl = True class UnixFileLock(BaseFileLock): """Uses the :func:`fcntl.flock` to hard lock the lock file on unix systems.""" def _acquire(self) -> None: open_mode = os.O_RDWR | os.O_CREAT | os.O_TRUNC fd = os.open(self._lock_file, open_mode) try: fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) except OSError: os.close(fd) else: self._lock_file_fd = fd def _release(self) -> None: # Do not remove the lockfile: # https://github.com/tox-dev/py-filelock/issues/31 # https://stackoverflow.com/questions/17708885/flock-removing-locked-file-without-race-condition fd = cast(int, self._lock_file_fd) self._lock_file_fd = None fcntl.flock(fd, fcntl.LOCK_UN) os.close(fd) __all__ = [ "has_fcntl", "UnixFileLock", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_util.py0000644000076600000240000000112214417536743023033 0ustar00aivarannamaastafffrom __future__ import annotations import os import stat def raise_on_exist_ro_file(filename: str) -> None: try: file_stat = os.stat(filename) # use stat to do exists + can write to check without race condition except OSError: return None # swallow does not exist or other errors if file_stat.st_mtime != 0: # if os.stat returns but modification is zero that's an invalid os.stat - ignore it if not (file_stat.st_mode & stat.S_IWUSR): raise PermissionError(f"Permission denied: {filename!r}") __all__ = [ "raise_on_exist_ro_file", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/_windows.py0000644000076600000240000000354214417536743023560 0ustar00aivarannamaastafffrom __future__ import annotations import os import sys from errno import ENOENT from typing import cast from ._api import BaseFileLock from ._util import raise_on_exist_ro_file if sys.platform == "win32": # pragma: win32 cover import msvcrt class WindowsFileLock(BaseFileLock): """Uses the :func:`msvcrt.locking` function to hard lock the lock file on windows systems.""" def _acquire(self) -> None: raise_on_exist_ro_file(self._lock_file) mode = ( os.O_RDWR # open for read and write | os.O_CREAT # create file if not exists | os.O_TRUNC # truncate file if not empty ) try: fd = os.open(self._lock_file, mode) except OSError as exception: if exception.errno == ENOENT: # No such file or directory raise else: try: msvcrt.locking(fd, msvcrt.LK_NBLCK, 1) except OSError: os.close(fd) else: self._lock_file_fd = fd def _release(self) -> None: fd = cast(int, self._lock_file_fd) self._lock_file_fd = None msvcrt.locking(fd, msvcrt.LK_UNLCK, 1) os.close(fd) try: os.remove(self._lock_file) # Probably another instance of the application hat acquired the file lock. except OSError: pass else: # pragma: win32 no cover class WindowsFileLock(BaseFileLock): """Uses the :func:`msvcrt.locking` function to hard lock the lock file on windows systems.""" def _acquire(self) -> None: raise NotImplementedError def _release(self) -> None: raise NotImplementedError __all__ = [ "WindowsFileLock", ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/py.typed0000644000076600000240000000000014417536743023036 0ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681833443.0 thonny-4.1.7/thonny/vendored_libs/filelock/version.py0000644000076600000240000000024014417536743023404 0ustar00aivarannamaastaff# file generated by setuptools_scm # don't change, don't track in version control __version__ = version = '3.9.0' __version_tuple__ = version_tuple = (3, 9, 0) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.4004836 thonny-4.1.7/thonny/vendored_libs/pipkin/0000755000076600000240000000000014730055627021046 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/__init__.py0000644000076600000240000000331214730022736023151 0ustar00aivarannamaastaffimport logging import subprocess import sys import traceback from typing import List, Optional from pipkin.adapters import Adapter, DummyAdapter, create_adapter from pipkin.common import ManagementError, UserError from pipkin.session import Session logger = logging.getLogger("pipkin") __version__ = "2.0b2" def error(msg): msg = "ERROR: " + msg print(msg, file=sys.stderr) return 1 def main(raw_args: Optional[List[str]] = None) -> int: from pipkin import parser args = parser.parse_arguments(raw_args) if args.verbose: logging_level = logging.DEBUG elif args.quiet: logging_level = logging.ERROR else: logging_level = logging.INFO logger.setLevel(logging_level) logger.propagate = True console_handler = logging.StreamHandler(sys.stderr) console_handler.setLevel(logging_level) logger.addHandler(console_handler) args_dict = vars(args) try: adapter: Adapter if args.command == "cache": adapter = DummyAdapter() else: adapter = create_adapter(**args_dict) session = Session(adapter) try: command_handler = getattr(session, args.command) command_handler(**args_dict) finally: session.close() except KeyboardInterrupt: return 1 except ManagementError as e: logger.error(traceback.format_exc()) logger.error("SCRIPT: %r", e.script) logger.error("OUT=%r", e.out) logger.error("ERR=%r", e.err) except UserError as e: return error(str(e)) except subprocess.CalledProcessError: # assuming the subprocess (pip) already printed the error return 1 return 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/__main__.py0000644000076600000240000000410214730022736023130 0ustar00aivarannamaastaff""" MIT License Copyright (c) 2023 Aivar Annamaa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import logging import subprocess import sys import textwrap from typing import List, Optional from pipkin import main logger = logging.getLogger(__name__) MP_ORG_INDEX = "https://micropython.org/pi" PYPI_INDEX = "https://pypi.org/pypi" PYPI_SIMPLE_INDEX = "https://pypi.org/simple" DEFAULT_INDEX_URLS = [MP_ORG_INDEX, PYPI_INDEX] SERVER_ENCODING = "utf-8" __version__ = "0.2b1" """ steps: - infer target if no explicit connection parameters are given - connect (MP) - determine target location on the device/mount - sync RTC (MP, install, uninstall). Not required for CP? - ensure temp venv for pip operations - fetch METADATA-s and RECORD-s (may be empty in all cases except "show -f") and populate venv - record current state - invoke pip (translate paths in the output) - determine deleted and changed dists and remove these on the target (according to actual RECORD-s) - determine new and changed dists and copy these to the target - clear venv """ sys.exit(main(sys.argv[1:])) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/adapters.py0000644000076600000240000004102014730022736023213 0ustar00aivarannamaastaffimport os.path import re from abc import ABC, abstractmethod from logging import getLogger from typing import Dict, List, Optional, Tuple from pipkin.common import UserError from pipkin.util import parse_meta_dir_name META_ENCODING = "utf-8" KNOWN_VID_PIDS = {(0x2E8A, 0x0005)} # Raspberry Pi Pico logger = getLogger(__name__) class Adapter(ABC): """ An instance of Adapter is meant to be used by single instance of Session. It is assumed that during the lifetime of an Adapter, sys.path stays fixed and distributions and sys.path directories are only manipulated via this Adapter. This requirement is related to the caching used in BaseAdapter. """ @abstractmethod def get_user_packages_path(self) -> Optional[str]: """Unix / Windows ports return the location of user packages""" ... @abstractmethod def get_default_target(self) -> str: """Installation location if neither --user nor --target is specified""" ... @abstractmethod def list_dists(self, paths: List[str] = None) -> Dict[str, Tuple[str, str]]: """Return canonic names of the distributions mapped to their meta dir names and installation paths. If a distribution is installed to different sys.path locations, then return only the first one. """ ... @abstractmethod def remove_dist( self, dist_name: str, target: Optional[str] = None, above_target: bool = False ) -> None: """If target is given, then remove from this directory. If above_path, then also remove from sys.path dirs which would hide the package at path. Otherwise remove the first visible instance of the dist according to sys.path. """ ... @abstractmethod def read_file(self, path: str) -> bytes: """Path must be device's absolute path (ie. start with /)""" ... @abstractmethod def write_file(self, path: str, content: bytes) -> None: """Path must be device's absolute path (ie. start with /)""" ... @abstractmethod def join_path(self, *parts: str) -> str: ... @abstractmethod def split_dir_and_basename(self, path: str) -> Tuple[str, str]: ... @abstractmethod def normpath(self, path: str) -> str: ... @abstractmethod def get_implementation_name_and_version_prefix(self) -> Tuple[str, str]: ... @abstractmethod def get_mpy_cross_args(self) -> List[str]: ... class DummyAdapter(Adapter): def get_user_packages_path(self) -> Optional[str]: raise NotImplementedError() def get_default_target(self) -> str: raise NotImplementedError() def list_dists(self, paths: List[str] = None) -> Dict[str, Tuple[str, str]]: raise NotImplementedError() def remove_dist( self, dist_name: str, target: Optional[str] = None, above_target: bool = False ) -> None: raise NotImplementedError() def read_file(self, path: str) -> bytes: raise NotImplementedError() def write_file(self, path: str, content: bytes) -> None: raise NotImplementedError() def join_path(self, *parts: str) -> str: raise NotImplementedError() def split_dir_and_basename(self, path: str) -> Tuple[str, str]: raise NotImplementedError() def normpath(self, path: str) -> str: raise NotImplementedError() def get_implementation_name_and_version_prefix(self) -> Tuple[str, str]: raise NotImplementedError() def get_mpy_cross_args(self) -> List[str]: raise NotImplementedError() class BaseAdapter(Adapter, ABC): def __init__(self): self._ensured_directories = set() self._sys_path: Optional[List[str]] = None self._sys_implementation: Optional[Tuple[str, str, int]] = None def get_sys_path(self) -> List[str]: if self._sys_path is None: self._sys_path = self.fetch_sys_path() return self._sys_path def get_implementation_name_and_version_prefix(self) -> Tuple[str, str]: impl = self.get_sys_implementation() return impl[0], ".".join(impl[1].split(".")[:2]) def get_mpy_cross_args(self) -> List[str]: impl = self.get_sys_implementation() sys_mpy = impl[2] if sys_mpy is None: return [] # https://docs.micropython.org/en/latest/reference/mpyfiles.html#versioning-and-compatibility-of-mpy-files args = [] arch = [ None, "x86", "x64", "armv6", "armv6m", "armv7m", "armv7em", "armv7emsp", "armv7emdp", "xtensa", "xtensawin", ][sys_mpy >> 10] if arch: args.append("-march=" + arch) if not sys_mpy & 0x200: args.append("-mno-unicode") return args @abstractmethod def fetch_sys_path(self) -> List[str]: ... def get_sys_implementation(self) -> Tuple[str, str, int]: if self._sys_implementation is None: self._sys_implementation = self.fetch_sys_implementation() return self._sys_implementation @abstractmethod def fetch_sys_implementation(self) -> Tuple[str, str, int]: ... @abstractmethod def remove_file_if_exists(self, path: str) -> None: ... @abstractmethod def remove_dir_if_empty(self, path: str) -> bool: ... @abstractmethod def list_meta_dir_names(self, path: str, dist_name: Optional[str] = None) -> List[str]: """Return meta dir names from the indicated directory""" ... def get_default_target(self) -> str: sys_path = self.get_sys_path() # M5-Flow 2.0.0 has both /lib and /flash/libs for candidate in ["/flash/lib", "/flash/libs", "/lib"]: if candidate in sys_path: return candidate for entry in sys_path: if "lib" in entry: return entry raise AssertionError("Could not determine default target") def list_dists(self, paths: List[str] = None) -> Dict[str, Tuple[str, str]]: if not paths: # TODO: Consider considering only single directory paths = [entry for entry in self.get_sys_path() if entry.startswith("/")] result = {} for path in paths: for dir_name in self.list_meta_dir_names(path): dist_name, _ = parse_meta_dir_name(dir_name) if dist_name not in result: result[dist_name] = dir_name, path return result def remove_dist( self, dist_name: str, target: Optional[str] = None, above_target: bool = False ) -> None: could_remove = False if target: result = self.check_remove_dist_from_path(dist_name, target) could_remove = could_remove or result if above_target and target in self.get_sys_path(): for entry in self.get_sys_path(): if entry == "": continue elif entry == target: break else: result = self.check_remove_dist_from_path(dist_name, entry) could_remove = could_remove or result else: for entry in self.get_sys_path(): if entry.startswith("/"): result = self.check_remove_dist_from_path(dist_name, entry) could_remove = could_remove or result if result: break if not could_remove: logger.warning("Could not find %r for removing", dist_name) def check_remove_dist_from_path(self, dist_name: str, path: str) -> bool: meta_dirs = self.list_meta_dir_names(path, dist_name) result = False for meta_dir_name in meta_dirs: self.remove_dist_by_meta_dir(path, meta_dir_name) result = True return result def remove_dist_by_meta_dir(self, containing_dir: str, meta_dir_name: str) -> None: record_bytes = self.read_file(self.join_path(containing_dir, meta_dir_name, "RECORD")) record_lines = record_bytes.decode(META_ENCODING).splitlines() package_dirs = set() for line in record_lines: rel_path, _, _ = line.split(",") abs_path = self.join_path(containing_dir, rel_path) logger.debug("Removing file %s", abs_path) self.remove_file_if_exists(abs_path) abs_dir, _ = self.split_dir_and_basename(abs_path) while len(abs_dir) > len(containing_dir): package_dirs.add(abs_dir) abs_dir, _ = self.split_dir_and_basename(abs_dir) for abs_dir in sorted(package_dirs, reverse=True): did_remove = self.remove_dir_if_empty(abs_dir) if did_remove and abs_dir in self._ensured_directories: self._ensured_directories.remove(abs_dir) def join_path(self, *parts: str) -> str: assert parts return self.get_dir_sep().join(parts) def split_dir_and_basename(self, path: str) -> Tuple[str, str]: dir_name, basename = path.rsplit(self.get_dir_sep(), maxsplit=1) return dir_name or None, basename or None def normpath(self, path: str) -> str: return path.replace("\\", self.get_dir_sep()).replace("/", self.get_dir_sep()) @abstractmethod def get_dir_sep(self) -> str: ... def write_file(self, path: str, content: bytes) -> None: parent, _ = self.split_dir_and_basename(path) self.ensure_dir_exists(parent) self.write_file_in_existing_dir(path, content) def ensure_dir_exists(self, path: str) -> None: if ( path in self._ensured_directories or path == "/" or path.endswith(":") or path.endswith(":\\") ): return else: parent, _ = self.split_dir_and_basename(path) if parent: self.ensure_dir_exists(parent) self.mkdir_in_existing_parent_exists_ok(path) self._ensured_directories.add(path) @abstractmethod def write_file_in_existing_dir(self, path: str, content: bytes) -> None: ... @abstractmethod def mkdir_in_existing_parent_exists_ok(self, path: str) -> None: ... class InterpreterAdapter(BaseAdapter, ABC): """Base class for adapters, which communicate with an interpreter""" def __init__(self, executable: str): super().__init__() self._executable = executable class ExecutableAdapter(InterpreterAdapter, ABC): def get_dir_sep(self) -> str: return os.path.sep class LocalExecutableAdapter(ExecutableAdapter): ... class SshExecutableAdapter(ExecutableAdapter): ... class LocalMirrorAdapter(BaseAdapter, ABC): def __init__(self, base_path: str): super().__init__() self.base_path = base_path def get_user_packages_path(self) -> Optional[str]: return None def get_dir_sep(self) -> str: return "/" def get_mpy_cross_args(self) -> List[str]: return [] def read_file(self, path: str) -> bytes: local_path = self.convert_to_local_path(path) with open(local_path, "rb") as fp: return fp.read() def write_file_in_existing_dir(self, path: str, content: bytes) -> None: local_path = self.convert_to_local_path(path) assert not os.path.isdir(local_path) block_size = 4 * 1024 with open(local_path, "wb") as fp: while content: block = content[:block_size] content = content[block_size:] bytes_written = fp.write(block) fp.flush() os.fsync(fp) assert bytes_written == len(block) def remove_file_if_exists(self, path: str) -> None: local_path = self.convert_to_local_path(path) if os.path.exists(local_path): os.remove(local_path) def remove_dir_if_empty(self, path: str) -> bool: local_path = self.convert_to_local_path(path) assert os.path.isdir(local_path) content = os.listdir(local_path) if content: return False else: os.rmdir(local_path) return True def mkdir_in_existing_parent_exists_ok(self, path: str) -> None: local_path = self.convert_to_local_path(path) if not os.path.isdir(local_path): assert not os.path.exists(local_path) os.mkdir(local_path, 0o755) def convert_to_local_path(self, device_path: str) -> str: assert device_path.startswith("/") return os.path.normpath(self.base_path + device_path) def list_meta_dir_names(self, path: str, dist_name: Optional[str] = None) -> List[str]: local_path = self.convert_to_local_path(path) try: return [ name for name in os.listdir(local_path) if name.endswith(".dist-info") and (dist_name is None or name.startswith(dist_name + "-")) ] except FileNotFoundError: # skipping non-existing dirs return [] class MountAdapter(LocalMirrorAdapter): def __init__(self, base_path: str): super().__init__(base_path) if not os.path.exists(base_path): raise UserError(f"Can't find mount point {base_path}") if os.path.isfile(base_path): raise UserError(f"Mount point {base_path} can't be a file") self._circuitpython_version = self._infer_cp_version() def fetch_sys_path(self) -> List[str]: if os.path.isdir(os.path.join(self.base_path, "lib")) or self.is_circuitpython(): return ["", "/", ".frozen", "/lib"] elif os.path.isdir(os.path.join(self.base_path, "flash")): return ["", "/flash", "/flash/lib"] else: return ["", "/", ".frozen", "/lib"] def fetch_sys_implementation(self) -> Tuple[str, str, int]: if self._circuitpython_version: return ("circuitpython", self._circuitpython_version, 0) else: raise UserError("Could not determine sys.implementation") def is_circuitpython(self) -> bool: # TODO: better look into the file as well return os.path.isfile(os.path.join(self.base_path, "boot_out.txt")) def _infer_cp_version(self) -> Optional[str]: boot_out_path = os.path.join(self.base_path, "boot_out.txt") if os.path.exists(boot_out_path): with open(boot_out_path, encoding="utf-8") as fp: firmware_info = fp.readline().strip() match = re.match(r".*?CircuitPython (\d+\.\d+)\..+?", firmware_info) if match: return match.group(1) return None class DirAdapter(LocalMirrorAdapter): def __init__(self, base_path: str): super().__init__(base_path) if not os.path.isdir(base_path): assert not os.path.exists(base_path) os.makedirs(base_path, mode=0o755) def fetch_sys_path(self) -> List[str]: # This means, list command without --path will consider this directory return ["/"] def fetch_sys_implementation(self) -> Tuple[str, str, int]: # TODO: return ("micropython", "1.20", 0) def get_default_target(self) -> str: return "/" def create_adapter(port: Optional[str], mount: Optional[str], dir: Optional[str], **kw) -> Adapter: if port: from pipkin import bare_metal, serial_connection connection = serial_connection.SerialConnection(port) return bare_metal.SerialPortAdapter(connection) elif dir: return DirAdapter(dir) elif mount: return MountAdapter(mount) else: return _infer_adapter() def _infer_adapter() -> BaseAdapter: from serial.tools.list_ports import comports candidates = [("port", p.device) for p in comports() if (p.vid, p.pid) in KNOWN_VID_PIDS] from .util import list_volumes for vol in list_volumes(skip_letters={"A"}): if os.path.isfile(os.path.join(vol, "boot_out.txt")): candidates.append(("mount", vol)) if not candidates: raise UserError("Could not auto-detect target") if len(candidates) > 1: raise UserError(f"Found several possible targets: {candidates}") kind, arg = candidates[0] if kind == "port": from pipkin import bare_metal, serial_connection connection = serial_connection.SerialConnection(arg) return bare_metal.SerialPortAdapter(connection) else: assert kind == "mount" return MountAdapter(arg) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1685726659.0 thonny-4.1.7/thonny/vendored_libs/pipkin/bare_metal.py0000644000076600000240000010151214436422703023507 0ustar00aivarannamaastaffimport ast import binascii import errno import os import re import struct import time from abc import ABC from logging import getLogger from textwrap import dedent from typing import Any, Callable, Dict, List, Optional, Tuple from pipkin import UserError from pipkin.adapters import BaseAdapter from pipkin.common import CommunicationError, ManagementError, ProtocolError from pipkin.connection import MicroPythonConnection, ReadingTimeoutError from pipkin.serial_connection import SerialConnection from pipkin.util import starts_with_continuation_byte logger = getLogger(__name__) RAW_MODE_CMD = b"\x01" NORMAL_MODE_CMD = b"\x02" INTERRUPT_CMD = b"\x03" SOFT_REBOOT_CMD = b"\x04" PASTE_MODE_CMD = b"\x05" PASTE_MODE_LINE_PREFIX = b"=== " PASTE_SUBMIT_MODE = "paste" RAW_PASTE_SUBMIT_MODE = "raw_paste" RAW_SUBMIT_MODE = "raw" RAW_PASTE_COMMAND = b"\x05A\x01" RAW_PASTE_CONFIRMATION = b"R\x01" RAW_PASTE_CONTINUE = b"\x01" MGMT_VALUE_START = b"" MGMT_VALUE_END = b"" # How many seconds to wait for something that should appear quickly. # In other words -- how long to wait with reporting a protocol error # (hoping that the required piece is still coming) WAIT_OR_CRASH_TIMEOUT = 5 FIRST_RAW_PROMPT = b"raw REPL; CTRL-B to exit\r\n>" RAW_PROMPT = b">" WEBREPL_REQ_S = "<2sBBQLH64s" WEBREPL_PUT_FILE = 1 WEBREPL_GET_FILE = 2 EOT = b"\x04" NORMAL_PROMPT = b">>> " LF = b"\n" OK = b"OK" ESC = b"\x1b" ST = b"\x1b\\" ENCODING = "utf-8" TRACEBACK_MARKER = b"Traceback (most recent call last):" OutputConsumer = Callable[[str, str], None] class BareMetalAdapter(BaseAdapter, ABC): def __init__( self, connection: MicroPythonConnection, submit_mode: Optional[str] = None, write_block_size: Optional[int] = None, write_block_delay: Optional[float] = None, ): super().__init__() self._connection = connection ( self._submit_mode, self._write_block_size, self._write_block_delay, ) = self._infer_submit_parameters(submit_mode, write_block_size, write_block_delay) self._last_prompt: Optional[bytes] = None self._interrupt_to_prompt() self._prepare_helper() self._builtin_modules = self._fetch_builtin_modules() logger.debug("Builtin modules: %r", self._builtin_modules) def get_dir_sep(self) -> str: return "/" def _infer_submit_parameters( self, submit_mode: Optional[str] = None, write_block_size: Optional[int] = None, write_block_delay: Optional[float] = None, ) -> Tuple[str, int, float]: if submit_mode is None: submit_mode = RAW_PASTE_SUBMIT_MODE if write_block_size is None: write_block_size = 255 if write_block_delay is None: if submit_mode == RAW_SUBMIT_MODE: write_block_delay = 0.01 else: write_block_delay = 0.0 return submit_mode, write_block_size, write_block_delay def _fetch_builtin_modules(self) -> List[str]: script = "__pipkin_helper.builtins.help('modules')" out, err = self._execute_and_capture_output(script) if err or not out: logger.warning("Could not query builtin modules") return [] modules_str_lines = out.strip().splitlines() last_line = modules_str_lines[-1].strip() if last_line.count(" ") > 0 and " " not in last_line and "\t" not in last_line: # probably something like "plus any modules on the filesystem" # (can be in different languages) modules_str_lines = modules_str_lines[:-1] modules_str = ( " ".join(modules_str_lines) .replace("/__init__", "") .replace("__main__", "") .replace("/", ".") ) return modules_str.split() def _interrupt_to_prompt(self) -> None: # It's safer to thoroughly interrupt before poking with RAW_MODE_CMD # as Pico may get stuck otherwise # https://github.com/micropython/micropython/issues/7867 interventions = [(INTERRUPT_CMD, 0.1), (INTERRUPT_CMD, 0.1), (RAW_MODE_CMD, 0.1)] for cmd, timeout in interventions: self._write(cmd) try: self._log_output_until_active_prompt(timeout=timeout) break except TimeoutError as e: logger.debug( "Could not get prompt with intervention %r and timeout %r. Read bytes: %r", cmd, timeout, getattr(e, "read_bytes", "?"), ) # Try again as long as there are interventions left else: raise CommunicationError("Could not get raw REPL") def _log_output(self, data: bytes, stream: str = "stdout") -> None: logger.debug("read %s: %r", stream, data) def _prepare_helper(self) -> None: script = ( dedent( """ class __pipkin_helper: import builtins try: import uos as os except builtins.ImportError: import os import sys @builtins.classmethod def print_mgmt_value(cls, obj): cls.builtins.print({mgmt_start!r}, cls.builtins.repr(obj), {mgmt_end!r}, sep='', end='') """ ).format( mgmt_start=MGMT_VALUE_START.decode(ENCODING), mgmt_end=MGMT_VALUE_END.decode(ENCODING), ) + "\n" ).lstrip() self._execute_without_output(script) def fetch_sys_path(self) -> List[str]: return self._evaluate("__pipkin_helper.sys.path") def fetch_sys_implementation(self) -> Tuple[str, str, int]: return self._evaluate("__pipkin_helper.builtins.tuple(__pipkin_helper.sys.implementation)") def get_user_packages_path(self) -> Optional[str]: return None def read_file(self, path: str) -> bytes: hex_mode = self._should_hexlify(path) open_script = f"__pipkin_fp = __pipkin_helper.builtins.open({path!r}, 'rb')" out, err = self._execute_and_capture_output(open_script) if (out + err).strip(): if any(str(nr) in out + err for nr in [errno.ENOENT, errno.ENODEV]): raise FileNotFoundError(f"Can't find {path} on target") else: raise ManagementError( f"Could not open file {path} for reading", script=open_script, out=out, err=err ) if hex_mode: self._execute_without_output("from binascii import hexlify as __temp_hexlify") block_size = 1024 num_bytes_read = 0 blocks = [] while True: if hex_mode: block = binascii.unhexlify( self._evaluate("__temp_hexlify(__pipkin_fp.read(%s))" % block_size) ) else: block = self._evaluate("__pipkin_fp.read(%s)" % block_size) if block: blocks.append(block) num_bytes_read += len(block) if len(block) < block_size: break self._execute_without_output( dedent( """ __pipkin_fp.close() del __pipkin_fp try: del __temp_hexlify except: pass """ ) ) return b"".join(blocks) def remove_file_if_exists(self, path: str) -> None: self._execute_without_output( dedent( f""" try: __pipkin_helper.os.stat({path!r}) and None except __pipkin_helper.builtins.OSError: pass else: __pipkin_helper.os.remove({path!r}) """ ) ) def remove_dir_if_empty(self, path: str) -> bool: return self._evaluate( dedent( f""" if __pipkin_helper.os.listdir({path!r}): __pipkin_helper.print_mgmt_value(False) else: __pipkin_helper.os.remove({path!r}) __pipkin_helper.print_mgmt_value(True) """ ) ) def mkdir_in_existing_parent_exists_ok(self, path: str) -> None: self._execute_without_output( dedent( f""" try: __pipkin_helper.os.stat({path!r}) and None except __pipkin_helper.builtins.OSError: __pipkin_helper.os.mkdir({path!r}) """ ) ) def list_meta_dir_names(self, path: str, dist_name: Optional[str] = None) -> List[str]: if dist_name: dist_name_condition = f"and name.startswith({dist_name+'-'!r})" else: dist_name_condition = "" return self._evaluate( dedent( f""" try: __pipkin_helper.print_mgmt_value([ name for name in __pipkin_helper.os.listdir({path!r}) if name.endswith('.dist-info') {dist_name_condition} ]) except __pipkin_helper.builtins.OSError as e: __pipkin_helper.print_mgmt_value([]) """ ) ) def _submit_code(self, script: str) -> None: assert script to_be_sent = script.encode("UTF-8") logger.debug("Submitting via %s: %r", self._submit_mode, to_be_sent[:1000]) # assuming we are already at a prompt, but threads may have produced something extra discarded_bytes = self._connection.read_all() if discarded_bytes: logger.info("Discarding %r", discarded_bytes) if self._submit_mode == PASTE_SUBMIT_MODE: self._submit_code_via_paste_mode(to_be_sent) elif self._submit_mode == RAW_PASTE_SUBMIT_MODE: try: self._submit_code_via_raw_paste_mode(to_be_sent) except RawPasteNotSupportedError: logger.warning("Could not use expected raw paste, falling back to paste mode") self._submit_mode = PASTE_SUBMIT_MODE self._submit_code_via_paste_mode(to_be_sent) else: self._submit_code_via_raw_mode(to_be_sent) def _submit_code_via_paste_mode(self, script_bytes: bytes) -> None: # Go to paste mode self._ensure_normal_mode() self._write(PASTE_MODE_CMD) discarded = self._connection.read_until(PASTE_MODE_LINE_PREFIX) logger.debug("Discarding %r", discarded) # Send script while script_bytes: block = script_bytes[: self._write_block_size] script_bytes = script_bytes[self._write_block_size :] # find proper block boundary while True: expected_echo = block.replace(b"\r\n", b"\r\n" + PASTE_MODE_LINE_PREFIX) if ( len(expected_echo) > self._write_block_size or block.endswith(b"\r") or len(block) > 2 and starts_with_continuation_byte(script_bytes) ): # move last byte to the next block script_bytes = block[-1:] + script_bytes block = block[:-1] continue else: break self._write(block) self._connection.read_all_expected(expected_echo, timeout=WAIT_OR_CRASH_TIMEOUT) # push and read confirmation self._write(EOT) expected_confirmation = b"\r\n" actual_confirmation = self._connection.read( len(expected_confirmation), timeout=WAIT_OR_CRASH_TIMEOUT ) assert actual_confirmation == expected_confirmation, "Expected %r, got %r" % ( expected_confirmation, actual_confirmation, ) def _submit_code_via_raw_mode(self, script_bytes: bytes) -> None: self._ensure_raw_mode() to_be_written = script_bytes + EOT while to_be_written: block = to_be_written[self._write_block_size :] self._write(block) to_be_written = to_be_written[len(block) :] if to_be_written: time.sleep(self._write_block_delay) # fetch command confirmation confirmation = self._connection.soft_read(2, timeout=WAIT_OR_CRASH_TIMEOUT) if confirmation != OK: data = confirmation + self._connection.read_all() data += self._connection.read(1, timeout=1, timeout_is_soft=True) data += self._connection.read_all() logger.error( "Could not read command confirmation for script\n\n: %s\n\n" + "Got: %r", script_bytes, data, ) raise ProtocolError("Could not read command confirmation") def _submit_code_via_raw_paste_mode(self, script_bytes: bytes) -> None: self._ensure_raw_mode() self._connection.set_text_mode(False) self._write(RAW_PASTE_COMMAND) response = self._connection.soft_read(2, timeout=WAIT_OR_CRASH_TIMEOUT) if response != RAW_PASTE_CONFIRMATION: # Occasionally, the device initially supports raw paste but later doesn't allow it # https://github.com/thonny/thonny/issues/1545 time.sleep(0.01) response += self._connection.read_all() if response == FIRST_RAW_PROMPT: self._last_prompt = FIRST_RAW_PROMPT raise RawPasteNotSupportedError() else: logger.error("Got %r instead of raw-paste confirmation", response) raise ProtocolError("Could not get raw-paste confirmation") self._raw_paste_write(script_bytes) self._connection.set_text_mode(True) def _raw_paste_write(self, command_bytes): # Adapted from https://github.com/micropython/micropython/commit/a59282b9bfb6928cd68b696258c0dd2280244eb3#diff-cf10d3c1fe676599a983c0ec85b78c56c9a6f21b2d896c69b3e13f34d454153e # Read initial header, with window size. data = self._connection.soft_read(2, timeout=2) assert len(data) == 2, "Could not read initial header, got %r" % ( data + self._connection.read_all() ) window_size = data[0] | data[1] << 8 window_remain = window_size # Write out the command_bytes data. i = 0 while i < len(command_bytes): while window_remain == 0 or not self._connection.incoming_is_empty(): data = self._connection.soft_read(1, timeout=WAIT_OR_CRASH_TIMEOUT) if data == b"\x01": # Device indicated that a new window of data can be sent. window_remain += window_size elif data == b"\x04": # Device indicated abrupt end, most likely a syntax error. # Acknowledge it and finish. self._write(b"\x04") logger.debug( "Abrupt end of raw paste submit after submitting %s bytes out of %s", i, len(command_bytes), ) return else: # Unexpected data from device. logger.error("Unexpected read during raw paste: %r", data) raise ProtocolError("Unexpected read during raw paste") # Send out as much data as possible that fits within the allowed window. b = command_bytes[i : min(i + window_remain, len(command_bytes))] self._write(b) window_remain -= len(b) i += len(b) # Indicate end of data. self._write(b"\x04") # Wait for device to acknowledge end of data. data = self._connection.soft_read_until(b"\x04", timeout=WAIT_OR_CRASH_TIMEOUT) if not data.endswith(b"\x04"): logger.error("Could not complete raw paste. Ack: %r", data) raise ProtocolError("Could not complete raw paste") def _ensure_raw_mode(self): if self._last_prompt in [ RAW_PROMPT, EOT + RAW_PROMPT, FIRST_RAW_PROMPT, ]: return logger.debug("requesting raw mode at %r", self._last_prompt) # assuming we are currently on a normal prompt self._write(RAW_MODE_CMD) self._log_output_until_active_prompt() if self._last_prompt == NORMAL_PROMPT: # Don't know why this happens sometimes (e.g. when interrupting a Ctrl+D or restarted # program, which is outputting text on ESP32) logger.info("Found normal prompt instead of expected raw prompt. Trying again.") self._write(RAW_MODE_CMD) time.sleep(0.5) self._log_output_until_active_prompt() if self._last_prompt != FIRST_RAW_PROMPT: logger.error( "Could not enter raw prompt, got %r", self._last_prompt, ) raise ProtocolError("Could not enter raw prompt") def _ensure_normal_mode(self, force=False): if self._last_prompt == NORMAL_PROMPT and not force: return logger.debug("requesting normal mode at %r", self._last_prompt) self._write(NORMAL_MODE_CMD) self._log_output_until_active_prompt() assert self._last_prompt == NORMAL_PROMPT, ( "Could not get normal prompt, got %r" % self._last_prompt ) def _log_output_until_active_prompt(self, timeout: float = WAIT_OR_CRASH_TIMEOUT) -> None: def collect_output(data, stream): if data: logger.info("Discarding %s: %r", stream, data) self._process_output_until_active_prompt(collect_output, timeout=timeout) def _capture_output_until_active_prompt(self, timeout: float) -> Tuple[str, str]: output = {"stdout": "", "stderr": ""} def collect_output(data, stream): output[stream] += data self._process_output_until_active_prompt(collect_output, timeout=timeout) return output["stdout"], output["stderr"] def _process_output_until_active_prompt( self, output_consumer: OutputConsumer, timeout: float, ): PROMPT_MARKERS = [NORMAL_PROMPT, EOT + RAW_PROMPT, FIRST_RAW_PROMPT] PROMPT_MARKERS_RE = re.compile( b"|".join( map( re.escape, PROMPT_MARKERS, ) ) ) start_time = time.time() while True: spent_time = time.time() - start_time time_left = max(timeout - spent_time, 0.0) data = self._connection.read_until(PROMPT_MARKERS_RE, timeout=time_left) assert any(data.endswith(marker) for marker in PROMPT_MARKERS) for prompt in PROMPT_MARKERS: if data.endswith(prompt): self._last_prompt = prompt content = data[: -len(self._last_prompt)] if EOT in content: out, err = content.split(EOT, maxsplit=1) elif TRACEBACK_MARKER in content: out, err = content.split(TRACEBACK_MARKER, maxsplit=1) err = TRACEBACK_MARKER + err else: out = content err = b"" output_consumer(out.decode(ENCODING), "stdout") if err: output_consumer(err.decode(ENCODING), "stderr") break # Check if it's really active prompt follow_up = self._connection.soft_read(1, timeout=0.01) if follow_up == ESC: # See if it's followed by a OSC code, like the one output by CircuitPython 8 follow_up += self._connection.soft_read_until(ST) if follow_up.endswith(ST): logger.debug("Dropping OSC sequence %r", follow_up) follow_up = b"" if follow_up: # Nope, the prompt is not active. # (Actually it may be that a background thread has produced this follow up, # but this would be too hard to consider.) # Don't output yet, because the follow-up may turn into another prompt, # and they can be captured all together. self._connection.unread(follow_up) output_consumer(self._last_prompt.decode(ENCODING), "stdout") else: break def _evaluate(self, script: str) -> Any: """Evaluate the output of the script or raise error, if anything looks wrong. Adds printing code if the script contains single expression and doesn't already contain printing code""" try: ast.parse(script, mode="eval") prefix = "__pipkin_helper.print_mgmt_value(" suffix = ")" if not script.strip().startswith(prefix): script = prefix + script + suffix except SyntaxError: pass out, err = self._execute_and_capture_output(script) if err: raise ManagementError("Script produced errors", script, out, err) elif ( MGMT_VALUE_START.decode(ENCODING) not in out or MGMT_VALUE_END.decode(ENCODING) not in out ): raise ManagementError("Management markers missing", script, out, err) start_token_pos = out.index(MGMT_VALUE_START.decode(ENCODING)) end_token_pos = out.index(MGMT_VALUE_END.decode(ENCODING)) # a thread or IRQ handler may have written something before or after mgmt value prefix = out[:start_token_pos] value_str = out[start_token_pos + len(MGMT_VALUE_START) : end_token_pos] suffix = out[end_token_pos + len(MGMT_VALUE_END) :] try: value = ast.literal_eval(value_str) except Exception as e: raise ManagementError("Could not parse management response", script, out, err) from e if prefix: logger.warning("Eval output had unexpected prefix: %r", prefix) if suffix: logger.warning("Eval output had unexpected suffix: %r", suffix) return value def _write(self, data: bytes) -> None: if ( RAW_MODE_CMD in data or NORMAL_MODE_CMD in data or INTERRUPT_CMD in data or EOT in data or PASTE_MODE_CMD in data ): logger.debug("Sending ctrl chars: %r", data) num_bytes = self._connection.write(data) assert num_bytes == len(data) def _should_hexlify(self, path): if "binascii" not in self._builtin_modules and "ubinascii" not in self._builtin_modules: return False for ext in (".py", ".txt", ".csv", "METADATA", "RECORD"): if path.lower().endswith(ext): return False return True def _execute_without_output(self, script: str, timeout: float = WAIT_OR_CRASH_TIMEOUT) -> None: """Meant for management tasks.""" out, err = self._execute_and_capture_output(script, timeout=timeout) if out or err: raise ManagementError("Command output was not empty", script, out, err) def _execute_and_capture_output( self, script: str, timeout: float = WAIT_OR_CRASH_TIMEOUT ) -> Tuple[str, str]: output_lists: Dict[str, List[str]] = {"stdout": [], "stderr": []} def consume_output(data, stream_name): assert isinstance(data, str) output_lists[stream_name].append(data) self._execute_with_consumer(script, consume_output, timeout=timeout) result = ["".join(output_lists[name]) for name in ["stdout", "stderr"]] return result[0], result[1] def _execute_with_consumer( self, script, output_consumer: OutputConsumer, timeout: float ) -> None: self._submit_code(script) self._process_output_until_active_prompt(output_consumer, timeout=timeout) class SerialPortAdapter(BareMetalAdapter): def __init__( self, connection: SerialConnection, submit_mode: Optional[str] = None, write_block_size: Optional[int] = None, write_block_delay: Optional[float] = None, mount_path: Optional[str] = None, ): super().__init__( connection, submit_mode=submit_mode, write_block_size=write_block_size, write_block_delay=write_block_delay, ) self._mount_path = mount_path self._read_only_filesystem = False def _internal_path_to_mounted_path(self, target_path: str) -> str: assert self._mount_path assert target_path.startswith("/") return os.path.normpath(os.path.join(self._mount_path, target_path[1:])) def write_file_in_existing_dir(self, path: str, content: bytes) -> None: start_time = time.time() if self._read_only_filesystem: self._write_file_via_mount(path, content) try: self._write_file_via_serial(path, content) except ReadOnlyFilesystemError: self._read_only_filesystem = True self._write_file_via_mount(path, content) logger.info("Wrote %s in %.1f seconds", path, time.time() - start_time) def _write_file_via_mount( self, target_path: str, content: bytes, ) -> None: mounted_target_path = self._internal_path_to_mounted_path(target_path) with open(mounted_target_path, "wb") as f: bytes_written = 0 block_size = 4 * 1024 to_be_written = content while to_be_written: block = to_be_written[:block_size] bytes_written += f.write(block) assert bytes_written f.flush() os.fsync(f) to_be_written = to_be_written[block_size:] assert bytes_written == len(content) def _write_file_via_serial( self, target_path: str, content: bytes, can_hexlify: bool = True ) -> None: out, err = self._execute_and_capture_output( dedent( """ __pipkin_path = '{path}' __pipkin_written = 0 __pipkin_fp = __pipkin_helper.builtins.open(__pipkin_path, 'wb') """ ).format(path=target_path), ) if self._contains_read_only_error(out + err): raise ReadOnlyFilesystemError() elif out + err: raise OSError( "Could not open file %s for writing, output:\n%s" % (target_path, out + err) ) # Define function to allow shorter write commands hex_mode = self._should_hexlify(target_path) if hex_mode: self._execute_without_output( dedent( """ from binascii import unhexlify as __pipkin_unhex def __W(x): global __pipkin_written __pipkin_written += __pipkin_fp.write(__pipkin_unhex(x)) __pipkin_fp.flush() if __pipkin_helper.builtins.hasattr(__pipkin_helper.os, "sync"): __pipkin_helper.os.sync() """ ) ) else: self._execute_without_output( dedent( """ def __W(x): global __pipkin_written __pipkin_written += __pipkin_fp.write(x) __pipkin_fp.flush() if __pipkin_helper.builtins.hasattr(__pipkin_helper.os, "sync"): __pipkin_helper.os.sync() """ ) ) bytes_sent = 0 block_size = 1024 to_be_written = content while to_be_written: block = to_be_written[:block_size] if hex_mode: script = "__W(%r)" % binascii.hexlify(block) else: script = "__W(%r)" % block out, err = self._execute_and_capture_output(script) if out or err: logger.error("Writing file produced unexpected output (%r) or error (%r)", out, err) raise UserError( "Could not write next block after having written %d bytes to %s" % (bytes_sent, target_path) ) bytes_sent += len(block) to_be_written = to_be_written[block_size:] bytes_received = self._evaluate("__pipkin_written") if bytes_received != bytes_sent: raise OSError("Expected %d written bytes but wrote %d" % (bytes_sent, bytes_received)) # clean up self._execute_without_output( dedent( """ try: del __W del __pipkin_written del __pipkin_path __pipkin_fp.close() del __pipkin_fp del __pipkin_result del __pipkin_unhex except: pass """ ) ) def remove_file_if_exists(self, path: str) -> None: if self._read_only_filesystem: self._remove_file_via_mount(path) return try: super().remove_file_if_exists(path) except ManagementError as e: if self._contains_read_only_error(e.out + e.err): self._read_only_filesystem = True self._remove_file_via_mount(path) else: raise def _remove_file_via_mount(self, target_path: str) -> None: logger.info("Removing %s via mount", target_path) mounted_target_path = self._internal_path_to_mounted_path(target_path) assert os.path.isfile(mounted_target_path) os.remove(mounted_target_path) def _contains_read_only_error(self, s: str) -> bool: canonic_out = s.replace("-", "").lower() return ( "readonly" in canonic_out or f"errno {errno.EROFS}" in canonic_out or f"oserror: {errno.EROFS}" in canonic_out ) def mkdir_in_existing_parent_exists_ok(self, path: str) -> None: if self._read_only_filesystem: self._mkdir_via_mount(path) return try: super().mkdir_in_existing_parent_exists_ok(path) except ManagementError as e: if self._contains_read_only_error(e.out + e.err): self._read_only_filesystem = True self._mkdir_via_mount(path) else: raise def _mkdir_via_mount(self, path: str) -> bool: mounted_path = self._internal_path_to_mounted_path(path) if not os.path.isdir(mounted_path): assert not os.path.exists(mounted_path) os.mkdir(mounted_path, 0o755) return True else: return False def remove_dir_if_empty(self, path: str) -> bool: if self._read_only_filesystem: return self._remove_dir_if_empty_via_mount(path) try: return super().remove_dir_if_empty(path) except ManagementError as e: if self._contains_read_only_error(e.out + e.err): self._read_only_filesystem = True return self._remove_dir_if_empty_via_mount(path) else: raise def _remove_dir_if_empty_via_mount(self, path: str) -> bool: mounted_path = self._internal_path_to_mounted_path(path) if os.listdir(mounted_path): return False else: os.rmdir(mounted_path) return True class WebReplAdapter(BareMetalAdapter): def write_file_in_existing_dir(self, path: str, content: bytes) -> None: """ Adapted from https://github.com/micropython/webrepl/blob/master/webrepl_cli.py """ dest_fname = path.encode("utf-8") rec = struct.pack( WEBREPL_REQ_S, b"WA", WEBREPL_PUT_FILE, 0, 0, len(content), len(dest_fname), dest_fname ) self._connection.set_text_mode(False) try: self._write(rec[:10]) self._write(rec[10:]) assert self._read_websocket_response() == 0 to_be_written = content block_size = 1024 while to_be_written: block = to_be_written[:block_size] self._write(block) to_be_written = to_be_written[block_size:] assert self._read_websocket_response() == 0 finally: self._connection.set_text_mode(True) def _read_websocket_response(self): data = self._connection.read(4) sig, code = struct.unpack("<2sH", data) assert sig == b"WB" return code class RawPasteNotSupportedError(RuntimeError): pass class ReadOnlyFilesystemError(OSError): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683480545.0 thonny-4.1.7/thonny/vendored_libs/pipkin/common.py0000644000076600000240000000054314425757741022721 0ustar00aivarannamaastaffclass UserError(RuntimeError): pass class CommunicationError(RuntimeError): pass class ProtocolError(RuntimeError): pass class ManagementError(ProtocolError): def __init__(self, msg: str, script: str, out: str, err: str): super().__init__(self, msg) self.script = script self.out = out self.err = err ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1685699373.0 thonny-4.1.7/thonny/vendored_libs/pipkin/connection.py0000644000076600000240000001414214436335455023564 0ustar00aivarannamaastaffimport queue import re import time from logging import getLogger from queue import Queue from typing import Optional, Union logger = getLogger(__name__) class MicroPythonConnection: """Utility class for using Serial or WebSocket connection Uses background thread to read from the source as soon as possible to avoid loss of data (because buffer overflow or the device discarding unread data). Allows unreading data. """ def __init__(self): self.encoding = "utf-8" self._read_queue: Queue = Queue() # populated by reader thread self._read_buffer = bytearray() # used for unreading and postponing bytes self.num_bytes_received = 0 self.startup_time = time.time() self.text_mode = True self._error = None self._reader_stopped = False def soft_read(self, size: int, timeout: float = 1) -> bytes: return self.read(size, timeout, True) def read(self, size: int, timeout: float = 10, timeout_is_soft: bool = False) -> bytes: if timeout == 0: if timeout_is_soft: return b"" else: raise ReadingTimeoutError(read_bytes=b"") timer = TimeHelper(timeout) while len(self._read_buffer) < size: self.check_for_error() try: self._read_buffer.extend(self._read_queue.get(True, timer.time_left)) except queue.Empty as e: if timeout_is_soft: return b"" else: logger.error( "Could not read expected %s bytes in %s seconds. Bytes read: %r", size, timeout, self._read_buffer, ) raise ReadingTimeoutError(read_bytes=self._read_buffer) from e try: data = self._read_buffer[:size] return data finally: del self._read_buffer[:size] def soft_read_until(self, terminator, timeout: float = 1000000) -> bytes: return self.read_until(terminator, timeout, timeout_is_soft=True) def read_until( self, terminator: Union[bytes, re.Pattern], timeout: float = 1000000, timeout_is_soft: bool = False, ) -> bytes: timer = TimeHelper(timeout) if isinstance(terminator, bytes): terminator = re.compile(re.escape(terminator)) assert isinstance(terminator, re.Pattern) while True: self.check_for_error() match = re.search(terminator, self._read_buffer) if match: break try: data = self._read_queue.get(True, timer.time_left) # print("RR", repr(data), file=sys.stderr) assert len(data) > 0 self._read_buffer.extend(data) except queue.Empty: if timeout_is_soft: break else: raise ReadingTimeoutError(read_bytes=self._read_buffer) if match: size = match.end() else: assert timeout_is_soft size = len(self._read_buffer) data = self._read_buffer[:size] del self._read_buffer[:size] return data def _fetch_to_buffer(self) -> None: while not self._read_queue.empty(): self._read_buffer.extend(self._read_queue.get(True)) def read_all(self, check_error: bool = True) -> bytes: self._fetch_to_buffer() if len(self._read_buffer) == 0 and check_error: self.check_for_error() try: return self._read_buffer finally: self._read_buffer = bytearray() def read_all_expected(self, expected: bytes, timeout: float = None) -> bytes: actual = self.read(len(expected), timeout=timeout) actual += self.read_all() assert expected == actual, "Expected %r, got %r" % (expected, actual) return actual def check_for_error(self) -> None: if self._error is None: return raise ConnectionError(self._error) def unread(self, data: bytes) -> None: if not data: return if isinstance(data, str): data = data.encode(self.encoding) elif isinstance(data, bytes): data = bytearray(data) self._read_buffer = data + self._read_buffer def write(self, data: bytes) -> int: """Writing""" raise NotImplementedError() def _log_data(self, data: bytes) -> None: print( data.decode(self.encoding, errors="replace") .replace("\r\n", "\n") .replace("\x01", "①") .replace("\x02", "②") .replace("\x03", "③") .replace("\x04", "④"), end="", ) def _make_output_available(self, data: bytes, block: bool = True) -> None: # self._log_data(data) if data: self._read_queue.put(data, block=block) self.num_bytes_received += len(data) def incoming_is_empty(self) -> bool: return self._read_queue.empty() and len(self._read_buffer) == 0 def outgoing_is_empty(self) -> bool: return True def buffers_are_empty(self) -> bool: return self.incoming_is_empty() and self.outgoing_is_empty() def set_text_mode(self, value: bool) -> None: self.text_mode = value def stop_reader(self) -> None: self._reader_stopped = True self._read_queue = Queue() self._read_buffer = bytearray() def close(self) -> None: raise NotImplementedError() class ReadingTimeoutError(TimeoutError): def __init__(self, read_bytes: bytes): super().__init__(f"Read bytes: {read_bytes!r}") self.read_bytes = read_bytes class TimeHelper: def __init__(self, time_allowed): self.start_time = time.time() self.time_allowed = time_allowed @property def time_spent(self): return time.time() - self.start_time @property def time_left(self): return max(self.time_allowed - self.time_spent, 0) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1711690524.0 thonny-4.1.7/thonny/vendored_libs/pipkin/parser.py0000644000076600000240000002446214601451434022715 0ustar00aivarannamaastaffimport argparse import sys from typing import Any, List, Optional from pipkin import __version__ def parse_arguments(raw_args: Optional[List[str]] = None) -> Any: if raw_args is None: raw_args = sys.argv[1:] main_parser = argparse.ArgumentParser( description="Tool for managing MicroPython and CircuitPython packages", allow_abbrev=False, add_help=False, ) general_group = main_parser.add_argument_group(title="general") general_group.add_argument( "-h", "--help", help="Show this help message and exit", action="help", ) general_group.add_argument( "-V", "--version", help="Show program version and exit", action="version", version=__version__, ) verbosity_group = general_group.add_mutually_exclusive_group() verbosity_group.add_argument( "-v", "--verbose", help="Show more details about the process", action="store_true", ) verbosity_group.add_argument( "-q", "--quiet", help="Don't show non-error output", action="store_true", ) connection_group = main_parser.add_argument_group( title="target selection (pick one or let pipkin autodetect the port or mount)" ) connection_exclusive_group = connection_group.add_mutually_exclusive_group() connection_exclusive_group.add_argument( "-p", "--port", help="Serial port of the target device", metavar="", ) connection_exclusive_group.add_argument( "-m", "--mount", help="Mount point (volume, disk, drive) of the target device", metavar="", ) connection_exclusive_group.add_argument( "-d", "--dir", help="Directory in the local filesystem", metavar="", ) # connection_exclusive_group.add_argument( # "-e", # "--exe", # help="Interpreter executable (Unix or Windows port)", # metavar="", # ) # sub-parsers subparsers = main_parser.add_subparsers( title="commands", description='Use "pipkin -h" for usage help of a command ', dest="command", required=True, ) install_parser = subparsers.add_parser( "install", help="Install packages.", description="Installs upip or pip compatible distribution packages onto " "a MicroPython/CircuitPython device or into a local directory.", ) uninstall_parser = subparsers.add_parser("uninstall", help="Uninstall packages.") list_parser = subparsers.add_parser("list", help="List installed packages.") show_parser = subparsers.add_parser( "show", help="Show information about one or more installed packages." ) freeze_parser = subparsers.add_parser( "freeze", help="Output installed packages in requirements format." ) _check_parser = subparsers.add_parser( "check", help="Verify installed packages have compatible dependencies." ) download_parser = subparsers.add_parser("download", help="Download packages.") wheel_parser = subparsers.add_parser( "wheel", help="Build Wheel archives for your requirements and dependencies." ) cache_parser = subparsers.add_parser("cache", help="Inspect and manage pipkin cache.") # common options for parser in [install_parser, download_parser, wheel_parser]: parser.add_argument( "specs", help="Package specification, eg. 'micropython-os' or 'micropython-os>=0.6'", nargs="*", metavar="", ) specs_group = parser.add_argument_group(title="package selection") specs_group.add_argument( "-r", "--requirement", help="Install from the given requirements file.", nargs="*", dest="requirement_files", metavar="", default=[], ) specs_group.add_argument( "-c", "--constraint", help="Constrain versions using the given constraints file.", nargs="*", dest="constraint_files", metavar="", default=[], ) specs_group.add_argument( "--no-deps", help="Don't install package dependencies.", action="store_true", ) specs_group.add_argument( "--pre", help="Include pre-release and development versions. By default, pipkin only finds stable versions.", action="store_true", ) # index-related for parser in [install_parser, download_parser, wheel_parser, list_parser]: index_group = parser.add_argument_group(title="index selection") index_group.add_argument( "-i", "--index-url", help="Base URL of the Python Package Index (default https://pypi.org/simple).", metavar="", ) index_group.add_argument( "--extra-index-url", help="Extra URLs of package indexes to use in addition to --index-url.", nargs="*", dest="extra_index_urls", default=[], metavar="", ) index_group.add_argument( "--no-index", help="Ignore package index (only looking at --find-links URLs instead).", action="store_true", ) index_group.add_argument( "--no-mp-org", help="Don't let micropython.org/pi override other indexes.", action="store_true", ) index_group.add_argument( "-f", "--find-links", help="If a URL or path to an html file, then parse for links to archives such as sdist " "(.tar.gz) or wheel (.whl) files. If a local path or " "file:// URL that's a directory, then look for archives in the directory listing.", metavar="", ) for parser in [uninstall_parser, show_parser]: parser.add_argument( "packages", help="Package name", nargs="*", metavar="", ) for parser in [list_parser, freeze_parser]: # parser.add_argument( # "--user", # help="Only output packages installed in user-site. Relevant with Unix and Windows ports", # action="store_true", # ) # parser.add_argument( # "--path", # help="Restrict to the specified installation path for listing packages.", # nargs="*", # dest="paths", # metavar="", # default=[], # ) parser.add_argument( "--exclude", help="Exclude specified package from the output.", nargs="*", dest="excludes", metavar="", default=[], ) # install_parser.add_argument( # "-t", # "--target", # help="Target directory in the target filesystem (eg. /lib)", # metavar="

", # ) # install_parser.add_argument( # "--user", # help="Install to the Python user install directory for target platform. " # "Only relevant with Unix and Windows ports", # action="store_true", # ) install_parser.add_argument( "-U", "--upgrade", help="Upgrade all specified packages to the newest available version. " "The handling of dependencies depends on the upgrade-strategy used.", action="store_true", ) install_parser.add_argument( "--upgrade-strategy", help="Determines how dependency upgrading should be handled [default: only-if-needed].\n" "'eager' - dependencies are upgraded regardless of whether the currently installed " "version satisfies the requirements of the upgraded package(s).\n" "'only-if-needed' - are upgraded only when they do not satisfy the requirements of the " "upgraded package(s).", choices=["only-if-needed", "eager"], default="only-if-needed", metavar="", ) install_parser.add_argument( "--force-reinstall", help="Reinstall all packages even if they are already up-to-date.", action="store_true", ) install_parser.add_argument( "--compile", help="Compile and install mpy files.", action="store_true", ) uninstall_parser.add_argument( "-r", "--requirement", help="Uninstall all the packages listed in the given requirements file.", nargs="*", dest="requirement_files", metavar="", default=[], ) uninstall_parser.add_argument( "-y", "--yes", help="Don't ask for confirmation of uninstall deletions.", action="store_true", ) list_parser.add_argument( "-o", "--outdated", help="List outdated packages", action="store_true", ) list_parser.add_argument( "-u", "--uptodate", help="List uptodate packages", action="store_true", ) list_parser.add_argument( "--pre", help="Also consider pre-release and development versions when deciding whether package is outdated or uptodate.", action="store_true", ) list_parser.add_argument( "--not-required", help="List packages that are not dependencies of installed packages.", action="store_true", ) list_parser.add_argument( "--format", help="Select the output format among: columns (default), freeze, or json", choices=["columns", "freeze", "json"], default="columns", metavar="", ) download_parser.add_argument( "-d", "--dest", help="Download packages into . Default: current directory.", default=".", metavar="", ) wheel_parser.add_argument( "-w", "--wheel-dir", help="Build wheels into , where the default is the current working directory.", default=".", metavar="", ) cache_parser.add_argument("cache_command", choices=["dir", "info", "list", "purge"]) args = main_parser.parse_args(args=raw_args) # print("ARGS", args) return args ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/proxy.py0000644000076600000240000006244114730022736022603 0ustar00aivarannamaastaff""" MIT License Copyright (c) 2022 Aivar Annamaa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import copy import email.parser import errno import hashlib import io import json import logging import os.path import shlex import socket import subprocess import sys import tarfile import tempfile import textwrap import threading import zipfile from abc import ABC, abstractmethod from html.parser import HTMLParser from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import BaseServer from textwrap import dedent from typing import Any, Dict, List, Optional, Tuple, Union from urllib.error import HTTPError from urllib.request import urlopen from pkg_resources import safe_name, safe_version from pipkin.util import ( create_dist_info_version_name, custom_normalize_dist_name, parse_dist_file_name, ) MP_ORG_INDEX_V1 = "https://micropython.org/pi" MP_ORG_INDEX_V2 = "https://micropython.org/pi/v2" PYPI_SIMPLE_INDEX = "https://pypi.org/simple" SERVER_ENCODING = "utf-8" # https://github.com/adafruit/circuitpython-build-tools/blob/de44a709f6287d2759df14c89707f2d8f5a026f5/circuitpython_build_tools/scripts/build_bundles.py#L42 NORMALIZED_IRRELEVANT_PACKAGE_NAMES = { "adafruit_blinka", "adafruit_blinka_bleio", "adafruit_blinka_displayio", "adafruit_blinka_pyportal", "adafruit_python_extended_bus", "numpy", "pillow", "pyasin1", "pyserial", "scipy", } # For efficient caching it's better if the proxy always runs at the same port PREFERRED_PORT = 36628 logger = logging.getLogger(__name__) def shlex_join(split_command): """Return a shell-escaped string from *split_command*.""" return " ".join(shlex.quote(arg) for arg in split_command) class SimpleUrlsParser(HTMLParser): def error(self, message): pass def __init__(self): self._current_tag: str = "" self._current_attrs: List[Tuple[str, str]] = [] self.file_urls: Dict[str, str] = {} super().__init__() def handle_starttag(self, tag: str, attrs: List[Tuple[str, str]]) -> None: self._current_tag = tag self._current_attrs = attrs def handle_data(self, data: str) -> None: if self._current_tag == "a": for att, val in self._current_attrs: if att == "href": self.file_urls[data] = val def handle_endtag(self, tag): pass class BaseIndexDownloader(ABC): def __init__(self, index_url: str): self._index_url = index_url.rstrip("/") @abstractmethod def get_dist_file_names(self, dist_name: str) -> Optional[List[str]]: raise NotImplementedError() @abstractmethod def get_file_content(self, dist_name: str, file_name: str) -> bytes: raise NotImplementedError() class RegularIndexDownloader(BaseIndexDownloader, ABC): def __init__(self, index_url: str): super().__init__(index_url) self._dist_urls_cache: Dict[str, Dict[str, str]] = {} def get_dist_file_names(self, dist_name: str) -> Optional[List[str]]: urls = self._get_dist_urls(dist_name) if urls is None: return None return list(urls.keys()) def get_file_content(self, dist_name: str, file_name: str) -> bytes: if self._should_return_dummy(dist_name): return create_dummy_dist(dist_name, file_name) else: original_bytes = self._download_file(dist_name, file_name) return self._tweak_file(dist_name, file_name, original_bytes) def _get_dist_urls(self, dist_name: str) -> Optional[Dict[str, str]]: """ Returns file names and url-s for constructing the dist index page. """ if dist_name not in self._dist_urls_cache: self._dist_urls_cache[dist_name] = self._download_file_urls(dist_name) return self._dist_urls_cache[dist_name] @abstractmethod def _download_file_urls(self, dist_name) -> Optional[Dict[str, str]]: raise NotImplementedError() def _download_file(self, dist_name: str, file_name: str) -> bytes: urls = self._get_dist_urls(dist_name) assert urls assert file_name in urls url = urls[file_name] logger.debug("Downloading file from %s", url) with urlopen(url) as result: logger.debug("Headers: %r", result.headers.items()) return result.read() def _tweak_file(self, dist_name: str, file_name: str, original_bytes: bytes) -> bytes: if not file_name.lower().endswith(".tar.gz"): return original_bytes # In case of upip packages (tar.gz-s without setup.py) reverse following process: # https://github.com/micropython/micropython-lib/commit/3a6ab0b in_tar = tarfile.open(fileobj=io.BytesIO(original_bytes), mode="r:gz") out_buffer = io.BytesIO() out_tar = tarfile.open(fileobj=out_buffer, mode="w:gz") wrapper_dir = None py_modules = [] packages = [] metadata_bytes = None requirements = [] egg_info_path = None for info in in_tar: logger.debug("Processing %r (name:%r, isfile:%r)", info, info.name, info.isfile()) out_info = copy.copy(info) if info.isdir(): content = None else: with in_tar.extractfile(info) as f: content = f.read() if "/" in info.name: wrapper_dir, rel_name = info.name.split("/", maxsplit=1) else: assert info.isdir() wrapper_dir, rel_name = info.name, "" assert custom_normalize_dist_name(wrapper_dir).startswith( custom_normalize_dist_name(dist_name) ) rel_name = rel_name.strip("/") rel_segments = rel_name.split("/") # collect information about the original tar if rel_name == "setup.py": logger.debug("The archive contains setup.py. No tweaks needed") return original_bytes elif ".egg-info" in rel_name: if rel_name.endswith(".egg-info/PKG-INFO"): egg_info_path = rel_name[: -len("/PKG-INFO")] metadata_bytes = content elif rel_name.endswith(".egg-info/requires.txt"): requirements = content.decode("utf-8").strip().splitlines() elif len(rel_segments) == 1: # toplevel item outside of egg-info if info.isfile() and rel_name.endswith(".py"): # toplevel module module_name = rel_name[: -len(".py")] py_modules.append(module_name) else: if info.isdir(): # Assuming all toplevel directories represent packages. packages.append(rel_name) else: # Assuming an item inside a subdirectory. # If it's a py, it will be included together with containing package, # otherwise it will be picked up by package_data wildcard expression. if rel_segments[0] not in packages: # directories may not have their own entry packages.append(rel_segments[0]) # all existing files and dirs need to be added without changing out_tar.addfile(out_info, io.BytesIO(content)) assert wrapper_dir assert metadata_bytes logger.debug("%s is optimized for upip. Re-constructing missing files", file_name) logger.debug("py_modules: %r", py_modules) logger.debug("packages: %r", packages) logger.debug("requirements: %r", requirements) metadata = self._parse_metadata(metadata_bytes) logger.debug("metadata: %r", metadata) setup_py = self._create_setup_py(metadata, py_modules, packages, requirements) logger.debug("setup.py: %s", setup_py) self._add_file_to_tar(wrapper_dir + "/setup.py", setup_py.encode("utf-8"), out_tar) self._add_file_to_tar(wrapper_dir + "/PKG-INFO", metadata_bytes, out_tar) self._add_file_to_tar( wrapper_dir + "/setup.cfg", b"""[egg_info] tag_build = tag_date = 0 """, out_tar, ) self._add_file_to_tar( wrapper_dir + "/" + egg_info_path + "/dependency_links.txt", b"\n", out_tar ) self._add_file_to_tar( wrapper_dir + "/" + egg_info_path + "/top_level.txt", ("\n".join(packages + py_modules) + "\n").encode("utf-8"), out_tar, ) # TODO: recreate SOURCES.txt and test with data files out_tar.close() out_bytes = out_buffer.getvalue() # with open("_temp.tar.gz", "wb") as fp: # fp.write(out_bytes) return out_bytes def _add_file_to_tar(self, name: str, content: bytes, tar: tarfile.TarFile) -> None: stream = io.BytesIO(content) info = tarfile.TarInfo(name=name) info.size = len(content) tar.addfile(info, stream) def _should_return_dummy(self, dist_name: str) -> bool: return custom_normalize_dist_name( dist_name ) in NORMALIZED_IRRELEVANT_PACKAGE_NAMES or custom_normalize_dist_name( dist_name ).startswith( "adafruit_blinka_" ) def _parse_metadata(self, metadata_bytes) -> Dict[str, str]: metadata = email.parser.Parser().parsestr(metadata_bytes.decode("utf-8")) return { key: metadata.get(key) for key in ( "Metadata-Version", "Name", "Version", "Summary", "Home-page", "Author", "Author-email", "License", ) } def _create_setup_py( self, metadata: Dict[str, str], py_modules: List[str], packages: List[str], requirements: List[str], ) -> str: src = dedent( """ from setuptools import setup setup ( """ ).lstrip() for src_key, target_key in [ ("Name", "name"), ("Version", "version"), ("Summary", "description"), ("Home-page", "url"), ("Author", "author"), ("Author-email", "author_email"), ("License", "license"), ]: if src_key in metadata: src += f" {target_key}={metadata[src_key]!r},\n" if requirements: src += f" install_requires={requirements!r},\n" if py_modules: src += f" py_modules={py_modules!r},\n" if packages: src += f" packages={packages!r},\n" # include all other files as package data src += " package_data={'*': ['*', '*/*', '*/*/*', '*/*/*/*', '*/*/*/*/*', '*/*/*/*/*/*', '*/*/*/*/*/*/*', '*/*/*/*/*/*/*/*']}\n" src += ")\n" return src class SimpleIndexDownloader(RegularIndexDownloader): def _download_file_urls(self, dist_name) -> Optional[Dict[str, str]]: url = f"{self._index_url}/{dist_name}" logger.info("Downloading file urls from simple index %s", url) try: with urlopen(url) as fp: parser = SimpleUrlsParser() parser.feed(fp.read().decode("utf-8")) return parser.file_urls except HTTPError as e: if e.code == 404: return None else: raise e class JsonIndexDownloader(RegularIndexDownloader): def _download_file_urls(self, dist_name) -> Optional[Dict[str, str]]: metadata_url = f"{self._index_url}/{dist_name}/json" logger.info("Downloading file urls from json index at %s", metadata_url) result = {} try: with urlopen(metadata_url) as fp: data = json.load(fp) releases = data["releases"] for ver in releases: for file in releases[ver]: file_url = file["url"] if "filename" in file: file_name = file["filename"] else: # micropython.org/pi doesn't have it file_name = file_url.split("/")[-1] # may be missing micropython prefix if not file_name.startswith(dist_name): # Let's hope version part doesn't contain dashes _, suffix = file_name.split("-") file_name = dist_name + "-" + suffix result[file_name] = file_url except HTTPError as e: if e.code == 404: return None else: raise e return result class MpOrgV1IndexDownloader(JsonIndexDownloader): def _download_file_urls(self, dist_name) -> Optional[Dict[str, str]]: if not custom_normalize_dist_name(dist_name).startswith("micropython_"): return None return super()._download_file_urls(dist_name) class MpOrgV2IndexDownloader(BaseIndexDownloader): def __init__(self, index_url): self._packages = None super().__init__(index_url) def get_dist_file_names(self, dist_name: str) -> Optional[List[str]]: # there is no per-package, all-versions metadata resource. Need to use the global index meta = self._get_dist_metadata(dist_name) if meta is None: return None # Collect relationship between version and constructed file names so that I won't need to parse file name later. meta["original_versions_per_file_name"] = {} result = [] for version in meta["versions"]["py"]: file_name = create_dist_info_version_name(dist_name, version) + "-py3-none-any.whl" meta["original_versions_per_file_name"][file_name] = version result.append(file_name) return result def get_file_content(self, dist_name: str, file_name: str) -> bytes: dist_meta = self._get_dist_metadata(dist_name) original_name = dist_meta["name"] original_versions = dist_meta.get("original_versions_per_file_name", None) assert isinstance(original_versions, dict) original_version = original_versions.get(file_name, None) assert isinstance(original_version, str) version_meta_url = f"{self._index_url}/package/py/{original_name}/{original_version}.json" with urlopen(version_meta_url) as fp: version_meta = json.load(fp) return self._construct_wheel_content(dist_meta, version_meta) def _construct_wheel_content( self, dist_meta: Dict[str, Any], version_meta: Dict[str, Any] ) -> bytes: urls_per_wheel_path = {} for wheel_path, short_hash in version_meta.get("hashes", []): urls_per_wheel_path[ wheel_path ] = f"{self._index_url}/file/{short_hash[:2]}/{short_hash}" for wheel_path, url in version_meta.get("urls", []): urls_per_wheel_path[wheel_path] = url bytes_per_wheel_path = {} for wheel_path, url in urls_per_wheel_path.items(): with urlopen(url) as fp: bytes_per_wheel_path[wheel_path] = fp.read() # construct metadata files meta_dir_prefix = create_dist_info_version_name(dist_meta["name"], version_meta["version"]) meta_dir = f"{meta_dir_prefix}.dist-info" summary = dist_meta.get("description", "").replace("\r\n", "\n").replace("\n", " ") metadata = textwrap.dedent( f""" Metadata-Version: 2.1 Name: {safe_name(dist_meta["name"])} Version: {safe_version(version_meta["version"])} Summary: {summary} Author: {dist_meta.get("author", "")} License: {dist_meta.get("license", "")} """ ).lstrip() for dep_name, dep_version in version_meta.get("deps", []): metadata += f"Requires-Dist: {dep_name}" if dep_version and dep_version != "latest": metadata += " (" if dep_version[0] not in "<>=": metadata += "==" metadata += dep_version metadata += ")" metadata += "\n" bytes_per_wheel_path[f"{meta_dir}/METADATA"] = metadata.encode("utf-8") bytes_per_wheel_path[f"{meta_dir}/WHEEL"] = ( textwrap.dedent( """ Wheel-Version: 1.0 Generator: bdist_wheel (0.37.1) Root-Is-Purelib: true Tag: py3-none-any """ ) .lstrip() .encode("utf-8") ) record_lines = [] for wheel_path, content in bytes_per_wheel_path.items(): digest = hashlib.sha256(content).hexdigest() record_lines.append(f"{wheel_path},sha256={digest},{len(content)}") record_lines.append(f"{meta_dir}/RECORD,,") bytes_per_wheel_path[f"{meta_dir}/RECORD"] = ("\n".join(record_lines) + "\n").encode( "utf-8" ) zip_buffer = io.BytesIO() with zipfile.ZipFile( zip_buffer, mode="a", compression=zipfile.ZIP_DEFLATED, allowZip64=False ) as fp: for wheel_path, content in bytes_per_wheel_path.items(): fp.writestr(wheel_path, content) with open(os.path.expanduser("~/out.whl"), "wb") as fp: fp.write(zip_buffer.getvalue()) return zip_buffer.getvalue() def _get_dist_metadata(self, dist_name: str) -> Optional[Dict[Any, Any]]: if self._packages is None: with urlopen(MP_ORG_INDEX_V2 + "/index.json") as fp: self._packages = json.load(fp)["packages"] for package in self._packages: if custom_normalize_dist_name(package["name"]) == custom_normalize_dist_name(dist_name): return package return None class PipkinProxy(HTTPServer): def __init__( self, no_mp_org: bool, index_url: Optional[str], extra_index_urls: List[str], port: int ): self._downloaders: List[BaseIndexDownloader] = [] self._downloaders_by_dist_name: Dict[str, Optional[BaseIndexDownloader]] = {} if not no_mp_org: # V1 first, because it only considers packages with "micropython-"-prefix self._downloaders.append(MpOrgV1IndexDownloader(MP_ORG_INDEX_V1)) self._downloaders.append(MpOrgV2IndexDownloader(MP_ORG_INDEX_V2)) self._downloaders.append(SimpleIndexDownloader(index_url or PYPI_SIMPLE_INDEX)) for url in extra_index_urls: self._downloaders.append(SimpleIndexDownloader(url)) super().__init__(("127.0.0.1", port), PipkinProxyHandler) def get_downloader_for_dist(self, dist_name: str) -> Optional[BaseIndexDownloader]: if dist_name not in self._downloaders_by_dist_name: for downloader in self._downloaders: logger.debug("Checking if %s has %r", downloader, dist_name) file_names = downloader.get_dist_file_names(dist_name) if file_names is not None: logger.debug("Got %r file names", len(file_names)) self._downloaders_by_dist_name[dist_name] = downloader break else: logger.debug("Got None. Trying next downloader") else: self._downloaders_by_dist_name[dist_name] = None return self._downloaders_by_dist_name[dist_name] def get_index_url(self) -> str: return f"http://127.0.0.1:{self.server_port}" class PipkinProxyHandler(BaseHTTPRequestHandler): def __init__( self, request: Union[socket.socket, Tuple[bytes, socket.socket]], client_address: Tuple[str, int], server: BaseServer, ): logger.debug("Creating new handler") assert isinstance(server, PipkinProxy) self.proxy: PipkinProxy = server super().__init__(request, client_address, server) def do_GET(self) -> None: path = self.path.strip("/") logger.debug("do_GET for %s", path) if "/" in path: assert path.count("/") == 1 self._serve_file(*path.split("/")) else: self._serve_distribution_page(path) def _serve_distribution_page(self, dist_name: str) -> None: logger.debug("Serving index page for %s", dist_name) downloader = self.proxy.get_downloader_for_dist(dist_name) if downloader is None: self.send_response(404) self.end_headers() return # TODO: check https://discuss.python.org/t/community-testing-of-packaging-tools-against-non-warehouse-indexes/13442 file_names = downloader.get_dist_file_names(dist_name) # logger.debug("File urls: %r", file_names) self.send_response(200) self.send_header("Content-type", f"text/html; charset={SERVER_ENCODING}") self.send_header("Cache-Control", "max-age=600, public") self.end_headers() self.wfile.write("\n".encode(SERVER_ENCODING)) for file_name in file_names: self.wfile.write( f"{file_name}\n".encode(SERVER_ENCODING) ) self.wfile.write("".encode(SERVER_ENCODING)) def _serve_file(self, dist_name: str, file_name: str): logger.debug("Serving %s for %s", file_name, dist_name) downloader = self.proxy.get_downloader_for_dist(dist_name) assert downloader is not None file_content = downloader.get_file_content(dist_name, file_name) self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Cache-Control", "max-age=365000000, immutable, public") self.end_headers() block_size = 4096 for start_index in range(0, len(file_content), block_size): block = file_content[start_index : start_index + block_size] self.wfile.write(block) def start_proxy( no_mp_org: bool, index_url: Optional[str], extra_index_urls: List[str], ) -> PipkinProxy: port = PREFERRED_PORT if no_mp_org: # Use different port for different set of source indexes, otherwise # pip may use wrong cached wheel. port += 7 try: proxy = PipkinProxy(no_mp_org, index_url, extra_index_urls, port) except OSError as e: if e.errno == errno.EADDRINUSE: logger.warning("Port %s was in use. Letting OS choose.", port) proxy = PipkinProxy(no_mp_org, index_url, extra_index_urls, 0) else: raise e server_thread = threading.Thread(target=proxy.serve_forever) server_thread.start() return proxy def create_dummy_dist(dist_name: str, file_name: str) -> bytes: logger.info("Creating dummy content for %s", file_name) parsed_dist_name, version, suffix = parse_dist_file_name(file_name) assert custom_normalize_dist_name(dist_name) == custom_normalize_dist_name(parsed_dist_name) with tempfile.TemporaryDirectory(prefix="pipkin-proxy") as tmp: setup_py_path = os.path.join(tmp, "setup.py") with open(setup_py_path, "w", encoding="utf-8") as fp: fp.write( dedent( f""" from setuptools import setup setup( name={dist_name!r}, version={version!r}, description="Dummy package for satisfying formal requirements", long_description="?", url="?", author="?" ) """ ) ) if suffix == ".whl": setup_py_args = ["bdist_wheel"] elif suffix == ".zip": setup_py_args = ["sdist", "--formats=zip"] elif suffix == ".tar.gz": setup_py_args = ["sdist", "--formats=gztar"] else: raise AssertionError("Unexpected suffix " + suffix) args = [sys.executable, setup_py_path] + setup_py_args subprocess.check_call(args, executable=args[0], cwd=tmp, stdin=subprocess.DEVNULL) dist_dir = os.path.join(tmp, "dist") dist_files = os.listdir(dist_dir) assert len(dist_files) == 1 with open(os.path.join(dist_dir, dist_files[0]), "rb") as bfp: return bfp.read() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1685699373.0 thonny-4.1.7/thonny/vendored_libs/pipkin/serial_connection.py0000644000076600000240000001470514436335455025130 0ustar00aivarannamaastaffimport pathlib import sys import threading import time from logging import getLogger from textwrap import dedent from .connection import MicroPythonConnection OUTPUT_ENQ = b"\x05" OUTPUT_ACK = b"\x06" NORMAL_PROMPT = b">>> " FIRST_RAW_PROMPT = b"raw REPL; CTRL-B to exit\r\n>" logger = getLogger(__name__) class SerialConnection(MicroPythonConnection): def __init__(self, port, baudrate=115200, dtr=None, rts=None, skip_reader=False): import serial from serial.serialutil import SerialException super().__init__() try: self._serial = serial.Serial( port=None, baudrate=baudrate, timeout=None, write_timeout=2, exclusive=True ) # Tweaking dtr and rts was proposed by # https://github.com/thonny/thonny/pull/1187 # but in some cases it messes up communication. # At the same time, in some cases it is required # https://github.com/thonny/thonny/issues/1462 # See also https://github.com/micropython/micropython/pull/10347 if dtr is not None: logger.debug("Setting DTR to %s", dtr) self._serial.dtr = dtr if rts is not None: logger.debug("Setting RTS to %s", rts) self._serial.rts = rts self._serial.port = port logger.debug("Opening serial port %s", port) self._serial.open() except SerialException as error: err_str = str(error) if "FileNotFoundError" in err_str: err_str = "port not found" message = "Unable to connect to " + port + ": " + err_str # TODO: check if these error codes also apply to Linux and Mac if error.errno == 13 and sys.platform == "linux": try: group = pathlib.Path(self._serial.port).group() except Exception: logger.warning("Could not query group for '%s'", self._serial.port) group = "dialoutfb" # TODO: check if user already has this group message += "\n\n" + dedent( """\ Try adding yourself to the '{group}' group: > sudo usermod -a -G {group} (NB! You may need to reboot your system after this!)""".format( group=group ) ) elif "PermissionError" in message or "Could not exclusively lock" in message: message += "\n\n" + dedent( """\ If you have serial connection to the device from another program, then disconnect it there first.""" ) elif error.errno == 16: message += "\n\n" + "Try restarting the device." raise ConnectionRefusedError(message) from error if skip_reader: self._reading_thread = None else: self._reading_thread = threading.Thread(target=self._listen_serial, daemon=True) self._reading_thread.start() def write(self, data: bytes) -> int: size = self._serial.write(data) # print(data.decode(), end="") assert size == len(data) return len(data) def _listen_serial(self): "NB! works in background thread" try: data = b"" while not self._reader_stopped: data += self._serial.read(1) # To avoid busy loop if len(data) == 0: self._error = "EOF" # print("LISTEN EOFFFFFFFFFF") break data += self._serial.read_all() # logger.debug("GOT %r", data) if data.endswith(OUTPUT_ENQ) and self.text_mode: # Flow control. logger.debug("Read ENQ, responding with ACK") # Assuming connection is idle and it is safe to write in this thread self._serial.write(OUTPUT_ACK) self._serial.flush() data = data[:-1] continue # don't publish incomplete utf-8 data try: if self.text_mode: data.decode("utf-8") # testing if data decodes to_be_published = data data = b"" except UnicodeDecodeError as e: if e.start == 0: # Invalid start byte, ie. we have missed first byte(s) of the codepoint. # No use of waiting, output everything to_be_published = data data = b"" else: to_be_published = data[: e.start] data = data[e.start :] if to_be_published: self._make_output_available(to_be_published) except Exception as e: self._error = str(e) def incoming_is_empty(self): return self._serial.in_waiting == 0 and super().incoming_is_empty() def outgoing_is_empty(self): return self._serial.out_waiting == 0 def close(self): if self._serial is not None: try: self._serial.cancel_read() if self._reading_thread: self._reading_thread.join() finally: try: self._serial.close() self._serial = None except Exception: logger.exception("Couldn't close serial") class DifficultSerialConnection(SerialConnection): """For hardening the communication protocol""" def _make_output_available(self, data, block=True): # output prompts in parts if FIRST_RAW_PROMPT in data or NORMAL_PROMPT in data: if FIRST_RAW_PROMPT in data: start = data.find(FIRST_RAW_PROMPT) end = start + len(FIRST_RAW_PROMPT) else: start = data.find(NORMAL_PROMPT) end = start + len(NORMAL_PROMPT) super()._make_output_available(data[: start + 1], block=block) time.sleep(0.1) super()._make_output_available(data[start + 1 : end - 1], block=block) time.sleep(0.1) super()._make_output_available(data[end - 1 :], block=block) else: super()._make_output_available(data, block=block) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/session.py0000644000076600000240000006625314730022736023112 0ustar00aivarannamaastaffimport hashlib import json import os.path import platform import shlex import shutil import stat import subprocess import sys import urllib.request from dataclasses import dataclass from logging import getLogger from typing import Dict, List, Optional, Set, Tuple from urllib.request import urlopen import filelock from filelock import BaseFileLock, FileLock from pipkin.adapters import Adapter from pipkin.common import UserError from pipkin.proxy import start_proxy from pipkin.util import ( get_base_executable, get_user_cache_dir, get_venv_executable, get_venv_site_packages_path, parse_meta_dir_name, ) logger = getLogger(__name__) INITIAL_VENV_DISTS = ["pip", "setuptools", "pkg_resources", "wheel"] INITIAL_VENV_FILES = ["easy_install.py"] META_ENCODING = "utf-8" @dataclass(frozen=True) class DistInfo: key: str project_name: str version: str location: str class Session: """ Allows performing several commands in row without releasing the venv. """ def __init__(self, adapter: Adapter, tty: bool = True): self._adapter = adapter self._venv_lock: Optional[BaseFileLock] = None self._venv_dir: Optional[str] = None self._quiet = False self._tty = tty def install( self, specs: Optional[List[str]] = None, requirement_files: Optional[List[str]] = None, constraint_files: Optional[List[str]] = None, pre: bool = False, no_deps: bool = False, no_mp_org: bool = False, index_url: Optional[str] = None, extra_index_urls: Optional[List[str]] = None, no_index: bool = False, find_links: Optional[str] = None, target: Optional[str] = None, user: bool = False, upgrade: bool = False, upgrade_strategy: str = "only-if-needed", force_reinstall: bool = False, compile: Optional[bool] = None, mpy_cross: Optional[str] = None, **_, ): logger.debug("Starting install") if compile is None and mpy_cross: compile = True args = ["install", "--no-compile", "--use-pep517"] if upgrade: args.append("--upgrade") if upgrade_strategy: args += ["--upgrade-strategy", upgrade_strategy] if force_reinstall: args.append("--force-reinstall") args += self._format_selection_args( specs=specs, requirement_files=requirement_files, constraint_files=constraint_files, pre=pre, no_deps=no_deps, ) self._populate_venv() state_before = self._get_venv_state() self._invoke_pip_with_index_args( args, no_mp_org=no_mp_org, index_url=index_url, extra_index_urls=extra_index_urls or [], no_index=no_index, find_links=find_links, ) state_after = self._get_venv_state() removed_meta_dirs = {name for name in state_before if name not in state_after} # removed meta dirs are expected when upgrading for meta_dir_name in removed_meta_dirs: self._report_progress(f"Removing {parse_meta_dir_name(meta_dir_name)[0]}") dist_name, _version = parse_meta_dir_name(meta_dir_name) self._adapter.remove_dist(dist_name) new_meta_dirs = {name for name in state_after if name not in state_before} changed_meta_dirs = { name for name in state_after if name in state_before and state_after[name] != state_before[name] } if new_meta_dirs or changed_meta_dirs: self._report_progress("Starting to apply changes to the target.") if target: effective_target = target elif user: effective_target = self._adapter.get_user_packages_path() else: effective_target = self._adapter.get_default_target() for meta_dir in changed_meta_dirs: self._report_progress(f"Removing old version of {parse_meta_dir_name(meta_dir)[0]}") # if target is specified by --target or --user, then don't touch anything # besides corresponding directory, regardless of the sys.path and possible hiding dist_name, _version = parse_meta_dir_name(meta_dir) if target: # pip doesn't remove old dist with --target unless --upgrade is given if upgrade: self._adapter.remove_dist(dist_name=dist_name, target=target) elif user: self._adapter.remove_dist( dist_name=dist_name, target=self._adapter.get_user_packages_path() ) else: # remove the all installations of this dist, which would hide the new installation self._adapter.remove_dist( dist_name=dist_name, target=effective_target, above_target=True ) for meta_dir in new_meta_dirs | changed_meta_dirs: self._upload_dist_by_meta_dir(meta_dir, effective_target, compile, mpy_cross) if new_meta_dirs or changed_meta_dirs: self._report_progress("All changes applied.") def uninstall( self, packages: Optional[List[str]] = None, requirement_files: Optional[List[str]] = None, yes: bool = False, **_, ): args = ["uninstall", "--yes"] for rf in requirement_files or []: args += ["-r", rf] for package in packages or []: args.append(package) self._populate_venv() state_before = self._get_venv_state() self._invoke_pip(args) state_after = self._get_venv_state() removed_meta_dirs = {name for name in state_before if name not in state_after} if removed_meta_dirs: # NB! If you want to move confirmation back to pip process, then test the process # in Windows via Thonny if not yes: names = [parse_meta_dir_name(d)[0] for d in removed_meta_dirs] if input(f"Proceed removing {', '.join(names)} (Y/n) at target? ").lower() == "n": return self._report_progress("Starting to apply changes to the target.") for meta_dir_name in removed_meta_dirs: self._report_progress(f"Removing {parse_meta_dir_name(meta_dir_name)[0]}") dist_name, _version = parse_meta_dir_name(meta_dir_name) self._adapter.remove_dist(dist_name) if removed_meta_dirs: self._report_progress("All changes applied.") def list( self, outdated: bool = False, uptodate: bool = False, not_required: bool = False, pre: bool = False, paths: Optional[List[str]] = None, user: bool = False, format: str = "columns", no_mp_org: Optional[bool] = False, index_url: Optional[str] = None, extra_index_urls: Optional[List[str]] = None, no_index: bool = False, find_links: Optional[str] = None, excludes: Optional[List[str]] = None, **_, ): args = ["list"] if outdated: args.append("--outdated") if uptodate: args.append("--uptodate") if not_required: args.append("--not-required") if pre: args.append("--pre") if format: args += ["--format", format] args += self._format_exclusion_args(excludes) self._populate_venv(paths=paths, user=user) self._invoke_pip_with_index_args( args, no_mp_org=no_mp_org, index_url=index_url, extra_index_urls=extra_index_urls, no_index=no_index, find_links=find_links, ) def basic_list(self) -> Set[DistInfo]: """ Allows listing without requiring the venv. """ dists_by_name = self._adapter.list_dists() result = set() for name in dists_by_name: meta_dir_name, location = dists_by_name[name] name, version = parse_meta_dir_name(meta_dir_name) result.add(DistInfo(key=name, project_name=name, version=version, location=location)) return result def show(self, packages: List[str], **_): self._populate_venv() self._invoke_pip(["show"] + packages) def freeze( self, paths: Optional[List[str]] = None, user: bool = False, excludes: Optional[List[str]] = None, **_, ): args = ["freeze"] args += self._format_exclusion_args(excludes) self._populate_venv(paths=paths, user=user) self._invoke_pip(args) def check(self, **_): self._populate_venv() self._invoke_pip(["check"]) def download( self, specs: Optional[List[str]] = None, requirement_files: Optional[List[str]] = None, constraint_files: Optional[List[str]] = None, pre: bool = False, no_deps: bool = False, no_mp_org: bool = False, index_url: Optional[str] = None, extra_index_urls: Optional[List[str]] = None, no_index: bool = False, find_links: Optional[str] = None, dest: Optional[str] = None, **_, ): args = ["download"] if dest: args += ["--dest", dest] args += self._format_selection_args( specs=specs, requirement_files=requirement_files, constraint_files=constraint_files, pre=pre, no_deps=no_deps, ) self._populate_venv() self._invoke_pip_with_index_args( args, no_mp_org=no_mp_org, index_url=index_url, extra_index_urls=extra_index_urls, no_index=no_index, find_links=find_links, ) def wheel( self, specs: Optional[List[str]] = None, requirement_files: Optional[List[str]] = None, constraint_files: Optional[List[str]] = None, pre: bool = False, no_deps: bool = False, no_mp_org: bool = False, index_url: Optional[str] = None, extra_index_urls: Optional[List[str]] = None, no_index: bool = False, find_links: Optional[str] = None, wheel_dir: Optional[str] = None, **_, ): args = ["wheel"] if wheel_dir: args += ["--wheel-dir", wheel_dir] args += self._format_selection_args( specs=specs, requirement_files=requirement_files, constraint_files=constraint_files, pre=pre, no_deps=no_deps, ) self._populate_venv() self._invoke_pip_with_index_args( args, no_mp_org=no_mp_org, index_url=index_url, extra_index_urls=extra_index_urls, no_index=no_index, find_links=find_links, ) def cache(self, cache_command: str, **_) -> None: if cache_command == "purge": if os.path.exists(self._get_pipkin_cache_dir()): shutil.rmtree(self._get_pipkin_cache_dir()) elif not os.path.exists(self._get_pipkin_cache_dir()): print(f"Cache dir ({self._get_pipkin_cache_dir()}) not created yet") elif cache_command == "dir": print(self._get_pipkin_cache_dir()) else: self._ensure_venv() self._invoke_pip(["cache", cache_command]) def close(self) -> None: if self._venv_lock is not None: # self._clear_venv() self._venv_lock.release() def _format_exclusion_args(self, excludes: Optional[List[str]]) -> List[str]: args = [] for exclude in (excludes or []) + ["pip", "pkg_resources", "setuptools", "wheel"]: args += ["--exclude", exclude] return args def _format_selection_args( self, specs: Optional[List[str]], requirement_files: Optional[List[str]], constraint_files: Optional[List[str]], pre: bool, no_deps: bool, ): args = [] for path in requirement_files or []: args += ["-r", path] for path in constraint_files or []: args += ["-c", path] if no_deps: args.append("--no-deps") if pre: args.append("--pre") args += specs or [] return args def _upload_dist_by_meta_dir( self, meta_dir_name: str, target: str, compile: bool, mpy_cross: Optional[str] ) -> None: self._report_progress(f"Copying {parse_meta_dir_name(meta_dir_name)[0]}", end="") rel_record_path = os.path.join(meta_dir_name, "RECORD") record_path = os.path.join(self._get_venv_site_packages_path(), rel_record_path) assert os.path.exists(record_path) target_record_lines = [] with open(record_path, encoding=META_ENCODING) as fp: record_lines = fp.read().splitlines() for line in record_lines: rel_path = line.split(",")[0] # don't consider files installed to e.g. bin-directory if rel_path.startswith(".."): continue # don't consider absolute paths if os.path.isabs(rel_path): logger.warning("Skipping absolute path %s", rel_path) continue # only consider METADATA from meta dir if rel_path.startswith(meta_dir_name) and os.path.basename(rel_path) != "METADATA": continue full_path = os.path.normpath( os.path.join(self._get_venv_site_packages_path(), rel_path) ) full_device_path = self._adapter.join_path(target, self._adapter.normpath(rel_path)) if full_path.endswith(".py") and compile: self._compile_with_mpy_cross( full_path, self._get_compiled_path(full_path), mpy_cross ) # forget about the .py file full_path = self._get_compiled_path(full_path) full_device_path = self._get_compiled_path(full_device_path) rel_path = self._get_compiled_path(rel_path) with open(full_path, "rb") as source_fp: content = source_fp.read() if rel_path.startswith(meta_dir_name) and os.path.basename(rel_path) == "METADATA": content = self._trim_metadata(content) self._adapter.write_file(full_device_path, content) self._report_progress(".", end="") target_record_lines.append(self._adapter.normpath(rel_path) + ",,") # add RECORD (without hashes) target_record_lines.append(self._adapter.normpath(rel_record_path) + ",,") full_device_record_path = self._adapter.join_path( target, self._adapter.normpath(rel_record_path) ) self._adapter.write_file( full_device_record_path, "\n".join(target_record_lines).encode(META_ENCODING) ) # add linebreak for the report self._report_progress("") def _trim_metadata(self, content: bytes) -> bytes: # TODO: return content def _get_compiled_path(self, source_path: str) -> str: assert source_path.endswith(".py"), f"Source path: {source_path}" return source_path[: -len(".py")] + ".mpy" def _ensure_venv(self) -> None: if self._venv_lock is not None: return self._venv_lock, self._venv_dir = self._prepare_venv() def _prepare_venv(self) -> Tuple[BaseFileLock, str]: path = self._compute_venv_path() if not os.path.exists(path): self._report_progress("Preparing working environment ...") logger.info("Start preparing working environment at %s ...", path) venv_cmd = [ sys.executable, "-I", "-m", "venv", path, ] subprocess.check_call( venv_cmd, executable=venv_cmd[0], stdin=subprocess.DEVNULL, ) logger.info("Done creating venv") assert os.path.exists(path) pip_cmd = [ get_venv_executable(path), "-I", "-m", "pip", "--disable-pip-version-check", "install", "--no-warn-script-location", "--upgrade", "pip==22.2.2", "setuptools==65.4.1", "wheel==0.38.4", ] subprocess.check_call( pip_cmd, executable=pip_cmd[0], stdin=subprocess.DEVNULL, ) self._patch_pip(path) logger.info("Done preparing working environment.") else: logger.debug("Using existing working environment at %s", path) lock = FileLock(os.path.join(path, "pipkin.lock")) try: lock.acquire(timeout=0.05) except filelock.Timeout: raise UserError( "Could not get exclusive access to the working environment. " "Is there another pipkin instance running?" ) logger.debug("Received lock on the working environment") return lock, path def _get_venv_site_packages_path(self) -> str: return get_venv_site_packages_path(self._venv_dir) def _patch_pip(self, venv_path: str) -> None: sp_cmd = [ get_venv_executable(venv_path), "-c", "import sysconfig; print(sysconfig.get_paths()['purelib'])", ] site_packages_path = subprocess.check_output( sp_cmd, executable=sp_cmd[0], stdin=subprocess.DEVNULL, universal_newlines=True, ).strip() pip_init_path = os.path.join(site_packages_path, "pip", "__init__.py") patch = """ import os import pip._vendor.packaging.markers import pip._vendor.distlib.markers ENV_VAR_PREFIX = "pip_marker_" def patch_context(context): for name in os.environ: if name.startswith(ENV_VAR_PREFIX): marker_name = name[len(ENV_VAR_PREFIX):] value = os.environ[name] context[marker_name] = value def patch_context_function(fun): def patched_context_function(): context = fun() patch_context(context) return context return patched_context_function pip._vendor.packaging.markers.default_environment = \ patch_context_function(pip._vendor.packaging.markers.default_environment) pip._vendor.distlib.markers.DEFAULT_CONTEXT = \ patch_context(pip._vendor.distlib.markers.DEFAULT_CONTEXT) """ logger.info("Patching %r", pip_init_path) with open(pip_init_path, "a", encoding="utf-8") as fp: fp.write(patch) def _clear_venv(self) -> None: sp_path = self._get_venv_site_packages_path() logger.debug("Clearing %s", sp_path) for name in os.listdir(sp_path): full_path = os.path.join(sp_path, name) if self._is_initial_venv_item(name): logger.debug("skipping %r", name) continue elif os.path.isfile(full_path): logger.debug("removing file %r", name) os.remove(full_path) else: logger.debug("removing directory %r", name) assert os.path.isdir(full_path) shutil.rmtree(full_path) def _populate_venv(self, paths: Optional[List[str]] = None, user: bool = False) -> None: """paths and user should be used only with list and freeze commands""" logger.debug("Start populating venv") self._ensure_venv() # TODO: try to re-use the state from the previous command executed in the same session. assert not (paths and user) if user: effective_paths = [self._adapter.get_user_packages_path()] else: effective_paths = paths self._clear_venv() dist_infos = self._adapter.list_dists(effective_paths) for name in dist_infos: meta_dir_name, original_path = dist_infos[name] self._prepare_dummy_dist(meta_dir_name, original_path) logger.debug("Done populating venv") def _prepare_dummy_dist(self, meta_dir_name: str, original_path: str) -> None: sp_path = self._get_venv_site_packages_path() meta_path = os.path.join(sp_path, meta_dir_name) os.mkdir(meta_path, 0o755) for name in ["METADATA"]: content = self._read_dist_meta_file(meta_dir_name, name, original_path) with open(os.path.join(meta_path, name), "bw") as meta_fp: meta_fp.write(content) # INSTALLER is mandatory according to https://www.python.org/dev/peps/pep-0376/ with open(os.path.join(meta_path, "INSTALLER"), "w", encoding="utf-8") as installer_fp: installer_fp.write("pip\n") # create dummy RECORD with open(os.path.join(meta_path, "RECORD"), "w", encoding=META_ENCODING) as record_fp: for name in ["METADATA", "INSTALLER", "RECORD"]: record_fp.write(f"{meta_dir_name}/{name},,\n") def _read_dist_meta_file( self, meta_dir_name: str, file_name: str, original_container_path: str ) -> bytes: # TODO: add cache path = self._adapter.join_path(original_container_path, meta_dir_name, file_name) return self._adapter.read_file(path) def _compute_venv_path(self) -> str: try: # try to share the pip-execution-venv among all pipkin-running-venvs created from # same base executable exe = get_base_executable() except Exception: exe = sys.executable venv_name = hashlib.md5(str((exe, sys.version_info[0:2])).encode("utf-8")).hexdigest() return os.path.join(self._get_workspaces_dir(), venv_name) def _get_workspaces_dir(self) -> str: return os.path.join(self._get_pipkin_cache_dir(), "workspaces") def _get_pipkin_cache_dir(self) -> str: result = os.path.join(get_user_cache_dir(), "pipkin") if sys.platform == "win32": # Windows doesn't have separate user cache dir result = os.path.join(result, "cache") return result def _is_initial_venv_item(self, name: str) -> bool: return ( name in INITIAL_VENV_FILES or name in INITIAL_VENV_DISTS or name.endswith(".dist-info") and name.split("-")[0] in INITIAL_VENV_DISTS ) def _get_venv_state(self, root: str = None) -> Dict[str, float]: """Returns mapping from meta_dir names to modification timestamps of METADATA files""" if root is None: root = self._get_venv_site_packages_path() result = {} for item_name in os.listdir(root): if self._is_initial_venv_item(item_name): continue if item_name.endswith(".dist-info"): metadata_full_path = os.path.join(root, item_name, "METADATA") assert os.path.exists(metadata_full_path) result[item_name] = os.stat(metadata_full_path).st_mtime return result def _invoke_pip_with_index_args( self, pip_args: List[str], no_mp_org: bool, index_url: str, extra_index_urls: List[str], no_index: bool, find_links: Optional[str], ): if no_index: assert find_links self._invoke_pip(pip_args + ["--no-index", "--find-links", find_links]) else: proxy = start_proxy(no_mp_org, index_url, extra_index_urls) logger.info("Using PipkinProxy at %s", proxy.get_index_url()) index_args = ["--index-url", proxy.get_index_url()] if find_links: index_args += ["--find-links", find_links] try: self._invoke_pip(pip_args + index_args) finally: proxy.shutdown() def _invoke_pip(self, args: List[str]) -> None: pip_cmd = [get_venv_executable(self._venv_dir), "-I", "-m", "pip"] if not self._tty: pip_cmd += ["--no-color"] pip_cmd += [ "--disable-pip-version-check", "--trusted-host", "127.0.0.1", ] + args logger.debug("Calling pip: %s", " ".join(shlex.quote(arg) for arg in pip_cmd)) env = {key: os.environ[key] for key in os.environ if not key.startswith("PIP_")} env["PIP_CACHE_DIR"] = self._get_pipkin_cache_dir() subprocess.check_call(pip_cmd, executable=pip_cmd[0], env=env, stdin=subprocess.DEVNULL) def _compile_with_mpy_cross( self, source_path: str, target_path: str, mpy_cross_path: Optional[str] ) -> None: if mpy_cross_path is None: mpy_cross_path = self._ensure_mpy_cross() # user-provided executable is assumed to have been validated with proper error messages in main() assert os.path.exists assert os.access(mpy_cross_path, os.X_OK) args = ( [mpy_cross_path] + self._adapter.get_mpy_cross_args() + ["-o", target_path, source_path] ) subprocess.check_call(args, executable=args[0], stdin=subprocess.DEVNULL) def _ensure_mpy_cross(self) -> str: impl_name, ver_prefix = self._adapter.get_implementation_name_and_version_prefix() path = self._get_mpy_cross_path(impl_name, ver_prefix) if not os.path.exists(path): self._download_mpy_cross(impl_name, ver_prefix, path) return path def _download_mpy_cross( self, implementation_name: str, version_prefix: str, target_path: str ) -> None: os.makedirs(os.path.dirname(target_path), exist_ok=True) meta_url = f"https://raw.githubusercontent.com/aivarannamaa/pipkin/master/data/{implementation_name}-mpy-cross.json" with urlopen(url=meta_url) as fp: meta = json.load(fp) if version_prefix not in meta: raise UserError(f"Can't find mpy-cross for {implementation_name} {version_prefix}") version_data = meta[version_prefix] if sys.platform == "win32": os_marker = "windows" elif sys.platform == "darwin": os_marker = "macos" elif sys.platform == "linux": os_marker = "linux" else: raise AssertionError(f"Unexpected sys.platform {sys.platform}") full_marker = f"{os_marker}-{platform.machine()}" if full_marker not in version_data: raise UserError( f"Can't find {full_marker} mpy-cross for {implementation_name} {version_prefix}" ) download_url = version_data[full_marker] urllib.request.urlretrieve(download_url, target_path) os.chmod(target_path, os.stat(target_path).st_mode | stat.S_IEXEC) def _get_mpy_cross_path(self, implementation_name: str, version_prefix: str) -> str: basename = f"mpy-cross_{implementation_name}_{version_prefix}" if sys.platform == "win32": basename += ".exe" return os.path.join(self._get_pipkin_cache_dir(), "mpy-cross", basename) def _report_progress(self, msg: str, end="\n") -> None: if not self._quiet: print(msg, end=end) sys.stdout.flush() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/vendored_libs/pipkin/util.py0000644000076600000240000001576414730022736022405 0ustar00aivarannamaastaffimport os.path import re import subprocess import sys from dataclasses import dataclass from logging import getLogger from typing import List, Optional, Set, Tuple import pkg_resources logger = getLogger(__name__) @dataclass class ParsedWheelFilename: project: str version: str build: Optional[str] python_tags: list[str] abi_tags: list[str] platform_tags: list[str] def parse_wheel_filename(filename: str) -> ParsedWheelFilename: # Adapted from https://github.com/jwodder/wheel-filename/blob/1568eb2f1726425588550067f09f5c0fde6c9652/src/wheel_filename/__init__.py PYTHON_TAG_RGX = r"[\w\d]+" ABI_TAG_RGX = r"[\w\d]+" PLATFORM_TAG_RGX = r"[\w\d]+" WHEEL_FILENAME_CRGX = re.compile( r"(?P[A-Za-z0-9](?:[A-Za-z0-9._]*[A-Za-z0-9])?)" r"-(?P[A-Za-z0-9_.!+]+)" r"(?:-(?P[0-9][\w\d.]*))?" r"-(?P{0}(?:\.{0})*)" r"-(?P{1}(?:\.{1})*)" r"-(?P{2}(?:\.{2})*)" r"\.[Ww][Hh][Ll]".format(PYTHON_TAG_RGX, ABI_TAG_RGX, PLATFORM_TAG_RGX) ) basename = os.path.basename(os.fsdecode(filename)) m = WHEEL_FILENAME_CRGX.fullmatch(basename) if not m: raise ValueError(f"Unexpected wheel filename {basename}") return ParsedWheelFilename( project=m.group("project"), version=m.group("version"), build=m.group("build"), python_tags=m.group("python_tags").split("."), abi_tags=m.group("abi_tags").split("."), platform_tags=m.group("platform_tags").split("."), ) def create_dist_info_version_name(dist_name: str, version: str) -> str: # https://packaging.python.org/en/latest/specifications/binary-distribution-format/#escaping-and-unicode # https://peps.python.org/pep-0440/ safe_name = pkg_resources.safe_name(dist_name).replace("-", "_") safe_version = pkg_resources.safe_version(version) return f"{safe_name}-{safe_version}" def get_windows_folder(ID: int) -> str: # http://stackoverflow.com/a/3859336/261181 # http://www.installmate.com/support/im9/using/symbols/functions/csidls.htm if sys.platform == "win32": import ctypes.wintypes SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(0, ID, 0, SHGFP_TYPE_CURRENT, buf) assert buf.value return buf.value else: raise AssertionError("Meant to be used only on Windows") def get_windows_roaming_appdata_dir() -> str: return get_windows_folder(26) def get_windows_local_appdata_dir() -> str: return get_windows_folder(28) def get_user_cache_dir() -> str: if sys.platform == "win32": return os.path.join(get_windows_local_appdata_dir()) elif sys.platform == "darwin": return os.path.expanduser("~/Library/Caches") else: return os.getenv("XDG_CACHE_HOME", os.path.expanduser("~/.cache")) def get_base_executable(): if sys.exec_prefix == sys.base_exec_prefix: return sys.executable if sys.platform == "win32": guess = sys.base_exec_prefix + "\\" + os.path.basename(sys.executable) if os.path.isfile(guess): return guess if os.path.islink(sys.executable): return os.path.realpath(sys.executable) raise RuntimeError("Don't know how to locate base executable") def get_venv_executable(path: str) -> str: if sys.platform == "win32": return os.path.join(path, "Scripts", "python.exe") else: return os.path.join(path, "bin", "python3") def get_venv_site_packages_path(venv_path: str) -> str: logger.debug("Querying site packages path for %s", venv_path) args = [ get_venv_executable(venv_path), "-c", "import site; print([p for p in site.getsitepackages() if 'site-packages' in p][0])", ] result = subprocess.check_output( args, executable=args[0], text=True, stdin=subprocess.DEVNULL, ).strip() assert result.startswith(venv_path) and result != venv_path logger.debug("Got site packages path %s", result) return result def parse_meta_dir_name(name: str) -> Tuple[str, str]: assert name.endswith(".dist-info") name, version = name[: -len(".dist-info")].split("-") return name, version def parse_dist_file_name(file_name: str) -> Tuple[str, str, str]: file_name = file_name.lower() if file_name.endswith(".whl"): pwf = parse_wheel_filename(file_name) return pwf.project, pwf.version, ".whl" for suffix in [".zip", ".tar.gz"]: if file_name.endswith(suffix): file_name = file_name[: -len(suffix)] break else: raise AssertionError("Unexpected file name " + file_name) # dist name and version is separated by the dash, but both parts can also contain dashes... if file_name.count("-") == 1: dist_name, version = file_name.split("-") else: # assuming dashes in the version part have digit on their left and letter on their right # let's get rid of these tweaked_file_name = re.sub(r"(\d)-([a-zA-Z])", r"\1_\2", file_name) # now let's treat the rightmost dash as separator dist_name = tweaked_file_name.rsplit("-", maxsplit=1)[0] version = file_name[len(dist_name) + 1 :] return dist_name, version, suffix def starts_with_continuation_byte(data: bytes) -> bool: return len(data) > 0 and is_continuation_byte(data[0]) def is_continuation_byte(byte: int) -> bool: return (byte & 0b11000000) == 0b10000000 def custom_normalize_dist_name(name: str) -> str: # https://peps.python.org/pep-0503/#normalized-names return pkg_resources.safe_name(name).lower().replace("-", "_").replace(".", "_") def list_volumes(skip_letters: Optional[Set[str]] = None) -> List[str]: skip_letters = skip_letters or set() "Adapted from https://github.com/ntoll/uflash/blob/master/uflash.py" if sys.platform == "win32": import ctypes # # In certain circumstances, volumes are allocated to USB # storage devices which cause a Windows popup to raise if their # volume contains no media. Wrapping the check in SetErrorMode # with SEM_FAILCRITICALERRORS (1) prevents this popup. # old_mode = ctypes.windll.kernel32.SetErrorMode(1) # @UndefinedVariable try: volumes = [] for disk in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": if disk in skip_letters: continue path = "{}:\\".format(disk) if os.path.exists(path): volumes.append(path) return volumes finally: ctypes.windll.kernel32.SetErrorMode(old_mode) # @UndefinedVariable else: # 'posix' means we're on Linux or OSX (Mac). # Call the unix "mount" command to list the mounted volumes. mount_output = subprocess.check_output(["mount"], stdin=subprocess.DEVNULL).splitlines() return [x.split()[2].decode("utf-8") for x in mount_output] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1685699373.0 thonny-4.1.7/thonny/vendored_libs/pipkin/webrepl_connection.py0000644000076600000240000001077014436335455025307 0ustar00aivarannamaastaffimport sys import threading from logging import DEBUG, getLogger from queue import Queue from .connection import MicroPythonConnection logger = getLogger(__name__) class WebReplConnection(MicroPythonConnection): """ Problem with block size: https://github.com/micropython/micropython/issues/2497 Start with conservative delay. Client may later reduce it for better efficiency """ def __init__(self, url, password, num_bytes_received=0): self.num_bytes_received = num_bytes_received super().__init__() try: import websockets # @UnusedImport except Exception: print( "Can't import `websockets`. You can install it via 'Tools => Manage plug-ins'.", file=sys.stderr, ) sys.exit(-1) self._url = url self._password = password self._write_responses: Queue = Queue() # Some tricks are needed to use async library in a sync program. # Using thread-safe queues to communicate with async world in another thread self._write_queue: Queue = Queue() self._connection_result: Queue = Queue() self._ws_thread = threading.Thread(target=self._wrap_ws_main, daemon=True) self._ws_thread.start() # Wait until connection was made res = self._connection_result.get() if res != "OK": raise res def _wrap_ws_main(self): import asyncio loop = asyncio.new_event_loop() if logger.isEnabledFor(DEBUG): loop.set_debug(True) loop.run_until_complete(self._ws_main()) async def _ws_main(self): import asyncio try: await self._ws_connect() except Exception as e: self._connection_result.put_nowait(e) return self._connection_result.put_nowait("OK") await asyncio.gather(self._ws_keep_reading(), self._ws_keep_writing()) async def _ws_connect(self): import websockets.exceptions try: try: self._ws = await websockets.connect(self._url, ping_interval=None) except websockets.exceptions.InvalidMessage: # try once more self._ws = await websockets.connect(self._url, ping_interval=None) except OSError as e: # print("\nCould not connect:", e, file=sys.stderr) raise ConnectionRefusedError(str(e)) from e logger.debug("GOT WS: %r", self._ws) # read password prompt and send password read_chars = "" logger.debug("Looking for password prompt") while read_chars != "Password: ": ch = await self._ws.recv() read_chars += ch logger.debug("Submitting password") await self._ws.send(self._password + "\n") async def _ws_keep_reading(self): import websockets.exceptions while not self._reader_stopped: try: data = await self._ws.recv() if isinstance(data, str): data = data.encode("UTF-8") if len(data) == 0: self._error = "EOF" break except websockets.exceptions.ConnectionClosedError: # TODO: try to reconnect in case of Ctrl+D self._error = "EOF" break self.num_bytes_received += len(data) self._make_output_available(data, block=False) async def _ws_keep_writing(self): import asyncio while True: while not self._write_queue.empty(): data = self._write_queue.get(block=False) if self.text_mode: payload = data.decode("UTF-8") else: payload = data await self._ws.send(payload) # logger.debug("Wrote %r bytes", len(data)) self._write_responses.put(len(data)) # Allow reading loop to progress await asyncio.sleep(0.01) def write(self, data: bytes) -> int: self._write_queue.put_nowait(data) return self._write_responses.get() async def _async_close(self): await self._ws.close() def close_and_return_new_connection(self): self.close() return WebReplConnection(self._url, self._password, self.num_bytes_received) def close(self): """ # TODO: import asyncio asyncio.get_event_loop().run_until_complete(self.async_close()) """ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.4011116 thonny-4.1.7/thonny/vendored_libs/serial/0000755000076600000240000000000014730055627021033 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1707061815.0 thonny-4.1.7/thonny/vendored_libs/serial/.DS_Store0000644000076600000240000001400414557731067022523 0ustar00aivarannamaastaffBud1  adedlg1S threadedlg1Scomp$gthreadedmoDDblob_طAthreadedmodDblob_طAthreadedph1Scomp0toolslg1ScomptoolsmoDDblob ٷAtoolsmodDblob ٷAtoolsph1Scomp urlhandlerlg1Scomp urlhandlermoDDblob $_طA urlhandlermodDblob $_طA urlhandlerph1Scomp  @ @ @ @ E DSDB ` @ @ @././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734361757.0 thonny-4.1.7/thonny/workbench.py0000644000076600000240000030142414730041235017263 0ustar00aivarannamaastaff# -*- coding: utf-8 -*- import ast import collections import importlib import os.path import pkgutil import platform import queue import re import shutil import socket import sys import tkinter as tk import tkinter.font as tk_font import traceback import webbrowser from logging import getLogger from threading import Thread from tkinter import messagebox, ttk from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, cast from warnings import warn import thonny from thonny import ( THONNY_USER_DIR, assistance, get_runner, get_shell, is_portable, languages, ui_utils, ) from thonny.common import Record, UserError, normpath_with_actual_case from thonny.config import try_load_configuration from thonny.config_ui import ConfigurationDialog from thonny.editors import EditorNotebook, is_local_path from thonny.languages import tr from thonny.misc_utils import ( copy_to_clipboard, get_menu_char, running_on_linux, running_on_mac_os, running_on_rpi, running_on_windows, ) from thonny.running import BackendProxy, Runner from thonny.shell import ShellView from thonny.ui_utils import ( AutomaticNotebook, AutomaticPanedWindow, caps_lock_is_on, create_action_label, create_tooltip, ems_to_pixels, get_hyperlink_cursor, get_style_configuration, lookup_style_option, register_latin_shortcut, select_sequence, sequence_to_accelerator, shift_is_pressed, ) logger = getLogger(__name__) SERVER_SUCCESS = "OK" SIMPLE_MODE_VIEWS = ["ShellView"] MenuItem = collections.namedtuple("MenuItem", ["group", "position_in_group", "tester"]) BackendSpec = collections.namedtuple( "BackendSpec", ["name", "proxy_class", "description", "config_page_constructor", "sort_key"] ) BasicUiThemeSettings = Dict[str, Dict[str, Union[Dict, Sequence]]] CompoundUiThemeSettings = List[BasicUiThemeSettings] UiThemeSettings = Union[BasicUiThemeSettings, CompoundUiThemeSettings] FlexibleUiThemeSettings = Union[UiThemeSettings, Callable[[], UiThemeSettings]] SyntaxThemeSettings = Dict[str, Dict[str, Union[str, int, bool]]] FlexibleSyntaxThemeSettings = Union[SyntaxThemeSettings, Callable[[], SyntaxThemeSettings]] OBSOLETE_PLUGINS = [ "thonnycontrib.pi", "thonnycontrib.micropython", "thonnycontrib.circuitpython", "thonnycontrib.microbit", "thonnycontrib.esp", "thonnycontrib.rpi_pico", ] class Workbench(tk.Tk): """ Thonny's main window and communication hub. Is responsible for: * creating the main window * maintaining layout (_init_containers) * loading plugins (_init_plugins, add_view, add_command) * providing references to main components (editor_notebook and runner) * communication between other components (see event_generate and bind) * configuration services (get_option, set_option, add_defaults) * loading translations * maintaining fonts (named fonts, increasing and decreasing font size) After workbench and plugins get loaded, 3 kinds of events start happening: * User events (keypresses, mouse clicks, menu selections, ...) * Virtual events (mostly via get_workbench().event_generate). These include: events reported via and dispatched by Tk event system; WorkbenchEvent-s, reported via and dispatched by enhanced get_workbench().event_generate. * Events from the background process (program output notifications, input requests, notifications about debugger's progress) """ def __init__(self) -> None: logger.info("Starting Workbench") thonny._workbench = self self.ready = False self._closing = False self._destroyed = False self._lost_focus = False self._is_portable = is_portable() self.initializing = True self._init_configuration() self._tweak_environment() self._check_init_server_loop() tk.Tk.__init__(self, className="Thonny") tk.Tk.report_callback_exception = self._on_tk_exception # type: ignore ui_utils.add_messagebox_parent_checker() self._event_handlers = {} # type: Dict[str, Set[Callable]] self._images = ( set() ) # type: Set[tk.PhotoImage] # keep images here to avoid Python garbage collecting them, self._default_image_mapping = ( {} ) # type: Dict[str, str] # to allow specify default alternative images self._image_mapping_by_theme = ( {} ) # type: Dict[str, Dict[str, str]] # theme-based alternative images self._current_theme_name = "clam" # will be overwritten later self._backends = {} # type: Dict[str, BackendSpec] self._commands = [] # type: List[Dict[str, Any]] self._toolbar_buttons = {} self._view_records = {} # type: Dict[str, Dict[str, Any]] self.content_inspector_classes = [] # type: List[Type] self._latin_shortcuts = {} # type: Dict[Tuple[int,int], List[Tuple[Callable, Callable]]] self._init_language() self._active_ui_mode = os.environ.get("THONNY_MODE", self.get_option("general.ui_mode")) self._init_scaling() self._init_theming() self._init_window() self.option_add("*Dialog.msg.wrapLength", "8i") self.add_view( ShellView, tr("Shell"), "s", visible_by_default=True, default_position_key="A" ) assistance.init() logger.info("Creating runner") self._runner = Runner() self._init_hooks() # Plugins may register hooks, so initialized them before to load plugins. logger.info("Start loading plugins") self._load_plugins() logger.info("Done loading plugins") self._editor_notebook = None # type: Optional[EditorNotebook] self._init_fonts() self.reload_themes() self._init_menu() self._init_containers() assert self._editor_notebook is not None self._init_program_arguments_frame() self._init_regular_mode_link() # TODO: self._show_views() # Make sure ShellView is loaded get_shell() self._init_commands() self._init_icon() try: self._editor_notebook.load_startup_files() except Exception: self.report_exception() self._editor_notebook.focus_set() logger.info("Opening views") self._try_action(self._open_views) self.bind_class("EditorCodeViewText", "<>", self.update_title, True) self.bind_class("EditorCodeViewText", "<>", self.update_title, True) self.bind_class("EditorCodeViewText", "<>", self.update_title, True) self.get_editor_notebook().bind("<>", self.update_title, True) self.get_editor_notebook().bind("<>", self._update_toolbar, True) self.bind_all("", self._on_all_key_presses, True) self.bind("", self._on_focus_out, True) self.bind("", self._on_focus_in, True) self.bind("BackendRestart", self._on_backend_restart, True) self._publish_commands() self.initializing = False self.event_generate("<>") self._make_sanity_checks() if self._is_server(): self._poll_ipc_requests() """ for name in sorted(sys.modules): if ( not name.startswith("_") and not name.startswith("thonny") and not name.startswith("tkinter") ): print(name) """ self.after(1, self._start_runner) # Show UI already before waiting for the backend to start self.after_idle(self.advertise_ready) def advertise_ready(self): self.ready = True self.event_generate("WorkbenchReady") self._editor_notebook.update_appearance() if self._configuration_manager.error_reading_existing_file: messagebox.showerror( "Problem", f"Previous configuration could not be read:\n\n" f"{self._configuration_manager.error_reading_existing_file}).\n\n" "Using default settings", master=self, ) def _make_sanity_checks(self): home_dir = os.path.expanduser("~") bad_home_msg = None if home_dir == "~": bad_home_msg = "Can not find your home directory." elif not os.path.exists(home_dir): bad_home_msg = "Reported home directory (%s) does not exist." % home_dir if bad_home_msg: messagebox.showwarning( "Problems with home directory", bad_home_msg + "\nThis may cause problems for Thonny.", master=self, ) def _try_action(self, action: Callable) -> None: try: action() except Exception: self.report_exception() def _init_configuration(self) -> None: self._configuration_manager = try_load_configuration(thonny.CONFIGURATION_FILE) self._configuration_pages = [] # type: List[Tuple[str, str, Type[tk.Widget], int]] self.set_default("general.single_instance", thonny.SINGLE_INSTANCE_DEFAULT) self.set_default("general.ui_mode", "simple" if running_on_rpi() else "regular") self.set_default("general.debug_mode", False) self.set_default("general.disable_notification_sound", False) self.set_default("general.scaling", "default") self.set_default("general.language", languages.BASE_LANGUAGE_CODE) self.set_default("general.font_scaling_mode", "default") self.set_default("general.environment", []) self.set_default("general.large_icon_rowheight_threshold", 32) self.set_default("file.avoid_zenity", False) self.set_default("run.working_directory", os.path.expanduser("~")) self.set_default( "general.data_url_prefix", "https://raw.githubusercontent.com/thonny/thonny/master/data" ) self.update_debug_mode() def get_data_url(self, file_name) -> str: return self.get_option("general.data_url_prefix") + "/" + file_name def _tweak_environment(self): for entry in self.get_option("general.environment"): if "=" in entry: key, val = entry.split("=", maxsplit=1) os.environ[key] = os.path.expandvars(val) else: logger.warning("No '=' in environment entry '%s'", entry) def update_debug_mode(self): os.environ["THONNY_DEBUG"] = str(self.get_option("general.debug_mode", False)) thonny.set_logging_level() def _init_language(self) -> None: """Initialize language.""" languages.set_language(self.get_option("general.language")) def _init_window(self) -> None: self.title("Thonny") self.set_default("layout.zoomed", False) self.set_default("layout.top", 50) self.set_default("layout.left", 150) if self.in_simple_mode(): self.set_default("layout.width", 1130) self.set_default("layout.height", 700) else: self.set_default("layout.width", 800) self.set_default("layout.height", 650) self.set_default("layout.w_width", 200) self.set_default("layout.e_width", 200) self.set_default("layout.s_height", 200) # I don't actually need saved options for Full screen/maximize view, # but it's easier to create menu items, if I use configuration manager's variables self.set_default("view.full_screen", False) self.set_default("view.maximize_view", False) # In order to avoid confusion set these settings to False # even if they were True when Thonny was last run self.set_option("view.full_screen", False) self.set_option("view.maximize_view", False) self.geometry( "{0}x{1}+{2}+{3}".format( min(max(self.get_option("layout.width"), 320), self.winfo_screenwidth()), min(max(self.get_option("layout.height"), 240), self.winfo_screenheight()), min(max(self.get_option("layout.left"), 0), self.winfo_screenwidth() - 200), min(max(self.get_option("layout.top"), 0), self.winfo_screenheight() - 200), ) ) if self.get_option("layout.zoomed"): ui_utils.set_zoomed(self, True) self.protocol("WM_DELETE_WINDOW", self._on_close) self.bind("", self._on_configure, True) def _init_icon(self) -> None: # Window icons if running_on_linux() and ui_utils.get_tk_version_info() >= (8, 6): self.iconphoto(True, self.get_image("thonny.png")) else: icon_file = os.path.join(self.get_package_dir(), "res", "thonny.ico") try: self.iconbitmap(icon_file, default=icon_file) except Exception: try: # seems to work in mac self.iconbitmap(icon_file) except Exception: pass def _init_menu(self) -> None: self.option_add("*tearOff", tk.FALSE) if lookup_style_option("Menubar", "custom", False): self._menubar = ui_utils.CustomMenubar( self ) # type: Union[tk.Menu, ui_utils.CustomMenubar] if self.get_ui_mode() != "simple": self._menubar.grid(row=0, sticky="nsew") else: opts = get_style_configuration("Menubar") if "custom" in opts: del opts["custom"] self._menubar = tk.Menu(self, **opts) if self.get_ui_mode() != "simple" or running_on_mac_os(): self["menu"] = self._menubar self._menus = {} # type: Dict[str, tk.Menu] self._menu_item_specs = ( {} ) # type: Dict[Tuple[str, str], MenuItem] # key is pair (menu_name, command_label) # create standard menus in correct order self.get_menu("file", tr("File")) self.get_menu("edit", tr("Edit")) self.get_menu("view", tr("View")) self.get_menu("run", tr("Run")) self.get_menu("tools", tr("Tools")) self.get_menu("help", tr("Help")) def _load_plugins(self) -> None: # built-in plugins import thonny.plugins # pylint: disable=redefined-outer-name self._load_plugins_from_path(thonny.plugins.__path__, "thonny.plugins.") # type: ignore # 3rd party plugins from namespace package # Now it's time to add plugins dir to sys path sys.path.append(thonny.get_sys_path_directory_containg_plugins()) try: import thonnycontrib # @UnresolvedImport except ImportError: # No 3rd party plugins installed pass else: self._load_plugins_from_path(thonnycontrib.__path__, "thonnycontrib.") def _load_plugins_from_path(self, path: List[str], prefix: str) -> None: load_function_name = "load_plugin" modules = [] for _, module_name, _ in sorted(pkgutil.iter_modules(path, prefix), key=lambda x: x[2]): if module_name in OBSOLETE_PLUGINS: logger.debug("Skipping plug-in %s", module_name) else: try: logger.debug("Importing %r", module_name) m = importlib.import_module(module_name) if hasattr(m, load_function_name): modules.append(m) except Exception: logger.exception("Failed loading plugin '" + module_name + "'") def module_sort_key(m): return getattr(m, "load_order_key", m.__name__) for m in sorted(modules, key=module_sort_key): logger.debug("Loading %r", m.__file__) getattr(m, load_function_name)() def _init_fonts(self) -> None: # set up editor and shell fonts self.set_default("view.io_font_family", "Courier" if running_on_mac_os() else "Courier New") default_editor_family = "Courier New" families = tk_font.families() for family in ["Consolas", "Ubuntu Mono", "Menlo", "DejaVu Sans Mono"]: if family in families: default_editor_family = family break self.set_default("view.editor_font_family", default_editor_family) if running_on_mac_os(): self.set_default("view.editor_font_size", 14) self.set_default("view.io_font_size", 12) elif self.in_simple_mode(): self.set_default("view.editor_font_size", 12) self.set_default("view.io_font_size", 12) else: self.set_default("view.editor_font_size", 13) self.set_default("view.io_font_size", 11) default_font = tk_font.nametofont("TkDefaultFont") if running_on_linux(): heading_font = tk_font.nametofont("TkHeadingFont") heading_font.configure(weight="normal") caption_font = tk_font.nametofont("TkCaptionFont") caption_font.configure(weight="normal", size=default_font.cget("size")) small_link_ratio = 0.8 if running_on_windows() else 0.7 self._fonts = [ tk_font.Font( name="SmallLinkFont", family=default_font.cget("family"), size=int(default_font.cget("size") * small_link_ratio), underline=True, ), tk_font.Font(name="IOFont", family=self.get_option("view.io_font_family")), tk_font.Font( name="BoldIOFont", family=self.get_option("view.io_font_family"), weight="bold" ), tk_font.Font( name="UnderlineIOFont", family=self.get_option("view.io_font_family"), underline=True, ), tk_font.Font( name="ItalicIOFont", family=self.get_option("view.io_font_family"), slant="italic" ), tk_font.Font( name="BoldItalicIOFont", family=self.get_option("view.io_font_family"), weight="bold", slant="italic", ), tk_font.Font(name="EditorFont", family=self.get_option("view.editor_font_family")), tk_font.Font(name="SmallEditorFont", family=self.get_option("view.editor_font_family")), tk_font.Font( name="BoldEditorFont", family=self.get_option("view.editor_font_family"), weight="bold", ), tk_font.Font( name="ItalicEditorFont", family=self.get_option("view.editor_font_family"), slant="italic", ), tk_font.Font( name="BoldItalicEditorFont", family=self.get_option("view.editor_font_family"), weight="bold", slant="italic", ), tk_font.Font( name="BoldTkDefaultFont", family=default_font.cget("family"), size=default_font.cget("size"), weight="bold", ), tk_font.Font( name="ItalicTkDefaultFont", family=default_font.cget("family"), size=default_font.cget("size"), slant="italic", ), tk_font.Font( name="UnderlineTkDefaultFont", family=default_font.cget("family"), size=default_font.cget("size"), underline=1, ), ] self.update_fonts() def _start_runner(self) -> None: try: self.update_idletasks() # allow UI to complete thonny._runner = self._runner self._runner.start() self._update_toolbar() except Exception: self.report_exception("Error when initializing backend") def _check_init_server_loop(self) -> None: """Socket will listen requests from newer Thonny instances, which try to delegate opening files to older instance""" if not self.get_option("general.single_instance") or os.path.exists( thonny.get_ipc_file_path() ): self._ipc_requests = None return self._ipc_requests = queue.Queue() # type: queue.Queue[bytes] server_socket, actual_secret = self._create_server_socket() server_socket.listen(10) def server_loop(): while True: logger.debug("Waiting for next client") (client_socket, _) = server_socket.accept() try: data = bytes() while True: new_data = client_socket.recv(1024) if len(new_data) > 0: data += new_data else: break proposed_secret, args = ast.literal_eval(data.decode("UTF-8")) if proposed_secret == actual_secret: self._ipc_requests.put(args) # respond OK client_socket.sendall(SERVER_SUCCESS.encode(encoding="utf-8")) client_socket.shutdown(socket.SHUT_WR) logger.debug("AFTER NEW REQUEST %s", client_socket) else: client_socket.shutdown(socket.SHUT_WR) raise PermissionError("Wrong secret") except Exception as e: logger.exception("Error in ipc server loop", exc_info=e) Thread(target=server_loop, daemon=True).start() def _create_server_socket(self): if running_on_windows(): server_socket = socket.socket(socket.AF_INET) # @UndefinedVariable server_socket.bind(("127.0.0.1", 0)) # advertise the port and secret port = server_socket.getsockname()[1] import uuid secret = str(uuid.uuid4()) with open(thonny.get_ipc_file_path(), "w") as fp: fp.write(str(port) + "\n") fp.write(secret + "\n") else: server_socket = socket.socket(socket.AF_UNIX) # @UndefinedVariable server_socket.bind(thonny.get_ipc_file_path()) secret = "" os.chmod(thonny.get_ipc_file_path(), 0o600) return server_socket, secret def _init_commands(self) -> None: self.add_command( "exit", "file", tr("Exit"), self._on_close, default_sequence=select_sequence("", "", ""), extra_sequences=[""] if running_on_linux() else [""] if running_on_windows() else [], ) self.add_command("show_options", "tools", tr("Options..."), self.show_options, group=180) self.createcommand("::tk::mac::ShowPreferences", self.show_options) self.createcommand("::tk::mac::Quit", self._mac_quit) self.add_command( "increase_font_size", "view", tr("Increase font size"), lambda: self._change_font_size(1), default_sequence=select_sequence("", ""), extra_sequences=[""], group=60, ) self.add_command( "decrease_font_size", "view", tr("Decrease font size"), lambda: self._change_font_size(-1), default_sequence=select_sequence("", ""), extra_sequences=[""], group=60, ) self.bind("", self._cmd_zoom_with_mouse, True) self.add_command( "focus_editor", "view", tr("Focus editor"), self._cmd_focus_editor, default_sequence=select_sequence("", ""), group=70, ) self.add_command( "focus_shell", "view", tr("Focus shell"), self._cmd_focus_shell, default_sequence=select_sequence("", ""), group=70, ) if self.get_ui_mode() == "expert": self.add_command( "toggle_maximize_view", "view", tr("Maximize view"), self._cmd_toggle_maximize_view, flag_name="view.maximize_view", default_sequence=None, group=80, ) self.bind_class("TNotebook", "", self._maximize_view, True) self.bind("", self._unmaximize_view, True) self.add_command( "toggle_maximize_view", "view", tr("Full screen"), self._cmd_toggle_full_screen, flag_name="view.full_screen", default_sequence=select_sequence("", ""), group=80, ) if self.in_simple_mode(): self.add_command( "font", "tools", tr("Change font size"), caption=tr("Zoom"), handler=self._toggle_font_size, image="zoom", include_in_toolbar=True, ) self.add_command( "quit", "help", tr("Exit Thonny"), self._on_close, image="quit", caption=tr("Quit"), include_in_toolbar=True, group=101, ) self.add_command( "SupportUkraine", "help", tr("Support Ukraine"), self._support_ukraine, image="Ukraine", caption=tr("Support"), include_in_toolbar=True, group=101, ) if thonny.in_debug_mode(): self.bind_all("", self._print_state_for_debugging, True) def _print_state_for_debugging(self, event) -> None: print(get_runner()._postponed_commands) def _init_containers(self) -> None: margin = ems_to_pixels(0.6) # Main frame functions as # - a background behind padding of main_pw, without this OS X leaves white border # - a container to be hidden, when a view is maximized and restored when view is back home main_frame = ttk.Frame(self) # self._main_frame = main_frame main_frame.grid(row=1, column=0, sticky=tk.NSEW) self.columnconfigure(0, weight=1) self.rowconfigure(1, weight=1) self._maximized_view = None # type: Optional[tk.Widget] self._toolbar = ttk.Frame(main_frame, padding=0) self._toolbar.grid( column=0, row=0, sticky=tk.NSEW, padx=margin, pady=(ems_to_pixels(0.5), 0) ) self.set_default("layout.west_pw_width", ems_to_pixels(15)) self.set_default("layout.east_pw_width", ems_to_pixels(15)) self.set_default("layout.s_nb_height", ems_to_pixels(15)) self.set_default("layout.nw_nb_height", ems_to_pixels(15)) self.set_default("layout.sw_nb_height", ems_to_pixels(15)) self.set_default("layout.ne_nb_height", ems_to_pixels(15)) self.set_default("layout.se_nb_height", ems_to_pixels(15)) self._main_pw = AutomaticPanedWindow(main_frame, orient=tk.HORIZONTAL) self._main_pw.grid(column=0, row=1, sticky=tk.NSEW, padx=margin, pady=(margin, 0)) main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(1, weight=1) self._west_pw = AutomaticPanedWindow( self._main_pw, 1, orient=tk.VERTICAL, preferred_size_in_pw=self.get_option("layout.west_pw_width"), ) self._center_pw = AutomaticPanedWindow(self._main_pw, 2, orient=tk.VERTICAL) self._east_pw = AutomaticPanedWindow( self._main_pw, 3, orient=tk.VERTICAL, preferred_size_in_pw=self.get_option("layout.east_pw_width"), ) self._view_notebooks = { "nw": AutomaticNotebook( self._west_pw, 1, preferred_size_in_pw=self.get_option("layout.nw_nb_height") ), "w": AutomaticNotebook(self._west_pw, 2), "sw": AutomaticNotebook( self._west_pw, 3, preferred_size_in_pw=self.get_option("layout.sw_nb_height") ), "s": AutomaticNotebook( self._center_pw, 3, preferred_size_in_pw=self.get_option("layout.s_nb_height") ), "ne": AutomaticNotebook( self._east_pw, 1, preferred_size_in_pw=self.get_option("layout.ne_nb_height") ), "e": AutomaticNotebook(self._east_pw, 2), "se": AutomaticNotebook( self._east_pw, 3, preferred_size_in_pw=self.get_option("layout.se_nb_height") ), } for nb_name in self._view_notebooks: self.set_default("layout.notebook_" + nb_name + "_visible_view", None) self._editor_notebook = EditorNotebook(self._center_pw) self._editor_notebook.position_key = 1 self._center_pw.insert("auto", self._editor_notebook) self._statusbar = ttk.Frame(main_frame) self._statusbar.grid(column=0, row=2, sticky="nsew", padx=margin, pady=(0)) self._statusbar.columnconfigure(2, weight=2) self._status_label = ttk.Label(self._statusbar, text="") self._status_label.grid(row=1, column=1, sticky="w") # self._init_support_ukraine_bar() self._init_backend_switcher() def _init_support_ukraine_bar(self) -> None: ukraine_label = create_action_label( self._statusbar, tr("Support Ukraine"), self._support_ukraine, # image=self.get_image("Ukraine"), # compound="left" ) ukraine_label.grid(row=1, column=1, sticky="wsn") def _support_ukraine(self, event=None) -> None: webbrowser.open("https://github.com/thonny/thonny/wiki/Support-Ukraine") def _init_backend_switcher(self): # Set up the menu self._backend_conf_variable = tk.StringVar(value="{}") if running_on_mac_os(): menu_conf = {} else: menu_conf = get_style_configuration("Menu") self._backend_menu = tk.Menu(self._statusbar, tearoff=False, **menu_conf) # Set up the button. self._backend_button = ttk.Button(self._statusbar, text=get_menu_char(), style="Toolbutton") self._backend_button.grid(row=1, column=3, sticky="nes") self._backend_button.configure(command=self._post_backend_menu) def _post_backend_menu(self): from thonny.plugins.micropython.uf2dialog import ( show_uf2_installer, uf2_device_is_present_in_bootloader_mode, ) menu_font = tk_font.nametofont("TkMenuFont") def choose_backend(): backend_conf = ast.literal_eval(self._backend_conf_variable.get()) assert isinstance(backend_conf, dict), "backend conf is %r" % backend_conf for name, value in backend_conf.items(): self.set_option(name, value) get_runner().restart_backend(False) self._backend_menu.delete(0, "end") max_description_width = 0 button_text_width = menu_font.measure(self._backend_button.cget("text")) num_entries = 0 added_micropython_separator = False for backend in sorted(self.get_backends().values(), key=lambda x: x.sort_key): entries = backend.proxy_class.get_switcher_entries() for conf, label in entries: if not added_micropython_separator and "MicroPython" in label: self._backend_menu.add_separator() added_micropython_separator = True self._backend_menu.add_radiobutton( label=label, command=choose_backend, variable=self._backend_conf_variable, value=repr(conf), ) max_description_width = max(menu_font.measure(label), max_description_width) num_entries += 1 # self._backend_conf_variable.set(value=self.get_option("run.backend_name")) self._backend_menu.add_separator() if uf2_device_is_present_in_bootloader_mode(): self._backend_menu.add_command( label=tr("Install MicroPython") + "...", command=lambda: show_uf2_installer(self, "MicroPython"), ) self._backend_menu.add_command( label=tr("Install CircuitPython") + "...", command=lambda: show_uf2_installer(self, "CircuitPython"), ) self._backend_menu.add_separator() self._backend_menu.add_command( label=tr("Configure interpreter..."), command=lambda: self.show_options("interpreter"), ) post_x = self._backend_button.winfo_rootx() post_y = ( self._backend_button.winfo_rooty() - self._backend_menu.yposition("end") - self._backend_menu.yposition(1) ) if self.winfo_screenwidth() / self.winfo_screenheight() > 2: # Most likely several monitors. # Tk will adjust x properly with single monitor, but when Thonny is maximized # on a monitor, which has another monitor to its right, the menu can be partially # displayed on another monitor (at least in Ubuntu). width_diff = max_description_width - button_text_width post_x -= width_diff + menu_font.measure("mmm") try: self._backend_menu.tk_popup(post_x, post_y) except tk.TclError as e: if not 'unknown option "-state"' in str(e): logger.warning("Problem with switcher popup", exc_info=e) def _on_backend_restart(self, event): proxy = get_runner().get_backend_proxy() if proxy: conf = proxy.get_current_switcher_configuration() desc = proxy.get_switcher_configuration_label(conf) value = repr(conf) else: desc = "" value = "n/a" self._backend_conf_variable.set(value=value) self._backend_button.configure(text=desc + " " + get_menu_char()) def _init_theming(self) -> None: self._style = ttk.Style() self._ui_themes = ( {} ) # type: Dict[str, Tuple[Optional[str], FlexibleUiThemeSettings, Dict[str, str]]] # value is (parent, settings, images) self._syntax_themes = ( {} ) # type: Dict[str, Tuple[Optional[str], FlexibleSyntaxThemeSettings]] # value is (parent, settings) self.set_default("view.ui_theme", self.get_default_ui_theme()) def add_command( self, command_id: str, menu_name: str, command_label: str, handler: Optional[Callable[[], None]] = None, tester: Optional[Callable[[], bool]] = None, default_sequence: Optional[str] = None, extra_sequences: Sequence[str] = [], flag_name: Optional[str] = None, skip_sequence_binding: bool = False, accelerator: Optional[str] = None, group: int = 99, position_in_group="end", image: Optional[str] = None, caption: Optional[str] = None, alternative_caption: Optional[str] = None, include_in_menu: bool = True, include_in_toolbar: bool = False, submenu: Optional[tk.Menu] = None, bell_when_denied: bool = True, show_extra_sequences=False, ) -> None: """Registers an item to be shown in specified menu. Args: menu_name: Name of the menu the command should appear in. Standard menu names are "file", "edit", "run", "view", "help". If a menu with given name doesn't exist, then new menu is created (with label=name). command_label: Label for this command handler: Function to be called when the command is invoked. Should be callable with one argument (the event or None). tester: Function to be called for determining if command is available or not. Should be callable with one argument (the event or None). Should return True or False. If None then command is assumed to be always available. default_sequence: Default shortcut (Tk style) flag_name: Used for toggle commands. Indicates the name of the boolean option. group: Used for grouping related commands together. Value should be int. Groups with smaller numbers appear before. Returns: None """ # Temporary solution for plug-ins made for versions before 3.2 if menu_name == "device": menu_name = "tools" group = 150 # store command to be published later self._commands.append( dict( command_id=command_id, menu_name=menu_name, command_label=command_label, handler=handler, tester=tester, default_sequence=default_sequence, extra_sequences=extra_sequences, flag_name=flag_name, skip_sequence_binding=skip_sequence_binding, accelerator=accelerator, group=group, position_in_group=position_in_group, image=image, caption=caption, alternative_caption=alternative_caption, include_in_menu=include_in_menu, include_in_toolbar=include_in_toolbar, submenu=submenu, bell_when_denied=bell_when_denied, show_extra_sequences=show_extra_sequences, ) ) def _publish_commands(self) -> None: for cmd in self._commands: self._publish_command(**cmd) def _publish_command( self, command_id: str, menu_name: str, command_label: str, handler: Optional[Callable[[], None]], tester: Optional[Callable[[], bool]] = None, default_sequence: Optional[str] = None, extra_sequences: Sequence[str] = [], flag_name: Optional[str] = None, skip_sequence_binding: bool = False, accelerator: Optional[str] = None, group: int = 99, position_in_group="end", image: Optional[str] = None, caption: Optional[str] = None, alternative_caption: Optional[str] = None, include_in_menu: bool = True, include_in_toolbar: bool = False, submenu: Optional[tk.Menu] = None, bell_when_denied: bool = True, show_extra_sequences: bool = False, ) -> None: def dispatch(event=None): if not tester or tester(): denied = False handler() else: denied = True logger.debug("Command '" + command_id + "' execution denied") if bell_when_denied: self.bell() self.event_generate("UICommandDispatched", command_id=command_id, denied=denied) def dispatch_if_caps_lock_is_on(event): if caps_lock_is_on(event) and not shift_is_pressed(event): dispatch(event) sequence_option_name = "shortcuts." + command_id self.set_default(sequence_option_name, default_sequence) sequence = self.get_option(sequence_option_name) if sequence: if not skip_sequence_binding: self.bind_all(sequence, dispatch, True) # work around caps-lock problem # https://github.com/thonny/thonny/issues/1347 # Unfortunately the solution doesn't work with sequences involving Shift # (in Linux with the expected solution Shift sequences did not come through # with Caps Lock, and in Windows, the shift handlers started to react # on non-shift keypresses) # Python 3.7 on Mac seems to require lower letters for shift sequences. parts = sequence.strip("<>").split("-") if len(parts[-1]) == 1 and parts[-1].islower() and "Shift" not in parts: lock_sequence = "<%s-Lock-%s>" % ("-".join(parts[:-1]), parts[-1].upper()) self.bind_all(lock_sequence, dispatch_if_caps_lock_is_on, True) # register shortcut even without binding register_latin_shortcut(self._latin_shortcuts, sequence, handler, tester) for extra_sequence in extra_sequences: self.bind_all(extra_sequence, dispatch, True) if "greek_" not in extra_sequence.lower() or running_on_linux(): # Use greek alternatives only on Linux # (they are not required on Mac # and cause double events on Windows) register_latin_shortcut(self._latin_shortcuts, sequence, handler, tester) menu = self.get_menu(menu_name) if image: _image = self.get_image(image) # type: Optional[tk.PhotoImage] _disabled_image = self.get_image(image, disabled=True) else: _image = None _disabled_image = None if not accelerator and sequence: accelerator = sequence_to_accelerator(sequence) """ # Does not work on Mac if show_extra_sequences: for extra_seq in extra_sequences: accelerator += " or " + sequence_to_accelerator(extra_seq) """ if include_in_menu: def dispatch_from_menu(): # I don't like that Tk menu toggles checkbutton variable # automatically before calling the handler. # So I revert the toggle before calling the actual handler. # This way the handler doesn't have to worry whether it # needs to toggle the variable or not, and it can choose to # decline the toggle. if flag_name is not None: var = self.get_variable(flag_name) var.set(not var.get()) dispatch(None) if _image and lookup_style_option("OPTIONS", "icons_in_menus", True): menu_image = _image # type: Optional[tk.PhotoImage] elif flag_name: # no image or black next to a checkbox menu_image = None else: menu_image = self.get_image("16x16-blank") # remember the details that can't be stored in Tkinter objects self._menu_item_specs[(menu_name, command_label)] = MenuItem( group, position_in_group, tester ) menu.insert( self._find_location_for_menu_item(menu_name, command_label), "checkbutton" if flag_name else "cascade" if submenu else "command", label=command_label, accelerator=accelerator, image=menu_image, compound=tk.LEFT, variable=self.get_variable(flag_name) if flag_name else None, command=dispatch_from_menu if handler else None, menu=submenu, ) if include_in_toolbar: toolbar_group = self._get_menu_index(menu) * 100 + group assert caption is not None self._add_toolbar_button( command_id, _image, _disabled_image, command_label, caption, caption if alternative_caption is None else alternative_caption, accelerator, handler, tester, toolbar_group, ) def add_view( self, cls: Type[tk.Widget], label: str, default_location: str, visible_by_default: bool = False, default_position_key: Optional[str] = None, ) -> None: """Adds item to "View" menu for showing/hiding given view. Args: view_class: Class or constructor for view. Should be callable with single argument (the master of the view) label: Label of the view tab location: Location descriptor. Can be "nw", "sw", "s", "se", "ne" Returns: None """ view_id = cls.__name__ if default_position_key == None: default_position_key = label self.set_default("view." + view_id + ".visible", visible_by_default) self.set_default("view." + view_id + ".location", default_location) self.set_default("view." + view_id + ".position_key", default_position_key) if self.in_simple_mode(): visibility_flag = tk.BooleanVar(value=view_id in SIMPLE_MODE_VIEWS) else: visibility_flag = cast(tk.BooleanVar, self.get_variable("view." + view_id + ".visible")) self._view_records[view_id] = { "class": cls, "label": label, "location": self.get_option("view." + view_id + ".location"), "position_key": self.get_option("view." + view_id + ".position_key"), "visibility_flag": visibility_flag, } # handler def toggle_view_visibility(): if visibility_flag.get(): self.hide_view(view_id) else: self.show_view(view_id, True) self.add_command( "toggle_" + view_id, menu_name="view", command_label=label, handler=toggle_view_visibility, flag_name="view." + view_id + ".visible", group=10, position_in_group="alphabetic", ) def add_configuration_page( self, key: str, title: str, page_class: Type[tk.Widget], order: int ) -> None: self._configuration_pages.append((key, title, page_class, order)) def add_content_inspector(self, inspector_class: Type) -> None: self.content_inspector_classes.append(inspector_class) def add_backend( self, name: str, proxy_class: Type[BackendProxy], description: str, config_page_constructor, sort_key=None, ) -> None: self._backends[name] = BackendSpec( name, proxy_class, description, config_page_constructor, sort_key if sort_key is not None else description, ) self.set_default(f"{name}.last_configurations", []) # assing names to related classes proxy_class.backend_name = name # type: ignore proxy_class.backend_description = description # type: ignore config_page_constructor.backend_name = name def add_ui_theme( self, name: str, parent: Union[str, None], settings: FlexibleUiThemeSettings, images: Dict[str, str] = {}, ) -> None: if name in self._ui_themes: warn(tr("Overwriting theme '%s'") % name) self._ui_themes[name] = (parent, settings, images) def add_syntax_theme( self, name: str, parent: Optional[str], settings: FlexibleSyntaxThemeSettings ) -> None: if name in self._syntax_themes: warn(tr("Overwriting theme '%s'") % name) self._syntax_themes[name] = (parent, settings) def get_usable_ui_theme_names(self) -> Sequence[str]: return sorted([name for name in self._ui_themes if self._ui_themes[name][0] is not None]) def get_syntax_theme_names(self) -> Sequence[str]: return sorted(self._syntax_themes.keys()) def get_ui_mode(self) -> str: return self._active_ui_mode def in_simple_mode(self) -> bool: return self.get_ui_mode() == "simple" def scale(self, value: Union[int, float]) -> int: if isinstance(value, (int, float)): # using int instead of round so that thin lines will stay # one pixel even with scaling_factor 1.67 result = int(self._scaling_factor * value) if result == 0 and value > 0: # don't lose thin lines because of scaling return 1 else: return result else: raise NotImplementedError("Only numeric dimensions supported at the moment") def _register_ui_theme_as_tk_theme(self, name: str) -> None: # collect settings from all ancestors total_settings = [] # type: List[FlexibleUiThemeSettings] total_images = {} # type: Dict[str, str] temp_name = name while True: parent, settings, images = self._ui_themes[temp_name] total_settings.insert(0, settings) for img_name in images: total_images.setdefault(img_name, images[img_name]) if parent is not None: temp_name = parent else: # reached start of the chain break assert temp_name in self._style.theme_names() # only root of the ancestors is relevant for theme_create, # because the method actually doesn't take parent settings into account # (https://mail.python.org/pipermail/tkinter-discuss/2015-August/003752.html) self._style.theme_create(name, temp_name) self._image_mapping_by_theme[name] = total_images # load images self.get_image("tab-close", "img_close") self.get_image("tab-close-active", "img_close_active") # apply settings starting from root ancestor for settings in total_settings: if callable(settings): settings = settings() if isinstance(settings, dict): self._style.theme_settings(name, settings) else: for subsettings in settings: self._style.theme_settings(name, subsettings) def _apply_ui_theme(self, name: str) -> None: self._current_theme_name = name if name not in self._style.theme_names(): self._register_ui_theme_as_tk_theme(name) self._style.theme_use(name) # https://wiki.tcl.tk/37973#pagetocfe8b22ab for setting in ["background", "foreground", "selectBackground", "selectForeground"]: value = self._style.lookup("Listbox", setting) if value: self.option_add("*TCombobox*Listbox." + setting, value) self.option_add("*Listbox." + setting, value) text_opts = self._style.configure("Text") if text_opts: for key in text_opts: self.option_add("*Text." + key, text_opts[key]) if hasattr(self, "_menus"): # if menus have been initialized, ie. when theme is being changed for menu in self._menus.values(): menu.configure(get_style_configuration("Menu")) self.update_fonts() def _apply_syntax_theme(self, name: str) -> None: def get_settings(name): try: parent, settings = self._syntax_themes[name] except KeyError: self.report_exception("Can't find theme '%s'" % name) return {} if callable(settings): settings = settings() if parent is None: return settings else: result = get_settings(parent) for key in settings: if key in result: result[key].update(settings[key]) else: result[key] = settings[key] return result from thonny import codeview codeview.set_syntax_options(get_settings(name)) def reload_themes(self) -> None: ui_theme = self.get_option("view.ui_theme") available_themes = self.get_usable_ui_theme_names() if ui_theme not in available_themes: logger.warning("Could not find UI theme %r, switching to default", ui_theme) ui_theme = self.get_default_ui_theme() self.set_option("view.ui_theme", ui_theme) self._apply_ui_theme(ui_theme) syntax_theme = self.get_option("view.syntax_theme") if syntax_theme not in self._syntax_themes: logger.warning("Could not find syntax theme %r, switching to default", syntax_theme) syntax_theme = self.get_default_syntax_theme() self.set_option("view.syntax_theme", syntax_theme) self._apply_syntax_theme(syntax_theme) def get_default_ui_theme(self) -> str: available_themes = self.get_usable_ui_theme_names() if "Windows" in available_themes: return "Windows" elif running_on_rpi() and "Raspberry Pi" in available_themes: return "Raspberry Pi" elif "Enhanced Clam" in available_themes: return "Enhanced Clam" else: return "clam" def get_default_syntax_theme(self) -> str: if self.uses_dark_ui_theme(): return "Default Dark" else: return "Default Light" def uses_dark_ui_theme(self) -> bool: name = self._style.theme_use() while True: if "dark" in name.lower(): return True try: name, _, _ = self._ui_themes[name] except KeyError: return False if name is None: # reached start of the chain break return False def _init_program_arguments_frame(self) -> None: self.set_default("view.show_program_arguments", False) self.set_default("run.program_arguments", "") self.set_default("run.past_program_arguments", []) visibility_var = self.get_variable("view.show_program_arguments") content_var = self.get_variable("run.program_arguments") frame = ttk.Frame(self._toolbar) col = 1000 self._toolbar.columnconfigure(col, weight=1) label = ttk.Label(frame, text=tr("Program arguments:")) label.grid(row=0, column=0, sticky="nse", padx=5) self.program_arguments_box = ttk.Combobox( frame, width=80, height=15, textvariable=content_var, values=[""] + self.get_option("run.past_program_arguments"), ) self.program_arguments_box.grid(row=0, column=1, sticky="nsew", padx=5) frame.columnconfigure(1, weight=1) def update_visibility(): if visibility_var.get(): if not frame.winfo_ismapped(): frame.grid(row=0, column=col, sticky="nse") else: if frame.winfo_ismapped(): frame.grid_remove() def toggle(): visibility_var.set(not visibility_var.get()) update_visibility() self.add_command( "viewargs", "view", tr("Program arguments"), toggle, flag_name="view.show_program_arguments", group=11, ) update_visibility() def _init_regular_mode_link(self): if self.get_ui_mode() != "simple": return label = ttk.Label( self._toolbar, text=tr("Switch to\nregular\nmode"), justify="right", font="SmallLinkFont", style="Url.TLabel", cursor=get_hyperlink_cursor(), ) label.grid(row=0, column=1001, sticky="ne") def on_click(event): self.set_option("general.ui_mode", "regular") tk.messagebox.showinfo( tr("Regular mode"), tr( "Configuration has been updated. " + "Restart Thonny to start working in regular mode.\n\n" + "(See 'Tools → Options → General' if you change your mind later.)" ), master=self, ) label.bind("<1>", on_click, True) def _switch_backend_group(self, group): pass def _switch_darkness(self, mode): pass def _switch_to_regular_mode(self): pass def log_program_arguments_string(self, arg_str: str) -> None: arg_str = arg_str.strip() self.set_option("run.program_arguments", arg_str) if arg_str == "": # empty will be handled differently return past_args = self.get_option("run.past_program_arguments") if arg_str in past_args: past_args.remove(arg_str) past_args.insert(0, arg_str) past_args = past_args[:10] self.set_option("run.past_program_arguments", past_args) self.program_arguments_box.configure(values=[""] + past_args) def _show_views(self) -> None: for view_id in self._view_records: if self._view_records[view_id]["visibility_flag"].get(): try: self.show_view(view_id, False) except Exception: self.report_exception("Problem showing " + view_id) def update_image_mapping(self, mapping: Dict[str, str]) -> None: """Was used by thonny-pi. Not recommended anymore""" self._default_image_mapping.update(mapping) def get_backends(self) -> Dict[str, BackendSpec]: return self._backends def get_option(self, name: str, default=None) -> Any: # Need to return Any, otherwise each typed call site needs to cast return self._configuration_manager.get_option(name, default) def set_option(self, name: str, value: Any) -> None: self._configuration_manager.set_option(name, value) def get_local_cwd(self) -> str: cwd = self.get_option("run.working_directory") if os.path.exists(cwd): return normpath_with_actual_case(cwd) else: return normpath_with_actual_case(os.path.expanduser("~")) def set_local_cwd(self, value: str) -> None: if self.get_option("run.working_directory") != value: self.set_option("run.working_directory", value) if value: self.event_generate("LocalWorkingDirectoryChanged", cwd=value) def set_default(self, name: str, default_value: Any) -> None: """Registers a new option. If the name contains a period, then the part left to the (first) period will become the section of the option and rest will become name under that section. If the name doesn't contain a period, then it will be added under section "general". """ self._configuration_manager.set_default(name, default_value) def get_variable(self, name: str) -> tk.Variable: return self._configuration_manager.get_variable(name) def get_menu(self, name: str, label: Optional[str] = None) -> tk.Menu: """Gives the menu with given name. Creates if not created yet. Args: name: meant to be used as not translatable menu name label: translated label, used only when menu with given name doesn't exist yet """ # For compatibility with plug-ins if name in ["device", "tempdevice"] and label is None: label = tr("Device") if name not in self._menus: if running_on_mac_os(): conf = {} else: conf = get_style_configuration("Menu") menu = tk.Menu(self._menubar, **conf) menu["postcommand"] = lambda: self._update_menu(menu, name) self._menubar.add_cascade(label=label if label else name, menu=menu) self._menus[name] = menu if label: self._menus[label] = menu return self._menus[name] def get_view(self, view_id: str, create: bool = True) -> tk.Widget: if "instance" not in self._view_records[view_id]: if not create: raise RuntimeError("View %s not created" % view_id) class_ = self._view_records[view_id]["class"] location = self._view_records[view_id]["location"] master = self._view_notebooks[location] # create the view view = class_(self) # View's master is workbench to allow making it maximized view.position_key = self._view_records[view_id]["position_key"] self._view_records[view_id]["instance"] = view # create the view home_widget to be added into notebook view.home_widget = ttk.Frame(master) view.home_widget.columnconfigure(0, weight=1) view.home_widget.rowconfigure(0, weight=1) view.home_widget.maximizable_widget = view # type: ignore view.home_widget.close = lambda: self.hide_view(view_id) # type: ignore if hasattr(view, "position_key"): view.home_widget.position_key = view.position_key # type: ignore # initially the view will be in it's home_widget view.grid(row=0, column=0, sticky=tk.NSEW, in_=view.home_widget) view.hidden = True return self._view_records[view_id]["instance"] def get_editor_notebook(self) -> EditorNotebook: assert self._editor_notebook is not None return self._editor_notebook def get_package_dir(self): """Returns thonny package directory""" return os.path.dirname(sys.modules["thonny"].__file__) def get_image( self, filename: str, tk_name: Optional[str] = None, disabled=False ) -> tk.PhotoImage: if filename in self._image_mapping_by_theme[self._current_theme_name]: filename = self._image_mapping_by_theme[self._current_theme_name][filename] if filename in self._default_image_mapping: filename = self._default_image_mapping[filename] # if path is relative then interpret it as living in res folder if not os.path.isabs(filename): filename = os.path.join(self.get_package_dir(), "res", filename) if not os.path.exists(filename): if os.path.exists(filename + ".png"): filename = filename + ".png" elif os.path.exists(filename + ".gif"): filename = filename + ".gif" if disabled: filename = os.path.join( os.path.dirname(filename), "_disabled_" + os.path.basename(filename) ) if not os.path.exists(filename): return None # are there platform-specific variants? plat_filename = filename[:-4] + "_" + platform.system() + ".png" if os.path.exists(plat_filename): filename = plat_filename treeview_rowheight = self._compute_treeview_rowheight() threshold = self.get_option("general.large_icon_rowheight_threshold") if ( treeview_rowheight > threshold and not filename.endswith("48.png") or treeview_rowheight > threshold * 1.5 ): scaled_filename = filename[:-4] + "_2x.png" scaled_filename_alt = filename[:-4] + "48.png" # used in pi theme if os.path.exists(scaled_filename): filename = scaled_filename elif os.path.exists(scaled_filename_alt): filename = scaled_filename_alt else: img = tk.PhotoImage(file=filename) # can't use zoom method, because this doesn't allow name img2 = tk.PhotoImage(tk_name) self.tk.call( img2, "copy", img.name, "-zoom", 2, 2, ) self._images.add(img2) return img2 img = tk.PhotoImage(tk_name, file=filename) self._images.add(img) return img def show_view(self, view_id: str, set_focus: bool = True) -> Union[bool, tk.Widget]: """View must be already registered. Args: view_id: View class name without package name (eg. 'ShellView')""" if view_id == "MainFileBrowser": # Was renamed in 3.1.1 view_id = "FilesView" # NB! Don't forget that view.home_widget is added to notebook, not view directly # get or create view = self.get_view(view_id) notebook = view.home_widget.master # type: ignore if hasattr(view, "before_show") and view.before_show() == False: # type: ignore return False if view.hidden: # type: ignore label = None if hasattr(view, "get_tab_text"): label = view.get_tab_text() if not label: label = self._view_records[view_id]["label"] notebook.insert("auto", view.home_widget, text=label) # type: ignore view.hidden = False # type: ignore if hasattr(view, "on_show"): # type: ignore view.on_show() # switch to the tab notebook.select(view.home_widget) # type: ignore # add focus if set_focus: view.focus_set() self.set_option("view." + view_id + ".visible", True) self.event_generate("ShowView", view=view, view_id=view_id) return view def hide_view(self, view_id: str) -> Union[bool, None]: # NB! Don't forget that view.home_widget is added to notebook, not view directly if "instance" in self._view_records[view_id]: # TODO: handle the case, when view is maximized view = self._view_records[view_id]["instance"] if view.hidden: return True if hasattr(view, "before_hide") and view.before_hide() == False: return False view.home_widget.master.forget(view.home_widget) self.set_option("view." + view_id + ".visible", False) self.event_generate("HideView", view=view, view_id=view_id) view.hidden = True return True def event_generate(self, sequence: str, event: Optional[Record] = None, **kwargs) -> None: """Uses custom event handling when sequence doesn't start with <. In this case arbitrary attributes can be added to the event. Otherwise forwards the call to Tk's event_generate""" # pylint: disable=arguments-differ if sequence.startswith("<"): assert event is None tk.Tk.event_generate(self, sequence, **kwargs) else: if sequence in self._event_handlers: if event is None: event = WorkbenchEvent(sequence, **kwargs) else: event.update(kwargs) # make a copy of handlers, so that event handler can remove itself # from the registry during iteration # (or new handlers can be added) for handler in sorted(self._event_handlers[sequence].copy(), key=str): try: handler(event) except Exception: self.report_exception("Problem when handling '" + sequence + "'") if not self._closing: self._update_toolbar() def bind(self, sequence: str, func: Callable, add: bool = None) -> None: # type: ignore """Uses custom event handling when sequence doesn't start with <. Otherwise forwards the call to Tk's bind""" # pylint: disable=signature-differs if not add: logger.warning( "Workbench.bind({}, ..., add={}) -- did you really want to replace existing bindings?".format( sequence, add ) ) if sequence.startswith("<"): tk.Tk.bind(self, sequence, func, add) else: if sequence not in self._event_handlers or not add: self._event_handlers[sequence] = set() self._event_handlers[sequence].add(func) def unbind(self, sequence: str, func=None) -> None: # pylint: disable=arguments-differ if sequence.startswith("<"): tk.Tk.unbind(self, sequence, funcid=func) else: try: self._event_handlers[sequence].remove(func) except Exception: logger.exception("Can't remove binding for '%s' and '%s'", sequence, func) def in_heap_mode(self) -> bool: # TODO: add a separate command for enabling the heap mode # untie the mode from HeapView return self._configuration_manager.has_option("view.HeapView.visible") and self.get_option( "view.HeapView.visible" ) def in_debug_mode(self) -> bool: return os.environ.get("THONNY_DEBUG", False) in [ "1", 1, "True", True, "true", ] or self.get_option("general.debug_mode", False) def _init_scaling(self) -> None: self._default_scaling_factor = self.tk.call("tk", "scaling") if self._default_scaling_factor > 10: # it may be infinity in eg. Fedora self._default_scaling_factor = 1.33 scaling = self.get_option("general.scaling") if scaling in ["default", "auto"]: # auto was used in 2.2b3 self._scaling_factor = self._default_scaling_factor else: self._scaling_factor = float(scaling) MAC_SCALING_MODIFIER = 1.7 if running_on_mac_os(): self._scaling_factor *= MAC_SCALING_MODIFIER self.tk.call("tk", "scaling", self._scaling_factor) font_scaling_mode = self.get_option("general.font_scaling_mode") if ( running_on_linux() and font_scaling_mode in ["default", "extra"] and scaling not in ["default", "auto"] ): # update system fonts which are given in pixel sizes for name in tk_font.names(): f = tk_font.nametofont(name) orig_size = f.cget("size") # According to do documentation, absolute values of negative font sizes # should be interpreted as pixel sizes (not affected by "tk scaling") # and positive values are point sizes, which are supposed to scale automatically # http://www.tcl.tk/man/tcl8.6/TkCmd/font.htm#M26 # Unfortunately it seems that this cannot be relied on # https://groups.google.com/forum/#!msg/comp.lang.tcl/ZpL6tq77M4M/GXImiV2INRQJ # My experiments show that manually changing negative font sizes # doesn't have any effect -- fonts keep their default size # (Tested in Raspbian Stretch, Ubuntu 18.04 and Fedora 29) # On the other hand positive sizes scale well (and they don't scale automatically) # convert pixel sizes to point_size if orig_size < 0: orig_size = -orig_size / self._default_scaling_factor # scale scaled_size = round( orig_size * (self._scaling_factor / self._default_scaling_factor) ) f.configure(size=scaled_size) elif running_on_mac_os() and scaling not in ["default", "auto"]: # see http://wiki.tcl.tk/44444 # update system fonts for name in tk_font.names(): f = tk_font.nametofont(name) orig_size = f.cget("size") assert orig_size > 0 f.configure(size=int(orig_size * self._scaling_factor / MAC_SCALING_MODIFIER)) def update_fonts(self) -> None: editor_font_size = self._guard_font_size(self.get_option("view.editor_font_size")) editor_font_family = self.get_option("view.editor_font_family") io_font_size = self._guard_font_size(self.get_option("view.io_font_size")) io_font_family = self.get_option("view.io_font_family") for io_name in [ "IOFont", "BoldIOFont", "UnderlineIOFont", "ItalicIOFont", "BoldItalicIOFont", ]: tk_font.nametofont(io_name).configure(family=io_font_family, size=io_font_size) try: shell = self.get_view("ShellView", create=False) except Exception: # shell may be not created yet pass else: shell.update_tabs() tk_font.nametofont("EditorFont").configure(family=editor_font_family, size=editor_font_size) tk_font.nametofont("SmallEditorFont").configure( family=editor_font_family, size=editor_font_size - 2 ) tk_font.nametofont("BoldEditorFont").configure( family=editor_font_family, size=editor_font_size ) tk_font.nametofont("ItalicEditorFont").configure( family=editor_font_family, size=editor_font_size ) tk_font.nametofont("BoldItalicEditorFont").configure( family=editor_font_family, size=editor_font_size ) if self.get_ui_mode() == "simple": default_size_factor = max(0.7, 1 - (editor_font_size - 10) / 25) small_size_factor = max(0.6, 0.8 - (editor_font_size - 10) / 25) tk_font.nametofont("TkDefaultFont").configure( size=round(editor_font_size * default_size_factor) ) tk_font.nametofont("TkHeadingFont").configure( size=round(editor_font_size * default_size_factor) ) tk_font.nametofont("SmallLinkFont").configure( size=round(editor_font_size * small_size_factor) ) # Tk doesn't update Treeview row height properly, at least not in Linux Tk style = ttk.Style() style.configure("Treeview", rowheight=self._compute_treeview_rowheight()) if self._editor_notebook is not None: self._editor_notebook.update_appearance() def _compute_treeview_rowheight(self): default_font = tk_font.nametofont("TkDefaultFont") return round(default_font.metrics("linespace") * 1.15) def _get_menu_index(self, menu: tk.Menu) -> int: for i in range(len(self._menubar.winfo_children())): if menu == self._menubar.winfo_children()[i]: return i raise RuntimeError("Couldn't find menu") def _add_toolbar_button( self, command_id: str, image: Optional[tk.PhotoImage], disabled_image: Optional[tk.PhotoImage], command_label: str, caption: str, alternative_caption: str, accelerator: Optional[str], handler: Callable[[], None], tester: Optional[Callable[[], bool]], toolbar_group: int, ) -> None: assert caption is not None and len(caption) > 0, ( "Missing caption for '%s'. Toolbar commands must have caption." % command_label ) slaves = self._toolbar.grid_slaves(0, toolbar_group) if len(slaves) == 0: group_frame = ttk.Frame(self._toolbar) if self.in_simple_mode(): padx = 0 # type: Union[int, Tuple[int, int]] else: padx = (0, ems_to_pixels(1)) group_frame.grid(row=0, column=toolbar_group, padx=padx) else: group_frame = slaves[0] if self.in_simple_mode(): screen_width = self.winfo_screenwidth() if screen_width >= 1280: button_width = max(7, len(caption), len(alternative_caption)) elif screen_width >= 1024: button_width = max(6, len(caption), len(alternative_caption)) else: button_width = max(5, len(caption), len(alternative_caption)) else: button_width = None if disabled_image is not None: image_spec = [image, "disabled", disabled_image] else: image_spec = image button = ttk.Button( group_frame, image=image_spec, style="Toolbutton", state=tk.NORMAL, text=caption, compound="top" if self.in_simple_mode() else None, pad=(10, 0) if self.in_simple_mode() else None, width=button_width, ) def toolbar_handler(*args): handler(*args) self._update_toolbar() if self.focus_get() == button: # previously selected widget would be better candidate, but this is # better than button self._editor_notebook.focus_set() button.configure(command=toolbar_handler) button.pack(side=tk.LEFT) button.tester = tester # type: ignore tooltip_text = command_label if self.get_ui_mode() != "simple": if accelerator and lookup_style_option( "OPTIONS", "shortcuts_in_tooltips", default=True ): tooltip_text += " (" + accelerator + ")" create_tooltip(button, tooltip_text) self._toolbar_buttons[command_id] = button def get_toolbar_button(self, command_id): return self._toolbar_buttons[command_id] def _update_toolbar(self, event=None) -> None: if self._destroyed or not hasattr(self, "_toolbar"): return if self._toolbar.winfo_ismapped(): for group_frame in self._toolbar.grid_slaves(0): for button in group_frame.pack_slaves(): if thonny._runner is None or button.tester and not button.tester(): button["state"] = tk.DISABLED else: button["state"] = tk.NORMAL def _cmd_zoom_with_mouse(self, event) -> None: if event.delta > 0: self._change_font_size(1) else: self._change_font_size(-1) def _toggle_font_size(self) -> None: current_size = self.get_option("view.editor_font_size") if self.winfo_screenwidth() < 1024: # assuming 32x32 icons small_size = 10 medium_size = 12 large_size = 14 elif self.winfo_screenwidth() < 1280: # assuming 32x32 icons small_size = 12 medium_size = 14 large_size = 18 else: small_size = 12 medium_size = 16 large_size = 20 widths = {10: 800, 12: 1050, 14: 1200, 16: 1300, 18: 1400, 20: 1650} if current_size < small_size or current_size >= large_size: new_size = small_size elif current_size < medium_size: new_size = medium_size else: new_size = large_size self._change_font_size(new_size - current_size) new_width = min(widths[new_size], self.winfo_screenwidth()) geo = re.findall(r"\d+", self.wm_geometry()) self.geometry("{0}x{1}+{2}+{3}".format(new_width, geo[1], geo[2], geo[3])) def _change_font_size(self, delta: int) -> None: if delta != 0: editor_font_size = self.get_option("view.editor_font_size") editor_font_size += delta self.set_option("view.editor_font_size", self._guard_font_size(editor_font_size)) io_font_size = self.get_option("view.io_font_size") io_font_size += delta self.set_option("view.io_font_size", self._guard_font_size(io_font_size)) self.update_fonts() def _guard_font_size(self, size: int) -> int: # https://bitbucket.org/plas/thonny/issues/164/negative-font-size-crashes-thonny MIN_SIZE = 4 MAX_SIZE = 200 if size < MIN_SIZE: return MIN_SIZE elif size > MAX_SIZE: return MAX_SIZE else: return size def _check_update_window_width(self, delta: int) -> None: if not ui_utils.get_zoomed(self): self.update_idletasks() # TODO: shift to left if right edge goes away from screen # TODO: check with screen width new_geometry = "{0}x{1}+{2}+{3}".format( self.winfo_width() + delta, self.winfo_height(), self.winfo_x(), self.winfo_y() ) self.geometry(new_geometry) def _maximize_view(self, event=None) -> None: if self._maximized_view is not None: return # find the widget that can be relocated widget = self.focus_get() if isinstance(widget, (EditorNotebook, AutomaticNotebook)): current_tab = widget.get_current_child() if current_tab is None: return if not hasattr(current_tab, "maximizable_widget"): return widget = current_tab.maximizable_widget while widget is not None: if hasattr(widget, "home_widget"): # if widget is view, then widget.master is workbench widget.grid(row=1, column=0, sticky=tk.NSEW, in_=widget.master) # type: ignore # hide main_frame self._main_frame.grid_forget() self._maximized_view = widget self.get_variable("view.maximize_view").set(True) break else: widget = widget.master # type: ignore def _unmaximize_view(self, event=None) -> None: if self._maximized_view is None: return # restore main_frame self._main_frame.grid(row=1, column=0, sticky=tk.NSEW, in_=self) # put the maximized view back to its home_widget self._maximized_view.grid( row=0, column=0, sticky=tk.NSEW, in_=self._maximized_view.home_widget # type: ignore ) self._maximized_view = None self.get_variable("view.maximize_view").set(False) def show_options(self, page_key=None): dlg = ConfigurationDialog(self, self._configuration_pages) if page_key: dlg.select_page(page_key) ui_utils.show_dialog(dlg) if dlg.backend_restart_required: get_runner().restart_backend(False) def _cmd_focus_editor(self) -> None: self.get_editor_notebook().focus_set() def _cmd_focus_shell(self) -> None: self.show_view("ShellView", True) shell = get_shell() # go to the end of any current input shell.text.mark_set("insert", "end") shell.text.see("insert") def _cmd_toggle_full_screen(self) -> None: """ TODO: For mac http://wiki.tcl.tk/44444 Switching a window to fullscreen mode (Normal Difference) To switch a window to fullscreen mode, the window must first be withdrawn. # For Linux/Mac OS X: set cfs [wm attributes $w -fullscreen] if { $::tcl_platform(os) eq "Darwin" } { if { $cfs == 0 } { # optional: save the window geometry set savevar [wm geometry $w] } wm withdraw $w } wm attributes $w -fullscreen [expr {1-$cfs}] if { $::tcl_platform(os) eq "Darwin" } { wm deiconify $w if { $cfs == 1 } { after idle [list wm geometry $w $savevar] } } """ var = self.get_variable("view.full_screen") var.set(not var.get()) self.attributes("-fullscreen", var.get()) def _cmd_toggle_maximize_view(self) -> None: if self._maximized_view is not None: self._unmaximize_view() else: self._maximize_view() def _update_menu(self, menu: tk.Menu, menu_name: str) -> None: if menu.index("end") is None: return for i in range(menu.index("end") + 1): item_data = menu.entryconfigure(i) if "label" in item_data: command_label = menu.entrycget(i, "label") if (menu_name, command_label) not in self._menu_item_specs: continue tester = self._menu_item_specs[(menu_name, command_label)].tester enabled = not tester if tester: try: enabled = tester() except Exception as e: logger.exception( "Could not check command tester for '%s'", item_data, exc_info=e ) traceback.print_exc() enabled = False if enabled: menu.entryconfigure(i, state=tk.NORMAL) else: menu.entryconfigure(i, state=tk.DISABLED) def _find_location_for_menu_item(self, menu_name: str, command_label: str) -> Union[str, int]: menu = self.get_menu(menu_name) if menu.index("end") == None: # menu is empty return "end" specs = self._menu_item_specs[(menu_name, command_label)] this_group_exists = False for i in range(0, menu.index("end") + 1): data = menu.entryconfigure(i) if "label" in data: # it's a command, not separator sibling_label = menu.entrycget(i, "label") sibling_group = self._menu_item_specs[(menu_name, sibling_label)].group if sibling_group == specs.group: this_group_exists = True if specs.position_in_group == "alphabetic" and sibling_label > command_label: return i if sibling_group > specs.group: assert ( not this_group_exists ) # otherwise we would have found the ending separator menu.insert_separator(i) return i else: # We found a separator if this_group_exists: # it must be the ending separator for this group return i # no group was bigger, ie. this should go to the end if not this_group_exists: menu.add_separator() return "end" def _poll_ipc_requests(self) -> None: try: if self._ipc_requests.empty(): return while not self._ipc_requests.empty(): args = self._ipc_requests.get() try: for filename in args: if os.path.isfile(filename): self.get_editor_notebook().show_file(filename) except Exception as e: logger.exception("Problem processing ipc request", exc_info=e) self.become_active_window() finally: self.after(50, self._poll_ipc_requests) def _on_close(self) -> None: if self._editor_notebook and not self._editor_notebook.check_allow_closing(): return self._closing = True try: self._save_layout() self._editor_notebook.remember_open_files() self.event_generate("WorkbenchClose") self._configuration_manager.save() temp_dir = self.get_temp_dir(create_if_doesnt_exist=False) if os.path.exists(temp_dir): try: shutil.rmtree(temp_dir) except Exception as e: logger.error("Could not remove temp dir", exc_info=e) except Exception: self.report_exception() self.destroy() self._destroyed = True def _on_all_key_presses(self, event): if running_on_windows(): ui_utils.handle_mistreated_latin_shortcuts(self._latin_shortcuts, event) def _on_focus_in(self, event): if self._lost_focus: self._lost_focus = False self.event_generate("WindowFocusIn") def _on_focus_out(self, event): if self.focus_get() is None: if not self._lost_focus: self._lost_focus = True self.event_generate("WindowFocusOut") def focus_get(self) -> Optional[tk.Widget]: try: return tk.Tk.focus_get(self) except Exception: # This may give error in Ubuntu return None def destroy(self) -> None: try: if self._is_server() and os.path.exists(thonny.get_ipc_file_path()): os.remove(thonny.get_ipc_file_path()) self._closing = True runner = get_runner() if runner is not None: runner.destroy_backend() # Tk clipboard gets cleared on exit and won't end up in system clipboard # https://bugs.python.org/issue1207592 # https://stackoverflow.com/questions/26321333/tkinter-in-python-3-4-on-windows-dont-post-internal-clipboard-data-to-the-windo try: clipboard_data = self.clipboard_get() if len(clipboard_data) < 1000 and all( map(os.path.exists, clipboard_data.splitlines()) ): # Looks like the clipboard contains file name(s) # Most likely this means actual file cut/copy operation # was made outside Thonny. # Don't want to replace this with simple string data of file names. pass else: copy_to_clipboard(clipboard_data) except Exception: pass except Exception: logger.exception("Error while destroying workbench") finally: super().destroy() def _on_configure(self, event) -> None: # called when window is moved or resized if ( hasattr(self, "_maximized_view") # configure may happen before the attribute is defined and self._maximized_view # type: ignore ): # grid again, otherwise it acts weird self._maximized_view.grid( row=1, column=0, sticky=tk.NSEW, in_=self._maximized_view.master # type: ignore ) def _on_tk_exception(self, exc, val, tb) -> None: # copied from tkinter.Tk.report_callback_exception with modifications # see http://bugs.python.org/issue22384 sys.last_type = exc sys.last_value = val sys.last_traceback = tb if isinstance(val, KeyboardInterrupt): # no need to report this, just let it close logger.info("Got KeyboardInterrupt, closing") self._on_close() return self.report_exception() def report_exception(self, title: str = "Internal error") -> None: logger.exception(title) if tk._default_root and not self._closing: # type: ignore (typ, value, _) = sys.exc_info() assert typ is not None if issubclass(typ, UserError): msg = str(value) else: msg = traceback.format_exc() dlg = ui_utils.LongTextDialog(title, msg, parent=self) ui_utils.show_dialog(dlg, self) def _open_views(self) -> None: for nb_name in self._view_notebooks: view_name = self.get_option("layout.notebook_" + nb_name + "_visible_view") if view_name != None: if view_name == "GlobalsView": # was renamed in 2.2b5 view_name = "VariablesView" if ( self.get_ui_mode() != "simple" or view_name in SIMPLE_MODE_VIEWS ) and view_name in self._view_records: self.show_view(view_name) # make sure VariablesView is at least loaded # otherwise it may miss globals events # and will show empty table on open self.get_view("VariablesView") if ( self.get_option("assistance.open_assistant_on_errors") or self.get_option("assistance.open_assistant_on_warnings") ) and (self.get_ui_mode() != "simple" or "AssistantView" in SIMPLE_MODE_VIEWS): self.get_view("AssistantView") def _save_layout(self) -> None: self.update_idletasks() self.set_option("layout.zoomed", ui_utils.get_zoomed(self)) for nb_name in self._view_notebooks: widget = self._view_notebooks[nb_name].get_visible_child() if hasattr(widget, "maximizable_widget"): view = widget.maximizable_widget view_name = type(view).__name__ self.set_option("layout.notebook_" + nb_name + "_visible_view", view_name) else: self.set_option("layout.notebook_" + nb_name + "_visible_view", None) if not ui_utils.get_zoomed(self) or running_on_mac_os(): # can't restore zoom on mac without setting actual dimensions gparts = re.findall(r"\d+", self.wm_geometry()) self.set_option("layout.width", int(gparts[0])) self.set_option("layout.height", int(gparts[1])) self.set_option("layout.left", int(gparts[2])) self.set_option("layout.top", int(gparts[3])) self.set_option("layout.west_pw_width", self._west_pw.preferred_size_in_pw) self.set_option("layout.east_pw_width", self._east_pw.preferred_size_in_pw) for key in ["nw", "sw", "s", "se", "ne"]: self.set_option( "layout.%s_nb_height" % key, self._view_notebooks[key].preferred_size_in_pw ) def update_title(self, event=None) -> None: editor = self.get_editor_notebook().get_current_editor() if self._is_portable: title_text = "Portable Thonny" else: title_text = "Thonny" if editor is not None: title_text += " - " + editor.get_long_description() self.title(title_text) if running_on_mac_os() and editor is not None: current_file = editor.get_filename() if current_file and is_local_path(current_file) and os.path.exists(current_file): self.wm_attributes("-titlepath", current_file) else: self.wm_attributes("-titlepath", "") def become_active_window(self, force=True) -> None: # Looks like at least on Windows all following is required # for ensuring the window gets focus # (deiconify, ..., iconify, deiconify) self.deiconify() if force: self.attributes("-topmost", True) self.after_idle(self.attributes, "-topmost", False) self.lift() if not running_on_linux(): # http://stackoverflow.com/a/13867710/261181 self.iconify() self.deiconify() editor = self.get_editor_notebook().get_current_editor() if editor is not None: # This method is meant to be called when new file is opened, so it's safe to # send the focus to the editor editor.focus_set() else: self.focus_set() def open_url(self, url): m = re.match(r"^thonny-editor://(.*?)(#(\d+)(:(\d+))?)?$", url) if m is not None: filename = m.group(1).replace("%20", " ") lineno = None if m.group(3) is None else int(m.group(3)) col_offset = None if m.group(5) is None else int(m.group(5)) if lineno is None: self.get_editor_notebook().show_file(filename) else: self.get_editor_notebook().show_file_at_line(filename, lineno, col_offset) return m = re.match(r"^thonny-help://(.*?)(#(.+))?$", url) if m is not None: topic = m.group(1) fragment = m.group(3) self.show_view("HelpView").load_topic(topic, fragment) return if url.endswith(".rst") and not url.startswith("http"): parts = url.split("#", maxsplit=1) topic = parts[0][:-4] if len(parts) == 2: fragment = parts[1] else: fragment = None self.show_view("HelpView").load_topic(topic, fragment) return # Fallback import webbrowser webbrowser.open(url, False, True) def open_help_topic(self, topic, fragment=None): self.show_view("HelpView").load_topic(topic, fragment) def bell(self, displayof=0): if not self.get_option("general.disable_notification_sound"): super().bell(displayof=displayof) def _mac_quit(self, *args): self._on_close() def _is_server(self): return self._ipc_requests is not None def get_toolbar(self): return self._toolbar def get_temp_dir(self, create_if_doesnt_exist=True): path = os.path.join(THONNY_USER_DIR, "temp") if create_if_doesnt_exist: os.makedirs(path, exist_ok=True) return path def _init_hooks(self): self._save_hooks = [] self._load_hooks = [] def append_save_hook(self, callback): self._save_hooks.append(callback) def append_load_hook(self, callback): self._load_hooks.append(callback) def iter_save_hooks(self): return iter(self._save_hooks) def iter_load_hooks(self): return iter(self._load_hooks) class WorkbenchEvent(Record): def __init__(self, sequence: str, **kwargs) -> None: Record.__init__(self, **kwargs) self.sequence = sequence ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734354398.0 thonny-4.1.7/thonny/workdlg.py0000644000076600000240000004042114730022736016754 0ustar00aivarannamaastaffimport os import queue import signal import subprocess import threading import time import tkinter as tk from logging import getLogger from tkinter import messagebox, ttk from typing import Optional from thonny import tktextext from thonny.languages import tr from thonny.misc_utils import get_menu_char, running_on_mac_os, running_on_windows from thonny.ui_utils import ( CommonDialog, create_action_label, ems_to_pixels, get_style_configuration, set_text_if_different, ) logger = getLogger(__name__) class WorkDialog(CommonDialog): def __init__(self, master, autostart=False): super(WorkDialog, self).__init__(master) self._autostart = autostart self._has_been_started = False self._state = "idle" self.success = False self._work_events_queue = queue.Queue() self.init_instructions_frame() self.init_main_frame() self.init_action_frame() self.init_log_frame() self.populate_main_frame() self.rowconfigure(4, weight=1) # log frame self.columnconfigure(0, weight=1) self.title(self.get_title()) self.stdout = "" self.stderr = "" self._update_scheduler = None self._keep_updating_ui() self.bind("", self.on_cancel, True) self.protocol("WM_DELETE_WINDOW", self.on_cancel) if self._autostart: self.bind("", self._start_on_map, True) def _start_on_map(self, event) -> None: if self._has_been_started: return self._has_been_started = True self.start_work_and_update_ui() def populate_main_frame(self): pass def is_ready_for_work(self): return True def init_instructions_frame(self): instructions = self.get_instructions() self.instructions_frame = ttk.Frame(self, style="Tip.TFrame") self.instructions_frame.grid(row=0, column=0, sticky="nsew") self.instructions_frame.rowconfigure(0, weight=1) self.instructions_frame.columnconfigure(0, weight=1) pad = self.get_large_padding() self.instructions_label = ttk.Label(self, style="Tip.TLabel", text=instructions) self.instructions_label.grid(row=0, column=0, sticky="w", padx=pad, pady=pad) def get_instructions(self) -> Optional[str]: return None def init_main_frame(self): self.main_frame = ttk.Frame(self) self.main_frame.grid(row=1, column=0, sticky="nsew") def init_action_frame(self): padding = self.get_large_padding() intpad = self.get_small_padding() self.action_frame = ttk.Frame(self) self.action_frame.grid(row=2, column=0, sticky="nsew") self._progress_bar = ttk.Progressbar( self.action_frame, length=ems_to_pixels(4), mode="indeterminate" ) self._current_action_label = create_action_label( self.action_frame, text="", width=round(self.get_action_text_max_length() * 1.1), click_handler=self.toggle_log_frame, ) self._current_action_label.grid( row=1, column=2, sticky="we", pady=padding, padx=(0, intpad) ) self._menu_button = ttk.Button( self.action_frame, text=get_menu_char(), command=self.post_action_menu, # style="Toolbutton" width=3, ) if self.has_action_menu(): self._menu_button.grid(column=3, row=1, pady=padding, padx=(0, intpad)) if running_on_mac_os(): menu_conf = {} else: menu_conf = get_style_configuration("Menu") self._action_menu = tk.Menu(self, tearoff=False, **menu_conf) self._ok_button = ttk.Button( self.action_frame, text=self.get_ok_text(), command=self.on_click_ok_button, state="disabled", default="active", ) if not self._autostart: self._ok_button.grid(column=4, row=1, pady=padding, padx=(0, intpad)) self._cancel_button = ttk.Button( self.action_frame, text=self.get_cancel_text(), command=self.on_cancel, ) self._cancel_button.grid(column=5, row=1, padx=(0, padding), pady=padding) self.action_frame.columnconfigure(2, weight=1) def on_click_ok_button(self): self.start_work_and_update_ui() def has_action_menu(self) -> bool: return False def populate_action_menu(self, action_menu: tk.Menu) -> None: pass def post_action_menu(self) -> None: self._action_menu.delete(0, "end") post_x = self._menu_button.winfo_rootx() post_y = self._menu_button.winfo_rooty() + self._menu_button.winfo_height() self.populate_action_menu(self._action_menu) self._action_menu.tk_popup(post_x, post_y) def get_action_text_max_length(self): return 35 def get_initial_log_line_count(self): return 5 def init_log_frame(self): self.log_frame = ttk.Frame(self) self.log_frame.columnconfigure(1, weight=1) self.log_frame.rowconfigure(1, weight=1) fixed_font = tk.font.nametofont("TkFixedFont") font = fixed_font.copy() font.configure(size=round(fixed_font.cget("size") * 0.8)) self.log_text = tktextext.TextFrame( self.log_frame, horizontal_scrollbar=False, wrap="word", borderwidth=1, height=self.get_initial_log_line_count(), width=20, font=font, read_only=True, ) padding = self.get_large_padding() self.log_text.grid(row=1, column=1, sticky="nsew", padx=padding, pady=(0, padding)) def update_ui(self): if self._state == "closed": return while not self._work_events_queue.empty(): self.handle_work_event(*self._work_events_queue.get()) if self._state == "closed": return if self._state == "idle": if self.is_ready_for_work(): self._ok_button.configure(state="normal") else: self._ok_button.configure(state="disabled") else: self._ok_button.configure(state="disabled") if self._state == "done": set_text_if_different(self._cancel_button, tr("Close")) else: set_text_if_different(self._cancel_button, tr("Cancel")) def start_work(self): pass def get_title(self): return "Work dialog" def _keep_updating_ui(self): if self._state != "closed": if self.winfo_ismapped(): self.update_ui() self._update_scheduler = self.after(200, self._keep_updating_ui) else: self._update_scheduler = None def close(self): self._state = "closed" if self._update_scheduler is not None: try: self.after_cancel(self._update_scheduler) except tk.TclError: pass self.destroy() def cancel_work(self): # worker should periodically check this value self._state = "cancelling" self.set_action_text(tr("Cancelling")) def toggle_log_frame(self, event=None): if self.log_frame.winfo_ismapped(): self.hide_log_frame() else: self.show_log_frame() def show_log_frame(self): self.log_frame.grid(row=4, column=0, sticky="nsew") self.rowconfigure(2, weight=0) self.rowconfigure(4, weight=1) def hide_log_frame(self): self.log_frame.grid_forget() self.rowconfigure(2, weight=1) self.rowconfigure(4, weight=0) def clear_log(self) -> None: self.log_text.text.direct_delete("1.0", "end") def get_ok_text(self): return tr("OK") def get_cancel_text(self): return tr("Cancel") def start_work_and_update_ui(self, event=None): assert self._state == "idle" if self.start_work() is not False: self._state = "working" self.success = False self.grid_progress_widgets() self._progress_bar["mode"] = "indeterminate" self._progress_bar.start() if not self._current_action_label["text"]: self._current_action_label["text"] = tr("Starting") + "..." def grid_progress_widgets(self): padding = self.get_large_padding() intpad = self.get_small_padding() self._progress_bar.grid(row=1, column=1, sticky="w", padx=(padding, intpad), pady=padding) def on_cancel(self, event=None): if self._state in ("idle", "done"): self.close() elif self._state == "cancelling" and self.confirm_leaving_while_cancelling(): self.close() elif self.confirm_cancel(): self.cancel_work() def confirm_leaving_while_cancelling(self): return messagebox.askyesno( "Close dialog?", "Cancelling is in progress.\nDo you still want to close the dialog?", parent=self, ) def confirm_cancel(self): return messagebox.askyesno( "Cancel work?", "Are you sure you want to cancel?", parent=self, ) def append_text(self, text: str, stream_name="stdout") -> None: """Appends text to the details box. May be called from another thread.""" self._work_events_queue.put(("append", (text, stream_name))) setattr(self, stream_name, getattr(self, stream_name) + text) def replace_last_line(self, text: str, stream_name="stdout") -> None: """Replaces last line in the details box. May be called from another thread.""" self._work_events_queue.put(("replace", (text, stream_name))) setattr(self, stream_name, getattr(self, stream_name) + text) def report_progress(self, value: Optional[float], maximum: Optional[float]) -> None: """Updates progress bar. May be called from another thread.""" self._work_events_queue.put(("progress", (value, maximum))) def set_action_text(self, text: str) -> None: """Updates text above the progress bar. May be called from another thread.""" self._work_events_queue.put(("action", (text,))) def set_action_text_smart(self, text: str) -> None: """Updates text above the progress bar. May be called from another thread.""" text = text.strip() if not text: return if len(text) > self.get_action_text_max_length(): text = text[: self.get_action_text_max_length() - 3] + "..." self.set_action_text(text) def report_done(self, success): """May be called from another thread.""" self._work_events_queue.put(("done", (success,))) def handle_work_event(self, type, args): if type in ("append", "replace"): text, stream_name = args if type == "replace": self.log_text.text.direct_delete("end-1c linestart", "end-1c") self.log_text.text.direct_insert("end", text, (stream_name,)) self.log_text.text.see("end") elif type == "action": set_text_if_different(self._current_action_label, args[0]) elif type == "progress": value, maximum = args if value is None or maximum is None: if self._progress_bar["mode"] != "indeterminate": self._progress_bar["mode"] = "indeterminate" self._progress_bar.start() else: if self._progress_bar["mode"] != "determinate": self._progress_bar["mode"] = "determinate" self._progress_bar.stop() self._progress_bar.configure(value=value, maximum=maximum) elif type == "done": self.on_done(args[0]) def allow_single_success(self) -> bool: return True def on_done(self, success): """NB! Don't call from non-ui thread!""" self.success = success if self.success and self.allow_single_success() or self._autostart: self._state = "done" self._cancel_button.focus_set() self._cancel_button["default"] = "active" self._ok_button["default"] = "normal" else: # allows trying again when failed or wasn't final action self.allow_new_work() self._progress_bar.stop() # need to put to determinate mode, otherwise it looks half done self._progress_bar["mode"] = "determinate" if self.success and self._autostart and not self.log_frame.winfo_ismapped(): self.close() if not self.success: self.show_log_frame() def allow_new_work(self): self._state = "idle" self._ok_button.focus_set() self._ok_button["default"] = "active" self._cancel_button["default"] = "normal" class SubprocessDialog(WorkDialog): """Shows incrementally the output of given subprocess. Allows cancelling""" def __init__(self, master, proc, title, long_description=None, autostart=True): self._proc = proc self.stdout = "" self.stderr = "" self._stdout_thread = None self._stderr_thread = None self._title = title self._long_description = long_description self.returncode = None super().__init__(master, autostart=autostart) def is_ready_for_work(self): return True def get_title(self): return self._title def get_instructions(self) -> Optional[str]: return self._long_description def start_work(self): if hasattr(self._proc, "cmd"): try: self.append_text(subprocess.list2cmdline(self._proc.cmd) + "\n") except: logger.warning("Could not extract cmd (%s)", self._proc.cmd) self._start_listening_current_proc() def _start_listening_current_proc(self): def listen_stream(stream_name): stream = getattr(self._proc, stream_name) while True: data = stream.readline() self.append_text(data, stream_name) self._check_set_action_text_from_output_line(data) setattr(self, stream_name, getattr(self, stream_name) + data) if data == "": logger.debug("Finished reading %s", stream_name) break if stream_name == "stdout": self._finish_process() logger.debug("Returning from reading %s", stream_name) self._stdout_thread = threading.Thread(target=listen_stream, args=["stdout"], daemon=True) self._stdout_thread.start() if self._proc.stderr is not None: self._stderr_thread = threading.Thread( target=listen_stream, args=["stderr"], daemon=True ) self._stderr_thread.start() def _finish_process(self): self.returncode = self._proc.wait() logger.debug("Process ended with returncode %s", self.returncode) if self.returncode: self.set_action_text("Error") self.append_text("Error: process returned with code %s\n" % self.returncode) else: self.set_action_text("Done!") self.append_text("Done!") self.report_done(self.returncode == 0) def get_action_text_max_length(self): return 35 def _check_set_action_text_from_output_line(self, line): if len(line) > self.get_action_text_max_length(): line = line[: self.get_action_text_max_length() - 3].strip() + "..." if line: self.set_action_text(line.strip()) def cancel_work(self): super().cancel_work() # try gently first try: try: if running_on_windows(): os.kill(self._proc.pid, signal.CTRL_BREAK_EVENT) # pylint: disable=no-member else: os.kill(self._proc.pid, signal.SIGINT) self._proc.wait(2) except subprocess.TimeoutExpired: if self._proc.poll() is None: # now let's be more concrete self._proc.kill() except OSError as e: messagebox.showerror("Error", "Could not kill subprocess: " + str(e), master=self) logger.error("Could not kill subprocess", exc_info=e) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1734368151.4017167 thonny-4.1.7/thonny.egg-info/0000755000076600000240000000000014730055627016427 5ustar00aivarannamaastaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/PKG-INFO0000644000076600000240000000372614730055626017533 0ustar00aivarannamaastaffMetadata-Version: 2.1 Name: thonny Version: 4.1.7 Summary: Python IDE for beginners Home-page: https://thonny.org Author: Aivar Annamaa and others Author-email: thonny@googlegroups.com License: MIT Project-URL: Source code, https://github.com/thonny/thonny Project-URL: Bug tracker, https://github.com/thonny/thonny/issues Keywords: IDE education debugger Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: MacOS X Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: License :: Freeware Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Education Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Text Editors Requires-Python: >=3.8 License-File: LICENSE.txt Requires-Dist: jedi>=0.18.1 Requires-Dist: setuptools>=45.2 Requires-Dist: pyserial>=3.4 Requires-Dist: pylint>=2.4 Requires-Dist: docutils>=0.16 Requires-Dist: mypy>=0.761 Requires-Dist: asttokens>=2.0 Requires-Dist: Send2Trash>=1.5 Requires-Dist: wheel Thonny is a simple Python IDE with features useful for learning programming. See https://thonny.org for more info. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/SOURCES.txt0000644000076600000240000013237214730055626020322 0ustar00aivarannamaastaffCHANGELOG.rst CREDITS.rst LICENSE.txt MANIFEST.in README.rst pyproject.toml requirements.txt setup.py exa/../thonny/locale/.DS_Store exa/../thonny/locale/compile_mo.bat exa/../thonny/locale/register_updates.py exa/../thonny/locale/thonny.pot exa/../thonny/locale/update_pot.bat exa/../thonny/locale/ar_AR/LC_MESSAGES/thonny.mo exa/../thonny/locale/ar_AR/LC_MESSAGES/thonny.po exa/../thonny/locale/be_BY/LC_MESSAGES/thonny.mo exa/../thonny/locale/be_BY/LC_MESSAGES/thonny.po exa/../thonny/locale/ca_ES/LC_MESSAGES/thonny.mo exa/../thonny/locale/ca_ES/LC_MESSAGES/thonny.po exa/../thonny/locale/cs_CZ/LC_MESSAGES/thonny.mo exa/../thonny/locale/cs_CZ/LC_MESSAGES/thonny.po exa/../thonny/locale/de_DE/LC_MESSAGES/thonny.mo exa/../thonny/locale/de_DE/LC_MESSAGES/thonny.po exa/../thonny/locale/el_GR/LC_MESSAGES/thonny.mo exa/../thonny/locale/el_GR/LC_MESSAGES/thonny.po exa/../thonny/locale/en_GB/LC_MESSAGES/thonny.mo exa/../thonny/locale/en_GB/LC_MESSAGES/thonny.po exa/../thonny/locale/en_US/LC_MESSAGES/thonny.mo exa/../thonny/locale/en_US/LC_MESSAGES/thonny.po exa/../thonny/locale/es_ES/HELP_CONTENT/debuggers.rst exa/../thonny/locale/es_ES/HELP_CONTENT/debugging.rst exa/../thonny/locale/es_ES/HELP_CONTENT/errors.rst exa/../thonny/locale/es_ES/LC_MESSAGES/thonny.mo exa/../thonny/locale/es_ES/LC_MESSAGES/thonny.po exa/../thonny/locale/et_EE/LC_MESSAGES/thonny.mo exa/../thonny/locale/et_EE/LC_MESSAGES/thonny.po exa/../thonny/locale/eu_ES/LC_MESSAGES/thonny.mo exa/../thonny/locale/eu_ES/LC_MESSAGES/thonny.po exa/../thonny/locale/fa_IR/LC_MESSAGES/thonny.mo exa/../thonny/locale/fa_IR/LC_MESSAGES/thonny.po exa/../thonny/locale/fi_FI/LC_MESSAGES/thonny.mo exa/../thonny/locale/fi_FI/LC_MESSAGES/thonny.po exa/../thonny/locale/fr_FR/HELP_CONTENT/birdseye.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/debuggers.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/debugging.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/dock.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/errors.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/flask.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/index.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/modes.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/packages.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/plotter.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/program_arguments.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/shell.rst exa/../thonny/locale/fr_FR/HELP_CONTENT/turtle.rst exa/../thonny/locale/fr_FR/LC_MESSAGES/thonny.mo exa/../thonny/locale/fr_FR/LC_MESSAGES/thonny.po exa/../thonny/locale/hu_HU/LC_MESSAGES/thonny.mo exa/../thonny/locale/hu_HU/LC_MESSAGES/thonny.po exa/../thonny/locale/hy_AM/LC_MESSAGES/thonny.mo exa/../thonny/locale/hy_AM/LC_MESSAGES/thonny.po exa/../thonny/locale/it_IT/LC_MESSAGES/thonny.mo exa/../thonny/locale/it_IT/LC_MESSAGES/thonny.po exa/../thonny/locale/ja_JP/LC_MESSAGES/thonny.mo exa/../thonny/locale/ja_JP/LC_MESSAGES/thonny.po exa/../thonny/locale/ko_KR/HELP_CONTENT/birdseye.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/debuggers.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/debugging.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/dock.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/errors.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/flask.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/index.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/modes.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/packages.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/plotter.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/program_arguments.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/shell.rst exa/../thonny/locale/ko_KR/HELP_CONTENT/turtle.rst exa/../thonny/locale/ko_KR/LC_MESSAGES/thonny.mo exa/../thonny/locale/ko_KR/LC_MESSAGES/thonny.po exa/../thonny/locale/lt_LT/LC_MESSAGES/thonny.mo exa/../thonny/locale/lt_LT/LC_MESSAGES/thonny.po exa/../thonny/locale/nb_NO/HELP_CONTENT/debugging.rst exa/../thonny/locale/nb_NO/HELP_CONTENT/errors.rst exa/../thonny/locale/nb_NO/HELP_CONTENT/index.rst exa/../thonny/locale/nb_NO/HELP_CONTENT/shell.rst exa/../thonny/locale/nb_NO/LC_MESSAGES/thonny.mo exa/../thonny/locale/nb_NO/LC_MESSAGES/thonny.po exa/../thonny/locale/nl_NL/LC_MESSAGES/thonny.mo exa/../thonny/locale/nl_NL/LC_MESSAGES/thonny.po exa/../thonny/locale/nn_NO/LC_MESSAGES/thonny.mo exa/../thonny/locale/nn_NO/LC_MESSAGES/thonny.po exa/../thonny/locale/pl_PL/LC_MESSAGES/thonny.mo exa/../thonny/locale/pl_PL/LC_MESSAGES/thonny.po exa/../thonny/locale/pt_BR/HELP_CONTENT/assistant.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/birdseye.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/debuggers.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/debugging.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/dock.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/errors.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/flask.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/index.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/modes.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/packages.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/plotter.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/program_arguments.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/shell.rst exa/../thonny/locale/pt_BR/HELP_CONTENT/turtle.rst exa/../thonny/locale/pt_BR/LC_MESSAGES/thonny.mo exa/../thonny/locale/pt_BR/LC_MESSAGES/thonny.po exa/../thonny/locale/pt_PT/LC_MESSAGES/thonny.mo exa/../thonny/locale/pt_PT/LC_MESSAGES/thonny.po exa/../thonny/locale/ro_RO/LC_MESSAGES/thonny.mo exa/../thonny/locale/ro_RO/LC_MESSAGES/thonny.po exa/../thonny/locale/ru_RU/LC_MESSAGES/thonny.mo exa/../thonny/locale/ru_RU/LC_MESSAGES/thonny.po exa/../thonny/locale/sk_SK/LC_MESSAGES/thonny.mo exa/../thonny/locale/sk_SK/LC_MESSAGES/thonny.po exa/../thonny/locale/sl_SI/LC_MESSAGES/thonny.mo exa/../thonny/locale/sl_SI/LC_MESSAGES/thonny.po exa/../thonny/locale/sq_AL/LC_MESSAGES/thonny.mo exa/../thonny/locale/sq_AL/LC_MESSAGES/thonny.po exa/../thonny/locale/sv_SE/LC_MESSAGES/thonny.mo exa/../thonny/locale/sv_SE/LC_MESSAGES/thonny.po exa/../thonny/locale/ta_IN/LC_MESSAGES/thonny.mo exa/../thonny/locale/ta_IN/LC_MESSAGES/thonny.po exa/../thonny/locale/th_TH/LC_MESSAGES/thonny.mo exa/../thonny/locale/th_TH/LC_MESSAGES/thonny.po exa/../thonny/locale/tr_TR/LC_MESSAGES/thonny.mo exa/../thonny/locale/tr_TR/LC_MESSAGES/thonny.po exa/../thonny/locale/uk_UA/LC_MESSAGES/thonny.mo exa/../thonny/locale/uk_UA/LC_MESSAGES/thonny.po exa/../thonny/locale/vi_VN/.DS_Store exa/../thonny/locale/vi_VN/LC_MESSAGES/.DS_Store exa/../thonny/locale/vi_VN/LC_MESSAGES/thonny.mo exa/../thonny/locale/vi_VN/LC_MESSAGES/thonny.po exa/../thonny/locale/zh_CN/LC_MESSAGES/thonny.mo exa/../thonny/locale/zh_CN/LC_MESSAGES/thonny.po exa/../thonny/locale/zh_Hans/LC_MESSAGES/thonny.mo exa/../thonny/locale/zh_Hans/LC_MESSAGES/thonny.po exa/../thonny/locale/zh_TW/LC_MESSAGES/thonny.mo exa/../thonny/locale/zh_TW/LC_MESSAGES/thonny.po exa/../thonny/vendored_libs/.DS_Store exa/../thonny/vendored_libs/filelock/__init__.py exa/../thonny/vendored_libs/filelock/_api.py exa/../thonny/vendored_libs/filelock/_error.py exa/../thonny/vendored_libs/filelock/_soft.py exa/../thonny/vendored_libs/filelock/_unix.py exa/../thonny/vendored_libs/filelock/_util.py exa/../thonny/vendored_libs/filelock/_windows.py exa/../thonny/vendored_libs/filelock/py.typed exa/../thonny/vendored_libs/filelock/version.py exa/../thonny/vendored_libs/pipkin/__init__.py exa/../thonny/vendored_libs/pipkin/__main__.py exa/../thonny/vendored_libs/pipkin/adapters.py exa/../thonny/vendored_libs/pipkin/bare_metal.py exa/../thonny/vendored_libs/pipkin/common.py exa/../thonny/vendored_libs/pipkin/connection.py exa/../thonny/vendored_libs/pipkin/parser.py exa/../thonny/vendored_libs/pipkin/proxy.py exa/../thonny/vendored_libs/pipkin/serial_connection.py exa/../thonny/vendored_libs/pipkin/session.py exa/../thonny/vendored_libs/pipkin/util.py exa/../thonny/vendored_libs/pipkin/webrepl_connection.py exa/../thonny/vendored_libs/serial/.DS_Store licenses/ECLIPSE-ICONS-LICENSE.txt packaging/icons/thonny-128x128.png packaging/icons/thonny-16x16.png packaging/icons/thonny-192x192.png packaging/icons/thonny-2.png packaging/icons/thonny-22x22.png packaging/icons/thonny-256x256.png packaging/icons/thonny-32x32.png packaging/icons/thonny-48x48.png packaging/icons/thonny-64x64.png packaging/linux/org.thonny.Thonny.appdata.xml packaging/linux/org.thonny.Thonny.desktop packaging/linux/thonny.1 thonny/VERSION thonny/__init__.py thonny/__main__.py thonny/assistance.py thonny/ast_utils.py thonny/backend.py thonny/base_file_browser.py thonny/codeview.py thonny/common.py thonny/config.py thonny/config_ui.py thonny/defaults.ini thonny/editor_helpers.py thonny/editors.py thonny/export.py thonny/first_run.py thonny/gridtable.py thonny/jedi_utils.py thonny/languages.py thonny/memory.py thonny/misc_utils.py thonny/roughparse.py thonny/rst_utils.py thonny/running.py thonny/shell.py thonny/terminal.py thonny/tktextext.py thonny/token_utils.py thonny/udisks.py thonny/ui_utils.py thonny/workbench.py thonny/workdlg.py thonny.egg-info/PKG-INFO thonny.egg-info/SOURCES.txt thonny.egg-info/dependency_links.txt thonny.egg-info/entry_points.txt thonny.egg-info/requires.txt thonny.egg-info/top_level.txt thonny/dbus/org.freedesktop.DBus.ObjectManager.xml thonny/dbus/org.freedesktop.UDisks2.xml thonny/locale/.DS_Store thonny/locale/compile_mo.bat thonny/locale/register_updates.py thonny/locale/thonny.pot thonny/locale/update_pot.bat thonny/locale/ar_AR/LC_MESSAGES/thonny.mo thonny/locale/ar_AR/LC_MESSAGES/thonny.po thonny/locale/be_BY/LC_MESSAGES/thonny.mo thonny/locale/be_BY/LC_MESSAGES/thonny.po thonny/locale/ca_ES/LC_MESSAGES/thonny.mo thonny/locale/ca_ES/LC_MESSAGES/thonny.po thonny/locale/cs_CZ/LC_MESSAGES/thonny.mo thonny/locale/cs_CZ/LC_MESSAGES/thonny.po thonny/locale/de_DE/LC_MESSAGES/thonny.mo thonny/locale/de_DE/LC_MESSAGES/thonny.po thonny/locale/el_GR/LC_MESSAGES/thonny.mo thonny/locale/el_GR/LC_MESSAGES/thonny.po thonny/locale/en_GB/LC_MESSAGES/thonny.mo thonny/locale/en_GB/LC_MESSAGES/thonny.po thonny/locale/en_US/LC_MESSAGES/thonny.mo thonny/locale/en_US/LC_MESSAGES/thonny.po thonny/locale/es_ES/HELP_CONTENT/debuggers.rst thonny/locale/es_ES/HELP_CONTENT/debugging.rst thonny/locale/es_ES/HELP_CONTENT/errors.rst thonny/locale/es_ES/LC_MESSAGES/thonny.mo thonny/locale/es_ES/LC_MESSAGES/thonny.po thonny/locale/et_EE/LC_MESSAGES/thonny.mo thonny/locale/et_EE/LC_MESSAGES/thonny.po thonny/locale/eu_ES/LC_MESSAGES/thonny.mo thonny/locale/eu_ES/LC_MESSAGES/thonny.po thonny/locale/fa_IR/LC_MESSAGES/thonny.mo thonny/locale/fa_IR/LC_MESSAGES/thonny.po thonny/locale/fi_FI/LC_MESSAGES/thonny.mo thonny/locale/fi_FI/LC_MESSAGES/thonny.po thonny/locale/fr_FR/HELP_CONTENT/birdseye.rst thonny/locale/fr_FR/HELP_CONTENT/debuggers.rst thonny/locale/fr_FR/HELP_CONTENT/debugging.rst thonny/locale/fr_FR/HELP_CONTENT/dock.rst thonny/locale/fr_FR/HELP_CONTENT/errors.rst thonny/locale/fr_FR/HELP_CONTENT/flask.rst thonny/locale/fr_FR/HELP_CONTENT/index.rst thonny/locale/fr_FR/HELP_CONTENT/modes.rst thonny/locale/fr_FR/HELP_CONTENT/packages.rst thonny/locale/fr_FR/HELP_CONTENT/plotter.rst thonny/locale/fr_FR/HELP_CONTENT/program_arguments.rst thonny/locale/fr_FR/HELP_CONTENT/shell.rst thonny/locale/fr_FR/HELP_CONTENT/turtle.rst thonny/locale/fr_FR/LC_MESSAGES/thonny.mo thonny/locale/fr_FR/LC_MESSAGES/thonny.po thonny/locale/hu_HU/LC_MESSAGES/thonny.mo thonny/locale/hu_HU/LC_MESSAGES/thonny.po thonny/locale/hy_AM/LC_MESSAGES/thonny.mo thonny/locale/hy_AM/LC_MESSAGES/thonny.po thonny/locale/it_IT/LC_MESSAGES/thonny.mo thonny/locale/it_IT/LC_MESSAGES/thonny.po thonny/locale/ja_JP/LC_MESSAGES/thonny.mo thonny/locale/ja_JP/LC_MESSAGES/thonny.po thonny/locale/ko_KR/HELP_CONTENT/birdseye.rst thonny/locale/ko_KR/HELP_CONTENT/debuggers.rst thonny/locale/ko_KR/HELP_CONTENT/debugging.rst thonny/locale/ko_KR/HELP_CONTENT/dock.rst thonny/locale/ko_KR/HELP_CONTENT/errors.rst thonny/locale/ko_KR/HELP_CONTENT/flask.rst thonny/locale/ko_KR/HELP_CONTENT/index.rst thonny/locale/ko_KR/HELP_CONTENT/modes.rst thonny/locale/ko_KR/HELP_CONTENT/packages.rst thonny/locale/ko_KR/HELP_CONTENT/plotter.rst thonny/locale/ko_KR/HELP_CONTENT/program_arguments.rst thonny/locale/ko_KR/HELP_CONTENT/shell.rst thonny/locale/ko_KR/HELP_CONTENT/turtle.rst thonny/locale/ko_KR/LC_MESSAGES/thonny.mo thonny/locale/ko_KR/LC_MESSAGES/thonny.po thonny/locale/lt_LT/LC_MESSAGES/thonny.mo thonny/locale/lt_LT/LC_MESSAGES/thonny.po thonny/locale/nb_NO/HELP_CONTENT/debugging.rst thonny/locale/nb_NO/HELP_CONTENT/errors.rst thonny/locale/nb_NO/HELP_CONTENT/index.rst thonny/locale/nb_NO/HELP_CONTENT/shell.rst thonny/locale/nb_NO/LC_MESSAGES/thonny.mo thonny/locale/nb_NO/LC_MESSAGES/thonny.po thonny/locale/nl_NL/LC_MESSAGES/thonny.mo thonny/locale/nl_NL/LC_MESSAGES/thonny.po thonny/locale/nn_NO/LC_MESSAGES/thonny.mo thonny/locale/nn_NO/LC_MESSAGES/thonny.po thonny/locale/pl_PL/LC_MESSAGES/thonny.mo thonny/locale/pl_PL/LC_MESSAGES/thonny.po thonny/locale/pt_BR/HELP_CONTENT/assistant.rst thonny/locale/pt_BR/HELP_CONTENT/birdseye.rst thonny/locale/pt_BR/HELP_CONTENT/debuggers.rst thonny/locale/pt_BR/HELP_CONTENT/debugging.rst thonny/locale/pt_BR/HELP_CONTENT/dock.rst thonny/locale/pt_BR/HELP_CONTENT/errors.rst thonny/locale/pt_BR/HELP_CONTENT/flask.rst thonny/locale/pt_BR/HELP_CONTENT/index.rst thonny/locale/pt_BR/HELP_CONTENT/modes.rst thonny/locale/pt_BR/HELP_CONTENT/packages.rst thonny/locale/pt_BR/HELP_CONTENT/plotter.rst thonny/locale/pt_BR/HELP_CONTENT/program_arguments.rst thonny/locale/pt_BR/HELP_CONTENT/shell.rst thonny/locale/pt_BR/HELP_CONTENT/turtle.rst thonny/locale/pt_BR/LC_MESSAGES/thonny.mo thonny/locale/pt_BR/LC_MESSAGES/thonny.po thonny/locale/pt_PT/LC_MESSAGES/thonny.mo thonny/locale/pt_PT/LC_MESSAGES/thonny.po thonny/locale/ro_RO/LC_MESSAGES/thonny.mo thonny/locale/ro_RO/LC_MESSAGES/thonny.po thonny/locale/ru_RU/LC_MESSAGES/thonny.mo thonny/locale/ru_RU/LC_MESSAGES/thonny.po thonny/locale/sk_SK/LC_MESSAGES/thonny.mo thonny/locale/sk_SK/LC_MESSAGES/thonny.po thonny/locale/sl_SI/LC_MESSAGES/thonny.mo thonny/locale/sl_SI/LC_MESSAGES/thonny.po thonny/locale/sq_AL/LC_MESSAGES/thonny.mo thonny/locale/sq_AL/LC_MESSAGES/thonny.po thonny/locale/sv_SE/LC_MESSAGES/thonny.mo thonny/locale/sv_SE/LC_MESSAGES/thonny.po thonny/locale/ta_IN/LC_MESSAGES/thonny.mo thonny/locale/ta_IN/LC_MESSAGES/thonny.po thonny/locale/th_TH/LC_MESSAGES/thonny.mo thonny/locale/th_TH/LC_MESSAGES/thonny.po thonny/locale/tr_TR/LC_MESSAGES/thonny.mo thonny/locale/tr_TR/LC_MESSAGES/thonny.po thonny/locale/uk_UA/LC_MESSAGES/thonny.mo thonny/locale/uk_UA/LC_MESSAGES/thonny.po thonny/locale/vi_VN/.DS_Store thonny/locale/vi_VN/LC_MESSAGES/.DS_Store thonny/locale/vi_VN/LC_MESSAGES/thonny.mo thonny/locale/vi_VN/LC_MESSAGES/thonny.po thonny/locale/zh_CN/LC_MESSAGES/thonny.mo thonny/locale/zh_CN/LC_MESSAGES/thonny.po thonny/locale/zh_Hans/LC_MESSAGES/thonny.mo thonny/locale/zh_Hans/LC_MESSAGES/thonny.po thonny/locale/zh_TW/LC_MESSAGES/thonny.mo thonny/locale/zh_TW/LC_MESSAGES/thonny.po thonny/plugins/__init__.py thonny/plugins/about.py thonny/plugins/assistant_config_page.py thonny/plugins/ast_view.py thonny/plugins/autocomplete.py thonny/plugins/backend_config_page.py thonny/plugins/base_syntax_themes.py thonny/plugins/base_ui_themes.py thonny/plugins/birdseye_frontend.py thonny/plugins/calltip.py thonny/plugins/cells.py thonny/plugins/clean_ui_themes.py thonny/plugins/coloring.py thonny/plugins/commenting_indenting.py thonny/plugins/common_editing_commands.py thonny/plugins/debugger.py thonny/plugins/dock_user_windows_frontend.py thonny/plugins/editor_config_page.py thonny/plugins/event_logging.py thonny/plugins/event_view.py thonny/plugins/files.py thonny/plugins/find_replace.py thonny/plugins/general_config_page.py thonny/plugins/goto_definition.py thonny/plugins/heap.py thonny/plugins/highlight_names.py thonny/plugins/locals_marker.py thonny/plugins/misc_analyzers.py thonny/plugins/notes.py thonny/plugins/object_inspector.py thonny/plugins/outline.py thonny/plugins/paren_matcher.py thonny/plugins/pgzero_frontend.py thonny/plugins/pip_gui.py thonny/plugins/pythontutor.py thonny/plugins/remove_old_data_dir.py thonny/plugins/replayer.py thonny/plugins/run_debug_config_page.py thonny/plugins/shell_config_page.py thonny/plugins/shell_macro.py thonny/plugins/statement_boxes.py thonny/plugins/stdlib_error_helpers.py thonny/plugins/terminal_config_page.py thonny/plugins/theme_and_font_config_page.py thonny/plugins/thonny_folders.py thonny/plugins/todo_view.py thonny/plugins/tomorrow_syntax_theme.py thonny/plugins/variables.py thonny/plugins/backend/__init__.py thonny/plugins/backend/birdseye_backend.py thonny/plugins/backend/dock_user_windows_backend.py thonny/plugins/backend/flask_backend.py thonny/plugins/backend/matplotlib_backend.py thonny/plugins/backend/pgzero_backend.py thonny/plugins/circuitpython/__init__.py thonny/plugins/circuitpython/cirpy_back.py thonny/plugins/circuitpython/cirpy_front.py thonny/plugins/circuitpython/api_stubs/_bleio/__init__.pyi thonny/plugins/circuitpython/api_stubs/_eve/__init__.pyi thonny/plugins/circuitpython/api_stubs/_pew/__init__.pyi thonny/plugins/circuitpython/api_stubs/_pixelmap/__init__.pyi thonny/plugins/circuitpython/api_stubs/_stage/__init__.pyi thonny/plugins/circuitpython/api_stubs/adafruit_bus_device/__init__.pyi thonny/plugins/circuitpython/api_stubs/adafruit_bus_device/i2c_device/__init__.pyi thonny/plugins/circuitpython/api_stubs/adafruit_bus_device/spi_device/__init__.pyi thonny/plugins/circuitpython/api_stubs/adafruit_pixelbuf/__init__.pyi thonny/plugins/circuitpython/api_stubs/aesio/__init__.pyi thonny/plugins/circuitpython/api_stubs/alarm/__init__.pyi thonny/plugins/circuitpython/api_stubs/alarm/pin/__init__.pyi thonny/plugins/circuitpython/api_stubs/alarm/time/__init__.pyi thonny/plugins/circuitpython/api_stubs/alarm/touch/__init__.pyi thonny/plugins/circuitpython/api_stubs/analogbufio/__init__.pyi thonny/plugins/circuitpython/api_stubs/analogio/__init__.pyi thonny/plugins/circuitpython/api_stubs/atexit/__init__.pyi thonny/plugins/circuitpython/api_stubs/audiobusio/__init__.pyi thonny/plugins/circuitpython/api_stubs/audiocore/__init__.pyi thonny/plugins/circuitpython/api_stubs/audioio/__init__.pyi thonny/plugins/circuitpython/api_stubs/audiomixer/__init__.pyi thonny/plugins/circuitpython/api_stubs/audiomp3/__init__.pyi thonny/plugins/circuitpython/api_stubs/audiopwmio/__init__.pyi thonny/plugins/circuitpython/api_stubs/bitbangio/__init__.pyi thonny/plugins/circuitpython/api_stubs/bitmaptools/__init__.pyi thonny/plugins/circuitpython/api_stubs/bitops/__init__.pyi thonny/plugins/circuitpython/api_stubs/board/__init__.pyi thonny/plugins/circuitpython/api_stubs/busio/__init__.pyi thonny/plugins/circuitpython/api_stubs/camera/__init__.pyi thonny/plugins/circuitpython/api_stubs/canio/__init__.pyi thonny/plugins/circuitpython/api_stubs/countio/__init__.pyi thonny/plugins/circuitpython/api_stubs/cyw43/__init__.pyi thonny/plugins/circuitpython/api_stubs/digitalio/__init__.pyi thonny/plugins/circuitpython/api_stubs/displayio/__init__.pyi thonny/plugins/circuitpython/api_stubs/dualbank/__init__.pyi thonny/plugins/circuitpython/api_stubs/espcamera/__init__.pyi thonny/plugins/circuitpython/api_stubs/espidf/__init__.pyi thonny/plugins/circuitpython/api_stubs/espnow/__init__.pyi thonny/plugins/circuitpython/api_stubs/espulp/__init__.pyi thonny/plugins/circuitpython/api_stubs/floppyio/__init__.pyi thonny/plugins/circuitpython/api_stubs/fontio/__init__.pyi thonny/plugins/circuitpython/api_stubs/framebufferio/__init__.pyi thonny/plugins/circuitpython/api_stubs/frequencyio/__init__.pyi thonny/plugins/circuitpython/api_stubs/getpass/__init__.pyi thonny/plugins/circuitpython/api_stubs/gifio/__init__.pyi thonny/plugins/circuitpython/api_stubs/gnss/__init__.pyi thonny/plugins/circuitpython/api_stubs/hashlib/__init__.pyi thonny/plugins/circuitpython/api_stubs/i2cperipheral/__init__.pyi thonny/plugins/circuitpython/api_stubs/i2ctarget/__init__.pyi thonny/plugins/circuitpython/api_stubs/imagecapture/__init__.pyi thonny/plugins/circuitpython/api_stubs/ipaddress/__init__.pyi thonny/plugins/circuitpython/api_stubs/is31fl3741/__init__.pyi thonny/plugins/circuitpython/api_stubs/keypad/__init__.pyi thonny/plugins/circuitpython/api_stubs/math/__init__.pyi thonny/plugins/circuitpython/api_stubs/mdns/__init__.pyi thonny/plugins/circuitpython/api_stubs/memorymap/__init__.pyi thonny/plugins/circuitpython/api_stubs/memorymonitor/__init__.pyi thonny/plugins/circuitpython/api_stubs/microcontroller/__init__.pyi thonny/plugins/circuitpython/api_stubs/msgpack/__init__.pyi thonny/plugins/circuitpython/api_stubs/neopixel_write/__init__.pyi thonny/plugins/circuitpython/api_stubs/nvm/__init__.pyi thonny/plugins/circuitpython/api_stubs/onewireio/__init__.pyi thonny/plugins/circuitpython/api_stubs/os/__init__.pyi thonny/plugins/circuitpython/api_stubs/paralleldisplay/__init__.pyi thonny/plugins/circuitpython/api_stubs/ps2io/__init__.pyi thonny/plugins/circuitpython/api_stubs/pulseio/__init__.pyi thonny/plugins/circuitpython/api_stubs/pwmio/__init__.pyi thonny/plugins/circuitpython/api_stubs/qrio/__init__.pyi thonny/plugins/circuitpython/api_stubs/rainbowio/__init__.pyi thonny/plugins/circuitpython/api_stubs/random/__init__.pyi thonny/plugins/circuitpython/api_stubs/rgbmatrix/__init__.pyi thonny/plugins/circuitpython/api_stubs/rotaryio/__init__.pyi thonny/plugins/circuitpython/api_stubs/rp2pio/__init__.pyi thonny/plugins/circuitpython/api_stubs/rtc/__init__.pyi thonny/plugins/circuitpython/api_stubs/samd/__init__.pyi thonny/plugins/circuitpython/api_stubs/sdcardio/__init__.pyi thonny/plugins/circuitpython/api_stubs/sdioio/__init__.pyi thonny/plugins/circuitpython/api_stubs/sharpdisplay/__init__.pyi thonny/plugins/circuitpython/api_stubs/socketpool/__init__.pyi thonny/plugins/circuitpython/api_stubs/ssl/__init__.pyi thonny/plugins/circuitpython/api_stubs/storage/__init__.pyi thonny/plugins/circuitpython/api_stubs/struct/__init__.pyi thonny/plugins/circuitpython/api_stubs/supervisor/__init__.pyi thonny/plugins/circuitpython/api_stubs/synthio/__init__.pyi thonny/plugins/circuitpython/api_stubs/terminalio/__init__.pyi thonny/plugins/circuitpython/api_stubs/time/__init__.pyi thonny/plugins/circuitpython/api_stubs/touchio/__init__.pyi thonny/plugins/circuitpython/api_stubs/traceback/__init__.pyi thonny/plugins/circuitpython/api_stubs/uheap/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/numpy/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/numpy/carray/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/numpy/fft/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/numpy/linalg/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/scipy/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/scipy/linalg/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/scipy/optimize/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/scipy/signal/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/user/__init__.pyi thonny/plugins/circuitpython/api_stubs/ulab/utils/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb/core/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb_cdc/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb_hid/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb_host/__init__.pyi thonny/plugins/circuitpython/api_stubs/usb_midi/__init__.pyi thonny/plugins/circuitpython/api_stubs/ustack/__init__.pyi thonny/plugins/circuitpython/api_stubs/vectorio/__init__.pyi thonny/plugins/circuitpython/api_stubs/watchdog/__init__.pyi thonny/plugins/circuitpython/api_stubs/wifi/__init__.pyi thonny/plugins/circuitpython/api_stubs/zlib/__init__.pyi thonny/plugins/cpython_backend/__init__.py thonny/plugins/cpython_backend/cp_back.py thonny/plugins/cpython_backend/cp_launcher.py thonny/plugins/cpython_backend/cp_tracers.py thonny/plugins/cpython_frontend/__init__.py thonny/plugins/cpython_frontend/cp_front.py thonny/plugins/cpython_frontend/cp_pip_gui.py thonny/plugins/cpython_ssh/__init__.py thonny/plugins/cpython_ssh/cps_back.py thonny/plugins/cpython_ssh/cps_front.py thonny/plugins/cpython_ssh/cps_pip_gui.py thonny/plugins/esp/__init__.py thonny/plugins/esp/esp_back.py thonny/plugins/esp/esp32_api_stubs/esp32.pyi thonny/plugins/esp/esp32_api_stubs/mp-1.18-esp32.txt thonny/plugins/esp/esp_common_api_stubs/esp.pyi thonny/plugins/ev3/__init__.py thonny/plugins/ev3/ev3_back.py thonny/plugins/ev3/api_stubs/pybricks/__init__.py thonny/plugins/ev3/api_stubs/pybricks/__stub/__control.py thonny/plugins/ev3/api_stubs/pybricks/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__init__.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__colorsensor.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__gyrosensor.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__infraredsensor.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__motor.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__touchsensor.py thonny/plugins/ev3/api_stubs/pybricks/ev3devices/__stub/__ultrasonicsensor.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__init__.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__battery.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__buttons.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__ev3brick.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__light.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__screen.py thonny/plugins/ev3/api_stubs/pybricks/hubs/__stub/__speaker.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__init__.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__analogsensor.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__dcmotor.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__ev3devsensor.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__i2cdevice.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__lumpdevice.py thonny/plugins/ev3/api_stubs/pybricks/iodevices/__stub/__uartdevice.py thonny/plugins/ev3/api_stubs/pybricks/media/__init__.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__init__.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__stub/__font.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__stub/__image.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__stub/__imagefile.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/media/ev3dev/__stub/__soundfile.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__init__.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__bluetoothmailboxclient.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__bluetoothmailboxserver.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__logicmailbox.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__mailbox.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__numericmailbox.py thonny/plugins/ev3/api_stubs/pybricks/messaging/__stub/__textmailbox.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__init__.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__colorsensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__energymeter.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__light.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__lightsensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__soundsensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__temperaturesensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__touchsensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__ultrasonicsensor.py thonny/plugins/ev3/api_stubs/pybricks/nxtdevices/__stub/__vernieradapter.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__init__.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__button.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__color.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__direction.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__port.py thonny/plugins/ev3/api_stubs/pybricks/parameters/__stub/__stop.py thonny/plugins/ev3/api_stubs/pybricks/robotics/__init__.py thonny/plugins/ev3/api_stubs/pybricks/robotics/__stub/__drivebase.py thonny/plugins/ev3/api_stubs/pybricks/robotics/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/tools/__init__.py thonny/plugins/ev3/api_stubs/pybricks/tools/__stub/__datalog.py thonny/plugins/ev3/api_stubs/pybricks/tools/__stub/__init__.py thonny/plugins/ev3/api_stubs/pybricks/tools/__stub/__stopwatch.py thonny/plugins/ev3/api_stubs/pybricks/tools/__stub/__tools.py thonny/plugins/help/__init__.py thonny/plugins/help/assistant.rst thonny/plugins/help/birdseye.rst thonny/plugins/help/debuggers.rst thonny/plugins/help/debugging.rst thonny/plugins/help/dock.rst thonny/plugins/help/errors.rst thonny/plugins/help/flask.rst thonny/plugins/help/index.rst thonny/plugins/help/modes.rst thonny/plugins/help/packages.rst thonny/plugins/help/plotter.rst thonny/plugins/help/program_arguments.rst thonny/plugins/help/shell.rst thonny/plugins/help/turtle.rst thonny/plugins/microbit/__init__.py thonny/plugins/microbit/microbit_back.py thonny/plugins/microbit/api_stubs/antigravity.pyi thonny/plugins/microbit/api_stubs/array.pyi thonny/plugins/microbit/api_stubs/audio.pyi thonny/plugins/microbit/api_stubs/collections.py thonny/plugins/microbit/api_stubs/gc.py thonny/plugins/microbit/api_stubs/love.pyi thonny/plugins/microbit/api_stubs/machine.py thonny/plugins/microbit/api_stubs/math.py thonny/plugins/microbit/api_stubs/microbit.pyi thonny/plugins/microbit/api_stubs/micropython.py thonny/plugins/microbit/api_stubs/music.pyi thonny/plugins/microbit/api_stubs/neopixel.pyi thonny/plugins/microbit/api_stubs/os.pyi thonny/plugins/microbit/api_stubs/radio.pyi thonny/plugins/microbit/api_stubs/random.pyi thonny/plugins/microbit/api_stubs/speech.pyi thonny/plugins/microbit/api_stubs/struct.pyi thonny/plugins/microbit/api_stubs/sys.pyi thonny/plugins/microbit/api_stubs/this.pyi thonny/plugins/microbit/api_stubs/time.py thonny/plugins/microbit/api_stubs/uarray.pyi thonny/plugins/microbit/api_stubs/ucollections.py thonny/plugins/microbit/api_stubs/ustruct.pyi thonny/plugins/microbit/api_stubs/utime.pyi thonny/plugins/micropython/__init__.py thonny/plugins/micropython/bare_metal_backend.py thonny/plugins/micropython/base_flashing_dialog.py thonny/plugins/micropython/connection.py thonny/plugins/micropython/esptool_dialog.py thonny/plugins/micropython/miniterm_wrapper.py thonny/plugins/micropython/mp_back.py thonny/plugins/micropython/mp_common.py thonny/plugins/micropython/mp_front.py thonny/plugins/micropython/os_mp_backend.py thonny/plugins/micropython/pip_gui.py thonny/plugins/micropython/serial_connection.py thonny/plugins/micropython/ssh_connection.py thonny/plugins/micropython/subprocess_connection.py thonny/plugins/micropython/uf2dialog.py thonny/plugins/micropython/webrepl_connection.py thonny/plugins/micropython/base_api_stubs/LICENSE thonny/plugins/micropython/base_api_stubs/_thread.pyi thonny/plugins/micropython/base_api_stubs/array.pyi thonny/plugins/micropython/base_api_stubs/binascii.pyi thonny/plugins/micropython/base_api_stubs/bluetooth.pyi thonny/plugins/micropython/base_api_stubs/btree.pyi thonny/plugins/micropython/base_api_stubs/cmath.pyi thonny/plugins/micropython/base_api_stubs/collections.pyi thonny/plugins/micropython/base_api_stubs/cryptolib.pyi thonny/plugins/micropython/base_api_stubs/errno.pyi thonny/plugins/micropython/base_api_stubs/framebuf.pyi thonny/plugins/micropython/base_api_stubs/gc.pyi thonny/plugins/micropython/base_api_stubs/hashlib.pyi thonny/plugins/micropython/base_api_stubs/heapq.pyi thonny/plugins/micropython/base_api_stubs/io.pyi thonny/plugins/micropython/base_api_stubs/json.pyi thonny/plugins/micropython/base_api_stubs/lcd160cr.pyi thonny/plugins/micropython/base_api_stubs/machine.pyi thonny/plugins/micropython/base_api_stubs/math.pyi thonny/plugins/micropython/base_api_stubs/micropython.pyi thonny/plugins/micropython/base_api_stubs/neopixel.pyi thonny/plugins/micropython/base_api_stubs/network.pyi thonny/plugins/micropython/base_api_stubs/os.pyi thonny/plugins/micropython/base_api_stubs/re.pyi thonny/plugins/micropython/base_api_stubs/select.pyi thonny/plugins/micropython/base_api_stubs/socket.pyi thonny/plugins/micropython/base_api_stubs/ssl.pyi thonny/plugins/micropython/base_api_stubs/statistics.pyi thonny/plugins/micropython/base_api_stubs/struct.pyi thonny/plugins/micropython/base_api_stubs/sys.pyi thonny/plugins/micropython/base_api_stubs/time.pyi thonny/plugins/micropython/base_api_stubs/uarray.pyi thonny/plugins/micropython/base_api_stubs/uasyncio.pyi thonny/plugins/micropython/base_api_stubs/ubinascii.pyi thonny/plugins/micropython/base_api_stubs/ubluetooth.pyi thonny/plugins/micropython/base_api_stubs/ucollections.pyi thonny/plugins/micropython/base_api_stubs/ucryptolib.pyi thonny/plugins/micropython/base_api_stubs/uctypes.pyi thonny/plugins/micropython/base_api_stubs/uerrno.pyi thonny/plugins/micropython/base_api_stubs/uhashlib.pyi thonny/plugins/micropython/base_api_stubs/uheapq.pyi thonny/plugins/micropython/base_api_stubs/uio.pyi thonny/plugins/micropython/base_api_stubs/ujson.pyi thonny/plugins/micropython/base_api_stubs/uos.pyi thonny/plugins/micropython/base_api_stubs/urandom.pyi thonny/plugins/micropython/base_api_stubs/ure.pyi thonny/plugins/micropython/base_api_stubs/uselect.pyi thonny/plugins/micropython/base_api_stubs/usocket.pyi thonny/plugins/micropython/base_api_stubs/ussl.pyi thonny/plugins/micropython/base_api_stubs/ustruct.pyi thonny/plugins/micropython/base_api_stubs/usys.pyi thonny/plugins/micropython/base_api_stubs/utime.pyi thonny/plugins/micropython/base_api_stubs/uzlib.pyi thonny/plugins/micropython/base_api_stubs/zlib.pyi thonny/plugins/micropython/generic_api_stubs/pyb.pyi thonny/plugins/micropython/generic_api_stubs/stm.pyi thonny/plugins/mypy/__init__.py thonny/plugins/pi/__init__.py thonny/plugins/pi/res/Ukraine.png thonny/plugins/pi/res/Ukraine48.png thonny/plugins/pi/res/_disabled_debug-run-cursor.png thonny/plugins/pi/res/_disabled_debug-run-cursor48.png thonny/plugins/pi/res/_disabled_debug-run.png thonny/plugins/pi/res/_disabled_debug-run48.png thonny/plugins/pi/res/_disabled_debug-step-into.png thonny/plugins/pi/res/_disabled_debug-step-into48.png thonny/plugins/pi/res/_disabled_debug-step-out.png thonny/plugins/pi/res/_disabled_debug-step-out48.png thonny/plugins/pi/res/_disabled_debug-step-over.png thonny/plugins/pi/res/_disabled_debug-step-over48.png thonny/plugins/pi/res/_disabled_document-new.png thonny/plugins/pi/res/_disabled_document-new48.png thonny/plugins/pi/res/_disabled_document-open.png thonny/plugins/pi/res/_disabled_document-open48.png thonny/plugins/pi/res/_disabled_document-save.png thonny/plugins/pi/res/_disabled_document-save48.png thonny/plugins/pi/res/_disabled_media-playback-start.png thonny/plugins/pi/res/_disabled_media-playback-start48.png thonny/plugins/pi/res/_disabled_process-stop.png thonny/plugins/pi/res/_disabled_process-stop48.png thonny/plugins/pi/res/_disabled_quit.png thonny/plugins/pi/res/_disabled_quit48.png thonny/plugins/pi/res/_disabled_resume.png thonny/plugins/pi/res/_disabled_resume48.png thonny/plugins/pi/res/_disabled_scrollbar-button-down-insens.png thonny/plugins/pi/res/_disabled_scrollbar-button-down.png thonny/plugins/pi/res/_disabled_scrollbar-button-left-insens.png thonny/plugins/pi/res/_disabled_scrollbar-button-left.png thonny/plugins/pi/res/_disabled_scrollbar-button-right-insens.png thonny/plugins/pi/res/_disabled_scrollbar-button-right.png thonny/plugins/pi/res/_disabled_scrollbar-button-up-insens.png thonny/plugins/pi/res/_disabled_scrollbar-button-up.png thonny/plugins/pi/res/_disabled_window-close-act.png thonny/plugins/pi/res/_disabled_window-close.png thonny/plugins/pi/res/_disabled_zoom.png thonny/plugins/pi/res/_disabled_zoom48.png thonny/plugins/pi/res/debug-run-cursor.png thonny/plugins/pi/res/debug-run-cursor48.png thonny/plugins/pi/res/debug-run.png thonny/plugins/pi/res/debug-run48.png thonny/plugins/pi/res/debug-step-into.png thonny/plugins/pi/res/debug-step-into48.png thonny/plugins/pi/res/debug-step-out.png thonny/plugins/pi/res/debug-step-out48.png thonny/plugins/pi/res/debug-step-over.png thonny/plugins/pi/res/debug-step-over48.png thonny/plugins/pi/res/document-new.png thonny/plugins/pi/res/document-new48.png thonny/plugins/pi/res/document-open.png thonny/plugins/pi/res/document-open48.png thonny/plugins/pi/res/document-save.png thonny/plugins/pi/res/document-save48.png thonny/plugins/pi/res/media-playback-start.png thonny/plugins/pi/res/media-playback-start48.png thonny/plugins/pi/res/process-stop.png thonny/plugins/pi/res/process-stop48.png thonny/plugins/pi/res/quit.png thonny/plugins/pi/res/quit48.png thonny/plugins/pi/res/resume.png thonny/plugins/pi/res/resume48.png thonny/plugins/pi/res/scrollbar-button-down-insens.png thonny/plugins/pi/res/scrollbar-button-down.png thonny/plugins/pi/res/scrollbar-button-left-insens.png thonny/plugins/pi/res/scrollbar-button-left.png thonny/plugins/pi/res/scrollbar-button-right-insens.png thonny/plugins/pi/res/scrollbar-button-right.png thonny/plugins/pi/res/scrollbar-button-up-insens.png thonny/plugins/pi/res/scrollbar-button-up.png thonny/plugins/pi/res/window-close-act.png thonny/plugins/pi/res/window-close.png thonny/plugins/pi/res/zoom.png thonny/plugins/pi/res/zoom48.png thonny/plugins/prime_inventor/__init__.py thonny/plugins/prime_inventor/prime_inventor_back.py thonny/plugins/prime_inventor/api_stubs/hub.pyi thonny/plugins/prime_inventor/api_stubs/_api/__init__.pyi thonny/plugins/prime_inventor/api_stubs/_api/app.pyi thonny/plugins/prime_inventor/api_stubs/_api/button.pyi thonny/plugins/prime_inventor/api_stubs/_api/colorsensor.pyi thonny/plugins/prime_inventor/api_stubs/_api/control.pyi thonny/plugins/prime_inventor/api_stubs/_api/distancesensor.pyi thonny/plugins/prime_inventor/api_stubs/_api/forcesensor.pyi thonny/plugins/prime_inventor/api_stubs/_api/large_technic_hub.pyi thonny/plugins/prime_inventor/api_stubs/_api/lightmatrix.pyi thonny/plugins/prime_inventor/api_stubs/_api/motionsensor.pyi thonny/plugins/prime_inventor/api_stubs/_api/motor.pyi thonny/plugins/prime_inventor/api_stubs/_api/motorpair.pyi thonny/plugins/prime_inventor/api_stubs/_api/operator.pyi thonny/plugins/prime_inventor/api_stubs/_api/speaker.pyi thonny/plugins/prime_inventor/api_stubs/_api/statuslight.pyi thonny/plugins/prime_inventor/api_stubs/_api/util.pyi thonny/plugins/prime_inventor/api_stubs/mindstorms/__init__.pyi thonny/plugins/prime_inventor/api_stubs/mindstorms/control.pyi thonny/plugins/prime_inventor/api_stubs/mindstorms/operator.pyi thonny/plugins/prime_inventor/api_stubs/mindstorms/util.pyi thonny/plugins/prime_inventor/api_stubs/spike/__init__.pyi thonny/plugins/prime_inventor/api_stubs/spike/control.pyi thonny/plugins/prime_inventor/api_stubs/spike/operator.pyi thonny/plugins/prime_inventor/api_stubs/spike/util.pyi thonny/plugins/printing/__init__.py thonny/plugins/printing/template.html thonny/plugins/pylint/__init__.py thonny/plugins/pylint/messages.py thonny/plugins/rp2040/__init__.py thonny/plugins/rp2040/rp2040_back.py thonny/plugins/rp2040/api_stubs/mp-1.18-pico.txt thonny/plugins/rp2040/api_stubs/rp2.pyi thonny/plugins/rpi_pico/__init__.py thonny/plugins/system_shell/__init__.py thonny/plugins/system_shell/explain_environment.py thonny/res/16x16-blank.gif thonny/res/1x1-white.gif thonny/res/PrintLnkTarget.vbs thonny/res/Ukraine.png thonny/res/Ukraine_2x.png thonny/res/_create_disabled_variants.py thonny/res/_disabled_16x16-blank.gif thonny/res/_disabled_1x1-white.gif thonny/res/_disabled_arrow-down.gif thonny/res/_disabled_birdseye.png thonny/res/_disabled_boxdot.png thonny/res/_disabled_boxdot_light.png thonny/res/_disabled_boxminus.png thonny/res/_disabled_boxminus_light.png thonny/res/_disabled_boxplus.png thonny/res/_disabled_boxplus_light.png thonny/res/_disabled_boxx.png thonny/res/_disabled_boxx_light.png thonny/res/_disabled_broken.png thonny/res/_disabled_closed-folder.gif thonny/res/_disabled_debug-current-script.png thonny/res/_disabled_debug-current-script_2x.png thonny/res/_disabled_delete.gif thonny/res/_disabled_folder.gif thonny/res/_disabled_generic-file.gif thonny/res/_disabled_hard-drive.gif thonny/res/_disabled_harddisk.png thonny/res/_disabled_harddisk_2x.png thonny/res/_disabled_help.png thonny/res/_disabled_help_2x.png thonny/res/_disabled_information.png thonny/res/_disabled_information_2x.png thonny/res/_disabled_nav-backward.png thonny/res/_disabled_nav-backward_2x.png thonny/res/_disabled_nav-forward.png thonny/res/_disabled_nav-forward_2x.png thonny/res/_disabled_new-file.png thonny/res/_disabled_new-file_Linux.png thonny/res/_disabled_new-file_Linux_2x.png thonny/res/_disabled_open-file.png thonny/res/_disabled_open-file_Linux.png thonny/res/_disabled_open-file_Linux_2x.png thonny/res/_disabled_open_folder.gif thonny/res/_disabled_outline-class.png thonny/res/_disabled_outline-class_2x.png thonny/res/_disabled_outline-method.gif thonny/res/_disabled_python-file.gif thonny/res/_disabled_python-icon.gif thonny/res/_disabled_quit.png thonny/res/_disabled_quit_2x.png thonny/res/_disabled_resume.png thonny/res/_disabled_resume_2x.png thonny/res/_disabled_run-current-script.png thonny/res/_disabled_run-current-script_2x.png thonny/res/_disabled_run-to-cursor.png thonny/res/_disabled_run-to-cursor_2x.png thonny/res/_disabled_save-file.png thonny/res/_disabled_save-file_2x_alt.png thonny/res/_disabled_save-file_Linux.png thonny/res/_disabled_save-file_Linux_2x.png thonny/res/_disabled_save-file_alt.png thonny/res/_disabled_star.png thonny/res/_disabled_star_2x.png thonny/res/_disabled_step-into.png thonny/res/_disabled_step-into_2x.png thonny/res/_disabled_step-out.png thonny/res/_disabled_step-out_2x.png thonny/res/_disabled_step-over.png thonny/res/_disabled_step-over_2x.png thonny/res/_disabled_stop.png thonny/res/_disabled_stop_2x.png thonny/res/_disabled_tab-close-active-clam-dark.gif thonny/res/_disabled_tab-close-active-clam.gif thonny/res/_disabled_tab-close-active.gif thonny/res/_disabled_tab-close-clam.gif thonny/res/_disabled_tab-close.gif thonny/res/_disabled_terminal.png thonny/res/_disabled_terminal_2x.png thonny/res/_disabled_text-file.gif thonny/res/_disabled_thonny.png thonny/res/_disabled_zoom.png thonny/res/arrow-down.gif thonny/res/birdseye.png thonny/res/boxdot.png thonny/res/boxdot_light.png thonny/res/boxminus.png thonny/res/boxminus_light.png thonny/res/boxplus.png thonny/res/boxplus_light.png thonny/res/boxx.png thonny/res/boxx_light.png thonny/res/broken.png thonny/res/closed-folder.gif thonny/res/debug-current-script.png thonny/res/debug-current-script_2x.png thonny/res/delete.gif thonny/res/folder.gif thonny/res/generic-file.gif thonny/res/hard-drive.gif thonny/res/harddisk.png thonny/res/harddisk_2x.png thonny/res/help.png thonny/res/help_2x.png thonny/res/information.png thonny/res/information_2x.png thonny/res/nav-backward.png thonny/res/nav-backward_2x.png thonny/res/nav-forward.png thonny/res/nav-forward_2x.png thonny/res/new-file.png thonny/res/new-file_Linux.png thonny/res/new-file_Linux_2x.png thonny/res/open-file.png thonny/res/open-file_Linux.png thonny/res/open-file_Linux_2x.png thonny/res/open_folder.gif thonny/res/outline-class.png thonny/res/outline-class_2x.png thonny/res/outline-method.gif thonny/res/python-file.gif thonny/res/python-icon.gif thonny/res/python-icon_2x.png thonny/res/quit.png thonny/res/quit_2x.png thonny/res/resume.png thonny/res/resume_2x.png thonny/res/run-current-script.png thonny/res/run-current-script_2x.png thonny/res/run-to-cursor.png thonny/res/run-to-cursor_2x.png thonny/res/save-file.png thonny/res/save-file_2x_alt.png thonny/res/save-file_Linux.png thonny/res/save-file_Linux_2x.png thonny/res/save-file_alt.png thonny/res/star.png thonny/res/star_2x.png thonny/res/step-into.png thonny/res/step-into_2x.png thonny/res/step-out.png thonny/res/step-out_2x.png thonny/res/step-over.png thonny/res/step-over_2x.png thonny/res/stop.png thonny/res/stop_2x.png thonny/res/tab-close-active-clam-dark.gif thonny/res/tab-close-active-clam.gif thonny/res/tab-close-active.gif thonny/res/tab-close-clam.gif thonny/res/tab-close.gif thonny/res/terminal.png thonny/res/terminal_2x.png thonny/res/text-file.gif thonny/res/thonny.ico thonny/res/thonny.png thonny/res/thonny_small.ico thonny/res/zoom.png thonny/test/__init__.py thonny/test/test_common.py thonny/test/plugins/__init__.py thonny/test/plugins/test_locals_marker.py thonny/test/plugins/test_name_highlighter.py thonny/test/plugins/test_pip_gui.py thonny/vendored_libs/.DS_Store thonny/vendored_libs/basedpyright/.DS_Store thonny/vendored_libs/basedpyright/dist/.DS_Store thonny/vendored_libs/basedpyright/dist/typeshed-fallback/.DS_Store thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stdlib/venv/__init__.pyi thonny/vendored_libs/basedpyright/dist/typeshed-fallback/stubs/.DS_Store thonny/vendored_libs/filelock/__init__.py thonny/vendored_libs/filelock/_api.py thonny/vendored_libs/filelock/_error.py thonny/vendored_libs/filelock/_soft.py thonny/vendored_libs/filelock/_unix.py thonny/vendored_libs/filelock/_util.py thonny/vendored_libs/filelock/_windows.py thonny/vendored_libs/filelock/py.typed thonny/vendored_libs/filelock/version.py thonny/vendored_libs/pipkin/__init__.py thonny/vendored_libs/pipkin/__main__.py thonny/vendored_libs/pipkin/adapters.py thonny/vendored_libs/pipkin/bare_metal.py thonny/vendored_libs/pipkin/common.py thonny/vendored_libs/pipkin/connection.py thonny/vendored_libs/pipkin/parser.py thonny/vendored_libs/pipkin/proxy.py thonny/vendored_libs/pipkin/serial_connection.py thonny/vendored_libs/pipkin/session.py thonny/vendored_libs/pipkin/util.py thonny/vendored_libs/pipkin/webrepl_connection.py thonny/vendored_libs/serial/.DS_Store././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/dependency_links.txt0000644000076600000240000000000114730055626022474 0ustar00aivarannamaastaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/entry_points.txt0000644000076600000240000000004514730055626021723 0ustar00aivarannamaastaff[gui_scripts] thonny = thonny:launch ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/requires.txt0000644000076600000240000000017014730055626021024 0ustar00aivarannamaastaffjedi>=0.18.1 setuptools>=45.2 pyserial>=3.4 pylint>=2.4 docutils>=0.16 mypy>=0.761 asttokens>=2.0 Send2Trash>=1.5 wheel ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1734368150.0 thonny-4.1.7/thonny.egg-info/top_level.txt0000644000076600000240000000000714730055626021155 0ustar00aivarannamaastaffthonny