Reputation: 213
I am trying to make a simple and personal IDE for python using tkinter. I have seen it done before and have everything form syntax highlighting to a built in terminal but have the problem of no autofill. I know that you can have autofill in entry's with many methods out there but after searching for autofill with Text entries I couldn't find anything. If I could get some help that would be fantastic! I am looking for something similar to what is seen here.
Code of similar idea:
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()
Link to source code of AutocompleteEntry
Upvotes: 4
Views: 4745
Reputation: 49
Today i tell you How you create Autocompeletion Entry box with Listbox without OOP. If you not know about OOP that this Code may help you.
You can create autocompletion Entry box and Search box one code only one line Difference.
from tkinter import *
import re
root=Tk()
def fun1(event, *args, **kwargs):
global data
if (e.get()==''):
lb.place_forget()
lb.delete(0, END)
else:
lb.delete(0, END)
value=e.get()
lb.place(x=0, y=20)
for items in data:
if (re.search(value, items, re.IGNORECASE)):
lb.insert(END, items)
print(value)
pass
def CurSelet(evt):
valued=lb.get(ACTIVE)
e.delete(0, END)
e.insert(END, valued)
lb.place_forget()
print( valued)
def down(ddd):
lb.focus()
lb.selection_set(0)
s=StringVar()
e=Entry(root, textvariable=s)
e.grid(row=2, column=2)
s.trace('w', fun1)
e.bind('<Down>', down)
for i in range(4,12):
ee=Entry(root)
ee.grid(row=i, column=2)
data=['Angular', 'action Script', 'Basic', 'GW-Basic' , 'C', 'C++', 'C#',
'Django' ,'Dot-Net', 'Flask' , 'Go-Lang', 'Html', 'Python', 'PHP', 'Pearl',
'Java', 'Javascript', 'Kotlin', 'Rust', 'R', 'S', 'Sr', 'Tekken 7', 'Tekken
Tag' ]
lb=Listbox(root)
lb.place_forget()
lb.bind("<Button-3>", CurSelet)
lb.bind("<Right>", CurSelet)
root.mainloop()
print(Listbox.curselection)
This is Search bar. If you Make AutoCompletion Use
if (re.match(value, items, re.IGNORECASE)):
in place of if (re.search(value, items, re.IGNORECASE)):
only re.match and re.search Defferane between searchbar & autocompletion.
Upvotes: 0
Reputation: 385900
For a rudimentary autocomplete feature the basic algorithm is fairly simple:
You can also add a binding for the tab key that will see if there is autocomplete text that is visible, and move the cursor to the end.
This is a very hacked-together example to illustrate the principle, though it lacks any bulletproofing, optimizations, or handling of edge cases such as when backspacing, typing in the middle of a word, choosing alternate replacements, etc.
Just to be clear: this isn't the best way to implement autocomplete, it merely illustrates the concepts.
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()
Upvotes: 3