2

我正在开始一个简单的小 GUI 来为我学生的 python 源代码评分。有没有一种简单的方法可以在 GUI 中自动格式化 python 代码的显示?例如,从某个编辑器中提取颜色格式?

我从 Python tkk 开始(只是为了进行一点额外的 Python 练习,我教它但不经常使用它),但如果在这方面更容易,我不反对切换语言。

输出将是一个包含所有成绩等的网页,但会显示使用 Google Prettify 的 python 代码(除非有人有更好的建议),所以我不需要保留配色方案,只希望它显示以使评分更容易。

非常感谢!

4

3 回答 3

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

ipython 提供了一个qt 控制台和一个支持高亮显示的web 服务器界面。ipython 本身具有许多使使用 python 进行开发更容易的功能。为了让 ipython 的一切顺利进行,有很多要求。大多数 linux 发行版的包管理存储库中都有 ipython,并且此站点上提供了一个 Windows 安装程序。

bpython 是另一个 python 迭代器替代品。它提供语法高亮、内联帮助和其他功能。屏幕截图是了解外观和感觉的最佳场所。它比 ipython 更轻量级。

就个人而言,我会设置一个 html 笔记本服务器并将其用作实验室/教室的一部分来教授 python。


对于问题的另一部分,在网页上显示成绩并突出显示语法;最简单的方法是使用众多静态站点生成器之一。几乎所有都支持语法高亮插件。

于 2012-12-18T05:58:10.350 回答
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 回答