2

学生の Python ソース コードを評価するためのシンプルで小さな GUI を開始しています。GUI 内で Python コードの表示を自動的にフォーマットする簡単な方法はありますか? たとえば、一部のエディターから色の書式設定を取得しますか?

私は Python tkk から始めました (少し余分な Python の練習のために、私はそれを教えますが、あまり使用しません) が、この面でより簡単である場合、言語を切り替えることに異議はありません。

出力はすべてのグレードなどを含む Web ページになりますが、Google Prettify を使用して Python コードが表示されるため (誰かがより良い提案を持っていない限り)、配色を維持する必要はなく、グレーディングを容易にするために表示するだけです。

どうもありがとう!

4

3 に答える 3

1

ipython は、強調表示をサポートするqt コンソールWeb サーバー インターフェイスを提供します。ipython 自体には、python での開発を容易にする多くの機能があります。ipython ですべてを実現するには、大量の要件のリストがあります。ほとんどの Linux ディストリビューションには、パッケージ管理リポジトリに ipython が含まれており、このサイトから Windows インストーラーを入手できます。

bpython は、別の python iterpreter の代替品です。構文の強調表示、インライン ヘルプ、およびその他の機能を提供します。スクリーンショットは、ルック アンド フィールのアイデアを得るのに最適な場所です。ipython よりも軽量です。

個人的には、HTML ノートブック サーバーをセットアップし、それを Python を教えるラボ/教室の一部として使用します。


質問の他の部分については、構文の強調表示を使用して Web ページに成績を表示します。最も簡単な方法は、多数ある静的サイト ジェネレーターの 1 つを使用することです。ほとんどすべてのプラグインが構文強調表示プラグインをサポートしています。

于 2012-12-18T05:58:10.350 に答える
1

@icktoofay が言ったように、Pygments を使用できます。PyQt/PiSide、PyGtk、および wxPython にはすべて WebKit ウィジェットがあります。PyGTK を使用した例を次に示します (注 - PyGtk の専門家ではありません)。

#!/usr/bin/env python
'''Example on using Pygments and gtk/webkit'''

from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

import gtk
import webkit

def gen_html(path):
    '''Generate HTML for Python file with embedded CSS.'''
    with open(path) as fo:
        code = fo.read()

    formatter = HtmlFormatter(linenos='table')
    css = formatter.get_style_defs()
    div = highlight(code, PythonLexer(), formatter)

    return '''<html>
        <head><style>{}</style></head>
        <body><div>{}</div></body>
        </html>'''.format(css, div)

def get_file():
    '''Get file from user.'''
    dlg = gtk.FileChooserDialog(
        title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
    dlg.set_default_response(gtk.RESPONSE_OK)

    # Only Python files
    filter = gtk.FileFilter()
    filter.set_name("Python files")
    filter.add_pattern("*.py")
    dlg.add_filter(filter)

    path = dlg.get_filename() if dlg.run() == gtk.RESPONSE_OK else None
    dlg.destroy()
    return path

def load(view):
    '''Load a new file'''
    path = get_file()
    if not path:
        return

    html = gen_html(path)
    with open('/tmp/src.html', 'w') as fo:
        fo.write(html)
    view.load_html_string(html, '/')


if __name__ == '__main__':
    box = gtk.VBox()
    # WebKit view in scroll
    view = webkit.WebView()
    sw = gtk.ScrolledWindow()
    sw.add(view)
    sw.set_size_request(600, 400)
    box.pack_start(sw)

    # Open file
    btn = gtk.Button('Open...')
    btn.connect('clicked', lambda e: load(view))
    box.pack_start(btn, False, False, 0)

    # Quit
    btn = gtk.Button('Quit')
    btn.connect('clicked', lambda e: gtk.main_quit())
    box.pack_start(btn, False, False, 0)

    # Main window
    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
    win.add(box)
    win.show_all()

    gtk.main()
于 2012-12-18T04:31:31.640 に答える
1

wxPython には SciTe がバンドルされていることを思い出しました。

#!/usr/bin/env python

import wx
from wx import stc
import keyword

class PyDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self, None, -1, 'Python Code')
        sizer = wx.BoxSizer(wx.VERTICAL)

        self.stc = stc.StyledTextCtrl(self, -1)
        self.stc.SetSizeHints(400, 400)
        self.stc.SetLexer(stc.STC_LEX_PYTHON)
        self.stc.SetKeyWords(0, " ".join(keyword.kwlist))
        self.stc.SetMarginType(1, stc.STC_MARGIN_NUMBER)
        # Python styles
        self.stc.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000')
        # Comments
        self.stc.StyleSetSpec(wx.stc.STC_P_COMMENTLINE,  'fore:#008000,back:#F0FFF0')
        self.stc.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#008000,back:#F0FFF0')
        # Numbers
        self.stc.StyleSetSpec(wx.stc.STC_P_NUMBER, 'fore:#008080')
        # Strings and characters
        self.stc.StyleSetSpec(wx.stc.STC_P_STRING, 'fore:#800080')
        self.stc.StyleSetSpec(wx.stc.STC_P_CHARACTER, 'fore:#800080')
        # Keywords
        self.stc.StyleSetSpec(wx.stc.STC_P_WORD, 'fore:#000080,bold')
        # Triple quotes
        self.stc.StyleSetSpec(wx.stc.STC_P_TRIPLE, 'fore:#800080,back:#FFFFEA')
        self.stc.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, 'fore:#800080,back:#FFFFEA')
        # Class names
        self.stc.StyleSetSpec(wx.stc.STC_P_CLASSNAME, 'fore:#0000FF,bold')
        # Function names
        self.stc.StyleSetSpec(wx.stc.STC_P_DEFNAME, 'fore:#008080,bold')
        # Operators
        self.stc.StyleSetSpec(wx.stc.STC_P_OPERATOR, 'fore:#800000,bold')
        # Identifiers. I leave this as not bold because everything seems
        # to be an identifier if it doesn't match the above criterae
        self.stc.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, 'fore:#000000')

        # Caret color
        self.stc.SetCaretForeground("BLUE")
        # Selection background
        self.stc.SetSelBackground(1, '#66CCFF')

        sizer.Add(self.stc, 0, wx.EXPAND)

        button = wx.Button(self, -1, 'Open...')
        self.Bind(wx.EVT_BUTTON, self.OnOpen, button)
        sizer.Add(button)

        self.SetSizer(sizer)
        sizer.Fit(self)

    def OnOpen(self, evt):
        dlg = wx.FileDialog(
            self,
            message = 'Choose File',
            wildcard = 'Python source (*.py)|*.py',
            style = wx.OPEN)

        if dlg.ShowModal() != wx.ID_OK:
            return

        with open(dlg.GetPath()) as fo:
            self.stc.SetText(fo.read())

        dlg.Destroy()


if __name__ == '__main__':
    app = wx.PySimpleApp()
    dlg = PyDialog()
    with open(__file__) as fo:
        dlg.stc.SetText(fo.read())
    dlg.ShowModal()
于 2012-12-19T01:47:32.990 に答える