118 lines
3.7 KiB
Python
118 lines
3.7 KiB
Python
import tkinter as tk
|
|
import tkinter.ttk as ttk
|
|
|
|
TESTLIST = ["Apfel", "Birne", "Cassis", "Dattel", "Erdbeere",
|
|
"Felsenbirne", "Granatapfel", "Heidelbeere", "Immergrün",
|
|
"Johannisbeere", "Kamille", "Lauch", "Meerrettich",
|
|
"Nahrung", "Obst", "Pastinake", "Quellwasser", "Rettich",
|
|
"Salat", "Tomate", "Unkraut", "Vogelbeere", "Walderdbeere",
|
|
"Xylit", "Ysop", "Zwetschge"]
|
|
|
|
def binsearch(list_for_search, keyword, depth:int=0):
|
|
l = len(list_for_search)
|
|
print("BS Tiefe {}, Restlänge {}: {}".format(depth,l,list_for_search))
|
|
|
|
if l == 1 and list_for_search[0] == keyword:
|
|
return {"result": 1, "word": list_for_search[0]}
|
|
elif l > 1:
|
|
w = list_for_search[l // 2]
|
|
if keyword < w :
|
|
newlist = list_for_search[: l // 2]
|
|
return binsearch(newlist, keyword, depth+1)
|
|
else:
|
|
newlist = list_for_search[l // 2:]
|
|
return binsearch(newlist, keyword, depth+1)
|
|
else:
|
|
return {"result": 0, "word": "not found"}
|
|
|
|
class Controller(object):
|
|
def __init__(self, app):
|
|
self.app = app
|
|
self.list_for_search = TESTLIST
|
|
self.keyword = "Nothing"
|
|
|
|
def fill_list(self):
|
|
self.app.fill_input_list(self.list_for_search)
|
|
|
|
def fill_entry(self, text: str = None):
|
|
if text is None:
|
|
text = "Apfel"
|
|
self.keyword = text
|
|
self.app.fill_entry(text)
|
|
|
|
def run_search(self):
|
|
print("Run")
|
|
self.keyword = self.app.get_keyword_entry()
|
|
result = binsearch(self.list_for_search, self.keyword)
|
|
if result["result"] == 1:
|
|
# success
|
|
print("word found")
|
|
print("The word is: {}".format(result["word"]))
|
|
self.app.set_canvas_color("green")
|
|
return 1
|
|
else:
|
|
# failure
|
|
print("word not found.")
|
|
self.app.set_canvas_color("red")
|
|
return -1
|
|
return 0
|
|
|
|
|
|
class Application(tk.Tk):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.con = Controller(self)
|
|
self.create_control_variables()
|
|
self.create_widgets()
|
|
self.con.fill_list()
|
|
self.con.fill_entry()
|
|
|
|
def create_control_variables(self):
|
|
self.e_search_var = tk.StringVar()
|
|
|
|
def fill_input_list(self, list_for_display: list = None):
|
|
if list_for_display is None:
|
|
list_for_display = [1,2,3,4,5]
|
|
else:
|
|
pass
|
|
for e in list_for_display:
|
|
self.lb_input.insert(tk.END, e)
|
|
|
|
def fill_entry(self, text):
|
|
self.e_search_var.set(text)
|
|
|
|
def get_keyword_entry(self):
|
|
return self.e_search_var.get()
|
|
|
|
def set_canvas_color(self, color:str=None):
|
|
if color is None:
|
|
color = "black"
|
|
self.c.configure(background=color)
|
|
|
|
def create_widgets(self):
|
|
self.lf_input = ttk.Labelframe(master=self, labelanchor="n", text="Eingabe")
|
|
self.lf_input.grid(row=0, column=0, columnspan=2)
|
|
|
|
self.lb_input = tk.Listbox(master=self.lf_input)
|
|
self.lb_input.grid(row=0, column=0)
|
|
|
|
self.lf_search = ttk.Labelframe(master=self, labelanchor="n", text="Suche")
|
|
self.lf_search.grid(row=1, column=0)
|
|
|
|
self.e_search = ttk.Entry(master=self.lf_search, textvariable=self.e_search_var)
|
|
self.e_search.grid(row=0, column=0)
|
|
|
|
self.b = ttk.Button(master=self, text="Suchen", command=self.con.run_search)
|
|
self.b.grid(row=1, column=1)
|
|
|
|
self.c = tk.Canvas(master=self, background="black",width=150, height=30)
|
|
self.c.grid(row=2, column=0, columnspan=2)
|
|
|
|
|
|
# --------------------------
|
|
# Execution
|
|
# --------------------------
|
|
if __name__ == "__main__":
|
|
app = Application()
|
|
app.mainloop()
|