2 changed files with 80 additions and 114 deletions
@ -1,71 +1,92 @@ |
|||||
# import saveto |
|
||||
import datetime |
|
||||
from decimal import Decimal as D |
|
||||
from tkinter import * |
from tkinter import * |
||||
def dicter(l): |
|
||||
ret = {} |
|
||||
for thing in l: |
|
||||
name = thing['name'] |
|
||||
ret[name] = thing |
|
||||
return ret |
|
||||
def message(qpb,qpd): |
|
||||
qpb,qpd = map(dicter,(qpb,qpd)) |
|
||||
def button_callback(arg): |
|
||||
check_boxes[arg].toggle() |
|
||||
prods = list(filter(lambda item: not item[1]['purchased'],qpb.items())) |
|
||||
|
|
||||
root = Tk() |
|
||||
checks = dict( |
|
||||
(prod[0],BooleanVar()) for prod in prods) |
|
||||
|
|
||||
root.wm_title("Today's Prices") |
|
||||
labels = ["","Product name","Price","Count","Total"] |
|
||||
for i,label in enumerate(labels): |
|
||||
Label(root,text = label).grid(row =0,column = i) |
|
||||
|
from decimal import Decimal as D |
||||
|
|
||||
row = 1 |
|
||||
total = 0 |
|
||||
single_total = 0 |
|
||||
buttons = [] |
|
||||
check_boxes = [] |
|
||||
for prod,data in prods: |
|
||||
|
class ButtonWithCheck: |
||||
|
def __init__(self,root,name): |
||||
|
self.name = name |
||||
|
self.root = root |
||||
|
self.checked = BooleanVar() |
||||
|
self.checkbox = Checkbutton(self.root,variable=self.checked,state = DISABLED) |
||||
|
self.button = Button(self.root,text = name,command = self.check) |
||||
|
def check(self): |
||||
|
self.checkbox.toggle() |
||||
|
def get_status(self): |
||||
|
return self.checked.get() |
||||
|
def grid(self,row,start_col): |
||||
|
col = start_col |
||||
|
self.checkbox.grid(row = row,column = col,sticky=E) |
||||
|
col += 1 |
||||
|
self.button.grid(row = row,column = col,sticky=E+W) |
||||
|
col += 1 |
||||
|
return col |
||||
|
|
||||
check_boxes.append( |
|
||||
Checkbutton(root,variable=checks[prod],state = DISABLED) |
|
||||
) |
|
||||
|
class SunkenText: |
||||
|
def __init__(self,root,text): |
||||
|
self.text = text |
||||
|
self.root = root |
||||
|
self.label = Label(self.root,text = self.text,relief = "sunken") |
||||
|
def grid(self,row,start_col): |
||||
|
col = start_col |
||||
|
self.label.grid(row = row,column = col,sticky=E+W) |
||||
|
col += 1 |
||||
|
return col |
||||
|
|
||||
check_boxes[-1].grid(row = row,column = labels.index(""),stick=E) |
|
||||
|
class Row: |
||||
|
labels = ["","Product name","Price","Count","Total"] |
||||
|
def __init__(self,root,info): |
||||
|
self.root = root |
||||
|
self.name = info['name'] |
||||
|
self.price = D(info['price']) |
||||
|
self.count = info['count'] |
||||
|
self.total = self.price * self.count |
||||
|
|
||||
buttons.append( |
|
||||
Button( |
|
||||
root,text=prod,command = lambda row=row-1: button_callback(row) |
|
||||
) |
|
||||
) |
|
||||
|
self.button = ButtonWithCheck(self.root,self.name) |
||||
|
|
||||
buttons[-1].grid(row=row,column = labels.index("Product name"),sticky = E+W) |
|
||||
|
self.label_price = SunkenText(self.root,'${}'.format(self.price)) |
||||
|
self.label_count = SunkenText(self.root,str(info['count'])) |
||||
|
self.label_total = SunkenText(self.root,'${}'.format(self.total)) |
||||
|
|
||||
price = D(qpd[prod]['price']) |
|
||||
row_total = data['count']*price |
|
||||
|
def grid(self,row_num): |
||||
|
col = self.button.grid(row_num,0) |
||||
|
col = self.label_count.grid(row_num,col) |
||||
|
col = self.label_price.grid(row_num,col) |
||||
|
col = self.label_total.grid(row_num,col) |
||||
|
|
||||
Label(root,text = '${}'.format(price),relief = "sunken").grid(row = row,column=labels.index('Price'),sticky=E+W) |
|
||||
Label(root,text = data['count'],relief = "sunken").grid(row=row,column=labels.index('Count'),sticky = E+W) |
|
||||
Label(root,text = '${}'.format(row_total),relief = "sunken").grid(row = row,column=labels.index("Total"),sticky=E+W) |
|
||||
|
def get_status(self): |
||||
|
return self.button.get_status() |
||||
|
|
||||
total += row_total |
|
||||
single_total += price |
|
||||
row += 1 |
|
||||
|
class MainWindow: |
||||
|
def __init__(self,prices): |
||||
|
self.root = Tk() |
||||
|
self.root.overrideredirect(True) |
||||
|
self.root.wm_attributes("-topmost", True) |
||||
|
self.rows = sorted(map(lambda row: Row(self.root,row),prices),key = lambda r: r.name) |
||||
|
offset = 0 |
||||
|
for i,label in enumerate(Row.labels): |
||||
|
Label(self.root,text = label).grid(row = offset,column = i) |
||||
|
offset += 1 |
||||
|
for row in self.rows: |
||||
|
row.grid(offset) |
||||
|
offset += 1 |
||||
|
total = sum(row.total for row in self.rows) |
||||
|
individual = sum(row.price for row in self.rows) |
||||
|
|
||||
Label(root,text = "Total:").grid(row = row,column=labels.index("Count")) |
|
||||
Label(root,text = "Individual:").grid(row = row,column=labels.index("Product name"),sticky = E) |
|
||||
Label(root,text = "${}".format(total)).grid(row=row,column = labels.index("Total")) |
|
||||
Label(root,text = "${}".format(single_total)).grid(row=row,column=labels.index("Price")) |
|
||||
Button(root,text = "OK", command = root.quit).grid(row=row+2) |
|
||||
|
Label(self.root,text = "Total:").grid(row = offset,column=Row.labels.index("Total")-1) |
||||
|
Label(self.root,text = "${}".format(total)).grid(row = offset,column = Row.labels.index("Total")) |
||||
|
Label(self.root,text = "Individual:").grid(row = offset,column = Row.labels.index("Price")-1,sticky = E) |
||||
|
Label(self.root,text = "${}".format(individual)).grid(row = offset,column = Row.labels.index("Price")) |
||||
|
offset += 1 |
||||
|
Button(self.root,text = "OK", command = self.root.quit).grid(row=offset) |
||||
|
def start(self): |
||||
|
mainloop() |
||||
|
self.root.withdraw() |
||||
|
|
||||
root.overrideredirect(True) |
|
||||
root.wm_attributes("-topmost", True) |
|
||||
mainloop() |
|
||||
root.destroy() |
|
||||
|
def get_status(self): |
||||
|
return dict( |
||||
|
(row.name,row.get_status()) for row in self.rows |
||||
|
) |
||||
|
|
||||
for key in checks.keys(): |
|
||||
checks[key] = checks[key].get() |
|
||||
return checks |
|
||||
|
if __name__ == "__main__": |
||||
|
info = [{'name': 'battery', 'link': 2, 'count': 4, 'purchased': 0, 'product_name': 'AHTECH Infinity 1300mah 14.8V 90C 4S1P Race', 'price': D('24.99'), 'time': '11:52:37.877501'}, {'name': 'charger', 'link': 6, 'count': 1, 'purchased': 0, 'product_name': 'Turnigy Reaktor 250W 10A 1-6S Balance Charger', 'price': D('52.88'), 'time': '15:05:16.120764'}, {'name': 'controller', 'link': 11, 'count': 1, 'purchased': 0, 'product_name': 'FrSky Taranis Q X7 2.4GHz 16CH Transmitter', 'price': D('104.99'), 'time': '15:26:24.942471'}, {'name': 'drone', 'link': 0, 'count': 1, 'purchased': 1, 'product_name': 'X215 PRO 215mm FPV Racing Drone BNF', 'price': D('212.35'), 'time': '11:41:46.865581'}, {'name': 'fpv', 'link': 7, 'count': 1, 'purchased': 1, 'product_name': 'Aomway Commander Goggles V1 FPV 2D 3D', 'price': D('299.00'), 'time': '15:09:55.486299'}, {'name': 'parallel_charger', 'link': 5, 'count': 1, 'purchased': 0, 'product_name': 'Paraboard Parallel Charging Board for Lipos with', 'price': D('19.99'), 'time': '15:04:41.003013'}, {'name': 'props', 'link': 4, 'count': 4, 'purchased': 0, 'product_name': 'DAL T5046 Cyclone Tri-Blade', 'price': D('2.79'), 'time': '15:03:59.716362'}, {'name': 'power_supply', 'link': 12, 'count': 1, 'purchased': 0, 'product_name': 'Turnigy Reaktor Pro 240W 16A Power Supply', 'price': D('34.29'), 'time': '15:27:19.812154'}] |
||||
|
window = MainWindow(info) |
||||
|
window.start() |
||||
@ -1,55 +0,0 @@ |
|||||
import copy |
|
||||
import sys |
|
||||
from quad_dialog import message,dicter |
|
||||
import datetime |
|
||||
import sqlite3 |
|
||||
import pandas |
|
||||
from decimal import Decimal as D |
|
||||
import shutil |
|
||||
from send2trash import send2trash |
|
||||
import gc |
|
||||
def test(): |
|
||||
con = sqlite3.connect('test.db') |
|
||||
cur = con.cursor() |
|
||||
date = '2018-08-18' |
|
||||
# print(date) |
|
||||
quad_links = list(row[0] for row in cur.execute('SELECT link FROM links ORDER BY id')) |
|
||||
quad_parts_base = pandas.read_sql('SELECT * FROM names',con).to_dict('records') |
|
||||
|
|
||||
current = copy.deepcopy(quad_parts_base) |
|
||||
complete = None |
|
||||
while not complete: |
|
||||
complete = pandas.read_sql('SELECT * FROM parts where date == "{}"'.format(date),con).to_dict('records') |
|
||||
if not complete: |
|
||||
reset() |
|
||||
# print(complete) |
|
||||
for item in current: |
|
||||
name = item['name'] |
|
||||
link = item['link'] |
|
||||
# print(link) |
|
||||
item['product_name'] = complete[link]['product_name'] |
|
||||
item['price'] = round(D(complete[link]['price']),2) |
|
||||
item['time'] = complete[link]['time'] |
|
||||
print(current) |
|
||||
bought = message(quad_parts_base,current) |
|
||||
|
|
||||
quad_parts_base = dicter(quad_parts_base) |
|
||||
for key,is_purchased in bought.items(): |
|
||||
if is_purchased: |
|
||||
# print(key) |
|
||||
try: |
|
||||
if quad_parts_base[key]['count'] > 1: |
|
||||
cur.execute('UPDATE names SET count = count - 1 WHERE name == ?',(key,)) |
|
||||
else: |
|
||||
cur.execute('UPDATE names SET purchased = 1 WHERE name == ?',(key,)) |
|
||||
except: |
|
||||
print(quad_parts_base) |
|
||||
con.commit() |
|
||||
con.close() |
|
||||
|
|
||||
def reset(): |
|
||||
try: |
|
||||
send2trash('test.db') |
|
||||
except: |
|
||||
pass |
|
||||
shutil.copy('quadparts.db','test.db') |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue