{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Инфраструктура Python. GUI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Самой серьезной существующей библиотекой для десктопного графического интерфейса является Qt. Она кроссплатформенная, содержит богатый набор элементов интерфейса и их настроек. В настоящее время активнее всего используются версии Qt4 и Qt5 с заметно отличающимися API. Для Python существует набор биндингов и врапперов над ними, призванных скрыть эти несовместимости и сделать их API, заточенный под C++ и свои Q`*`-классы, более pythonic. Здесь будет описана библиотека `PyQt5`, включенная в Anaconda." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Qt-приложение обрабатывает события в главном цикле — методе `QApplication.exec_`. События присылаются системой и транслируются внутри Qt в сигналы (`signal`), которые соединяются (`connect`) со слотами (`slot`), функциями-обработчиками. События крутятся вокруг набора созданных виджетов, организованных в дерево. Корневой виджет является главным окном, при завершении которого происходит выход из `exec_`.\n", "\n", "В отдельном скрипте для запуска достаточно использовать\n", "\n", "```python\n", "app = QApplication([])\n", "window = MainWindowClass()\n", "window.show()\n", "app.exec_()\n", "```\n", "\n", "Здесь же для удобства повествования будет использоваться специальная функция `run_qt_and_screenshot`, которая принимает класс-наследник `QWidget`, создает его в качестве главного окна, запускает главный цикл, а непосредственно перед закрытием главного окна и выходом делает скриншот и выводит как результат. Сюда же включено немного своей особой магии, которую IPython требует, чтобы не создавать `QApplication` несколько раз при переисполнении ячеек." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from PyQt5.QtGui import *\n", "from PyQt5.QtCore import *\n", "from PyQt5.QtWidgets import *\n", "from PyQt5.QtWebKit import *\n", "from PyQt5.QtWebKitWidgets import *" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import PIL.Image\n", "from io import BytesIO\n", "\n", "pixmap = None\n", "def run_qt_and_screenshot(WindowClass, method='pyqt5'):\n", " app = QCoreApplication.instance()\n", " if app is None:\n", " app = QApplication([])\n", "\n", " def closeEvent(self, event):\n", " global pixmap\n", " rect = self.frameGeometry()\n", " dw = QDesktopWidget()\n", " desktop_id = dw.screen(dw.screenNumber(self)).winId()\n", " if method == 'pyside':\n", " pixmap = QPixmap.grabWindow(desktop_id, rect.x(), rect.y(), rect.width(), rect.height())\n", " elif method == 'pyqt5':\n", " pixmap = QApplication.primaryScreen().grabWindow(desktop_id, rect.x(), rect.y(), rect.width(), rect.height())\n", " event.accept()\n", " \n", " WindowClass.closeEvent = closeEvent\n", " window = WindowClass()\n", " window.show()\n", "\n", " if method == 'pyside':\n", " try:\n", " from IPython.lib.guisupport import start_event_loop_qt4\n", " start_event_loop_qt4(app)\n", " except ImportError:\n", " app.exec_()\n", " elif method == 'pyqt5':\n", " app.exec_()\n", "\n", " io = QBuffer()\n", " pixmap.save(io, 'PNG')\n", " return PIL.Image.open(BytesIO(io.data().data()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Полезная нагрузка:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class MainWindow(QWidget):\n", " def __init__(self, parent=None):\n", " super(MainWindow, self).__init__(parent)\n", " self.setWindowTitle('Hello, world')\n", " self.resize(320, 240)\n", " btn = QPushButton('Click me!', self)\n", " btn.clicked.connect(self.on_btn)\n", " def on_btn(self):\n", " QMessageBox.information(self, 'I\\'m making a note here', 'Huge success!')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_qt_and_screenshot(MainWindow)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Положение виджетов друг на друге можно настраивать вызовами `resize` или `setGeometry`, но предпочтительнее использовать лаяуты. Это контейнеры, описывающие как надо располагать виджеты внутри них, что позволяет, например, осмысленно обрабатывать изменение размера главного окна." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class MainWindow(QWidget):\n", " def __init__(self, parent=None):\n", " super(MainWindow, self).__init__(parent)\n", " self.setWindowTitle('Hello, graphics')\n", "\n", " ilayout = QHBoxLayout()\n", " self.edit = QLineEdit('sin(x)')\n", " btn = QPushButton('Draw')\n", " ilayout.addWidget(self.edit)\n", " ilayout.addWidget(btn)\n", "\n", " olayout = QVBoxLayout()\n", " self.area = QLabel()\n", " olayout.addLayout(ilayout)\n", " olayout.addWidget(self.area)\n", " self.setLayout(olayout)\n", "\n", " btn.clicked.connect(self.redraw)\n", " self.redraw()\n", "\n", " def redraw(self):\n", " expr = self.edit.text()\n", " dpi = 96\n", " ioff()\n", " figure(figsize=(400./dpi, 300./dpi), dpi=dpi)\n", " x = linspace(-5, 5)\n", " y = eval(expr, dict([('x', x)] + numpy.__dict__.items()))\n", " plot(x, y)\n", " io = BytesIO()\n", " savefig(io, format='png', dpi=dpi)\n", " close()\n", " ion()\n", " pix = QPixmap()\n", " pix.loadFromData(io.getvalue())\n", " self.area.setPixmap(pix)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_qt_and_screenshot(MainWindow)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Когда-то программа, делающая то же самое, была достойна областного конкурса исследовательских работ школьников в МАН :-) Как вариант, `matplotlib` можно встроить в Qt-приложение встроенным способом https://matplotlib.org/gallery/user_interfaces/embedding_in_qt_sgskip.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Иконографика" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Программы и сайты часто оформляются иконками, упрощающими навигацию за счет понимания семантики некоторого пункта UI не только чтением текста, но и опознаванием стоящей рядом иконки. В настоящее время более-менее сформировался иконографический язык и его \"слова\" доступны в свободно распространяемых шрифтах FontAwesome (https://fontawesome.com/cheatsheet) и ElusiveIcons (http://elusiveicons.com/icons/). Их можно использовать в Qt, используя библиотеку `qtawesome`. В момент ее импорта должен быть рабочий `QApplication`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "pip install qtawesome\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "app = QCoreApplication.instance()\n", "if app is None:\n", " app = QApplication([])\n", "import qtawesome" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def qpixmap_to_png(pixmap):\n", " io = QBuffer()\n", " pixmap.save(io, 'PNG')\n", " return io.data().data()\n", "\n", "def qicon_to_png(icon):\n", " return qpixmap_to_png(icon.pixmap(32, 32))\n", "\n", "get_ipython().display_formatter.formatters['image/png'].for_type(QIcon, qicon_to_png);" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB\nGUlEQVRYhe2W0Q2DMAxET92ECboCG3QERsgoHYER2g3YgBE6QlZwP6ARIQ4501RIFZb8g+Lcw75A\ngDPOMIU0gDhABkA8IDKnn5+5ac1vhPuFYCn7iiDSrd6WTT/Vfi9uFV7nXohN8Tsg7WLtxxuvShDS\nZNruAbkWah+ZOosnVMMR4qF+1I3JFTf5tidr23gU4fktswfTBXGcq6O3HJV9tD0cAzAQZ3w9Ik8C\nDAyA9cwPaWuzI1BAOXLjGVdNOGc9AGWe0m6LcwDkCJK6jqijRlAyYQ6A9EscF4XgSVAqglQwe2c/\nRDU6wH6OmX+/GaAnxUMXCmY0AVh/RkDZ1SaAzijOQlC5VzyCOOpKFiCOvJQmIEdcy8/443gDaATh\nX6JpL5EAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qtawesome.icon('fa.question-circle', color='blue', color_active='orange')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC\nMUlEQVRYhe2W0XHaQBCG/z1CAU4HpACBjgJsGkjoILgC0kEmDWRMBVACcQPG7yBhCggdWAVo2M3L\nrkcRdxKTCfCQ/DOaOe192t27We0d8K+LLhXIe/8K4KZmzt2lEogovdgOmLz3GYDU3i+6A5XgudmC\nOzAYDD4558ZEdCsiPQAgor2IvDDzYrvd/mjhnpl5aVw9eJZl3nsvRwmkadonojkqWxSSiKw02F0b\n1+l0vjHz92pwTej1twQ0+BOAGyLaA5iVZfm42+32Nu+cuwMwra4WwIyZV3mevwBAkiS9brf7scqp\n3oJXRfXgABZZlt2HVlTjAKAQkZEFr8t7PwcwAQDn3Gi9Xq/qjNOVzNuCqx6M0+dGbUGprwUAHA6H\nryGGtJCWRLTfbDYfYs5C3HA4/CkiPWYeVwuuLuNCu+Ccc2Mdz2IOFAxxs9pcTDMAYObPR36J6BYA\nyrJ8bPJgHDOvzGZjm4vJfIc4Z5Vq1R6TcdWCs3Gt2o9kvkPctc8COP2XkSRJ4yqMS9O0bzYb21xM\n5jvEORF5BgBtHlEZp80I1bHNxWS+Q5xj5qWOp01OIty0NhdTlLNO+KR9vbERVTk1TURklef5KPZN\npRsGW7EV4RcABYCJfhDTG6dPoba24IWIBBd2icOo8bw4Oo4BPJxyzGoCjRyAXETuY8GPEjCdetFQ\nbkJE/bYLyR/Ley92ezmHrt4Jo7fiyD2+yLLs/d9M4Oo70Kpz18C7E5jiXMH/CwB+AUNBbvxII7zi\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qtawesome.icon('fa.venus-mars')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC\n9ElEQVRYhe2WT0hUURTGfy+fo8OooaETOAZjyUBowQNNJAgKgqCkdq2iRGlXFu4daytmbR0KXEmb\nBIMWMbULK3uQY5Qt/JMjaJCSzTDOzBteizeTzzv3OTPRLs/qvnvu/b7vnnPfORf27X83pZTFJviB\nc0Ar0Cy4F4A5IKzA4j8VkCXuBdqKxI0AoWKEFBRgwiWgr0hi0cYUmPprASbcxgq5aAvAW2HuFPlp\nASslD0sWYMJZoF+YjgCPFFh32OMFbpGfqlEFXsn2qHsAieRjCkxpmjaoQVCyLajo+pAJHomv34RP\nMuEHZAKAqzLyHJHDnqAJo8jTIMMEJCnInn4s9z1TXc3NlpbTQK0DMAAD0SiNySQAZaaZrslkXrfF\n4zPsTkefGAVZBDrsHyM+35lSyAG+VVaWXw8E2oGJvbCdBHTaxuvzbneNZM2kYRjNuq4rLyORJ8fj\n8bWcY7WigmGfD6BWsS6t/cSdIpBMgN82npOR67p+RVXVa8/r6lY2VbXrZDz+/qBhrNnIccDwi07Z\nX1BlG38XnYZh3NU0bXAgGg1WZzKsulwANKVSL3oCgRsSPDtGleh0+gscbXZ2dvHe0lKvPedf3G7P\noXS6p1QskEcgxo7SBtH5o7z88WYiEc+dPBv20AmfLy+8EoyY6JRFwN5AWu2OgWiUFZfrwtFE4mtj\nKjX/q6wsOuzzBXVdH1JVdcRBgB0jrznJBEzbxt5jicQf8sZkkp+qevijx9NeaxhvLm5sNBmGMa5p\n2jPgsghkWjXA64ANFFGIntbXn88oSoU95w63XbTND7o+zu7KWLgQZReEc99dW1ufj2xvp0slv7+8\nPCmQh2W9QNoNs1F4QP5vs6DkNynZ/l6g2zYVA+4U3YyyC0MO4I6vIhPasg2pW3CFnFp4oQeJ7E0A\nFtgcO0WmAeu2eyVrHd8CBQXYRPQiqWIFLIZ1ckfyogRkRXix+rnseSazMDDhFPaSBQhCOrC6mp+d\nqMSwisw08K4Y4n3bt5z9BqAy8X+SZOXYAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qtawesome.icon('fa.camera', 'fa.ban', options=[{'scale_factor': 0.5}, {'color': 'red', 'opacity': 0.7}])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from ultra import json_file_get" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "998\n", "\n", "ei.comment ei.universal-access ei.photo ei.laptop ei.move ei.eye-close ei.hand-left ei.align-left ei.tasks ei.redux ei.quote-right-alt ei.caret-left ei.paper-clip-alt ei.laptop-alt ei.spotify ei.graph-alt ei.group ei.twitter ei.paper-clip ei.error-alt ei.broom ei.search-alt ei.vimeo ei.wrench-alt ei.foursquare ei.resize-vertical ei.opensource ei.th ei.folder-sign ei.th-list ei.speaker ei.deviantart ei.trash-alt ei.eur ei.random ei.flag-alt ei.video-chat ei.info-circle ei.circle-arrow-left ei.stop ei.smiley-alt ei.remove-circle ei.volume-up ei.reddit ei.idea-alt ei.facebook ei.w3c ei.compass ei.facetime-video ei.address-book ei.indent-left ei.friendfeed-rect ei.caret-up ei.trash ei.magic ei.gift ei.quotes ei.cogs ei.signal ei.list ei.upload ei.refresh ei.picasa ei.magnet ei.edit ei.viadeo ei.adjust ei.gbp ei.file-new ei.chevron-down ei.quote-alt ei.time-alt ei.glasses ei.resize-horizontal ei.arrow-down ei.heart-alt ei.delicious ei.picture ei.livejournal ei.globe ei.heart-empty ei.idea ei.align-center ei.tumblr ei.unlock ei.video ei.arrow-left ei.download ei.home ei.comment-alt ei.pencil-alt ei.retweet ei.hourglass ei.caret-down ei.chevron-left ei.font ei.leaf ei.file-new-alt ei.pinterest ei.screenshot ei.user ei.tags ei.print ei.flickr ei.zoom-in ei.plus-sign ei.bookmark-empty ei.map-marker ei.bold ei.question-sign ei.file-alt ei.hand-down ei.screen ei.barcode ei.thumbs-up ei.guidedog ei.pause ei.key ei.eye-open ei.path ei.smiley ei.list-alt ei.asl ei.resize-full ei.search ei.male ei.ok ei.adjust-alt ei.braille ei.credit-card ei.headphones ei.file-edit-alt ei.website ei.minus ei.filter ei.share-alt ei.inbox ei.fast-backward ei.cog ei.graph ei.circle-arrow-up ei.link ei.file-edit ei.home-alt ei.blind ei.ban-circle ei.pause-alt ei.volume-down ei.bell ei.cc ei.blogger ei.puzzle ei.inbox-alt ei.text-height ei.plurk-alt ei.phone-alt ei.ok-sign ei.brush ei.female ei.qrcode ei.scissors ei.dribbble ei.cloud ei.instagram ei.inbox-box ei.return-key ei.tint ei.text-width ei.certificate ei.bookmark ei.video-alt ei.myspace ei.question ei.align-right ei.quote-right ei.behance ei.music ei.soundcloud ei.italic ei.time ei.forward ei.wordpress ei.photo-alt ei.calendar-sign ei.stop-alt ei.fork ei.pencil ei.shopping-cart ei.exclamation-sign ei.cloud-alt ei.chevron-right ei.plurk ei.fire ei.wrench ei.envelope ei.fast-forward ei.glass ei.download-alt ei.github ei.bullhorn ei.adult ei.child ei.bulb ei.website-alt ei.digg ei.address-book-alt ei.folder ei.podcast ei.rss ei.hearing-impaired ei.stumbleupon ei.star-alt ei.star-empty ei.cog-alt ei.car ei.googleplus ei.youtube ei.record ei.hdd ei.dashboard ei.friendfeed ei.error ei.screen-alt ei.indent-right ei.torso ei.map-marker-alt ei.align-justify ei.heart ei.arrow-up ei.vkontakte ei.thumbs-down ei.lock ei.skype ei.share ei.remove ei.linkedin ei.lock-alt ei.th-large ei.tag ei.play-alt ei.compass-alt ei.file ei.shopping-cart-sign ei.hand-up ei.usd ei.resize-small ei.github-text ei.calendar ei.film ei.check-empty ei.unlock-alt ei.slideshare ei.remove-sign ei.person ei.mic ei.view-mode ei.check ei.play-circle ei.iphone-home ei.book ei.minus-sign ei.warning-sign ei.lastfm ei.reverse-alt ei.css ei.caret-right ei.circle-arrow-down ei.play ei.repeat ei.star ei.briefcase ei.envelope-alt ei.fullscreen ei.camera ei.volume-off ei.folder-close ei.asterisk ei.globe-alt ei.ok-circle ei.plane ei.repeat-alt ei.plus ei.arrow-right ei.group-alt ei.step-forward ei.network ei.forward-alt ei.circle-arrow-right ei.off ei.eject ei.phone ei.step-backward ei.wheelchair ei.lines ei.flag ei.hand-right ei.folder-open ei.road ei.chevron-up ei.fontsize ei.stackoverflow ei.backward ei.mic-alt ei.zoom-out fa.code fa.chain fa.chevron-circle-right fa.dollar fa.crosshairs fa.gg fa.ge fa.legal fa.angle-double-left fa.flash fa.send fa.foursquare fa.hourglass-2 fa.hourglass-3 fa.th fa.angle-left fa.recycle fa.file-code-o fa.thumb-tack fa.fax fa.xing-square fa.hospital-o fa.volume-up fa.spoon fa.facebook fa.cloud-download fa.trophy fa.caret-up fa.magic fa.hourglass-o fa.balance-scale fa.upload fa.magnet fa.adjust fa.subway fa.codiepie fa.location-arrow fa.check-circle fa.arrow-down fa.bicycle fa.instagram fa.caret-square-o-up fa.facebook-f fa.crop fa.external-link fa.arrow-circle-down fa.paper-plane fa.meanpath fa.long-arrow-left fa.download fa.bold fa.caret-down fa.chevron-left fa.venus fa.font fa.pinterest fa.cart-plus fa.folder-open-o fa.tachometer fa.creative-commons fa.clipboard fa.bar-chart fa.reply fa.hourglass-half fa.graduation-cap fa.info-circle fa.exchange fa.hand-o-up fa.pause fa.paypal fa.tv fa.github-square fa.search fa.mixcloud fa.venus-mars fa.flask fa.pinterest-square fa.fast-backward fa.code-fork fa.tasks fa.firefox fa.apple fa.gamepad fa.cc-stripe fa.quote-left fa.user-times fa.plus-square-o fa.eye-slash fa.trello fa.dribbble fa.user-secret fa.cloud fa.usd fa.eye fa.usb fa.certificate fa.500px fa.camera fa.music fa.gg-circle fa.sort fa.pencil fa.bookmark-o fa.diamond fa.share fa.hourglass-1 fa.envelope fa.yahoo fa.glass fa.flag fa.train fa.bullhorn fa.pause-circle-o fa.folder fa.outdent fa.stumbleupon fa.i-cursor fa.car fa.file-excel-o fa.arrow-circle-o-left fa.paragraph fa.file-photo-o fa.y-combinator fa.cab fa.male fa.history fa.h-square fa.heart fa.sort-amount-desc fa.search-plus fa.life-ring fa.lock fa.git-square fa.mouse-pointer fa.mail-forward fa.sign-in fa.odnoklassniki-square fa.tag fa.align-justify fa.level-up fa.chevron-circle-down fa.filter fa.sticky-note-o fa.moon-o fa.comments-o fa.lastfm fa.pagelines fa.credit-card-alt fa.file-word-o fa.map fa.object-ungroup fa.briefcase fa.stop fa.clone fa.plane fa.check-square fa.toggle-left fa.unlink fa.github fa.step-backward fa.wheelchair fa.cutlery fa.microphone-slash fa.user-plus fa.truck fa.toggle-down fa.ambulance fa.cc-visa fa.superscript fa.tty fa.shield fa.user-md fa.hand-stop-o fa.pie-chart fa.align-left fa.motorcycle fa.ticket fa.battery-half fa.spotify fa.dot-circle-o fa.facebook-square fa.group fa.angle-up fa.shopping-basket fa.paperclip fa.deviantart fa.file-audio-o fa.eur fa.coffee fa.times-circle-o fa.weixin fa.yc fa.y-combinator-square fa.internet-explorer fa.file-video-o fa.angle-double-up fa.safari fa.mail-reply-all fa.bank fa.commenting-o fa.black-tie fa.youtube-play fa.edit fa.caret-square-o-right fa.arrows fa.refresh fa.list-ul fa.file-o fa.battery-0 fa.battery-3 fa.battery-2 fa.battery-4 fa.battery-three-quarters fa.reddit-alien fa.square fa.ellipsis-v fa.list fa.globe fa.strikethrough fa.comment-o fa.bluetooth fa.hand-pointer-o fa.unlock fa.arrow-left fa.scissors fa.ellipsis-h fa.scribd fa.exclamation fa.try fa.flag-o fa.star-half-full fa.battery-quarter fa.ra fa.print fa.check-circle-o fa.houzz fa.lemon-o fa.umbrella fa.bell-o fa.intersex fa.cc-diners-club fa.undo fa.shekel fa.rebel fa.chevron-down fa.soundcloud fa.thumbs-o-down fa.bar-chart-o fa.indent fa.language fa.circle-thin fa.drupal fa.headphones fa.cc-mastercard fa.times fa.buysellads fa.fonticons fa.sort-asc fa.folder-open fa.heartbeat fa.feed fa.arrows-v fa.phone-square fa.text-height fa.linkedin-square fa.delicious fa.qrcode fa.arrows-h fa.mercury fa.text-width fa.envelope-o fa.rss-square fa.bookmark fa.automobile fa.sort-down fa.bitcoin fa.behance fa.sort-up fa.toggle-right fa.star-half-o fa.keyboard-o fa.gear fa.minus-circle fa.hotel fa.sort-numeric-asc fa.share-alt fa.shirtsinbulk fa.viacoin fa.copy fa.institution fa.rss fa.television fa.slack fa.folder-o fa.bed fa.caret-square-o-down fa.paper-plane-o fa.circle-o-notch fa.medkit fa.file-zip-o fa.calendar-minus-o fa.tencent-weibo fa.navicon fa.file-archive-o fa.share-alt-square fa.file-movie-o fa.building-o fa.sort-alpha-desc fa.map-signs fa.long-arrow-right fa.microphone fa.calendar-check-o fa.play-circle fa.github-alt fa.file-sound-o fa.wrench fa.play fa.hand-o-down fa.hand-rock-o fa.cc-jcb fa.compress fa.pencil-square-o fa.google-plus-square fa.angle-right fa.rotate-left fa.forumbee fa.eject fa.mobile fa.hourglass-end fa.trash-o fa.star-o fa.floppy-o fa.hand-grab-o fa.cc-discover fa.bomb fa.star-half-empty fa.random fa.fire-extinguisher fa.pencil-square fa.reddit-square fa.arrow-circle-o-down fa.caret-left fa.camera-retro fa.thumbs-o-up fa.product-hunt fa.digg fa.copyright fa.terminal fa.twitter-square fa.shopping-bag fa.stop-circle fa.photo fa.circle fa.columns fa.sign-out fa.cube fa.gittip fa.mars-stroke-v fa.file-text fa.amazon fa.smile-o fa.compass fa.list-ol fa.stumbleupon-circle fa.qq fa.yc-square fa.child fa.stop-circle-o fa.remove fa.pied-piper fa.gears fa.gbp fa.ban fa.fighter-jet fa.space-shuttle fa.steam fa.bars fa.lightbulb-o fa.map-pin fa.circle-o fa.contao fa.vine fa.align-center fa.rmb fa.bullseye fa.btc fa.close fa.calendar fa.retweet fa.hourglass fa.weibo fa.tags fa.minus-square-o fa.rouble fa.won fa.subscript fa.flickr fa.cc-amex fa.reddit fa.times-circle fa.tripadvisor fa.sort-amount-asc fa.renren fa.arrow-circle-o-right fa.pinterest-p fa.html5 fa.key fa.picture-o fa.toggle-off fa.list-alt fa.fort-awesome fa.cubes fa.tablet fa.credit-card fa.toggle-up fa.minus fa.unlock-alt fa.ils fa.cog fa.arrow-right fa.cc-paypal fa.birthday-cake fa.comment fa.bell fa.cc fa.get-pocket fa.bell-slash-o fa.header fa.bluetooth-b fa.linux fa.table fa.caret-square-o-left fa.spinner fa.thumbs-up fa.tint fa.soccer-ball-o fa.connectdevelop fa.chrome fa.trademark fa.align-right fa.quote-right fa.long-arrow-down fa.beer fa.th-list fa.eraser fa.codepen fa.square-o fa.hourglass-start fa.ruble fa.fire fa.sellsy fa.fast-forward fa.bell-slash fa.commenting fa.inr fa.hashtag fa.file-text-o fa.mortar-board fa.vimeo fa.dashboard fa.hand-o-right fa.object-group fa.rotate-right fa.anchor fa.meh-o fa.file-image-o fa.mars-stroke-h fa.calculator fa.vk fa.odnoklassniki fa.linkedin fa.jpy fa.unsorted fa.turkish-lira fa.skype fa.envelope-square fa.ship fa.dashcube fa.optin-monster fa.paw fa.venus-double fa.calendar-times-o fa.check fa.sliders fa.stack-overflow fa.file-pdf-o fa.android fa.stack-exchange fa.twitch fa.caret-right fa.dedent fa.tree fa.gratipay fa.map-marker fa.slideshare fa.binoculars fa.sticky-note fa.sheqel fa.user fa.ioxhost fa.expand fa.euro fa.bitbucket-square fa.hand-paper-o fa.database fa.rupee fa.hacker-news fa.edge fa.calendar-plus-o fa.hand-lizard-o fa.xing fa.youtube-square fa.taxi fa.sort-desc fa.rocket fa.yen fa.money fa.laptop fa.arrows-alt fa.underline fa.google-plus fa.cut fa.share-square-o fa.street-view fa.arrow-circle-up fa.plus-square fa.desktop fa.expeditedssl fa.toggle-on fa.minus-square fa.adn fa.whatsapp fa.save fa.puzzle-piece fa.css3 fa.skyatlas fa.level-down fa.mobile-phone fa.check-square-o fa.hand-spock-o fa.leanpub fa.arrow-circle-left fa.exclamation-triangle fa.gift fa.cogs fa.signal fa.frown-o fa.modx fa.battery-empty fa.chevron-circle-left fa.university fa.sitemap fa.external-link-square fa.google fa.volume-off fa.twitter fa.battery-full fa.hand-o-left fa.phone fa.mars-double fa.maxcdn fa.hand-peace-o fa.pause-circle fa.lastfm-square fa.home fa.empire fa.server fa.search-minus fa.pied-piper-alt fa.leaf fa.exclamation-circle fa.comments fa.cny fa.facebook-official fa.clock-o fa.hand-scissors-o fa.tumblr-square fa.rub fa.chevron-circle-up fa.opencart fa.barcode fa.vimeo-square fa.battery-1 fa.arrow-circle-right fa.bolt fa.paste fa.hdd-o fa.plug fa.industry fa.map-o fa.krw fa.joomla fa.sun-o fa.plus fa.life-buoy fa.play-circle-o fa.mars-stroke fa.road fa.volume-down fa.question-circle fa.image fa.angle-double-right fa.reply-all fa.inbox fa.female fa.gavel fa.life-bouy fa.jsfiddle fa.git fa.share-square fa.support fa.question fa.wordpress fa.italic fa.forward fa.steam-square fa.sort-numeric-desc fa.video-camera fa.thumbs-down fa.medium fa.chevron-right fa.bus fa.registered fa.mars fa.angle-down fa.send-o fa.link fa.eyedropper fa.mail-reply fa.bug fa.angellist fa.chain-broken fa.info fa.tumblr fa.line-chart fa.long-arrow-up fa.simplybuilt fa.trash fa.paint-brush fa.windows fa.calendar-o fa.reorder fa.suitcase fa.file-picture-o fa.arrow-circle-o-up fa.arrow-up fa.opera fa.shopping-cart fa.files-o fa.th-large fa.warning fa.at fa.file fa.star-half fa.futbol-o fa.flag-checkered fa.genderless fa.archive fa.film fa.power-off fa.heart-o fa.percent fa.google-wallet fa.book fa.transgender fa.cloud-upload fa.file-powerpoint-o fa.openid fa.repeat fa.star fa.users fa.transgender-alt fa.asterisk fa.plus-circle fa.cart-arrow-down fa.wechat fa.life-saver fa.dropbox fa.wikipedia-w fa.newspaper-o fa.building fa.bitbucket fa.yelp fa.neuter fa.behance-square fa.wifi fa.youtube fa.angle-double-down fa.sort-alpha-asc fa.area-chart fa.chevron-up fa.stethoscope fa.step-forward fa.backward\n" ] } ], "source": [ "fn_ei = \"C:\\\\Users\\\\User\\\\Anaconda2\\\\Lib\\\\site-packages\\\\qtawesome\\\\fonts\\\\elusiveicons-webfont-charmap.json\"\n", "fn_fa = \"C:\\\\Users\\\\User\\\\Anaconda2\\\\Lib\\\\site-packages\\\\qtawesome\\\\fonts\\\\fontawesome-webfont-charmap.json\"\n", "names = ['ei.' + name for name in json_file_get(fn_ei).keys()] + ['fa.' + name for name in json_file_get(fn_fa).keys()]\n", "print len(names)\n", "print\n", "for name in names:\n", " #IPython.display.display(qtawesome.icon(name))\n", " print name," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Стили, меню, тулбар, статусбар" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo темы: есть ли симпатичные в опенсорсе? Как ставить?\n", "\n", "есть https://github.com/ColinDuquesnoy/QDarkStyleSheet\n", "\n", "https://wiki.qt.io/Gallery_of_Qt_CSS_Based_Styles\n", "\n", "был когда-то qtdotnetstyle, еще до qss\n", "\n", "Разделитель в меню, тулбар, статусбар" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class MyWindow(QMainWindow):\n", " def __init__(self, parent=None):\n", " super(MyWindow, self).__init__(parent)\n", " exitAction = QAction(qtawesome.icon('fa.question-circle', color='blue', color_active='orange'), '&Exit', self)\n", " exitAction.setShortcut('Ctrl+Q')\n", " exitAction.setStatusTip('Exit application')\n", " exitAction.triggered.connect(self.close)\n", "\n", " self.toolbar = self.addToolBar('Exit')\n", " self.toolbar.addAction(exitAction)\n", " \n", " self.combo = QComboBox()\n", " for k in QStyleFactory.keys():\n", " self.combo.addItem(k)\n", " self.combo.currentIndexChanged.connect(self.combo_changed)\n", " self.toolbar.addWidget(self.combo)\n", "\n", " self.statusBar()\n", "\n", " menubar = self.menuBar()\n", " fileMenu = menubar.addMenu('&File')\n", " fileMenu.addAction(exitAction)\n", " \n", " def combo_changed(self, arg):\n", " app = QCoreApplication.instance()\n", " style = self.combo.currentText()\n", " app.setStyle(QStyleFactory.create(style))\n", "\n", "run_qt_and_screenshot(MyWindow)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[u'Windows', u'WindowsXP', u'WindowsVista', u'Fusion']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "QStyleFactory.keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Грид" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "* Как установить режим выделения, получать выделение, событие изменения выделения\n", "* Как добавить чекбоксы в грид\n", "* Ресайз окна очень тормозит, возможно потому что грид спрашивает data на каждый пиксель, как этого избежать?\n", "* Длины скроллбаров на гриде неправильные" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys\n", "import operator" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data = c_[arange(0, 1000, dtype='int').astype('object'), random.rand(1000), random.randn(1000)]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class NumpyArrayModel(QAbstractTableModel):\n", " data_calls_changed = pyqtSignal(int)\n", " def __init__(self, header, arr, parent=None):\n", " self.data_calls = 0\n", " assert len(arr.shape) == 2\n", " self.arr = arr\n", " self.header = header\n", " self.parent = parent\n", " super(NumpyArrayModel, self).__init__(parent)\n", " def headerData(self, section, orientation, role=Qt.DisplayRole):\n", " if orientation == Qt.Horizontal:\n", " if role == Qt.DisplayRole:\n", " return self.header[section]\n", " return QAbstractTableModel.headerData(self, section, orientation, role)\n", " def rowCount(self, parent):\n", " return self.arr.shape[0]\n", " def columnCount(self, parent):\n", " return self.arr.shape[1]\n", " def data(self, index, role):\n", " if role == Qt.DisplayRole:\n", " self.data_calls += 1\n", " self.data_calls_changed.emit(self.data_calls)\n", " return str(self.arr[index.row(), index.column()])\n", " if role == Qt.ForegroundRole and index.column() == 2:\n", " return QBrush(Qt.darkRed if self.arr[index.row(), index.column()] < 0 else Qt.darkGreen)\n", " return None\n", " def sort(self, Ncol, order):\n", " self.layoutAboutToBeChanged.emit()\n", " if Ncol == 2:\n", " self.arr = array(sorted(self.arr, key=lambda x:abs(x[2])))\n", " else:\n", " self.arr = array(sorted(self.arr, key=operator.itemgetter(Ncol)))\n", " if order == Qt.DescendingOrder:\n", " self.arr = self.arr[::-1]\n", " self.layoutChanged.emit()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class MainWindow(QWidget):\n", " def __init__(self, parent=None):\n", " super(MainWindow, self).__init__(parent)\n", " self.setWindowTitle('Hello, widgets')\n", " self.resize(640, 400)\n", " \n", " hbox = QHBoxLayout(self)\n", "\n", " vbox = QVBoxLayout()\n", " self.lbl = QLabel(\"foo\")\n", " vbox.addWidget(self.lbl)\n", " vbox.addSpacerItem(QSpacerItem(1, 2))\n", " cmd = QPushButton(\"Click me\")\n", " vbox.addWidget(cmd)\n", " import qtawesome\n", " \n", " cmd2 = QPushButton(qtawesome.icon('fa.question-circle', color='blue', color_active='orange'), \"Help\")\n", " vbox.addWidget(cmd2)\n", " #cmd.clicked.connect(someFunc)\n", " hbox.addLayout(vbox)\n", "\n", " txt = QTextEdit()\n", " hbox.addWidget(txt)\n", " txt.setText(\"Input there\")\n", "\n", " self.model = NumpyArrayModel(['Index', 'Uniform', 'Normal'], data)\n", " self.model.data_calls_changed.connect(self.data_calls)\n", " \n", " self.tbl = QTableView()\n", " self.tbl.setMinimumWidth(300)\n", " self.tbl.setModel(self.model)\n", " self.tbl.verticalHeader().hide()\n", " self.tbl.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)\n", " self.tbl.verticalHeader().setDefaultSectionSize(16)\n", " self.tbl.horizontalHeader().setAlternatingRowColors(True)\n", " self.tbl.resizeColumnsToContents()\n", " self.tbl.setSortingEnabled(True)\n", " self.tbl.setAlternatingRowColors(True)\n", "\n", " self.tbl.setSelectionBehavior(QTableView.SelectRows)\n", " self.tbl.setSelectionMode(QTableView.SingleSelection)\n", "\n", " selectionModel = self.tbl.selectionModel()\n", " selectionModel.selectionChanged.connect(lambda: self.selection_changed(selectionModel.selectedRows()))\n", "\n", " hbox.addWidget(self.tbl)\n", "\n", " self.wv = QWebView()\n", " #self.wv.load(QUrl(\"http://yandex.ru\"))\n", " self.wv.setHtml('Hello, world!')\n", " hbox.addWidget(self.wv)\n", "\n", " def data_calls(self, num):\n", " self.lbl.setText(str(num))\n", " def selection_changed(self, selected):\n", " html = 'Row: %d, column: %d' % (selected[0].row(), selected[0].column())\n", " self.wv.setHtml(html)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_qt_and_screenshot(MainWindow)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Дерево" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo дерево:драгндроп, обработка смены выделения, показывать развернутым" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARAAAADmCAIAAACS1E3yAAAfQElEQVR4nO2dfXhU1b3vv2vtmchE\nTRBMMkREBQzyWIgWBT2IIlS0FRUftcUePahHuJrDy7WxknCLpdpi5ID1hQtX6PN4uLdW6ikePdJy\nqsghCgqpVOPLEXk5bUEgL5aSKExm9l5r3T/WzM7OvCV7mJnMDL/PwzOsWS+//Zu95zu/tdZea4fd\nc889J06cQATGOQiCiKCktNPFxcWeEydO+P1+kFQKl+/feeeiRYtWr15dWlqaLpsdHR0PPvhgGm12\ndHTc8a2xL7z8RuvB3QAYZ8nrxxarSKbqWUclqO+s2SNTqmEXjPrRIw/VN/yfF3/1q0imBNDS0uIJ\nmzaM5P4lhzEW+9bOjCo91VBKORP226jSDMIYGFNK7d69O10m/X5/em36/X4pM38q3GJ/hw1DCQHA\ng5OILVGSYIzpBGcMkTRzJE7W+3zDVki3VJSSPTOjKmcOKaUlRBqtpdemNsiYCv/sy2SV436TWILS\nqLe9n2UFADLmcmiZeHptHsezeDphjHHGGNcvPJzDOdPVbN2cMqiIQrQypJQ6GU7Y77OlHCGEZVlp\ntJZem9qgjDkbUUR1uk6S+HaUVErJBJ/LtWC6RRL+j3EbxrhhdKf1/xHxnGqSUU5kBDsphOyRrVhE\nY4yxTGhGSikyEGFibR4+dHj//n2JGo4YMbLynMpEBoWlTDMEwEg8hoktONzy5f4/HwAw4vxhlf6z\n4+ZoYsc5sSgphRBKxY9xHlf9seiQ4hCJwbnh8XDODcMwdI4tHh12GDul5hXsGGKrQgihX8MJyxI9\nxYNIby0TmhFCmKaZRmuJbH6+5/MnGxoSNVxYV1dWXpbIoGWZVrALgIj5bdUZUdlMAcCevfufeO4F\nAPXz7rVCQQD//Zcv7Jzys86w66uezZVC7GlWUlmmKWUcwTDOXUQYp1qcwcSI4DEMw+PpTtiaMQwj\nEmf6frh8R4cWLZGwTqQUlmVpxViWxTnXacaYlIwxKYSMtE27ZkzTDAQCabSWyGYoFErSTwuFQnHd\nME2TKYQCx08c7wTAObejAHPEA2YnuV2KUDCgj/j4z9curLkLwJOrfqlzQsFA4PhXAKCl0VMFtn6U\nHbcYpJShri7htks2aHBFoqIoOFOMKa/X69EYhhF51bHGGWr6aLMAcAYWoV8ty/J4PJZlCWEZBrcs\nrRrOWPfQWUr925Z2zQgp0zmG0T2oeDalEKFQCEB9fb0z/4knntClcd0IG7TMYKALWjB2VIECwHRv\nKpzTDQPOrRj8wznfW/q/fwngp8+8gIieF/3TXeed47dCXUCPoWFk1hIqkrYFoxQghWWFpIrffU0o\nmGnXTY2br3tXjtEs3njzLYMpr60Yp3IinOqC0UHF4zEsyzIMbprOgR0cXerMjWGEZaWzS2ZZiWxa\nQgSDQZ0YP368zmxqarIz47ohLIsxZZnBrmAXAC9T0PPhkQoMYI6o4nwtO9Mry0rq5tzx2MoXbYOP\nzv378yrLys70iq7jiIQW5XyV3WlE8pWClNIyQwnHMInOSPUllyQqiuKNN98yDMPr8Xi0Zrxej2Ho\nVxKMlLJ7IBeZM9Rd23C9HpMDSkrZraK0ykZImU7BRCJMrE0hRFdXF3qOcOJmRhlkQMg0zeNfARAe\nDjuqAJwzRPpjWjZMKcbCgmJMmaGgZYa0JjWWGTJDQTMYQFgJDIBUUulzK8P9MaWkUswpJCmlNE2V\nYIIkoWCKDLa18dPnG/dwj+RexYuEUSSevO1bgwadZdeZ+oNfv/XU9wB0j/Edg5bzr5k+bnARAMD8\n26eNH5z1d1Mqvcc+2/5Ba6JjJqDi0qtGF325dWfCO2QVl141utTryDA7Ptvm+jBhRk2YXOnrYcF/\n6cTRpd6+2PRfOnF00Zf/ufNzAJwx0T1sO2fSty897fCG13caXCluGIaU0jAMKZVhSC0UzrW6sj/o\nb2tr/+LggUQNh547rDxmmJ5k0C8sKxgMgUFY1s4dO+x8OzO+YIRgDGYoGAwcB2AYukvGGZS+KwGA\nMcahwjmO8X/7sa+/aD36v579VchhuX7FCz+b/30RHFQ28IyIHhTsMAKmwBy3yHQFppSUSgkzqOIN\n+pFEMNqbIRU+w6u4V3CvNLwJJyXDt1zs2WTG+HnXjBmMo82/a2oJq8n48g+N+1ikd+qGyI9Mwnbt\nze+2A6gaf7UfLW837emlel+O5i2uHMLbWwGgvLLYG/GgF5u6g62rKcb0NDHnXCkethA5P8yOOY4p\neM65lDJDEyNCCDPBGObPf/nzqpUrEzWsmTv3LMevpG0tkU1LSssSABYu7DGG0ZmWlHHdEEIwwDJD\noeAJAB7OGA+rIiIPxRhTDAyK6ZvjkRB04Isj9c/+2jItAA0LvssYW/j0rwEsXPF/n1jwvcG+yshY\nRSkFBUhAKgBMKSUVwGCvMVBQQijLCirpMsIc7woBOGug98ODB0weMIqEp8gCJkIfWynGWNmY9nBt\nxvRn6L59WTagCObxw4wZkRsyFZf83UVFf922a+/IcZMGmx1WSakPMDs//6t3lN8HINC67f29uHDc\nVYPNTqukxAfA7Px850dtOhxzzoHysRNGlXgBIND6zq69cfwOf11RPnbCKK8V8Pl8gdZ3du29cNxV\nfh8AmJ17dnzUBpSPnVBVGra07X2HJQYgEAj4iof4eXsbUF5ZjEDA9HmY7UK4oe1DxCszEHB6Gq52\n4tAbWz+KnCXOuZThs+SYoHfe/I2dUU0Lpmk6eyxOLNNsbW1L1NCK19CeJYstskwzwb34hNa0KQ4E\nA193ff03AB6DQ4EzxhkYwAHOYTAogDPwyFecM4AzhI7rZTXLam467+wzATQ8MP2RVa8DQPA4AscA\nKKEUoBikglRQgFCQgJThNAApFRiEkKHA10q6nCXTn3jnX/YapwlvkTC8llFkAVBgTL8A/vMO2pXt\n2/laPOzDPUeHfPPcb3/b/7dP3v6gze6bhBPekqKj27f9ceS4iRWjSlu3bf9j+ZjxVYPGVrCPAXhL\nvEe3b9+FkeMmVgwfW9HeEmk48pujfIE925vaMHLcxIrLLty3a1+sy5EDAfChc/v2XUDF2Al+tG7b\nvg9lYyZUXVBd0X5iaFVxYO+2pjaM/OZVFeOq9v2xp/g6OwMVg/wVrL2t3O9D4Kjp83nCLlSVonPP\n9o+7fegYM7wEnXu3f9RWNnZ8lc+CrlZ84vOtH7aICy+fes5VYz/Z330XwT5LPWfZ7XPIOZdCpL1X\nJoQIJRBMWVl5fX1dooZDKs+JbWhHmNiisrLyxYsXubKmTXEOMxQMnfgagOScc3CAMxgckGAGk/qL\nxwAGg8EIJzHsDP7Pc77FwM4ffHr5AIsDvMRYMec6BXXewNNZ11cAOMI6gYJSYdkIocDDsgFgKUgJ\nIaQwg9JyGWH0xfX6LKPIMrzCU2QaXgsAZ933ep6e8mTC5jj47ptHPNXX3jD0G1OnnDjS+Ice30iz\n8+A+AB2mWYHOfQDaAlaVzy78Yi8A7OsIVPi9JXajkSU+eH1VEydW6Wq+ciDh7yIABDr3AkCZ3+eF\nt+KqieGJcqtkZKkPXt+FV028MJGlvZ2BqwZVlKPk3BIE9nbgfN12ZKkPgdaP22z3SkaW+3xeM/Cn\nNgDtLYELSrzhal7fqMnXjNL2T69M22qOlJGJB/0lJWeWlFyUpG1sQ/tOf2xRCta0KQZYoS4tGObl\nKjLk1z8tioNxBckYU4bB9JyAARgcQ4sx1OdlAGNBhIIAKgdgyBCPAsBC0gxJBSGB8GIKvfaFMaaY\nYkJq8XQPbyxTyFAQbrtk4eIBpsdrGUWWx2N6vCb0OueYPoNz3ZR9u1opJT9u/P1/DZ1w7ZizLynf\ncwSR/EjC0bN0pOzCbuPdRYl6YjEVnW9Ud09MM/KyiuieWLStvQc7JlxQMcbrMwMHWuE/3+lVj59+\np8fO4kDL2zt223PKFRNGoftDOmflY86hlFJlYEWZECKNiy+715KlyaYQggNWMGR1HQfgERwMPDyI\nAedM98QMDkPB4PBwZnAYDIYEZ+DhuQEg0seQUkFBMSZkuPclJCyp9L1hBigJqUczLDzrLBWEgrSE\ntIIMKQnGOyDk8VqGx/R4LcNjAfjok0910ZhvfCMYikwmaHlEXnsuLDyryOuQgow0kFJqNyNZOlMB\nXl9FmWxpLa8e7EOg5XMpq3WtPR0Bv3/Q2DL5YZLJqu4D2G9ajpy44KLSc0fKlj3hSnuOBfxDBo0p\nk82xllTYim7lC7T8oUWW+8PeORtWlfoQaPm8BZePKvH5y2RLa7nf54UVqTa4ulzuOiQd6wn1MhnH\nuYoldpFsukgSYVKzll6b4QhjWtI8AUBJzrgeFsNgMAxlAAZnHg4PhyHgVfAAHg5DQiuHqx4r4qXS\na17DUhEMpgAXEBymgFAQljIApZiSkU6TVJBQQkjTYm7vw3DGDh/eP2fY9EQV9JIoZzzRq6bCM6SX\nXHfzBZE1PCcOvfn+YUMvuZPhXQ+OtVNSyu7vqQJMq2jE1VdfBCBwZNtuiYrIGd2983Dp5MpRV18z\nCkDgSPREc7fdqDdHPtjnnzh6yNVXDwFgdny2/YPdO48MnDzkoshR9ERwlJUjh0+MKC06tjviJ6SU\ncvfOz3wTR+uGZsdn23ZLwPbKDARM3Xb3ziOlk4dcPGXKxQCOf/H6f7aHP4PjLNlnLGoVZibuWgIQ\nQlw2blwaraXXpjbIoCbffDcAD8AZPBw8PFxhTMHDwTkMgHNl6Jk0Bg5wBY8B9Jxq6JaAHtwDllBS\nQQBCsfAYRkIySKUsCQBCQYcjxiMzzTGw782cqTcDRRUs+cnSgadzcCZCpuExwL2AUJYVsqAULGHp\nO02csaeeXV3kZWecfrrH23330r7T7/F4uINeT9zoK6eWhz5t3NXi+pTnGNKBXkFmCWFZlmVZpml2\n/xd+Y4VXmUVWZNox5+Q90TsuT95Opgl8vtXDYTAA8DJwDi9nYcEABoPHgMHhYfDo7pmCoXtrkakz\n1vNs2XNiQimtBMEgFSzdPdNxRscfAIAllE5LBUuo5Rvee/GllxzmVPeOy1ie+vlTnnjbML1eD2OG\nGQravoWCAYOfFp5c18vUlVJSKo9Hf13sm/19WXwpFZRK57ra/kLHD+EgrAnLsrRSnDoRwl62nEap\n2CxdujSN1jJEXqzMTRhh9FXsrudcqhxB68Dj9Q4YMMAZWMLRxePxGIa93J8x1pcIUzDoKKGXXUoh\ntFRs2VgOtfTQTM+OWYa6Z0QqJI8w+nvuzImrGR03hBCwf1ANQ6/K5aZpRPpjRuSWdsY/Vc6ghyu2\nCIRlOftmdu9L5zj7b6SWXMb1jkt9FXvOgymllODckJJzbmmpmaZhGIxzw95Axvkpt4EsMsgXUirn\nOv/IDhn71SkV0kku40Iw+kI670DL7lkfqXdD8VgYc+5SzsiHyEkcU8U95sFiifrpAcWWHCaVCKM1\noxMAGGNSr4+KfQJGTzLgf04TfY+l53MwokKKLRJSSy6TylNjoq+oUip8b1U6tRGVRp5Mg6SLHksN\negqjR9dLKWdNIsdJRTA2KrLwhDne2pEkNnFKDfoRebZVbOhwaoN0kl8kFIyrCxm38inYB0sOaSOP\nSPTtjS8YpVSyJ4zEu/B9+i7ENEytVZ8aZrNVxg4X/6L19kuUWqssHy6dTmbgo/l8vria8Rw9erSo\nqGjtunV21v2zZh07dmz8lVN6dYIgCpWm97YMHDjwFw5dzJ416+jRo8nGMIvrFmTesUKgs7OzpKSk\n93pEPtDZ2fnMqhcSlfYy6Kdud9+hc3UqcArdeieIk4cEkwYothQSya8mCSYNkGAKieRXk8YwJ4u9\nuI7OVQHQ68N6KMKkAZJKIZGeCDNx4kRn/vbt2wGsXLly7ty5zoSuqUtPEeJGmPb29ieffPK9994b\nOXLkOsdcPpHj9BphkglGb9XQ6XfeeQfApEmTdELn19TU6MRLL71UU1NjN5QJnktbkOj9c85zBaC2\ntvanP/3psmXLcIqdjXwnvBsyMcm6ZCqGqMxJkybpVwA67ayzcuXKSZMm/fCHP2xvb481VTDEPVH7\n9+8/88wznTn2+XEmNm3aNGnSpMbGxg0bNuiEs36S0qVLl06aNOmee+75+OOPo+ovXbp006ZNOrOp\nqWnp0qXp+6yFD05yliyuuai3jY2NAOzLqTM3bNhw9dVXNzY2zps3b9myZdn4rP0EIjHEmblo0aIF\nCxbY32blOHXOxIgRI1588cUXXnjh3HPP1Qln/SSldXV1jY2Ny5YtW7FihV1/8ODBjY2N06dP37Jl\ni87cvHnz9OnT0/6RCxj01iNwPUsWlWO/deYrpZ555pnkdgoJFfPLNG3atBEjRvzsZz+79957dQRG\nvHM1YsQIAPv37x83bpxOOI0kKu3s7Ny8eXNLS8vLL7/stDZu3Dil1MUXX9zW1tbe3l5UVLRp06aF\nCxcW9slPO8lP10nth0nO1q1bM2c8d7B/maIYMWLE008/ffPNN6f9PCxduvT2228fP358TU3N5MmT\nYytMnz59165dAObPn5/eQxc8ia6mTaYizH333ffKK6/ceuutLpzNc2LPVTAYHD58uM4fPnz4wYMH\no2omSSQp3bFjR21t7dlnn/3222/HrXb55ZevXLkSwNy5cym8pJdkgomrtriCue+++6699totW7bY\nmXfdddfq1auvvfZaADfccMMjjzySTq9zDGcPWFNfX79z584JEyY89NBDOv+BBx64++67582bh5MW\nzHPPPbdw4UJtM261c845x06QYNyS/Iyx66ZN8/v9cffDLPzBgwXwBMpMM2DAgMOHD1dUVOTOufry\nyy/r6+sfeOCBcel7mPIpgr6a//LiK3H3wyR7kB/Rd3LqV3zq1KnDhw+/4447SC2pkfoYptcBEGGT\nO+dq8+bNOpEj/hQYtJYsDdBXs5BIPcLs378/3c4ULHSuThGSCaaqqiprfuQ1KvIQUKIAUEoBbyYq\nTSYYj4emBAiiBzSGIQgXkGAIwgUkGIJwwckKZvbs2bNnz+57/SSD4xUrVpykMznCnj171q9f79xR\nRxQMJyUYV1LplYcffjiN1vqRp59+GsDq1av72xEi/aQumL6rZf369foPxWzcuNHOfPTRRxljM2bM\naG5uhuMPaMYtzS9WrVo1c+bM/vaCyAgpCsaVWhBZOVJcXGznP/bYY0qpNWvW/PjHP0bMHqyoUoLI\nEVK50+KqJ3bnnXfaMpgyJfwXATo6OjZt2nTo0KG43bDkpQTRj/TPLFl9ff35559/xx13xF23k7yU\n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\nHvVyANCIcBMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class TreeItem(object):\n", " def __init__(self, data, parent=None):\n", " self.parentItem = parent\n", " self.itemData = data\n", " self.childItems = []\n", "\n", " def appendChild(self, item):\n", " self.childItems.append(item)\n", "\n", " def child(self, row):\n", " return self.childItems[row]\n", "\n", " def childCount(self):\n", " return len(self.childItems)\n", "\n", " def columnCount(self):\n", " return len(self.itemData)\n", "\n", " def data(self, column):\n", " try:\n", " return self.itemData[column]\n", " except IndexError:\n", " return None\n", "\n", " def parent(self):\n", " return self.parentItem\n", "\n", " def row(self):\n", " if self.parentItem:\n", " return self.parentItem.childItems.index(self)\n", " return 0\n", "\n", "\n", "class TreeModel(QAbstractItemModel):\n", " def __init__(self, data, parent=None):\n", " super(TreeModel, self).__init__(parent)\n", " self.rootItem = TreeItem((\"Title\", \"Summary\"))\n", " import re\n", " parents = [self.rootItem]\n", " indentations = [0]\n", " for line in data.splitlines():\n", " position = len(re.match('\\s*', line).group())\n", " lineData = line[position:].strip()\n", " columnData = lineData.split('\\t')\n", " if position > indentations[-1]:\n", " # The last child of the current parent is now the new\n", " # parent unless the current parent has no children.\n", " if parents[-1].childCount() > 0:\n", " parents.append(parents[-1].child(parents[-1].childCount() - 1))\n", " indentations.append(position)\n", " else:\n", " while position < indentations[-1] and len(parents) > 0:\n", " parents.pop()\n", " indentations.pop()\n", " parents[-1].appendChild(TreeItem(columnData, parents[-1]))\n", "\n", " def columnCount(self, parent):\n", " parentItem = parent.internalPointer() if parent.isValid() else self.rootItem\n", " return parentItem.columnCount()\n", " def rowCount(self, parent):\n", " if parent.column() > 0: return 0\n", " parentItem = parent.internalPointer() if parent.isValid() else self.rootItem\n", " return parentItem.childCount()\n", "\n", " def headerData(self, section, orientation, role):\n", " if orientation == Qt.Horizontal and role == Qt.DisplayRole:\n", " return self.rootItem.data(section)\n", " return None\n", " def data(self, index, role):\n", " if not index.isValid(): return None\n", " if role != Qt.DisplayRole: return None\n", " item = index.internalPointer()\n", " return item.data(index.column())\n", "\n", " def flags(self, index):\n", " if not index.isValid(): return Qt.NoItemFlags\n", " return Qt.ItemIsEnabled | Qt.ItemIsSelectable\n", "\n", " def index(self, row, column, parent):\n", " if not self.hasIndex(row, column, parent): return QModelIndex()\n", " parentItem = parent.internalPointer() if parent.isValid() else self.rootItem\n", " childItem = parentItem.child(row)\n", " if not childItem: return QModelIndex()\n", " return self.createIndex(row, column, childItem)\n", "\n", " def parent(self, index):\n", " if not index.isValid(): return QModelIndex()\n", " childItem = index.internalPointer()\n", " parentItem = childItem.parent()\n", " if parentItem == self.rootItem: return QModelIndex()\n", " return self.createIndex(parentItem.row(), 0, parentItem)\n", "\n", "\n", "model = TreeModel('''data\\t1\n", " data2\\t2\n", " data3\\t3\n", " data4\\t4\n", "data5\\t5\n", " data6\\tSIX''')\n", "\n", "class MyTreeView(QTreeView):\n", " def __init__(self, parent=None):\n", " super(MyTreeView, self).__init__(parent)\n", " self.setModel(model)\n", " self.setWindowTitle(\"Simple Tree Model\")\n", " self.expandAll()\n", "\n", "run_qt_and_screenshot(MyTreeView)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AboveItem AdjustIgnored AdjustToContents AdjustToContentsOnFirstShow AllEditTriggers AnimatingState AnyKeyPressed BelowItem Box CollapsingState ContiguousSelection CurrentChanged CursorAction DoubleClicked DragDrop DragDropMode DragOnly DragSelectingState DraggingState DrawChildren DrawWindowBackground DropIndicatorPosition DropOnly EditKeyPressed EditTrigger EditTriggers EditingState EnsureVisible ExpandingState ExtendedSelection HLine IgnoreMask InternalMove MoveDown MoveEnd MoveHome MoveLeft MoveNext MovePageDown MovePageUp MovePrevious MoveRight MoveUp MultiSelection NoDragDrop NoEditTriggers NoFrame NoSelection NoState OnItem OnViewport PaintDeviceMetric Panel PdmDepth PdmDevicePixelRatio PdmDevicePixelRatioScaled PdmDpiX PdmDpiY PdmHeight PdmHeightMM PdmNumColors PdmPhysicalDpiX PdmPhysicalDpiY PdmWidth PdmWidthMM Plain PositionAtBottom PositionAtCenter PositionAtTop Raised RenderFlag RenderFlags ScrollHint ScrollMode ScrollPerItem ScrollPerPixel SelectColumns SelectItems SelectRows SelectedClicked SelectionBehavior SelectionMode Shadow Shadow_Mask Shape Shape_Mask SingleSelection SizeAdjustPolicy State StyleMask StyledPanel Sunken VLine WinPanel __class__ __delattr__ __dict__ __doc__ __format__ __getattr__ __getattribute__ __hash__ __init__ __module__ __new__ __reduce__ __reduce_ex__ __repr__ __setattr__ __sizeof__ __str__ __subclasshook__ __weakref__ acceptDrops accessibleDescription accessibleName actionEvent actions activateWindow activated addAction addActions addScrollBarWidget adjustSize allColumnsShowFocus alternatingRowColors autoExpandDelay autoFillBackground autoScrollMargin backgroundRole baseSize blockSignals changeEvent childAt childEvent children childrenRect childrenRegion clearFocus clearMask clearSelection clicked close closeEditor closeEvent closePersistentEditor collapse collapseAll collapsed colorCount columnAt columnCountChanged columnMoved columnResized columnViewportPosition columnWidth commitData connectNotify contentsMargins contentsRect contextMenuEvent contextMenuPolicy cornerWidget create createWindowContainer currentChanged currentIndex cursor customContextMenuRequested customEvent dataChanged defaultDropAction deleteLater depth destroy destroyed devType devicePixelRatio devicePixelRatioF devicePixelRatioFScale dirtyRegionOffset disconnect disconnectNotify doubleClicked dragDropMode dragDropOverwriteMode dragEnabled dragEnterEvent dragLeaveEvent dragMoveEvent drawBranches drawFrame drawRow drawTree dropEvent dropIndicatorPosition dumpObjectInfo dumpObjectTree dynamicPropertyNames edit editTriggers editorDestroyed effectiveWinId ensurePolished enterEvent entered event eventFilter executeDelayedItemsLayout expand expandAll expandToDepth expanded expandsOnDoubleClick find findChild findChildren focusInEvent focusNextChild focusNextPrevChild focusOutEvent focusPolicy focusPreviousChild focusProxy focusWidget font fontInfo fontMetrics foregroundRole frameGeometry frameRect frameShadow frameShape frameSize frameStyle frameWidth geometry getContentsMargins grab grabGesture grabKeyboard grabMouse grabShortcut graphicsEffect graphicsProxyWidget hasAutoScroll hasFocus hasHeightForWidth hasMouseTracking header height heightForWidth heightMM hide hideColumn hideEvent horizontalOffset horizontalScrollBar horizontalScrollBarPolicy horizontalScrollMode horizontalScrollbarAction horizontalScrollbarValueChanged iconSize iconSizeChanged indentation indexAbove indexAt indexBelow indexRowSizeHint indexWidget inherits initPainter initStyleOption inputMethodEvent inputMethodHints inputMethodQuery insertAction insertActions installEventFilter isActiveWindow isAncestorOf isAnimated isColumnHidden isEnabled isEnabledTo isExpanded isFirstColumnSpanned isFullScreen isHeaderHidden isHidden isIndexHidden isLeftToRight isMaximized isMinimized isModal isRightToLeft isRowHidden isSignalConnected isSortingEnabled isVisible isVisibleTo isWidgetType isWindow isWindowModified isWindowType itemDelegate itemDelegateForColumn itemDelegateForRow itemsExpandable keyPressEvent keyReleaseEvent keyboardGrabber keyboardSearch killTimer layout layoutDirection leaveEvent lineWidth locale logicalDpiX logicalDpiY lower mapFrom mapFromGlobal mapFromParent mapTo mapToGlobal mapToParent mask maximumHeight maximumSize maximumViewportSize maximumWidth metaObject metric midLineWidth minimumHeight minimumSize minimumSizeHint minimumWidth model mouseDoubleClickEvent mouseGrabber mouseMoveEvent mousePressEvent mouseReleaseEvent move moveCursor moveEvent moveToThread nativeEvent nativeParentWidget nextInFocusChain normalGeometry objectName objectNameChanged openPersistentEditor overrideWindowFlags overrideWindowState paintEngine paintEvent paintingActive palette parent parentWidget physicalDpiX physicalDpiY pos pressed previousInFocusChain property pyqtConfigure raise_ receivers rect reexpand releaseKeyboard releaseMouse releaseShortcut removeAction removeEventFilter render repaint reset resetIndentation resize resizeColumnToContents resizeEvent restoreGeometry rootIndex rootIsDecorated rowHeight rowsAboutToBeRemoved rowsInserted rowsRemoved saveGeometry scheduleDelayedItemsLayout scroll scrollBarWidgets scrollContentsBy scrollDirtyRegion scrollTo scrollToBottom scrollToTop selectAll selectedIndexes selectionBehavior selectionChanged selectionCommand selectionMode selectionModel sender senderSignalIndex setAcceptDrops setAccessibleDescription setAccessibleName setAllColumnsShowFocus setAlternatingRowColors setAnimated setAttribute setAutoExpandDelay setAutoFillBackground setAutoScroll setAutoScrollMargin setBackgroundRole setBaseSize setColumnHidden setColumnWidth setContentsMargins setContextMenuPolicy setCornerWidget setCurrentIndex setCursor setDefaultDropAction setDirtyRegion setDisabled setDragDropMode setDragDropOverwriteMode setDragEnabled setDropIndicatorShown setEditTriggers setEnabled setExpanded setExpandsOnDoubleClick setFirstColumnSpanned setFixedHeight setFixedSize setFixedWidth setFocus setFocusPolicy setFocusProxy setFont setForegroundRole setFrameRect setFrameShadow setFrameShape setFrameStyle setGeometry setGraphicsEffect setHeader setHeaderHidden setHidden setHorizontalScrollBar setHorizontalScrollBarPolicy setHorizontalScrollMode setIconSize setIndentation setIndexWidget setInputMethodHints setItemDelegate setItemDelegateForColumn setItemDelegateForRow setItemsExpandable setLayout setLayoutDirection setLineWidth setLocale setMask setMaximumHeight setMaximumSize setMaximumWidth setMidLineWidth setMinimumHeight setMinimumSize setMinimumWidth setModel setMouseTracking setObjectName setPalette setParent setProperty setRootIndex setRootIsDecorated setRowHidden setSelection setSelectionBehavior setSelectionMode setSelectionModel setShortcutAutoRepeat setShortcutEnabled setSizeAdjustPolicy setSizeIncrement setSizePolicy setSortingEnabled setState setStatusTip setStyle setStyleSheet setTabKeyNavigation setTabOrder setTextElideMode setToolTip setToolTipDuration setTreePosition setUniformRowHeights setUpdatesEnabled setVerticalScrollBar setVerticalScrollBarPolicy setVerticalScrollMode setViewport setViewportMargins setVisible setWhatsThis setWindowFilePath setWindowFlags setWindowIcon setWindowIconText setWindowModality setWindowModified setWindowOpacity setWindowRole setWindowState setWindowTitle setWordWrap setupViewport sharedPainter show showColumn showDropIndicator showEvent showFullScreen showMaximized showMinimized showNormal signalsBlocked size sizeAdjustPolicy sizeHint sizeHintForColumn sizeHintForIndex sizeHintForRow sizeIncrement sizePolicy sortByColumn stackUnder startDrag startTimer state staticMetaObject statusTip style styleSheet tabKeyNavigation tabletEvent testAttribute textElideMode thread timerEvent toolTip toolTipDuration tr treePosition underMouse ungrabGesture uniformRowHeights unsetCursor unsetLayoutDirection unsetLocale update updateEditorData updateEditorGeometries updateGeometries updateGeometry updateMicroFocus updatesEnabled verticalOffset verticalScrollBar verticalScrollBarPolicy verticalScrollMode verticalScrollbarAction verticalScrollbarValueChanged viewOptions viewport viewportEntered viewportEvent viewportMargins viewportSizeHint visibleRegion visualRect visualRegionForSelection whatsThis wheelEvent width widthMM winId window windowFilePath windowFlags windowHandle windowIcon windowIconChanged windowIconText windowIconTextChanged windowModality windowOpacity windowRole windowState windowTitle windowTitleChanged windowType wordWrap x y\n" ] } ], "source": [ "print ' '.join(dir(QTreeView))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scintilla" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Самым популярным компонентом для подсвеченного текста является Scintilla, которую использует, например, Notepad++. Для Qt существует враппер с Python-оберткой в свою очередь для него. Хороший обзор QScintilla можно найти здесь https://qscintilla.com/\n", "\n", "http://pyqt.sourceforge.net/Docs/QScintilla2/classQsciLexer.html\n", "\n", "https://qscintilla.com/downloads/qscintilla_docs.pdf\n", "\n", "https://scintilla.org/ScintillaDoc.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "conda install -c cogsci qscintilla2\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "```\n", "SCI_STYLESETFONT(int style, const char *fontName)\n", "SCI_STYLESETSIZE(int style, int sizePoints)\n", "SCI_STYLESETBOLD(int style, bool bold)\n", "SCI_STYLESETITALIC(int style, bool italic)\n", "SCI_STYLESETUNDERLINE(int style, bool underline)\n", "SCI_STYLESETFORE(int style, colour fore)\n", "SCI_STYLESETBACK(int style, colour back)\n", "SCI_STYLESETCHANGEABLE(int style, bool changeable)\n", "SCI_STYLESETHOTSPOT(int style, bool hotspot)\n", "```" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "python Python Single-quoted string\n" ] } ], "source": [ "print QsciLexerPython().lexer(), QsciLexerPython().language(), QsciLexerPython().description(4)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2\n" ] } ], "source": [ "print QsciLexerPython.Comment, QsciLexerPython.Number" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from PyQt5.Qsci import QsciScintilla, QsciLexerPython" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import xmltodict\n", "from ultra import file_get\n", "\n", "theme = xmltodict.parse(file_get(\"C:\\\\Program Files (x86)\\\\Notepad++\\\\themes\\\\Solarized-light.xml\"))\n", "\n", "style = [\n", " lexer_record['WordsStyle']\n", " for lexer_record in theme['NotepadPlus']['LexerStyles']['LexerType']\n", " if lexer_record['@name'] == 'python'\n", "][0]\n", "\n", "global_style = theme['NotepadPlus']['GlobalStyles']['WidgetStyle']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", "* менять стрелку влево на стрелку вправо на Margin?\n", "* collapsed-expanded\n", "* ссылки, обработка кликов на них\n", "* интеллисенс?\n", "* получение выделения\n", "* установление курсора/скролла, выделения\n", "* подсветка таких же выделенных слов\n", "* выделенный в Notepad++ текст имеет цвета, а у меня всегда белый\n", "* Настройки Scintilla из Notepad++?\n", "* Как прикрутить лексеры из Notepad++? pygments? Как подсвечивать синтаксис вставленных в текст блоков кода на разных языках?" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ANNOTATION_BOXED ANNOTATION_HIDDEN ANNOTATION_INDENTED ANNOTATION_STANDARD AcsAPIs AcsAll AcsDocument AcsNone AcusAlways AcusExplicit AcusNever AdjustIgnored AdjustToContents AdjustToContentsOnFirstShow AiClosing AiMaintain AiOpening AnnotationBoxed AnnotationDisplay AnnotationHidden AnnotationIndented AnnotationStandard AutoCompletionSource AutoCompletionUseSingle Background Bookmark BottomLeftCorner Box BoxIndicator BoxedFoldStyle BoxedMinus BoxedMinusConnected BoxedPlus BoxedPlusConnected BoxedTreeFoldStyle BraceMatch CARETSTYLE_BLOCK CARETSTYLE_INVISIBLE CARETSTYLE_LINE CARET_EVEN CARET_JUMPS CARET_SLOP CARET_STRICT CallTipsAboveText CallTipsBelowText CallTipsContext CallTipsNoAutoCompletionContext CallTipsNoContext CallTipsNone CallTipsPosition CallTipsStyle Circle CircledFoldStyle CircledMinus CircledMinusConnected CircledPlus CircledPlusConnected CircledTreeFoldStyle DashesIndicator DiagonalIndicator DotBoxIndicator DotsIndicator DownTriangle DrawChildren DrawWindowBackground EDGE_BACKGROUND EDGE_LINE EDGE_NONE EdgeBackground EdgeLine EdgeMode EdgeNone EolMac EolMode EolUnix EolWindows FoldStyle FullBoxIndicator FullRectangle HLine HiddenIndicator INDIC0_MASK INDIC1_MASK INDIC2_MASK INDICS_MASK INDIC_BOX INDIC_COMPOSITIONTHICK INDIC_COMPOSITIONTHIN INDIC_CONTAINER INDIC_DASH INDIC_DIAGONAL INDIC_DOTBOX INDIC_DOTS INDIC_FULLBOX INDIC_HIDDEN INDIC_IME INDIC_IME_MAX INDIC_MAX INDIC_PLAIN INDIC_ROUNDBOX INDIC_SQUIGGLE INDIC_SQUIGGLELOW INDIC_SQUIGGLEPIXMAP INDIC_STRAIGHTBOX INDIC_STRIKE INDIC_TEXTFORE INDIC_TT IgnoreMask IndicatorStyle Invisible LeftRectangle LeftSideRoundedSplitter LeftSideSplitter MarginType MarkerSymbol Minus MoNone MoSublineSelect NoBraceMatch NoFoldStyle NoFrame NumberMargin PaintDeviceMetric Panel PdmDepth PdmDevicePixelRatio PdmDevicePixelRatioScaled PdmDpiX PdmDpiY PdmHeight PdmHeightMM PdmNumColors PdmPhysicalDpiX PdmPhysicalDpiY PdmWidth PdmWidthMM Plain PlainFoldStyle PlainIndicator Plus QSCN_SELCHANGED Raised Rectangle RenderFlag RenderFlags RightArrow RightTriangle RoundBoxIndicator RoundedBottomLeftCorner SCEN_CHANGE SCFIND_CXX11REGEX SCFIND_MATCHCASE SCFIND_POSIX SCFIND_REGEXP SCFIND_WHOLEWORD SCFIND_WORDSTART SCI_ADDREFDOCUMENT SCI_ADDSELECTION SCI_ADDSTYLEDTEXT SCI_ADDTABSTOP SCI_ADDTEXT SCI_ADDUNDOACTION SCI_ALLOCATE SCI_ALLOCATEEXTENDEDSTYLES SCI_ALLOCATESUBSTYLES SCI_ANNOTATIONCLEARALL SCI_ANNOTATIONGETLINES SCI_ANNOTATIONGETSTYLE SCI_ANNOTATIONGETSTYLEOFFSET SCI_ANNOTATIONGETSTYLES SCI_ANNOTATIONGETTEXT SCI_ANNOTATIONGETVISIBLE SCI_ANNOTATIONSETSTYLE SCI_ANNOTATIONSETSTYLEOFFSET SCI_ANNOTATIONSETSTYLES SCI_ANNOTATIONSETTEXT SCI_ANNOTATIONSETVISIBLE SCI_APPENDTEXT SCI_ASSIGNCMDKEY SCI_AUTOCACTIVE SCI_AUTOCCANCEL SCI_AUTOCCOMPLETE SCI_AUTOCGETAUTOHIDE SCI_AUTOCGETCANCELATSTART SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR SCI_AUTOCGETCHOOSESINGLE SCI_AUTOCGETCURRENT SCI_AUTOCGETCURRENTTEXT SCI_AUTOCGETDROPRESTOFWORD SCI_AUTOCGETIGNORECASE SCI_AUTOCGETMAXHEIGHT SCI_AUTOCGETMAXWIDTH SCI_AUTOCGETMULTI SCI_AUTOCGETORDER SCI_AUTOCGETSEPARATOR SCI_AUTOCGETTYPESEPARATOR SCI_AUTOCPOSSTART SCI_AUTOCSELECT SCI_AUTOCSETAUTOHIDE SCI_AUTOCSETCANCELATSTART SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR SCI_AUTOCSETCHOOSESINGLE SCI_AUTOCSETDROPRESTOFWORD SCI_AUTOCSETFILLUPS SCI_AUTOCSETIGNORECASE SCI_AUTOCSETMAXHEIGHT SCI_AUTOCSETMAXWIDTH SCI_AUTOCSETMULTI SCI_AUTOCSETORDER SCI_AUTOCSETSEPARATOR SCI_AUTOCSETTYPESEPARATOR SCI_AUTOCSHOW SCI_AUTOCSTOPS SCI_BACKTAB SCI_BEGINUNDOACTION SCI_BRACEBADLIGHT SCI_BRACEBADLIGHTINDICATOR SCI_BRACEHIGHLIGHT SCI_BRACEHIGHLIGHTINDICATOR SCI_BRACEMATCH SCI_CALLTIPACTIVE SCI_CALLTIPCANCEL SCI_CALLTIPPOSSTART SCI_CALLTIPSETBACK SCI_CALLTIPSETFORE SCI_CALLTIPSETFOREHLT SCI_CALLTIPSETHLT SCI_CALLTIPSETPOSITION SCI_CALLTIPSETPOSSTART SCI_CALLTIPSHOW SCI_CALLTIPUSESTYLE SCI_CANCEL SCI_CANPASTE SCI_CANREDO SCI_CANUNDO SCI_CHANGEINSERTION SCI_CHANGELEXERSTATE SCI_CHARLEFT SCI_CHARLEFTEXTEND SCI_CHARLEFTRECTEXTEND SCI_CHARPOSITIONFROMPOINT SCI_CHARPOSITIONFROMPOINTCLOSE SCI_CHARRIGHT SCI_CHARRIGHTEXTEND SCI_CHARRIGHTRECTEXTEND SCI_CHOOSECARETX SCI_CLEAR SCI_CLEARALL SCI_CLEARALLCMDKEYS SCI_CLEARCMDKEY SCI_CLEARDOCUMENTSTYLE SCI_CLEARREGISTEREDIMAGES SCI_CLEARREPRESENTATION SCI_CLEARSELECTIONS SCI_CLEARTABSTOPS SCI_COLOURISE SCI_CONTRACTEDFOLDNEXT SCI_CONVERTEOLS SCI_COPY SCI_COPYALLOWLINE SCI_COPYRANGE SCI_COPYTEXT SCI_COUNTCHARACTERS SCI_CREATEDOCUMENT SCI_CREATELOADER SCI_CUT SCI_DELETEBACK SCI_DELETEBACKNOTLINE SCI_DELETERANGE SCI_DELLINELEFT SCI_DELLINERIGHT SCI_DELWORDLEFT SCI_DELWORDRIGHT SCI_DELWORDRIGHTEND SCI_DESCRIBEKEYWORDSETS SCI_DESCRIBEPROPERTY SCI_DISTANCETOSECONDARYSTYLES SCI_DOCLINEFROMVISIBLE SCI_DOCUMENTEND SCI_DOCUMENTENDEXTEND SCI_DOCUMENTSTART SCI_DOCUMENTSTARTEXTEND SCI_DROPSELECTIONN SCI_EDITTOGGLEOVERTYPE SCI_EMPTYUNDOBUFFER SCI_ENDUNDOACTION SCI_ENSUREVISIBLE SCI_ENSUREVISIBLEENFORCEPOLICY SCI_EXPANDCHILDREN SCI_FINDCOLUMN SCI_FINDINDICATORFLASH SCI_FINDINDICATORHIDE SCI_FINDINDICATORSHOW SCI_FINDTEXT SCI_FOLDALL SCI_FOLDCHILDREN SCI_FOLDLINE SCI_FORMATRANGE SCI_FORMFEED SCI_FREESUBSTYLES SCI_GETADDITIONALCARETFORE SCI_GETADDITIONALCARETSBLINK SCI_GETADDITIONALCARETSVISIBLE SCI_GETADDITIONALSELALPHA SCI_GETADDITIONALSELECTIONTYPING SCI_GETALLLINESVISIBLE SCI_GETANCHOR SCI_GETAUTOMATICFOLD SCI_GETBACKSPACEUNINDENTS SCI_GETBUFFEREDDRAW SCI_GETCARETFORE SCI_GETCARETLINEBACK SCI_GETCARETLINEBACKALPHA SCI_GETCARETLINEVISIBLE SCI_GETCARETLINEVISIBLEALWAYS SCI_GETCARETPERIOD SCI_GETCARETSTICKY SCI_GETCARETSTYLE SCI_GETCARETWIDTH SCI_GETCHARACTERPOINTER SCI_GETCHARAT SCI_GETCODEPAGE SCI_GETCOLUMN SCI_GETCONTROLCHARSYMBOL SCI_GETCURLINE SCI_GETCURRENTPOS SCI_GETCURSOR SCI_GETDIRECTFUNCTION SCI_GETDIRECTPOINTER SCI_GETDOCPOINTER SCI_GETEDGECOLOUR SCI_GETEDGECOLUMN SCI_GETEDGEMODE SCI_GETENDATLASTLINE SCI_GETENDSTYLED SCI_GETEOLMODE SCI_GETEXTRAASCENT SCI_GETEXTRADESCENT SCI_GETFIRSTVISIBLELINE SCI_GETFOCUS SCI_GETFOLDEXPANDED SCI_GETFOLDLEVEL SCI_GETFOLDPARENT SCI_GETFONTQUALITY SCI_GETGAPPOSITION SCI_GETHIGHLIGHTGUIDE SCI_GETHOTSPOTACTIVEBACK SCI_GETHOTSPOTACTIVEFORE SCI_GETHOTSPOTACTIVEUNDERLINE SCI_GETHOTSPOTSINGLELINE SCI_GETHSCROLLBAR SCI_GETIDENTIFIER SCI_GETIMEINTERACTION SCI_GETINDENT SCI_GETINDENTATIONGUIDES SCI_GETINDICATORCURRENT SCI_GETINDICATORVALUE SCI_GETKEYSUNICODE SCI_GETLASTCHILD SCI_GETLAYOUTCACHE SCI_GETLENGTH SCI_GETLEXER SCI_GETLEXERLANGUAGE SCI_GETLINE SCI_GETLINECOUNT SCI_GETLINEENDPOSITION SCI_GETLINEENDTYPESACTIVE SCI_GETLINEENDTYPESALLOWED SCI_GETLINEENDTYPESSUPPORTED SCI_GETLINEINDENTATION SCI_GETLINEINDENTPOSITION SCI_GETLINESELENDPOSITION SCI_GETLINESELSTARTPOSITION SCI_GETLINESTATE SCI_GETLINEVISIBLE SCI_GETMAINSELECTION SCI_GETMARGINCURSORN SCI_GETMARGINLEFT SCI_GETMARGINMASKN SCI_GETMARGINOPTIONS SCI_GETMARGINRIGHT SCI_GETMARGINSENSITIVEN SCI_GETMARGINTYPEN SCI_GETMARGINWIDTHN SCI_GETMAXLINESTATE SCI_GETMODEVENTMASK SCI_GETMODIFY SCI_GETMOUSEDOWNCAPTURES SCI_GETMOUSEDWELLTIME SCI_GETMOUSESELECTIONRECTANGULARSWITCH SCI_GETMULTIPASTE SCI_GETMULTIPLESELECTION SCI_GETNEXTTABSTOP SCI_GETOVERTYPE SCI_GETPASTECONVERTENDINGS SCI_GETPHASESDRAW SCI_GETPOSITIONCACHE SCI_GETPRIMARYSTYLEFROMSTYLE SCI_GETPRINTCOLOURMODE SCI_GETPRINTMAGNIFICATION SCI_GETPRINTWRAPMODE SCI_GETPROPERTY SCI_GETPROPERTYEXPANDED SCI_GETPROPERTYINT SCI_GETPUNCTUATIONCHARS SCI_GETRANGEPOINTER SCI_GETREADONLY SCI_GETRECTANGULARSELECTIONANCHOR SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE SCI_GETRECTANGULARSELECTIONCARET SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE SCI_GETRECTANGULARSELECTIONMODIFIER SCI_GETREPRESENTATION SCI_GETSCROLLWIDTH SCI_GETSCROLLWIDTHTRACKING SCI_GETSEARCHFLAGS SCI_GETSELALPHA SCI_GETSELECTIONEMPTY SCI_GETSELECTIONEND SCI_GETSELECTIONMODE SCI_GETSELECTIONNANCHOR SCI_GETSELECTIONNANCHORVIRTUALSPACE SCI_GETSELECTIONNCARET SCI_GETSELECTIONNCARETVIRTUALSPACE SCI_GETSELECTIONNEND SCI_GETSELECTIONNSTART SCI_GETSELECTIONS SCI_GETSELECTIONSTART SCI_GETSELEOLFILLED SCI_GETSELTEXT SCI_GETSTATUS SCI_GETSTYLEAT SCI_GETSTYLEBITS SCI_GETSTYLEBITSNEEDED SCI_GETSTYLEDTEXT SCI_GETSTYLEFROMSUBSTYLE SCI_GETSUBSTYLEBASES SCI_GETSUBSTYLESLENGTH SCI_GETSUBSTYLESSTART SCI_GETTABINDENTS SCI_GETTABWIDTH SCI_GETTAG SCI_GETTARGETEND SCI_GETTARGETRANGE SCI_GETTARGETSTART SCI_GETTECHNOLOGY SCI_GETTEXT SCI_GETTEXTLENGTH SCI_GETTEXTRANGE SCI_GETTWOPHASEDRAW SCI_GETUNDOCOLLECTION SCI_GETUSETABS SCI_GETVIEWEOL SCI_GETVIEWWS SCI_GETVIRTUALSPACEOPTIONS SCI_GETVSCROLLBAR SCI_GETWHITESPACECHARS SCI_GETWHITESPACESIZE SCI_GETWORDCHARS SCI_GETWRAPINDENTMODE SCI_GETWRAPMODE SCI_GETWRAPSTARTINDENT SCI_GETWRAPVISUALFLAGS SCI_GETWRAPVISUALFLAGSLOCATION SCI_GETXOFFSET SCI_GETZOOM SCI_GOTOLINE SCI_GOTOPOS SCI_GRABFOCUS SCI_HIDELINES SCI_HIDESELECTION SCI_HOME SCI_HOMEDISPLAY SCI_HOMEDISPLAYEXTEND SCI_HOMEEXTEND SCI_HOMERECTEXTEND SCI_HOMEWRAP SCI_HOMEWRAPEXTEND SCI_INDICATORALLONFOR SCI_INDICATORCLEARRANGE SCI_INDICATOREND SCI_INDICATORFILLRANGE SCI_INDICATORSTART SCI_INDICATORVALUEAT SCI_INDICGETALPHA SCI_INDICGETFLAGS SCI_INDICGETFORE SCI_INDICGETHOVERFORE SCI_INDICGETHOVERSTYLE SCI_INDICGETOUTLINEALPHA SCI_INDICGETSTYLE SCI_INDICGETUNDER SCI_INDICSETALPHA SCI_INDICSETFLAGS SCI_INDICSETFORE SCI_INDICSETHOVERFORE SCI_INDICSETHOVERSTYLE SCI_INDICSETOUTLINEALPHA SCI_INDICSETSTYLE SCI_INDICSETUNDER SCI_INSERTTEXT SCI_LEXER_START SCI_LINECOPY SCI_LINECUT SCI_LINEDELETE SCI_LINEDOWN SCI_LINEDOWNEXTEND SCI_LINEDOWNRECTEXTEND SCI_LINEDUPLICATE SCI_LINEEND SCI_LINEENDDISPLAY SCI_LINEENDDISPLAYEXTEND SCI_LINEENDEXTEND SCI_LINEENDRECTEXTEND SCI_LINEENDWRAP SCI_LINEENDWRAPEXTEND SCI_LINEFROMPOSITION SCI_LINELENGTH SCI_LINESCROLL SCI_LINESCROLLDOWN SCI_LINESCROLLUP SCI_LINESJOIN SCI_LINESONSCREEN SCI_LINESSPLIT SCI_LINETRANSPOSE SCI_LINEUP SCI_LINEUPEXTEND SCI_LINEUPRECTEXTEND SCI_LOADLEXERLIBRARY SCI_LOWERCASE SCI_MARGINGETSTYLE SCI_MARGINGETSTYLEOFFSET SCI_MARGINGETSTYLES SCI_MARGINGETTEXT SCI_MARGINSETSTYLE SCI_MARGINSETSTYLEOFFSET SCI_MARGINSETSTYLES SCI_MARGINSETTEXT SCI_MARGINTEXTCLEARALL SCI_MARKERADD SCI_MARKERADDSET SCI_MARKERDEFINE SCI_MARKERDEFINEPIXMAP SCI_MARKERDEFINERGBAIMAGE SCI_MARKERDELETE SCI_MARKERDELETEALL SCI_MARKERDELETEHANDLE SCI_MARKERENABLEHIGHLIGHT SCI_MARKERGET SCI_MARKERLINEFROMHANDLE SCI_MARKERNEXT SCI_MARKERPREVIOUS SCI_MARKERSETALPHA SCI_MARKERSETBACK SCI_MARKERSETBACKSELECTED SCI_MARKERSETFORE SCI_MARKERSYMBOLDEFINED SCI_MOVECARETINSIDEVIEW SCI_MOVESELECTEDLINESDOWN SCI_MOVESELECTEDLINESUP SCI_NEWLINE SCI_NULL SCI_OPTIONAL_START SCI_PAGEDOWN SCI_PAGEDOWNEXTEND SCI_PAGEDOWNRECTEXTEND SCI_PAGEUP SCI_PAGEUPEXTEND SCI_PAGEUPRECTEXTEND SCI_PARADOWN SCI_PARADOWNEXTEND SCI_PARAUP SCI_PARAUPEXTEND SCI_PASTE SCI_POINTXFROMPOSITION SCI_POINTYFROMPOSITION SCI_POSITIONAFTER SCI_POSITIONBEFORE SCI_POSITIONFROMLINE SCI_POSITIONFROMPOINT SCI_POSITIONFROMPOINTCLOSE SCI_POSITIONRELATIVE SCI_PRIVATELEXERCALL SCI_PROPERTYNAMES SCI_PROPERTYTYPE SCI_REDO SCI_REGISTERIMAGE SCI_REGISTERRGBAIMAGE SCI_RELEASEALLEXTENDEDSTYLES SCI_RELEASEDOCUMENT SCI_REPLACESEL SCI_REPLACETARGET SCI_REPLACETARGETRE SCI_RGBAIMAGESETHEIGHT SCI_RGBAIMAGESETSCALE SCI_RGBAIMAGESETWIDTH SCI_ROTATESELECTION SCI_SCROLLCARET SCI_SCROLLRANGE SCI_SCROLLTOEND SCI_SCROLLTOSTART SCI_SEARCHANCHOR SCI_SEARCHINTARGET SCI_SEARCHNEXT SCI_SEARCHPREV SCI_SELECTALL SCI_SELECTIONDUPLICATE SCI_SELECTIONISRECTANGLE SCI_SETADDITIONALCARETFORE SCI_SETADDITIONALCARETSBLINK SCI_SETADDITIONALCARETSVISIBLE SCI_SETADDITIONALSELALPHA SCI_SETADDITIONALSELBACK SCI_SETADDITIONALSELECTIONTYPING SCI_SETADDITIONALSELFORE SCI_SETANCHOR SCI_SETAUTOMATICFOLD SCI_SETBACKSPACEUNINDENTS SCI_SETBUFFEREDDRAW SCI_SETCARETFORE SCI_SETCARETLINEBACK SCI_SETCARETLINEBACKALPHA SCI_SETCARETLINEVISIBLE SCI_SETCARETLINEVISIBLEALWAYS SCI_SETCARETPERIOD SCI_SETCARETSTICKY SCI_SETCARETSTYLE SCI_SETCARETWIDTH SCI_SETCHARSDEFAULT SCI_SETCODEPAGE SCI_SETCONTROLCHARSYMBOL SCI_SETCURRENTPOS SCI_SETCURSOR SCI_SETDOCPOINTER SCI_SETEDGECOLOUR SCI_SETEDGECOLUMN SCI_SETEDGEMODE SCI_SETEMPTYSELECTION SCI_SETENDATLASTLINE SCI_SETEOLMODE SCI_SETEXTRAASCENT SCI_SETEXTRADESCENT SCI_SETFIRSTVISIBLELINE SCI_SETFOCUS SCI_SETFOLDEXPANDED SCI_SETFOLDFLAGS SCI_SETFOLDLEVEL SCI_SETFOLDMARGINCOLOUR SCI_SETFOLDMARGINHICOLOUR SCI_SETFONTQUALITY SCI_SETHIGHLIGHTGUIDE SCI_SETHOTSPOTACTIVEBACK SCI_SETHOTSPOTACTIVEFORE SCI_SETHOTSPOTACTIVEUNDERLINE SCI_SETHOTSPOTSINGLELINE SCI_SETHSCROLLBAR SCI_SETIDENTIFIER SCI_SETIDENTIFIERS SCI_SETIMEINTERACTION SCI_SETINDENT SCI_SETINDENTATIONGUIDES SCI_SETINDICATORCURRENT SCI_SETINDICATORVALUE SCI_SETKEYSUNICODE SCI_SETKEYWORDS SCI_SETLAYOUTCACHE SCI_SETLEXER SCI_SETLEXERLANGUAGE SCI_SETLINEENDTYPESALLOWED SCI_SETLINEINDENTATION SCI_SETLINESTATE SCI_SETMAINSELECTION SCI_SETMARGINCURSORN SCI_SETMARGINLEFT SCI_SETMARGINMASKN SCI_SETMARGINOPTIONS SCI_SETMARGINRIGHT SCI_SETMARGINSENSITIVEN SCI_SETMARGINTYPEN SCI_SETMARGINWIDTHN SCI_SETMODEVENTMASK SCI_SETMOUSEDOWNCAPTURES SCI_SETMOUSEDWELLTIME SCI_SETMOUSESELECTIONRECTANGULARSWITCH SCI_SETMULTIPASTE SCI_SETMULTIPLESELECTION SCI_SETOVERTYPE SCI_SETPASTECONVERTENDINGS SCI_SETPHASESDRAW SCI_SETPOSITIONCACHE SCI_SETPRINTCOLOURMODE SCI_SETPRINTMAGNIFICATION SCI_SETPRINTWRAPMODE SCI_SETPROPERTY SCI_SETPUNCTUATIONCHARS SCI_SETREADONLY SCI_SETRECTANGULARSELECTIONANCHOR SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE SCI_SETRECTANGULARSELECTIONCARET SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE SCI_SETRECTANGULARSELECTIONMODIFIER SCI_SETREPRESENTATION SCI_SETSAVEPOINT SCI_SETSCROLLWIDTH SCI_SETSCROLLWIDTHTRACKING SCI_SETSEARCHFLAGS SCI_SETSEL SCI_SETSELALPHA SCI_SETSELBACK SCI_SETSELECTION SCI_SETSELECTIONEND SCI_SETSELECTIONMODE SCI_SETSELECTIONNANCHOR SCI_SETSELECTIONNANCHORVIRTUALSPACE SCI_SETSELECTIONNCARET SCI_SETSELECTIONNCARETVIRTUALSPACE SCI_SETSELECTIONNEND SCI_SETSELECTIONNSTART SCI_SETSELECTIONSTART SCI_SETSELEOLFILLED SCI_SETSELFORE SCI_SETSTATUS SCI_SETSTYLEBITS SCI_SETSTYLING SCI_SETSTYLINGEX SCI_SETTABINDENTS SCI_SETTABWIDTH SCI_SETTARGETEND SCI_SETTARGETRANGE SCI_SETTARGETSTART SCI_SETTECHNOLOGY SCI_SETTEXT SCI_SETTWOPHASEDRAW SCI_SETUNDOCOLLECTION SCI_SETUSETABS SCI_SETVIEWEOL SCI_SETVIEWWS SCI_SETVIRTUALSPACEOPTIONS SCI_SETVISIBLEPOLICY SCI_SETVSCROLLBAR SCI_SETWHITESPACEBACK SCI_SETWHITESPACECHARS SCI_SETWHITESPACEFORE SCI_SETWHITESPACESIZE SCI_SETWORDCHARS SCI_SETWRAPINDENTMODE SCI_SETWRAPMODE SCI_SETWRAPSTARTINDENT SCI_SETWRAPVISUALFLAGS SCI_SETWRAPVISUALFLAGSLOCATION SCI_SETXCARETPOLICY SCI_SETXOFFSET SCI_SETYCARETPOLICY SCI_SETZOOM SCI_SHOWLINES SCI_START SCI_STARTRECORD SCI_STARTSTYLING SCI_STOPRECORD SCI_STUTTEREDPAGEDOWN SCI_STUTTEREDPAGEDOWNEXTEND SCI_STUTTEREDPAGEUP SCI_STUTTEREDPAGEUPEXTEND SCI_STYLECLEARALL SCI_STYLEGETBACK SCI_STYLEGETBOLD SCI_STYLEGETCASE SCI_STYLEGETCHANGEABLE SCI_STYLEGETCHARACTERSET SCI_STYLEGETEOLFILLED SCI_STYLEGETFONT SCI_STYLEGETFORE SCI_STYLEGETHOTSPOT SCI_STYLEGETITALIC SCI_STYLEGETSIZE SCI_STYLEGETSIZEFRACTIONAL SCI_STYLEGETUNDERLINE SCI_STYLEGETVISIBLE SCI_STYLEGETWEIGHT SCI_STYLERESETDEFAULT SCI_STYLESETBACK SCI_STYLESETBOLD SCI_STYLESETCASE SCI_STYLESETCHANGEABLE SCI_STYLESETCHARACTERSET SCI_STYLESETEOLFILLED SCI_STYLESETFONT SCI_STYLESETFORE SCI_STYLESETHOTSPOT SCI_STYLESETITALIC SCI_STYLESETSIZE SCI_STYLESETSIZEFRACTIONAL SCI_STYLESETUNDERLINE SCI_STYLESETVISIBLE SCI_STYLESETWEIGHT SCI_SWAPMAINANCHORCARET SCI_TAB SCI_TARGETFROMSELECTION SCI_TEXTHEIGHT SCI_TEXTWIDTH SCI_TOGGLECARETSTICKY SCI_TOGGLEFOLD SCI_UNDO SCI_UPPERCASE SCI_USEPOPUP SCI_USERLISTSHOW SCI_VCHOME SCI_VCHOMEEXTEND SCI_VCHOMERECTEXTEND SCI_VCHOMEWRAP SCI_VCHOMEWRAPEXTEND SCI_VERTICALCENTRECARET SCI_VISIBLEFROMDOCLINE SCI_WORDENDPOSITION SCI_WORDLEFT SCI_WORDLEFTEND SCI_WORDLEFTENDEXTEND SCI_WORDLEFTEXTEND SCI_WORDPARTLEFT SCI_WORDPARTLEFTEXTEND SCI_WORDPARTRIGHT SCI_WORDPARTRIGHTEXTEND SCI_WORDRIGHT SCI_WORDRIGHTEND SCI_WORDRIGHTENDEXTEND SCI_WORDRIGHTEXTEND SCI_WORDSTARTPOSITION SCI_WRAPCOUNT SCI_ZOOMIN SCI_ZOOMOUT SCK_ADD SCK_BACK SCK_DELETE SCK_DIVIDE SCK_DOWN SCK_END SCK_ESCAPE SCK_HOME SCK_INSERT SCK_LEFT SCK_MENU SCK_NEXT SCK_PRIOR SCK_RETURN SCK_RIGHT SCK_RWIN SCK_SUBTRACT SCK_TAB SCK_UP SCK_WIN SCLEX_A68K SCLEX_ABAQUS SCLEX_ADA SCLEX_APDL SCLEX_AS SCLEX_ASM SCLEX_ASN1 SCLEX_ASP SCLEX_ASYMPTOTE SCLEX_AU3 SCLEX_AVE SCLEX_AVS SCLEX_BAAN SCLEX_BASH SCLEX_BATCH SCLEX_BIBTEX SCLEX_BLITZBASIC SCLEX_BULLANT SCLEX_CAML SCLEX_CLW SCLEX_CLWNOCASE SCLEX_CMAKE SCLEX_COBOL SCLEX_COFFEESCRIPT SCLEX_CONF SCLEX_CONTAINER SCLEX_CPP SCLEX_CPPNOCASE SCLEX_CSOUND SCLEX_CSS SCLEX_D SCLEX_DIFF SCLEX_DMAP SCLEX_DMIS SCLEX_ECL SCLEX_EIFFEL SCLEX_EIFFELKW SCLEX_ERLANG SCLEX_ERRORLIST SCLEX_ESCRIPT SCLEX_F77 SCLEX_FLAGSHIP SCLEX_FORTH SCLEX_FORTRAN SCLEX_FREEBASIC SCLEX_GAP SCLEX_GUI4CLI SCLEX_HASKELL SCLEX_HTML SCLEX_IHEX SCLEX_INNOSETUP SCLEX_KIX SCLEX_KVIRC SCLEX_LATEX SCLEX_LISP SCLEX_LITERATEHASKELL SCLEX_LOT SCLEX_LOUT SCLEX_LUA SCLEX_MAGIK SCLEX_MAKEFILE SCLEX_MARKDOWN SCLEX_MATLAB SCLEX_METAPOST SCLEX_MMIXAL SCLEX_MODULA SCLEX_MSSQL SCLEX_MYSQL SCLEX_NIMROD SCLEX_NNCRONTAB SCLEX_NSIS SCLEX_NULL SCLEX_OCTAVE SCLEX_OPAL SCLEX_OSCRIPT SCLEX_PASCAL SCLEX_PERL SCLEX_PHP SCLEX_PHPSCRIPT SCLEX_PLM SCLEX_PO SCLEX_POV SCLEX_POWERBASIC SCLEX_POWERPRO SCLEX_POWERSHELL SCLEX_PROGRESS SCLEX_PROPERTIES SCLEX_PS SCLEX_PUREBASIC SCLEX_PYTHON SCLEX_R SCLEX_REBOL SCLEX_REGISTRY SCLEX_RUBY SCLEX_RUST SCLEX_SCRIPTOL SCLEX_SMALLTALK SCLEX_SML SCLEX_SORCUS SCLEX_SPECMAN SCLEX_SPICE SCLEX_SQL SCLEX_SREC SCLEX_STTXT SCLEX_TACL SCLEX_TADS3 SCLEX_TAL SCLEX_TCL SCLEX_TCMD SCLEX_TEHEX SCLEX_TEX SCLEX_TXT2TAGS SCLEX_VB SCLEX_VBSCRIPT SCLEX_VERILOG SCLEX_VHDL SCLEX_VISUALPROLOG SCLEX_XML SCLEX_YAML SCMOD_ALT SCMOD_CTRL SCMOD_META SCMOD_NORM SCMOD_SHIFT SCMOD_SUPER SCN_AUTOCCANCELLED SCN_AUTOCCHARDELETED SCN_AUTOCSELECTION SCN_CALLTIPCLICK SCN_CHARADDED SCN_DOUBLECLICK SCN_DWELLEND SCN_DWELLSTART SCN_FOCUSIN SCN_FOCUSOUT SCN_HOTSPOTCLICK SCN_HOTSPOTDOUBLECLICK SCN_HOTSPOTRELEASECLICK SCN_INDICATORCLICK SCN_INDICATORRELEASE SCN_MACRORECORD SCN_MARGINCLICK SCN_MODIFIED SCN_MODIFYATTEMPTRO SCN_NEEDSHOWN SCN_PAINTED SCN_SAVEPOINTLEFT SCN_SAVEPOINTREACHED SCN_STYLENEEDED SCN_UPDATEUI SCN_USERLISTSELECTION SCN_ZOOM SCVS_NONE SCVS_RECTANGULARSELECTION SCVS_USERACCESSIBLE SCWS_INVISIBLE SCWS_VISIBLEAFTERINDENT SCWS_VISIBLEALWAYS SC_ALPHA_NOALPHA SC_ALPHA_OPAQUE SC_ALPHA_TRANSPARENT SC_AUTOMATICFOLD_CHANGE SC_AUTOMATICFOLD_CLICK SC_AUTOMATICFOLD_SHOW SC_CACHE_CARET SC_CACHE_DOCUMENT SC_CACHE_NONE SC_CACHE_PAGE SC_CARETSTICKY_OFF SC_CARETSTICKY_ON SC_CARETSTICKY_WHITESPACE SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE SC_CASE_LOWER SC_CASE_MIXED SC_CASE_UPPER SC_CHARSET_8859_15 SC_CHARSET_ANSI SC_CHARSET_ARABIC SC_CHARSET_BALTIC SC_CHARSET_CHINESEBIG5 SC_CHARSET_DEFAULT SC_CHARSET_EASTEUROPE SC_CHARSET_GB2312 SC_CHARSET_GREEK SC_CHARSET_HANGUL SC_CHARSET_HEBREW SC_CHARSET_JOHAB SC_CHARSET_MAC SC_CHARSET_OEM SC_CHARSET_RUSSIAN SC_CHARSET_SHIFTJIS SC_CHARSET_SYMBOL SC_CHARSET_THAI SC_CHARSET_TURKISH SC_CHARSET_VIETNAMESE SC_CP_DBCS SC_CP_UTF8 SC_CURSORARROW SC_CURSORNORMAL SC_CURSORREVERSEARROW SC_CURSORWAIT SC_EFF_QUALITY_ANTIALIASED SC_EFF_QUALITY_DEFAULT SC_EFF_QUALITY_LCD_OPTIMIZED SC_EFF_QUALITY_MASK SC_EFF_QUALITY_NON_ANTIALIASED SC_EOL_CR SC_EOL_CRLF SC_EOL_LF SC_FOLDACTION_CONTRACT SC_FOLDACTION_EXPAND SC_FOLDACTION_TOGGLE SC_FOLDFLAG_LEVELNUMBERS SC_FOLDFLAG_LINEAFTER_CONTRACTED SC_FOLDFLAG_LINEAFTER_EXPANDED SC_FOLDFLAG_LINEBEFORE_CONTRACTED SC_FOLDFLAG_LINEBEFORE_EXPANDED SC_FOLDFLAG_LINESTATE SC_FOLDLEVELBASE SC_FOLDLEVELHEADERFLAG SC_FOLDLEVELNUMBERMASK SC_FOLDLEVELWHITEFLAG SC_FONT_SIZE_MULTIPLIER SC_IME_INLINE SC_IME_WINDOWED SC_INDICFLAG_VALUEBEFORE SC_INDICVALUEBIT SC_INDICVALUEMASK SC_IV_LOOKBOTH SC_IV_LOOKFORWARD SC_IV_NONE SC_IV_REAL SC_LASTSTEPINUNDOREDO SC_LINE_END_TYPE_DEFAULT SC_LINE_END_TYPE_UNICODE SC_MARGINOPTION_NONE SC_MARGINOPTION_SUBLINESELECT SC_MARGIN_BACK SC_MARGIN_FORE SC_MARGIN_NUMBER SC_MARGIN_RTEXT SC_MARGIN_SYMBOL SC_MARGIN_TEXT SC_MARKNUM_FOLDER SC_MARKNUM_FOLDEREND SC_MARKNUM_FOLDERMIDTAIL SC_MARKNUM_FOLDEROPEN SC_MARKNUM_FOLDEROPENMID SC_MARKNUM_FOLDERSUB SC_MARKNUM_FOLDERTAIL SC_MARK_ARROW SC_MARK_ARROWDOWN SC_MARK_ARROWS SC_MARK_AVAILABLE SC_MARK_BACKGROUND SC_MARK_BOOKMARK SC_MARK_BOXMINUS SC_MARK_BOXMINUSCONNECTED SC_MARK_BOXPLUS SC_MARK_BOXPLUSCONNECTED SC_MARK_CHARACTER SC_MARK_CIRCLE SC_MARK_CIRCLEMINUS SC_MARK_CIRCLEMINUSCONNECTED SC_MARK_CIRCLEPLUS SC_MARK_CIRCLEPLUSCONNECTED SC_MARK_DOTDOTDOT SC_MARK_EMPTY SC_MARK_FULLRECT SC_MARK_LCORNER SC_MARK_LCORNERCURVE SC_MARK_LEFTRECT SC_MARK_MINUS SC_MARK_PIXMAP SC_MARK_PLUS SC_MARK_RGBAIMAGE SC_MARK_ROUNDRECT SC_MARK_SHORTARROW SC_MARK_SMALLRECT SC_MARK_TCORNER SC_MARK_TCORNERCURVE SC_MARK_UNDERLINE SC_MARK_VLINE SC_MASK_FOLDERS SC_MODEVENTMASKALL SC_MOD_BEFOREDELETE SC_MOD_BEFOREINSERT SC_MOD_CHANGEANNOTATION SC_MOD_CHANGEFOLD SC_MOD_CHANGEINDICATOR SC_MOD_CHANGELINESTATE SC_MOD_CHANGEMARGIN SC_MOD_CHANGEMARKER SC_MOD_CHANGESTYLE SC_MOD_CHANGETABSTOPS SC_MOD_CONTAINER SC_MOD_DELETETEXT SC_MOD_INSERTCHECK SC_MOD_INSERTTEXT SC_MOD_LEXERSTATE SC_MULTIAUTOC_EACH SC_MULTIAUTOC_ONCE SC_MULTILINEUNDOREDO SC_MULTIPASTE_EACH SC_MULTIPASTE_ONCE SC_MULTISTEPUNDOREDO SC_ORDER_CUSTOM SC_ORDER_PERFORMSORT SC_ORDER_PRESORTED SC_PERFORMED_REDO SC_PERFORMED_UNDO SC_PERFORMED_USER SC_PHASES_MULTIPLE SC_PHASES_ONE SC_PHASES_TWO SC_PRINT_BLACKONWHITE SC_PRINT_COLOURONWHITE SC_PRINT_COLOURONWHITEDEFAULTBG SC_PRINT_INVERTLIGHT SC_PRINT_NORMAL SC_SEL_LINES SC_SEL_RECTANGLE SC_SEL_STREAM SC_SEL_THIN SC_STARTACTION SC_STATUS_BADALLOC SC_STATUS_FAILURE SC_STATUS_OK SC_STATUS_WARNREGEX SC_STATUS_WARN_START SC_TECHNOLOGY_DEFAULT SC_TECHNOLOGY_DIRECTWRITE SC_TECHNOLOGY_DIRECTWRITEDC SC_TECHNOLOGY_DIRECTWRITERETAIN SC_TIME_FOREVER SC_TYPE_BOOLEAN SC_TYPE_INTEGER SC_TYPE_STRING SC_UPDATE_CONTENT SC_UPDATE_H_SCROLL SC_UPDATE_SELECTION SC_UPDATE_V_SCROLL SC_WEIGHT_BOLD SC_WEIGHT_NORMAL SC_WEIGHT_SEMIBOLD SC_WRAPINDENT_FIXED SC_WRAPINDENT_INDENT SC_WRAPINDENT_SAME SC_WRAPVISUALFLAGLOC_DEFAULT SC_WRAPVISUALFLAGLOC_END_BY_TEXT SC_WRAPVISUALFLAGLOC_START_BY_TEXT SC_WRAPVISUALFLAG_END SC_WRAPVISUALFLAG_MARGIN SC_WRAPVISUALFLAG_NONE SC_WRAPVISUALFLAG_START SC_WRAP_CHAR SC_WRAP_NONE SC_WRAP_WHITESPACE SC_WRAP_WORD STYLE_BRACEBAD STYLE_BRACELIGHT STYLE_CALLTIP STYLE_CONTROLCHAR STYLE_DEFAULT STYLE_INDENTGUIDE STYLE_LASTPREDEFINED STYLE_LINENUMBER STYLE_MAX SendScintilla SendScintillaPtrResult Shadow Shadow_Mask Shape Shape_Mask SizeAdjustPolicy SloppyBraceMatch SmallRectangle SquiggleIndicator SquiggleLowIndicator SquigglePixmapIndicator StraightBoxIndicator StrictBraceMatch StrikeIndicator StyleMask StyledPanel Sunken SymbolMargin SymbolMarginDefaultBackgroundColor SymbolMarginDefaultForegroundColor TTIndicator TextColorIndicator TextMargin TextMarginRightJustified ThickCompositionIndicator ThinCompositionIndicator ThreeDots ThreeRightArrows UNDO_MAY_COALESCE Underline VISIBLE_SLOP VISIBLE_STRICT VLine VerticalLine WhitespaceVisibility WinPanel WrapCharacter WrapFlagByBorder WrapFlagByText WrapFlagInMargin WrapFlagNone WrapIndentFixed WrapIndentIndented WrapIndentMode WrapIndentSame WrapMode WrapNone WrapVisualFlag WrapWhitespace WrapWord WsInvisible WsVisible WsVisibleAfterIndent __class__ __delattr__ __dict__ __doc__ __format__ __getattr__ __getattribute__ __hash__ __init__ __module__ __new__ __reduce__ __reduce_ex__ __repr__ __setattr__ __sizeof__ __str__ __subclasshook__ __weakref__ acceptDrops accessibleDescription accessibleName actionEvent actions activateWindow addAction addActions addScrollBarWidget adjustSize annotate annotation annotationDisplay apiContext append autoCompleteFromAPIs autoCompleteFromAll autoCompleteFromDocument autoCompletionCaseSensitivity autoCompletionFillupsEnabled autoCompletionReplaceWord autoCompletionShowSingle autoCompletionSource autoCompletionThreshold autoCompletionUseSingle autoFillBackground autoIndent backgroundRole backspaceUnindents baseSize beginUndoAction blockSignals braceMatching callTip callTipsPosition callTipsStyle callTipsVisible canInsertFromMimeData cancelList caseSensitive changeEvent childAt childEvent children childrenRect childrenRegion clear clearAnnotations clearFocus clearFolds clearIndicatorRange clearMarginText clearMask clearRegisteredImages close closeEvent color colorCount connectNotify contentsMargins contentsRect contextMenuEvent contextMenuPolicy contractedFolds convertEols copy copyAvailable cornerWidget create createStandardContextMenu createWindowContainer cursor cursorPositionChanged customContextMenuRequested customEvent cut deleteLater depth destroy destroyed devType devicePixelRatio devicePixelRatioF devicePixelRatioFScale disconnect disconnectNotify document dragEnterEvent dragLeaveEvent dragMoveEvent drawFrame dropEvent dumpObjectInfo dumpObjectTree dynamicPropertyNames edgeColor edgeColumn edgeMode effectiveWinId endUndoAction ensureCursorVisible ensureLineVisible ensurePolished enterEvent eolMode eolVisibility event eventFilter extraAscent extraDescent fillIndicatorRange find findChild findChildren findFirst findFirstInSelection findNext firstVisibleLine focusInEvent focusNextChild focusNextPrevChild focusOutEvent focusPolicy focusPreviousChild focusProxy focusWidget foldAll foldLine folding font fontInfo fontMetrics foregroundRole frameGeometry frameRect frameShadow frameShape frameSize frameStyle frameWidth fromMimeData geometry getContentsMargins getCursorPosition getSelection grab grabGesture grabKeyboard grabMouse grabShortcut graphicsEffect graphicsProxyWidget hasFocus hasHeightForWidth hasMouseTracking hasSelectedText height heightForWidth heightMM hide hideEvent horizontalScrollBar horizontalScrollBarPolicy indent indentation indentationGuides indentationWidth indentationsUseTabs indicatorClicked indicatorDefine indicatorDrawUnder indicatorReleased inherits initPainter initStyleOption inputMethodEvent inputMethodHints inputMethodQuery insert insertAction insertActions insertAt installEventFilter isActiveWindow isAncestorOf isCallTipActive isEnabled isEnabledTo isFullScreen isHidden isLeftToRight isListActive isMaximized isMinimized isModal isModified isReadOnly isRedoAvailable isRightToLeft isSignalConnected isUndoAvailable isUtf8 isVisible isVisibleTo isWidgetType isWindow isWindowModified isWindowType isWordCharacter keyPressEvent keyReleaseEvent keyboardGrabber killTimer layout layoutDirection leaveEvent length lexer lineAt lineIndexFromPosition lineLength lineWidth lines linesChanged locale logicalDpiX logicalDpiY lower mapFrom mapFromGlobal mapFromParent mapTo mapToGlobal mapToParent marginClicked marginLineNumbers marginMarkerMask marginOptions marginSensitivity marginType marginWidth markerAdd markerDefine markerDelete markerDeleteAll markerDeleteHandle markerFindNext markerFindPrevious markerLine markersAtLine mask maximumHeight maximumSize maximumViewportSize maximumWidth metaObject metric midLineWidth minimumHeight minimumSize minimumSizeHint minimumWidth modificationAttempted modificationChanged mouseDoubleClickEvent mouseGrabber mouseMoveEvent mousePressEvent mouseReleaseEvent move moveEvent moveToMatchingBrace moveToThread nativeEvent nativeParentWidget nextInFocusChain normalGeometry objectName objectNameChanged overrideWindowFlags overrideWindowState overwriteMode paintEngine paintEvent paintingActive palette paper parent parentWidget paste physicalDpiX physicalDpiY pool pos positionFromLineIndex previousInFocusChain property pyqtConfigure raise_ read receivers recolor rect redo registerImage releaseKeyboard releaseMouse releaseShortcut removeAction removeEventFilter removeSelectedText render repaint replace replaceSelectedText resetFoldMarginColors resetHotspotBackgroundColor resetHotspotForegroundColor resetMatchedBraceIndicator resetSelectionBackgroundColor resetSelectionForegroundColor resetUnmatchedBraceIndicator resize resizeEvent restoreGeometry saveGeometry scroll scrollBarWidgets scrollContentsBy selectAll selectToMatchingBrace selectedText selectionChanged selectionToEol sender senderSignalIndex setAcceptDrops setAccessibleDescription setAccessibleName setAnnotationDisplay setAttribute setAutoCompletionCaseSensitivity setAutoCompletionFillups setAutoCompletionFillupsEnabled setAutoCompletionReplaceWord setAutoCompletionShowSingle setAutoCompletionSource setAutoCompletionThreshold setAutoCompletionUseSingle setAutoCompletionWordSeparators setAutoFillBackground setAutoIndent setBackgroundRole setBackspaceUnindents setBaseSize setBraceMatching setCallTipsBackgroundColor setCallTipsForegroundColor setCallTipsHighlightColor setCallTipsPosition setCallTipsStyle setCallTipsVisible setCaretForegroundColor setCaretLineBackgroundColor setCaretLineVisible setCaretWidth setColor setContentsMargins setContextMenuPolicy setContractedFolds setCornerWidget setCursor setCursorPosition setDisabled setDocument setEdgeColor setEdgeColumn setEdgeMode setEnabled setEolMode setEolVisibility setExtraAscent setExtraDescent setFirstVisibleLine setFixedHeight setFixedSize setFixedWidth setFocus setFocusPolicy setFocusProxy setFoldMarginColors setFolding setFont setForegroundRole setFrameRect setFrameShadow setFrameShape setFrameStyle setGeometry setGraphicsEffect setHidden setHorizontalScrollBar setHorizontalScrollBarPolicy setHotspotBackgroundColor setHotspotForegroundColor setHotspotUnderline setHotspotWrap setIndentation setIndentationGuides setIndentationGuidesBackgroundColor setIndentationGuidesForegroundColor setIndentationWidth setIndentationsUseTabs setIndicatorDrawUnder setIndicatorForegroundColor setIndicatorHoverForegroundColor setIndicatorHoverStyle setIndicatorOutlineColor setInputMethodHints setLayout setLayoutDirection setLexer setLineWidth setLocale setMarginLineNumbers setMarginMarkerMask setMarginOptions setMarginSensitivity setMarginText setMarginType setMarginWidth setMarginsBackgroundColor setMarginsFont setMarginsForegroundColor setMarkerBackgroundColor setMarkerForegroundColor setMask setMatchedBraceBackgroundColor setMatchedBraceForegroundColor setMatchedBraceIndicator setMaximumHeight setMaximumSize setMaximumWidth setMidLineWidth setMinimumHeight setMinimumSize setMinimumWidth setModified setMouseTracking setObjectName setOverwriteMode setPalette setPaper setParent setProperty setReadOnly setSelection setSelectionBackgroundColor setSelectionForegroundColor setSelectionToEol setShortcutAutoRepeat setShortcutEnabled setSizeAdjustPolicy setSizeIncrement setSizePolicy setStatusTip setStyle setStyleSheet setTabIndents setTabOrder setTabWidth setText setToolTip setToolTipDuration setUnmatchedBraceBackgroundColor setUnmatchedBraceForegroundColor setUnmatchedBraceIndicator setUpdatesEnabled setUtf8 setVerticalScrollBar setVerticalScrollBarPolicy setViewport setViewportMargins setVisible setWhatsThis setWhitespaceBackgroundColor setWhitespaceForegroundColor setWhitespaceSize setWhitespaceVisibility setWindowFilePath setWindowFlags setWindowIcon setWindowIconText setWindowModality setWindowModified setWindowOpacity setWindowRole setWindowState setWindowTitle setWrapIndentMode setWrapMode setWrapVisualFlags setupViewport sharedPainter show showEvent showFullScreen showMaximized showMinimized showNormal showUserList signalsBlocked size sizeAdjustPolicy sizeHint sizeIncrement sizePolicy stackUnder standardCommands startTimer staticMetaObject statusTip style styleSheet tabIndents tabWidth tabletEvent testAttribute text textChanged textHeight thread timerEvent toMimeData toolTip toolTipDuration tr underMouse undo ungrabGesture unindent unsetCursor unsetLayoutDirection unsetLocale update updateGeometry updateMicroFocus updatesEnabled userListActivated verticalScrollBar verticalScrollBarPolicy viewport viewportEvent viewportMargins viewportSizeHint visibleRegion whatsThis wheelEvent whitespaceSize whitespaceVisibility width widthMM winId window windowFilePath windowFlags windowHandle windowIcon windowIconChanged windowIconText windowIconTextChanged windowModality windowOpacity windowRole windowState windowTitle windowTitleChanged windowType wordAtLineIndex wordAtPoint wordCharacters wrapIndentMode wrapMode write x y zoomIn zoomOut zoomTo\n" ] } ], "source": [ "for item in dir(QsciScintilla):\n", " print item," ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nH/cRuwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class SimplePythonEditor(QsciScintilla):\n", " ARROW_MARKER_NUM = 8\n", "\n", " def __init__(self, parent=None):\n", " super(SimplePythonEditor, self).__init__(parent)\n", "\n", " self.setUtf8(True)\n", " self.setWrapMode(QsciScintilla.WrapWord)\n", " self.setIndentationsUseTabs(False)\n", " #self.setIndentationGuides(True) # вертикальные полоски на каждом табе\n", " self.setTabWidth(4)\n", " self.setAutoIndent(True)\n", " \n", " # Set the default font\n", " font = QFont()\n", " font.setFamily('Vollkorn')\n", " font.setFixedPitch(True)\n", " font.setPointSize(24)\n", " self.setFont(font)\n", "\n", " # Margin 0 is used for line numbers\n", " fontmetrics = QFontMetrics(font)\n", " self.setMarginsFont(font)\n", " self.setMarginWidth(0, fontmetrics.width(\"00000\") + 6)\n", " self.setMarginLineNumbers(0, True)\n", "\n", " # Clickable margin 1 for showing markers\n", " self.setMarginWidth(1, fontmetrics.width(\"0\"))\n", " self.setMarginSensitivity(1, True)\n", " self.marginClicked.connect(self.on_margin_clicked)\n", " self.markerDefine(QsciScintilla.RightArrow, self.ARROW_MARKER_NUM)\n", " self.setMarkerBackgroundColor(QColor(\"#ee1111\"), self.ARROW_MARKER_NUM)\n", "\n", " # Brace matching: enable for a brace immediately before or after the current position\n", " self.setBraceMatching(QsciScintilla.SloppyBraceMatch)\n", " self.setMatchedBraceBackgroundColor(Qt.yellow);\n", "\n", " self.setCaretLineVisible(True)\n", " for item in global_style:\n", " fg = QColor('#' + item['@fgColor']) if '@fgColor' in item else None\n", " bg = QColor('#' + item['@bgColor']) if '@bgColor' in item else None\n", " if item['@name'] == 'Current line background colour':\n", " self.setCaretLineBackgroundColor(bg)\n", " elif item['@name'] == 'Selected text colour':\n", " self.setSelectionBackgroundColor(bg)\n", " elif item['@name'] == 'Line number margin':\n", " self.setMarginsBackgroundColor(bg)\n", " self.setMarginsForegroundColor(fg)\n", " elif item['@name'] == 'Caret colour':\n", " self.setCaretForegroundColor(fg)\n", " elif item['@name'] == 'Brace highlight style':\n", " self.setMatchedBraceBackgroundColor(bg)\n", " self.setMatchedBraceForegroundColor(fg)\n", " elif item['@name'] == 'Bad brace colour':\n", " self.setUnmatchedBraceBackgroundColor(bg)\n", " self.setUnmatchedBraceForegroundColor(fg)\n", " \n", " lexer = QsciLexerPython()\n", " lexer.setDefaultFont(font)\n", " self.setLexer(lexer)\n", " for item in style:\n", " if int(item['@styleID']) == 0:\n", " lexer.setPaper(QColor('#' + item['@bgColor']))\n", " lexer.setFont(font, int(item['@styleID']))\n", " self.SendScintilla(QsciScintilla.SCI_STYLESETBACK, int(item['@styleID']), QColor('#' + item['@bgColor']))\n", " self.SendScintilla(QsciScintilla.SCI_STYLESETFORE, int(item['@styleID']), QColor('#' + item['@fgColor']))\n", "\n", " # Hide horizontal scrollbar by raw message to Scintilla\n", " self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0)\n", "\n", " self.setMinimumSize(480, 320)\n", " \n", " self.setText('def hello():\\n\\t# Comment\\n\\tpass\\n\\tself.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0)\\n\\tpass')\n", "\n", " def on_margin_clicked(self, nmargin, nline, modifiers):\n", " # Toggle marker for the line the margin was clicked on\n", " if self.markersAtLine(nline) != 0:\n", " self.markerDelete(nline, self.ARROW_MARKER_NUM)\n", " else:\n", " self.markerAdd(nline, self.ARROW_MARKER_NUM)\n", " \n", " def wheelEvent(self, event):\n", " if QApplication.keyboardModifiers() & Qt.ControlModifier:\n", " if event.angleDelta().y() > 0:\n", " self.zoomIn()\n", " else:\n", " self.zoomOut()\n", " else:\n", " super(SimplePythonEditor, self).wheelEvent(event)\n", " \n", "run_qt_and_screenshot(SimplePythonEditor)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo uic\n", "```\n", "from PyQt4 import uic\n", "uic.loadUi(\"main.ui\", self) и все\n", "\n", "pyuic5 main.ui -o main.py\n", "```\n", "\n", "todo Как что-нибудь рисовать?\n", "\n", "todo как проигрывать видео? нужен видеоплеер -- QtAV? https://github.com/wang-bin/QtAV -- Qt+ffmpeg, не нашел питон-биндингов, ждем https://github.com/wang-bin/QtAV/pull/1082/commits -- смерджили!\n", "\n", "стриминг stream.send_to_rtmp_server(original_video) - что это?\n", "\n", "\n", "todo pyqtgraph? http://www.pyqtgraph.org/ PyQtGraph is a pure-python graphics and GUI library built on PyQt4 / PySide and numpy.\n", "\n", "todo pyglet?\n", "\n", "todo Нужны сплиттер, иконка окна, Докающиеся субокна?\n", "\n", "todo RichEdit?\n", "\n", "todo VB6: Label, QLineEdit, QTextEdit, Frame, Combo (как устанавливать значение?), OptionButton, Checkbox\n", " QTextEdit()\n", " .setText(text)\n", "\n", " checkBox = QtGui.QCheckBox('Enlarge Window', self)\n", " checkBox.toggle()\n", " checkBox.stateChanged.connect(self.enlarge_window)\n", " def enlarge_window(self, state):\n", " if state == QtCore.Qt.Checked:\n", "\n", "\n", "\n", "todo OpenFile, OpenFolder dialogs\n", " QFontDialog.getFont()\n", " QColorDialog.getColor()\n", " QFileDialog.getOpenFileName(self, 'Open File')\n", " QFileDialog.getSaveFileName(self, 'Save File')\n", "\n", "todo Календарь\n", " QCalendarWidget\n", "\n", "todo Табы, прогрессбар, слайдер\n", " QProgressBar\n", " self.progress.setValue(self.completed)\n", "\n", "todo отдельно QWebView, перехватывать переходы по ссылкам\n", "\n", " void MainWindow::downloadRequested(\n", " const QNetworkRequest &request)\n", " {\n", " // First prompted with a file dialog to make sure\n", " // they want the file and to select a download\n", " // location and name.\n", " QString defaultFileName =\n", " QFileInfo(request.url().toString()).fileName();\n", " QString fileName =\n", " QFileDialog::getSaveFileName(this,\n", " tr(\"Save File\"),\n", " defaultFileName);\n", " if (fileName.isEmpty())\n", " return;\n", "\n", " // Construct a new request that stores the\n", " // file name that should be used when the\n", " // download is complete\n", " QNetworkRequest newRequest = request;\n", " newRequest.setAttribute(QNetworkRequest::User,\n", " fileName);\n", "\n", " // Ask the network manager to download\n", " // the file and connect to the progress\n", " // and finished signals.\n", " QNetworkAccessManager *networkManager =\n", " webView->page()->networkAccessManager();\n", " QNetworkReply *reply =\n", " networkManager->get(newRequest);\n", " connect(\n", " reply, SIGNAL(downloadProgress(qint64, qint64)),\n", " this, SLOT(downloadProgress(qint64, qint64)));\n", " connect(reply, SIGNAL(finished()),\n", " this, SLOT(downloadIssueFinished()));\n", " }\n", "\n", "\n", "todo Обработка драгндропа\n", "\n", "todo self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 }