one simple app, coumadin gui work
For anyone who might interested I have done some major rewrite of the
coumadin regimen app
and thought I would share it with debian med for further comment.
I would particularly interested in cleaning up the code.
Karsten, I also have managed to make the Target INR selectable.
Much more work than I thought but I like the solution.
G
note. Run GUI.py initially to start.
Thanks,all
(im going to bed now)
G
import decimal
from Tkinter import *
import CR
TargetINR = ["1.5-2.5","2.0-3.0","2.5-3.5"]
class Main:
def __init__(self, parent):
self.parent = parent
Label(parent, text="Select Target INR").grid(row=2)
self.INRList= Listbox(parent,selectmode=SINGLE,
height=3,
takefocus=0,
exportselection=0)
self.INRList.grid(row=2,column=1)
[self.INRList.insert(END, item) for item in TargetINR]
self.INRList.select_set(1)
Label(parent, text="Current INR?").grid(row=3)
self.INREntry = Entry(parent)
self.INREntry.grid(row=3,column=1)
Label (parent, text="Coumadin increment?").grid(row=4)
self.UnitDose= Entry(parent)
self.UnitDose.grid(row=4,column=1)
Label (parent, text = "Monday's dose?").grid(row=5)
self.MondayEntry = Entry(parent)
self.MondayEntry.grid(row=5,column=1)
Label (parent, text = "Tuedays's dose?").grid(row=6)
self.TuesdayEntry = Entry(parent)
self.TuesdayEntry.grid(row=6,column=1)
Label (parent, text = "Wednesday's dose?").grid(row=7)
self.WednesdayEntry = Entry(parent)
self.WednesdayEntry.grid(row=7,column=1)
Label (parent, text = "Thursday's dose?").grid(row=8)
self.ThursdayEntry = Entry(parent)
self.ThursdayEntry.grid(row=8,column=1)
Label (parent, text = "Friday's dose?").grid(row=9)
self.FridayEntry = Entry(parent)
self.FridayEntry.grid(row=9,column=1)
Label (parent, text = "Saturday's dose?").grid(row=10)
self.SaturdayEntry = Entry(parent)
self.SaturdayEntry.grid(row=10,column=1)
Label (parent, text = "Sunday's dose?").grid(row=11)
self.SundayEntry = Entry(parent)
self.SundayEntry.grid(row=11,column=1)
Label (parent, text = "Manual Percent Change?").grid(row=12)
self.ManualPercentChangeEntry = Entry(parent)
self.ManualPercentChangeEntry.grid(row=12,column=1)
SubmitButton = Button(parent, text="Submit?", background="green")
SubmitButton.grid(row=13,columnspan=2)
SubmitButton.bind("<Button-1>", self.SubmitClick)
SubmitButton.bind("<Return>", self.SubmitClick)
Label(parent, text = "Current Total Dose").grid(row=15)
self.CurrentTotalDoseText = Text(parent, width=20,height=1)
self.CurrentTotalDoseText.grid(row=15,column=1)
Label(parent, text = "Percent Change").grid(row=16)
self.PercentChangeText = Text(parent,width=20,height=1)
self.PercentChangeText.grid(row=16,column=1)
Label(parent, text = "New Current Dose").grid(row=17)
self.NewTotalDoseText = Text(parent,width=20,height=1)
self.NewTotalDoseText.grid(row=17,column=1)
Label(parent, text = "New Coumadin Regimen").grid(row=18,columnspan=2)
self.NewRegimenText = Text(parent, width="60", height="5")
self.NewRegimenText.grid(row=19,columnspan=2)
ExitButton = Button(parent, text="EXIT?", background="red")
ExitButton.grid(row=100,columnspan=2)
ExitButton.bind("<Button-1>", self.ExitClick)
ExitButton.bind("<Return>", self.ExitClick)
def SubmitClick (self,event):
CurrentINR = decimal.Decimal(self.INREntry.get())
UnitDose = decimal.Decimal(self.UnitDose.get())
Monday = decimal.Decimal(self.MondayEntry.get())
Tuesday = decimal.Decimal(self.TuesdayEntry.get())
Wednesday = decimal.Decimal(self.WednesdayEntry.get())
Thursday = decimal.Decimal(self.ThursdayEntry.get())
Friday = decimal.Decimal(self.FridayEntry.get())
Saturday = decimal.Decimal(self.SaturdayEntry.get())
Sunday = decimal.Decimal(self.SundayEntry.get())
ManualPercentChange = self.ManualPercentChangeEntry.get()
TargetINRSelection = self.INRList.curselection() #Dont'covert this to a float as you can leave it empty
OUTPUT = CR.CoumadinRegimen(CurrentINR,UnitDose,
Monday,Tuesday,Wednesday,
Thursday,Friday,Saturday,
Sunday,ManualPercentChange,
TargetINRSelection[0])
self.CurrentTotalDoseText.delete(1.0,END)
self.CurrentTotalDoseText.insert(END,str(OUTPUT[0])+"mgs")
self.PercentChangeText.delete(1.0,END)
self.PercentChangeText.insert(END,str(OUTPUT[2]*100)+"%")
self.NewTotalDoseText.delete(1.0,END)
self.NewTotalDoseText.insert(END,str(str(OUTPUT[1])+"mgs"))
self.NewRegimenText.delete(1.0,END)
self.NewRegimenText.insert(END,str(OUTPUT[3]))
def ExitClick(self,event):
self.parent.destroy()
root = Tk()
root.title("Coumadin Regimen Calculator")
main = Main(root)
root.mainloop()
import inr
import math
import decimal
def CoumadinRegimen (CurrentINR,
UnitDose,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
ManualPercentChange = None,
TargetINR = None
):
"""Accept Coumadin dosing regimen and return new dosing regimen.
This function is an attemp to merge the coumadinRegimen functions.
It accepts
1. CurrentINR: the patient's current INR
2. UnitDose: ths is the smallest increment that you can change a patient's
dose. Ie if you are using 2mg tablets then the smaller change would
be splitting the tablet which would be 1mg which is what you enter.
3. Monday-Sunday: Just enter the actual coumadin dose
4. ManualPercentChange: Allows the doctor to change the percent adjustment
5. TargetINR: not implemented yet, but will adjust suggest precent
adjustments depending on what your goal is, 2, 2.5, 3, which would
represent 1.5-2.5,2-3, and 2.5-3.5
"""
CurrentWeekDose = {"Monday":Monday,
"Tuesday":Tuesday,
"Wednesday":Wednesday,
"Thursday":Thursday,
"Friday":Friday,
"Saturday":Saturday,
"Sunday":Sunday}
CoumadinValuesList = CurrentWeekDose.values()
CurrentTotal = sum(CoumadinValuesList)
CurrentDoseUnit = CurrentTotal/UnitDose #This is needed since we are trying to be decide how to spread the increments (pill), not actual mg
if ManualPercentChange == None:
PercentChange = inr.INRadjust(CurrentINR,TargetINR)
elif ManualPercentChange == '':
PercentChange = inr.INRadjust(CurrentINR,TargetINR)
else:
PercentChange = decimal.Decimal(ManualPercentChange)/decimal.Decimal(100)
UnitIncrease = decimal.Decimal(str(CurrentDoseUnit))*(PercentChange)
NewUnitTotal = CurrentDoseUnit + UnitIncrease
NewDoseUnitRounded = math.ceil(NewUnitTotal)
NewTotal = decimal.Decimal(str(NewDoseUnitRounded))*UnitDose
Regimen = divmod(NewDoseUnitRounded,7) #This is the key math to figure out who to distribute the new doses
WeekReference = { 0:"No left over doses",
1:"Monday",
2:"Monday Thursday",
3:"Monday Wednesday Friday",
4:"Monday Wednesday Friday Saturday",
5:"Monday Wednesday Friday Saturday Sunday",
6:"Monday Tuesday Wednesday Friday Saturday Sunday"
}
WeekOrderedlist = 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday'
if Regimen[1] == 0:
SingleTextLineOfRegimen = str((UnitDose * decimal.Decimal(str(Regimen[0])))) + "mg of coumadin every day."
else:
SingleTextLineOfRegimen = str((UnitDose * decimal.Decimal(str(Regimen[0]))))\
+"mg of coumadin every day except "\
+ str ((UnitDose*decimal.Decimal(str(Regimen[0]))+UnitDose))\
+ "mg on "\
+ WeekReference[Regimen[1]]
return CurrentTotal, NewTotal, PercentChange, SingleTextLineOfRegimen
import decimal
def d(X):
return decimal.Decimal(str(X))
def INRadjust (CurrentINR,target_inr=1):
"""
Takes current INR and returns suggested percentage change in coumadin dose.
The target INR selections are:
case 0: 1.5-2.5
case 1:2.0-3.0
case 2:2.5-3.5
"""
cases = [(1.5,2.5), (2.0, 3.0), (2.5, 3.5)]
percent_change=0
try:
low_range, high_range = cases[int(target_inr)]
except IndexError:
print "Case assignment failed"
return
delta_low = d(low_range) - d(CurrentINR)
delta_high = d(CurrentINR) - d(high_range)
#note some weight stuff going on with >=
# str >= int always equal true
# dec >= int always equal true
if target_inr==1 and (d(3)>=d(CurrentINR)>=d(2)):
percent_change=0
return percent_change
elif target_inr==0 and (d(2.5)>=d(CurrentINR)>=d(1.5)):
percent_change=0
return percent_change
elif target_inr==2 and (d(3.5)>=d(CurrentINR)>=d(2.5)):
percent_change=0
return percent_change
else: pass
if delta_low >= d(0.5):
percent_change= 0.15
elif d(0.5) > delta_low >= d(0.25):
percent_change = .10
elif d(0.25) > delta_low >d(0.01):
percent_change =0.05
elif d(0.5) > delta_high >= d(0.01):
percent_change = -0.05
elif d(1) > delta_high >= d(0.5):
percent_change = -0.10
elif d(1.5) > delta_high >= d(1):
percent_change= -0.125
elif d(2) > delta_high >= d(1.5):
percent_change = -0.15
elif d(2.5) > delta_high >= d(2.0):
percent_change = -0.175
elif d(3) > delta_high >= d(2.5):
percent_change = -0.20
elif d(3.5) > delta_high >= d(3):
percent_change = -0.25
elif d(4) > delta_high >= d(3.5):
percent_change = -0.30
elif d(4.5) > delta_high >= d(4):
percent_change = -0.35
elif delta_high >= d(4.5):
percent_change = -0.40
else:
print "percent_change assigntment failed."
return decimal.Decimal(str(percent_change))
Reply to: