我正在尝试使用绝地来完成 PyQt 应用程序中的 python 代码,使用QCompleter
并QStringListModel
存储可能的完成。
这是一个简单的工作演示:
#!/usr/bin/env python3
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import jedi
import sys
class JediEdit(QLineEdit):
def __init__(self, parent=None):
super().__init__(parent)
self._model = QStringListModel()
self._compl = QCompleter()
self._compl.setModel(self._model)
self.setCompleter(self._compl)
self.textEdited.connect(self.update_model)
def update_model(self, cur_text):
script = jedi.Script(cur_text)
compl = script.completions()
strings = list(cur_text + c.complete for c in compl)
self._model.setStringList(strings)
if __name__ == '__main__':
app = QApplication(sys.argv)
line = JediEdit()
line.show()
sys.exit(app.exec_())
如果您运行应用程序并编写没有完成任何内容的代码(例如或
foo =
),则完成实际上会显示所有可能出现在该位置的标记。
所以,如果我运行并在字段中写一个空格,就会弹出很多东西,从abs
到__version__
.
我想防止这种情况发生:是否可以查询jedi.Script
以了解令牌是否正在完成或是否正在启动一个全新的令牌?
编辑:另一个小问题:假设我正在运行一个与绝地当前状态分离的解释器。我怎样才能提供局部和全局变量,jedi.Script
以便它考虑这些,而不是它自己的完成?