171 lines
5.8 KiB
Python
171 lines
5.8 KiB
Python
import sqlite3
|
|
import io
|
|
from PIL import Image, ImageTk
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
|
|
SEARCH = """
|
|
SELECT recipe.ROWID, item.uniquename, title.en, title.ru, recipe.amountcrafted
|
|
FROM title JOIN item ON title.item=item.ROWID JOIN recipe ON recipe.item=item.ROWID
|
|
WHERE UPPER(title.en) LIKE ?1
|
|
OR UPPER(title.ru) LIKE ?1
|
|
ORDER BY title.en;
|
|
"""
|
|
SEARCH2 = """
|
|
SELECT item.ROWID
|
|
FROM title JOIN item ON title.item=item.ROWID
|
|
WHERE UPPER(title.en) LIKE ?1
|
|
OR UPPER(title.ru) LIKE ?1
|
|
ORDER BY title.en;
|
|
"""
|
|
|
|
RECIPES = """
|
|
SELECT ingredient.recipe, i2.uniquename, t2.en, t2.ru, recipe.amountcrafted, ingredient.amount
|
|
FROM ingredient JOIN item ON item.ROWID=ingredient.item JOIN title ON title.item=item.ROWID
|
|
JOIN recipe on ingredient.recipe=recipe.ROWID JOIN item as i2 ON i2.ROWID=recipe.item
|
|
JOIN title as t2 ON i2.ROWID=t2.item
|
|
WHERE ingredient.item = ?;
|
|
"""
|
|
|
|
INGREDIENTS = """
|
|
SELECT item.ROWID, item.uniquename, ingredient.amount, title.en, title.ru
|
|
FROM ingredient JOIN item ON ingredient.item=item.ROWID JOIN title ON title.item=item.ROWID
|
|
WHERE ingredient.recipe = ?;
|
|
"""
|
|
|
|
|
|
def update(db, frame, entry, event, images):
|
|
search = entry.get().strip().split()
|
|
if len(search) < 2:
|
|
return
|
|
n = None
|
|
ni = None
|
|
try:
|
|
n = int(search[0])
|
|
ni = 0
|
|
except:
|
|
pass
|
|
if n is None:
|
|
try:
|
|
n = int(search[-1])
|
|
ni = -1
|
|
except:
|
|
pass
|
|
if n is None:
|
|
return
|
|
del search[ni]
|
|
search = " ".join(search).upper()
|
|
if len(search) < 3:
|
|
return
|
|
for w in frame.winfo_children():
|
|
w.destroy()
|
|
|
|
inner = tk.Canvas(frame)
|
|
inner.pack(side="left", fill="both", expand=1)
|
|
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=inner.yview)
|
|
scrollbar.pack(side="right", fill="y")
|
|
inner.configure(yscrollcommand=scrollbar.set)
|
|
inner.update()
|
|
scrollable_frame = tk.Frame(inner)
|
|
w = inner.create_window((0, 0), window=scrollable_frame, anchor="nw")
|
|
inner.itemconfig(w, width=inner.winfo_width())
|
|
search_by_recipe(db, images, n, search, scrollable_frame)
|
|
search_by_ingredient(db, images, n, search, scrollable_frame)
|
|
inner.update()
|
|
try:
|
|
inner.configure(scrollregion=inner.bbox("all"))
|
|
except:
|
|
pass
|
|
|
|
|
|
def search_by_recipe(db, images, n, search, inner):
|
|
for i, un, en, ru, ac in db.execute(SEARCH, ("%" + search + "%",)).fetchall():
|
|
row = ttk.Frame(inner)
|
|
row.pack(fill="x", expand=1)
|
|
left = ttk.Frame(row)
|
|
left.pack(side="left", fill="y")
|
|
ttk.Label(left, image=images[un]).pack()
|
|
ttk.Label(left, text=en, font=("TkDefaultFont", 10, "bold")).pack()
|
|
ttk.Label(left, text=ru, font=("TkDefaultFont", 10, "bold")).pack()
|
|
ttk.Label(left, text=f"{n}/{ac}", font=("TkDefaultFont", 10, "bold")).pack()
|
|
right = ttk.Frame(row)
|
|
right.pack(side="right")
|
|
for j, iun, iam, ien, iru in db.execute(INGREDIENTS, (i,)).fetchall():
|
|
ingr = ttk.Frame(right)
|
|
ingr.pack(side="left")
|
|
ttk.Label(ingr, image=images[iun]).pack()
|
|
ttk.Label(ingr, text=ien).pack()
|
|
ttk.Label(ingr, text=iru).pack()
|
|
ttk.Label(ingr, text=f"{iam}*{n//ac}={iam*(n//ac)}").pack()
|
|
|
|
|
|
def search_by_ingredient(db, images, n, search, inner):
|
|
for (i,) in db.execute(SEARCH2, ("%" + search + "%",)).fetchall():
|
|
for j, un, en, ru, ac, ami in db.execute(RECIPES, (i,)):
|
|
c = n // ami
|
|
row = ttk.Frame(inner)
|
|
row.pack(fill="x", expand=1)
|
|
left = ttk.Frame(row)
|
|
left.pack(side="left", fill="y")
|
|
ttk.Label(left, image=images[un]).pack()
|
|
ttk.Label(left, text=en).pack()
|
|
ttk.Label(left, text=ru).pack()
|
|
ttk.Label(left, text=f"{ac}*{c}={ac*c}").pack()
|
|
right = ttk.Frame(row)
|
|
right.pack(side="right")
|
|
for ii, iun, iam, ien, iru in db.execute(INGREDIENTS, (j,)).fetchall():
|
|
ingr = ttk.Frame(right)
|
|
ingr.pack(side="left")
|
|
ttk.Label(ingr, image=images[iun]).pack()
|
|
if ii == i:
|
|
ttk.Label(ingr, font=("TkDefaultFont", 10, "bold"), text=ien).pack()
|
|
ttk.Label(ingr, font=("TkDefaultFont", 10, "bold"), text=iru).pack()
|
|
ttk.Label(
|
|
ingr,
|
|
text=f"{iam}*{c}={iam*(c)}",
|
|
font=("TkDefaultFont", 10, "bold"),
|
|
).pack()
|
|
else:
|
|
ttk.Label(ingr, text=ien).pack()
|
|
ttk.Label(ingr, text=iru).pack()
|
|
ttk.Label(ingr, text=f"{iam}*{c}={iam*(c)}").pack()
|
|
|
|
|
|
def close(root, db):
|
|
db.close()
|
|
root.destroy()
|
|
|
|
|
|
def main():
|
|
root = tk.Tk()
|
|
db = sqlite3.connect("recipes.db")
|
|
db.create_function("UPPER", 1, str.upper)
|
|
images = {
|
|
a: b
|
|
for a, b in db.execute(
|
|
"SELECT item.uniquename, image.image FROM item JOIN image ON item.ROWID=image.item;"
|
|
).fetchall()
|
|
}
|
|
images = {
|
|
a: ImageTk.PhotoImage(Image.open(io.BytesIO(b)).resize((100, 100)))
|
|
for a, b in images.items()
|
|
}
|
|
root.title("Albion Online Recipes Helper")
|
|
f = ttk.Frame(root)
|
|
f.pack(fill="both", expand=1, padx=5, pady=5)
|
|
ttk.Label(f, text="Напечатай сколько и чего надо:").pack(anchor="nw")
|
|
s = ttk.Entry(f)
|
|
s.focus()
|
|
s.pack(anchor="nw")
|
|
ttk.Label(f, text="Вот что можно сделать:").pack(anchor="nw")
|
|
b = ttk.Frame(f)
|
|
b.pack(fill="both", expand=1)
|
|
s.bind("<KeyRelease>", lambda e: update(db, b, s, e, images))
|
|
|
|
root.protocol("WM_DELETE_WINDOW", lambda: close(root, db))
|
|
root.mainloop()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|