Kivy - 程式碼輸入



Kivy 框架中的 CodeInput 元件是一個特殊的 TextInput 框,能夠顯示可編輯的文字,並根據所選語言詞法分析器的語法進行高亮顯示。

CodeInput 元件需要安裝 **pygments** 包。

  • pygments 包是一個 Python 語法高亮器。

  • 它用於需要美化原始碼的應用程式。

  • Pygments 支援幾乎所有語言,包括程式語言、指令碼語言,甚至能夠根據框架和庫的語法提供語法高亮顯示。

  • 支援以 Lexer 類的方式提供。例如,要選擇 Python 語法來高亮顯示語言元素,我們需要匯入 Python3Lexer;對於 C++ 程式碼,需要匯入 CppLexer 類。Kivy 程式碼則使用 KivyLexer 進行高亮顯示。

如果當前工作環境沒有安裝 pygments,請執行以下命令:

pip3 install pygments

CodeInput 類定義在 "kivy.uix.codeinput" 模組中。

from kivy.uix.codeinput import CodeInput
codewidget = CodeInput(**kwargs)

CodeInput 類繼承自 TextInput 類,以及 CodeNavigationBehaviou mixin。與 TextInput 物件一樣,CodeInput 元件是一個多行文字框,可以新增到其他佈局類中。可以透過指定以下屬性來例項化它:

  • **lexer** - 這是 pygments 用於高亮顯示程式碼的所選 Lexer。它是一個 ObjectProperty,預設為 PythonLexer。

  • **style** - 用於格式化的 pygments 樣式物件。當設定 style_name 時,這將更改為相應的樣式物件。

  • **style_name** - 用於格式化的 pygments 樣式的名稱。style_name 是一個 OptionProperty,預設為 'default'。pygments 中有很多可用的樣式。一些例子包括 emacs、xcode、vs、bw、colorful 等等。

除此之外,它還繼承了 TextInput 類的屬性。CodeNavigationBehavior mixin 修改了 TextInput 中的導航行為,使其像 IDE 一樣工作,而不是像文字處理器。

示例

在下面的程式碼中,CodeInput 元件使用 PythonLexer 對 Python 原始碼進行語法高亮顯示。使用 Python 的檔案物件讀取 "code.py" 檔案,並將資料賦值給 CodeInput 物件的 text 屬性。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.codeinput import CodeInput
from pygments.lexers.python import Python3Lexer
from kivy.uix.scrollview import ScrollView
from kivy.uix.codeinput import CodeInput
from kivy.core.window import Window

Window.size = (720,400)

class codeinputdemoapp(App):
   def build(self):
      scr = ScrollView(size=Window.size)
      codinp = CodeInput(style='emacs')
      codinp.height = max(codinp.minimum_height, scr.height)
      file=open('code.py')
      text=file.read()
      codinp.text=text
      scr.add_widget(codinp)
      return scrx

codeinputdemoapp().run()
Kivy Code Input

要高亮顯示使用 Kivy 相關關鍵字和函式的程式碼,請載入 KivyLexer。您也可以嘗試使用 "pigment" 樣式,將其更改為 "colorful" 或任何其他可用樣式。

from kivy.extras.highlight import KivyLexer

讀取 "kivycode.py" 檔案並將其載入到 CodeInput 框中。

file=open('kivycode.py')
text=file.read()
codinp.text=text
Kivy Code Input File

您也可以嘗試使用 CppLexer 顯示 C++ 程式碼:

from pygments.lexers.c_cpp import CppLexer

這次,將樣式更改為 "friendly"。

file=open('test.cpp')
text=file.read()
codinp.text=text
kivy code CppLexer
廣告