Я пытаюсь создать простую и личную IDE для Python, используя tkinter. Я видел, как это делалось раньше, и у меня есть подсветка синтаксиса для встроенного терминала, но у меня нет проблемы с автозаполнением. Я знаю, что у вас может быть автозаполнение записей с помощью многих методов, но после поиска автозаполнения текстовыми записями я ничего не смог найти. Если бы я мог получить некоторую помощь, это было бы фантастически! Я ищу что-то похожее на то, что видно здесь.
Код похожей идеи:
from ttkwidgets.autocomplete import AutocompleteEntry
from tkinter import *
countries = [
'Antigua and Barbuda', 'Bahamas','Barbados','Belize', 'Canada',
'Costa Rica ', 'Cuba', 'Dominica', 'Dominican Republic', 'El Salvador ',
'Grenada', 'Guatemala ', 'Haiti', 'Honduras ', 'Jamaica', 'Mexico',
'Nicaragua', 'Saint Kitts and Nevis', 'Panama ', 'Saint Lucia',
'Saint Vincent and the Grenadines', 'Trinidad and Tobago', 'United States of America'
]
ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws.config(bg='#f25252')
frame = Frame(ws, bg='#f25252')
frame.pack(expand=True)
Label(
frame,
bg='#f25252',
font = ('Times',21),
text='Countries in North America '
).pack()
entry = AutocompleteEntry(
frame,
width=30,
font=('Times', 18),
completevalues=countries
)
entry.pack()
ws.mainloop()
Связь в исходный код AutocompleteEntry
Интеллисенс. Он предоставляет предложения (то есть, если я вставлю «pr», он предложит добавить «int», создав функцию print())
Вы понимаете, как привязать клавиши к функциям? Непонятно, в какой части проблемы вам нужна помощь.
что-то похожее на запись автозаполнения, показанную здесь, с дополнительным преимуществом возможности в текстовом поле: pythonguides.com/python-tkinter-автозаполнение
Вы пробовали посмотреть код для этого AutocompleteEntry
и применить его к текстовому виджету?
Я пытался в течение последнего часа, но не могу понять, как это сделать. Добавлю ссылку на репозиторий в вопрос
Для элементарной функции автозаполнения базовый алгоритм довольно прост:
Вы также можете добавить привязку для клавиши табуляции, которая будет видеть, есть ли видимый текст автозаполнения, и переместить курсор в конец.
Это очень тщательно собранный пример, иллюстрирующий принцип, хотя в нем отсутствует какая-либо пуленепробиваемость, оптимизация или обработка пограничных случаев, таких как возврат назад, ввод в середине слова, выбор альтернативных замен и т. д.
Просто для ясности: это не лучший способ реализации автозаполнения, он просто иллюстрирует концепции.
import tkinter as tk
class AutocompleteText(tk.Text):
def __init__(self, *args, **kwargs):
self.callback = kwargs.pop("autocomplete", None)
super().__init__(*args, **kwargs)
# bind on key release, which will happen after tkinter
# inserts the typed character
self.bind("<Any-KeyRelease>", self._autocomplete)
# special handling for tab, which needs to happen on the
# key _press_
self.bind("<Tab>", self._handle_tab)
def _handle_tab(self, event):
# see if any text has the "autocomplete" tag
tag_ranges= self.tag_ranges("autocomplete")
if tag_ranges:
# move the insertion cursor to the end of
# the selected text, and then remove the "sel"
# and "autocomplete" tags
self.mark_set("insert", tag_ranges[1])
self.tag_remove("sel", "1.0", "end")
self.tag_remove("autocomplete", "1.0", "end")
# prevent the default behavior of inserting a literal tab
return "break"
def _autocomplete(self, event):
if event.char and self.callback:
# get word preceeding the insertion cursor
word = self.get("insert-1c wordstart", "insert-1c wordend")
# pass word to callback to get possible matches
matches = self.callback(word)
if matches:
# autocomplete on the first match
remainder = matches[0][len(word):]
# remember the current insertion cursor
insert = self.index("insert")
# insert at the insertion cursor the remainder of
# the matched word, and apply the tag "sel" so that
# it is selected. Also, add the "autocomplete" text
# which will make it easier to find later.
self.insert(insert, remainder, ("sel", "autocomplete"))
# move the cursor back to the saved position
self.mark_set("insert", insert)
def get_matches(word):
# For illustrative purposes, pull possible matches from
# what has already been typed. You could just as easily
# return a list of pre-defined keywords.
words = text.get("1.0", "end-1c").split()
matches = [x for x in words if x.startswith(word)]
return matches
root = tk.Tk()
text = AutocompleteText(root, autocomplete=get_matches)
text.pack(fill = "both", expand=True)
root.mainloop()
Я обнаружил проблему, это не позволяет людям распечатать то, что у них было до появления всплывающего окна, и я надеялся дать список ключевых слов, а не ИИ, который учится на предыдущих входных данных.
@TRCK: я уверен, что вы найдете много проблем. Это не полное решение, это иллюстрация методов. Создание надлежащего решения производственного качества зависит от вас. Вы можете заменить функцию get_matches
любой функцией, которую хотите. Единственное требование состоит в том, чтобы он возвращал список возможных совпадений. Кроме того, я не уверен, что вы подразумеваете под «всплывающим окном», поскольку это решение не отображает всплывающее окно.
Привет @Брайан Окли. Я смотрел на код и надеюсь получить немного больше помощи с этим. Я знаю, что это много, но не могли бы вы объяснить, как я могу добавить настройки к базовому виджету (т.е. задать специальный шрифт, отключить перенос слов и т. д.). Если бы вы могли помочь мне понять это, чтобы я мог лучше работать с другими пользовательскими виджетами, которые мне очень помогли бы! Одна последняя просьба, которую я имею, это некоторая помощь с возвратом. Я не очень хорошо знаком с пользовательскими виджетами, и понимание этого виджета очень сложно, что затрудняет добавление этой функции самостоятельно. Если бы вы могли помочь, это было бы здорово!
Кроме того, я понял, как добавить свой собственный список ключевых слов. Кроме того, если этот разговор становится слишком длинным, мы могли бы начать небольшую цепочку электронных писем.
Не могли бы вы помочь мне с обратным ходом?
@TRCK: это отдельный вопрос. Комментарии Stackoverflow не предназначены для долгих дискуссий.
можете ли вы уточнить, что вы подразумеваете под «автозаполнением». Это может означать разные вещи для разных людей.