示例#1
0
文件: table.py 项目: Huaxu007/AutoOED
class Table:
    '''
    Excel-like table in tkinter gui
    '''
    def __init__(self, master, columns):

        # default params
        self.params = {
            'cellwidth': 110,
            'precision': 6,
        }

        self.data = []

        self.model = TableModel()
        self.columns = columns
        for column in columns:
            self.model.addColumn(colname=column)
        self.table = TableCanvas(parent=master, model=self.model, cellwidth=self.params['cellwidth'], read_only=True)
        self.table.setSelectedRow(-1)
        self.table.show()
        
        self.n_rows = 0

    def set_params(self, params):
        assert params.keys() == self.params.keys()
        self.params = params
        self.table.cellwidth = self.params['cellwidth']
        self.refresh()

    def get_params(self):
        return self.params.copy()

    def _process_val(self, val):
        if val is None:
            return 'N/A'
        elif isinstance(val, bool):
            if val == True: return 'True'
            else: return 'False'
        elif isinstance(val, float):
            if np.isnan(val): return 'N/A'
            else: return round(val, self.params['precision'])
        else:
            return str(val)

    def transform_data(self, data_list):
        '''
        '''
        new_data_list = []
        for data in data_list:
            data = np.array(data, dtype=str)
            if len(data.shape) == 1:
                data = np.expand_dims(data, axis=1)
            assert len(data.shape) == 2
            new_data_list.append(data)
        return np.hstack(new_data_list)

    def load(self, data, transform=False):
        '''
        '''
        if transform:
            data = self.transform_data(data)

        if len(data) > self.n_rows:
            self.model.autoAddRows(len(data) - self.n_rows)
            self.data.extend([[None for _ in self.columns] for _ in range(len(data) - self.n_rows)])
        elif len(data) < self.n_rows:
            self.model.deleteRows(rowlist=range(len(data), self.n_rows))
            del self.data[len(data):]
        self.n_rows = len(data)

        for row in range(self.n_rows):
            row_data = data[row]
            for j, col in enumerate(self.columns):
                self.model.data[row][col] = self._process_val(row_data[j])
                self.data[row][self.columns.index(col)] = row_data[j]

        self.table.redrawTable()

    def insert(self, columns, data, transform=False):
        '''
        Insert data into bottom of the table
        '''
        if transform:
            data = self.transform_data(data)

        old_n_rows = self.n_rows
        if len(data) > 0:
            self.model.autoAddRows(len(data))
            self.data.extend([[None for _ in self.columns] for _ in data])
            self.n_rows = old_n_rows + len(data)

        if columns is None: columns = self.columns

        for i, row in enumerate(range(old_n_rows, self.n_rows)):
            row_data = data[i]
            for j, col in enumerate(columns):
                self.model.data[row][col] = self._process_val(row_data[j])
                self.data[row][self.columns.index(col)] = row_data[j]
        
        self.table.redrawTable()

    def update(self, columns, data, rowids=None, transform=False):
        '''
        Update rows of the table (TODO: support single rowid)
        '''
        if transform:
            data = self.transform_data(data)

        if rowids is None:
            rowids = list(range(len(data)))
            new_n_rows = len(data)
            if new_n_rows > self.n_rows:
                self.model.autoAddRows(new_n_rows - self.n_rows)
                self.n_rows = new_n_rows

        if columns is None: columns = self.columns

        assert len(data) == len(rowids)
        for i, row in enumerate(rowids):
            row_data = data[i]
            for j, col in enumerate(columns):
                self.model.data[row][col] = self._process_val(row_data[j])
                self.data[row][self.columns.index(col)] = row_data[j]

        self.table.redrawTable()

    def refresh(self):
        '''
        '''
        for row in range(self.n_rows):
            for j, col in enumerate(self.columns):
                self.model.data[row][col] = self._process_val(self.data[row][j])
        
        self.table.redrawTable()

    def get(self, row, column):
        '''
        Get the cell value
        '''
        return self.table.model.data[row][column]

    def get_column(self, column):
        '''
        Get values of a column
        '''
        return [self.get(row, column) for row in range(self.n_rows)]

    def export_csv(self):
        '''
        Export table content to a csv file
        '''
        self.table.exportTable()
示例#2
0
class GUI:
    def __init__(self, database_connection):
        self.database_connection = database_connection
        self.rowNumber = -1
        self.rows = {}
        self.X = ""
        self.H = 'No'
        self.B = 'No'

        self.root = tk.Tk()
        self.root.title('')
        canvas = tk.Canvas(self.root, height=600, width=1500)
        canvas.pack()
        self.frame = tk.Frame(self.root)
        self.frame.place(relx=0, rely=0, relwidth=0.5, relheight=1)
        self.tframe = tk.Frame(self.root)
        self.tframe.place(relx=0.5, rely=0.0, relwidth=0.5, relheight=0.5)

        # table build
        self.table = TableCanvas(self.tframe,
                                 rows=2,
                                 cols=4,
                                 cellwidth=175,
                                 state="readonly")
        self.table_value = TableCanvas(self.frame,
                                       rows=2,
                                       cols=6,
                                       cellwidth=117,
                                       state="readonly")
        self.table_value.show()

        self.table.bind('<ButtonRelease-1>',
                        self.clicked)  # Bind the click release event

        self.table.model.columnlabels['1'] = "VerifiedDate"
        self.table.model.columnlabels['2'] = "Program"
        self.table.model.columnlabels['3'] = "OrdPhysician"
        self.table.model.columnlabels['4'] = "BandQ"
        self.table.show()

        self.table_value.model.columnlabels['1'] = "Total Protein"
        self.table_value.model.columnlabels['2'] = "Albumin"
        self.table_value.model.columnlabels['3'] = "Alpha1"
        self.table_value.model.columnlabels['4'] = "Alpha2"
        self.table_value.model.columnlabels['5'] = "Beta"
        self.table_value.model.columnlabels['6'] = "Gamma"

        self.hframe = tk.Frame(self.root)
        self.hframe.place(relx=0.5, rely=0.5, relwidth=0.5, relheight=0.57)
        self.History = tk.Label(
            self.frame,
            text='Does this patient have a previous history?',
            font=15)
        self.History.place(relx=0.13, rely=0.22, relwidth=0.8, relheight=0.1)
        self.var1 = tk.IntVar()
        self.var1.set('no')
        self.button_Y_H = tk.Radiobutton(self.frame,
                                         text="Yes",
                                         font=8,
                                         variable=self.var1,
                                         value='yes',
                                         command=self.HY)
        self.button_N_H = tk.Radiobutton(self.frame,
                                         text="No",
                                         font=8,
                                         variable=self.var1,
                                         value='no',
                                         command=self.HN)
        self.button_Y_H.place(relx=0.35,
                              rely=0.35,
                              relwidth=0.10,
                              relheight=0.05)
        self.button_N_H.place(relx=0.55,
                              rely=0.35,
                              relwidth=0.10,
                              relheight=0.05)
        self.Band = tk.Label(
            self.frame,
            text='Is there a band present in the current study?',
            font=15)
        self.Band.place(relx=0.13, rely=0.42, relwidth=0.8, relheight=0.1)
        self.var2 = tk.IntVar()
        self.var2.set('no')
        self.button_Y_B = tk.Radiobutton(self.frame,
                                         text="Yes",
                                         font=8,
                                         variable=self.var2,
                                         value='yes',
                                         command=self.BY)
        self.button_N_B = tk.Radiobutton(self.frame,
                                         text="No",
                                         font=8,
                                         variable=self.var2,
                                         value='no',
                                         command=self.BN)
        self.button_Y_B.place(relx=0.35,
                              rely=0.53,
                              relwidth=0.10,
                              relheight=0.05)
        self.button_N_B.place(relx=0.55,
                              rely=0.53,
                              relwidth=0.10,
                              relheight=0.05)
        self.comment = tk.Text(self.frame, height=30, width=10)
        self.comment.place(relx=0.13, rely=0.60, relwidth=0.8, relheight=0.35)
        self.button_next = tk.Button(self.frame,
                                     text="Next",
                                     font=8,
                                     command=self.next_row)
        self.button_next.place(relx=0.9,
                               rely=0.22,
                               relwidth=0.1,
                               relheight=0.1)
        self.button_prev = tk.Button(self.frame,
                                     text="Previous",
                                     font=8,
                                     command=self.prev_row)
        self.button_prev.place(relx=0.06,
                               rely=0.22,
                               relwidth=0.1,
                               relheight=0.1)
        self.button_close = tk.Button(self.frame,
                                      text="Close",
                                      font=8,
                                      command=self.close)
        self.button_close.place(relx=0.473,
                                rely=0.95,
                                relwidth=0.07,
                                relheight=0.05)
        self.button_pickday = tk.Button(self.frame,
                                        text="Pick Day",
                                        font=8,
                                        command=self.pickDate)
        self.button_pickday.place(relx=0.4,
                                  rely=0.15,
                                  relwidth=0.1,
                                  relheight=0.05)
        self.history_comment = tk.Text(self.hframe, height=30, width=10)
        self.history_comment.place(relx=0.1,
                                   rely=0.1,
                                   relwidth=0.8,
                                   relheight=0.6)

        self.attending = tk.Label(self.hframe, text='', font=15)
        self.attending.place(relx=0.125,
                             rely=0.75,
                             relwidth=0.8,
                             relheight=0.1)

        self.date_label = tk.Label(self.frame, text='', font=15)
        self.date_label.place(relx=0.5,
                              rely=0.15,
                              relwidth=0.16,
                              relheight=0.05)

        # TODO default date to today's date
        default_date = '09-08-2016'
        self.update_date(default_date)

    def update_date(self, new_date):
        self.rows = database_connection.get_rows_for_date(new_date)
        self.date_label.config(text=new_date)
        self.rowNumber = 0
        self.resetTK()

    def close(self):
        self.root.destroy()

    def next_row(self):
        if self.rowNumber == len(self.rows) - 1:
            return
        self.rowNumber = self.rowNumber + 1
        self.thisRowData = self.rows[self.rowNumber]
        self.var1.set('no')
        self.var2.set('no')
        self.H = 'No'
        self.B = 'No'
        self.updateTK()

    def prev_row(self):
        if self.rowNumber == 0:
            return
        self.rowNumber = self.rowNumber - 1
        self.thisRowData = self.rows[self.rowNumber]
        self.var1.set('no')
        self.var2.set('no')
        self.H = 'No'
        self.B = 'No'
        self.updateTK()

    def resetTK(self):
        self.rowNumber = -1
        self.thisRowData = None
        self.next_row()
        self.updateTK()

    def pickDate(self):
        calendarPopupFrame = tk.Toplevel()
        calendarObject = Calendar(calendarPopupFrame, self)

    def HY(self):
        self.H = 'Yes'
        self.updateTK()

    def HN(self):
        self.H = 'No'
        self.updateTK()

    def BY(self):
        self.B = 'Yes'
        self.updateTK()

    def BN(self):
        self.B = 'No'
        self.updateTK()

    def clicked(self, event):  # Click event callback function.
        self.updateHistoryComment()

    def updateHistoryComment(self):
        currentPatientHistoryRecord = self.getCurrentPatientHistoryRecord()
        if currentPatientHistoryRecord is None:
            return

        self.attending.config(
            text=currentPatientHistoryRecord.signout_pathologist)
        self.history_comment.delete('1.0', tk.END)
        self.history_comment.insert(
            tk.END, str(currentPatientHistoryRecord.interpretation))
        self.table.redrawTable()

    def getCurrentPatientHistoryRecord(self):
        currentTableRecord = self.table.get_currentRecord()
        for ph in self.patient_history:
            if currentTableRecord['1'] == ph.get_formatted_verified_time() and \
                    currentTableRecord['2'] == ph.get_program_description() and \
                    currentTableRecord['3'] == ph.ordering_provider and \
                    currentTableRecord['4'] == ph.band_concentration:
                return ph
        return None

    def updateTK(self):
        # update button text
        self.History.config(text='Case ' + str(self.thisRowData.seq) +
                            ': Does ' + self.thisRowData.patientName +
                            ' have a previous history?')

        # update history comment and attending
        self.attending.config(text='')
        self.history_comment.delete('1.0', tk.END)
        self.history_comment.insert(tk.END, str(''))

        self.table_value.model.setValueAt(self.thisRowData.pt, 0, 0)
        self.table_value.model.setValueAt(self.thisRowData.getAbsAlbuminText(),
                                          0, 1)
        self.table_value.model.setValueAt(self.thisRowData.getAbsAlpha1Text(),
                                          0, 2)
        self.table_value.model.setValueAt(self.thisRowData.getAbsAlpha2Text(),
                                          0, 3)
        self.table_value.model.setValueAt(self.thisRowData.getAbsBetaText(), 0,
                                          4)
        self.table_value.model.setValueAt(self.thisRowData.getAbsGammaText(),
                                          0, 5)

        self.table_value.model.setValueAt(
            str(self.thisRowData.getRelAlbuminText()), 1, 1)
        self.table_value.model.setValueAt(
            str(self.thisRowData.getRelAlpha1Text()), 1, 2)
        self.table_value.model.setValueAt(
            str(self.thisRowData.getRelAlpha2Text()), 1, 3)
        self.table_value.model.setValueAt(
            str(self.thisRowData.getRelBetaText()), 1, 4)
        self.table_value.model.setValueAt(
            str(self.thisRowData.getRelGammaText()), 1, 5)

        self.table_value.redrawTable()
        # update suggested comment
        new_comment = ""
        try:
            new_comment = CommentInterpreter.CM(self.thisRowData, self.H,
                                                self.B)
        except:
            new_comment = "An error occurred when trying to create the comment"
        self.comment.delete('1.0', tk.END)
        self.comment.insert(tk.END, str(new_comment))

        # update historical table
        self.table.model.deleteRows()
        self.table.clearSelected()
        self.table.redrawTable()

        if self.thisRowData.mrn is None:
            return

        self.patient_history = database_connection.get_history(
            str(self.thisRowData.mrn))

        # add a row for each new history element
        for ph in self.patient_history:
            new_row_index = self.table.model.addRow() - 1
            self.table.model.setValueAt(ph.verified_time.strftime("%Y-%m-%d"),
                                        new_row_index, 0)
            self.table.model.setValueAt(ph.get_program_description(),
                                        new_row_index, 1)
            self.table.model.setValueAt(ph.ordering_provider, new_row_index, 2)
            self.table.model.setValueAt(ph.band_concentration, new_row_index,
                                        3)

        self.table.setSelectedRow(0)
        self.updateHistoryComment()

    def mainloop(self):
        self.root.mainloop()
示例#3
0
class EventMaker(tk.Frame):
    def __init__(self, section_name, master=None, model_name=None, **options):
        """
        Frames parameter section inquiries as listed in cEvents.ModelEvents
        :param section_name: STR of section name - must be one of: "bce", "..."
        :param master: tk.Frame-master
        :param options: relief, ...
        """
        Frame.__init__(self, master, **options)
        if not model_name:
            self.mbce = cTFmodel.Hy2OptModel("default")
        else:
            self.mbce = cTFmodel.Hy2OptModel(model_name)
            self.mbce.overwrite_defaults(section_name)
        self.sn = section_name
        self.number_of_events = 1
        self.del_event_var = tk.StringVar()

        self.bg_color = self.mbce.bce_bg_colors[self.sn]
        self.config(width=ww, height=int(20 * self.mbce.default_dicts[self.sn].keys().__len__()), bg=self.bg_color)
        tk.Label(self, text=self.mbce.bce_name_dict[self.sn].upper()).grid(sticky=tk.W, row=0, column=0, columnspan=3, padx=xd, pady=yd)

        usr_msg, fg_col = self.chk_model()
        self.l_model_check = tk.Label(self, fg=fg_col, width=85, text=usr_msg)
        self.l_model_check.grid(sticky=tk.W, row=1, column=0, columnspan=3, padx=xd, pady=yd)

        self.par_objects = {"Events": self.mbce.event_file}
        if os.path.isfile(dir2tf + "models/" + self.mbce.event_file[0]):
            self.mbce.events = fGl.dict_nested_read_from_file(dir2tf + "models/" + self.mbce.event_file[0])

        self.table_frame = Frame(self, width=700)
        self.table_frame.grid(sticky=tk.EW, row=2, rowspan=2, column=0, columnspan=3, padx=xd, pady=yd)
        self.table = TableCanvas(self.table_frame, data=self.mbce.events)
        if model_name and self.mbce.events:
            self.table.show()

        tk.Button(self, text="Add event", command=lambda: self.add_row()).grid(sticky=tk.EW, row=2, column=3, padx=xd, pady=yd)
        tk.Button(self, text="Delete event\n(row) No:", command=lambda: self.del_row()).grid(sticky=tk.EW, row=3, column=3, padx=xd, pady=yd)
        tk.Entry(self, width=3, textvariable=self.del_event_var).grid(sticky=tk.EW, row=3, column=4, padx=xd, pady=yd)

        self.make_up()

    def add_row(self):
        self.number_of_events += 1
        self.table.addRow(self.number_of_events)

    def del_row(self):
        self.number_of_events -= 1
        try:
            del_row = int(self.del_event_var.get()) - 1
            self.table.setSelectedRow(del_row)
            self.table.deleteRow()
        except:
            showinfo("INFO", "The event number must be a positive integer of a present row number.", parent=self)
            return -1

        if self.number_of_events < 1:
            showinfo("WARNING", "Define at least one event!", parent=self)

    def chk_model(self):
        if not (self.mbce.name == "default"):
            msg0 = "Define inlet flows (for Name-fields of 2d_sa_MODEL_QT_R.shp)\nand outlet WSEs (for Name-fields of 2d_bc_MODEL_HT.shp).\n"
            self.mbce.get_boundary_sa_names()
            self.mbce.get_boundary_bc_names()
            msg1 = str("Identified inlet names: " + ", ".join(self.mbce.bc_dict['sa']))
            msg2 = str("\nIdentified outlet names: " + ", ".join(self.mbce.bc_dict['bc']))
            return msg0 + msg1 + msg2, "forest green"
        else:
            msg0 = "NOT AVAILABLE\n\nDefine and select a model.\n"
            msg1 = "Event definitions require the prior definition of a mode with a 2d_sa_MODEL_QT_R.shp file (Geometry Tab)."
            return msg0 + msg1, "red3"

    def make_up(self):
        for wid in self.winfo_children():
            try:
                wid.configure(bg=self.bg_color)
            except:
                pass

    def save_event_file(self):
        self.mbce.events = {}  # reset events dictionary

        for row in range(1, self.table.rows+1):
            self.mbce.events.update({row: {}})
            for col in self.table.model.columnNames:
                try:
                    self.mbce.events[row].update({col: self.table.model.data[row][col]})
                except:
                    print("Setting %s to 0.0 (no value defined)" % str(col))
                    self.mbce.events[row].update({col: 0.0})

        fGl.dict_nested_write2file(self.mbce.events, dir2tf + "models/" + self.mbce.event_file[0])
示例#4
0
def startWindow():
	StartWindow = tk.Tk()
	StartWindow.title(programTitle)

	StartWindow.tk.call('wm', 'iconphoto', StartWindow._w, tk.PhotoImage(file=programIcon))

	AuxLabel1 = tk.Label(StartWindow,
						text=None)

	StartLabel = tk.Label(StartWindow,
							text="Main menu",
							font="Calibri 14")

	MainPacientLabel = tk.Label(StartWindow,
								text="The pacient is " + pacientName,
								font="Calibri 10")

	TableFrameStart = tk.Frame(StartWindow)

	#tabela = tk.Label(StartWindow,
	#					text="A tabela fica aqui!",
	#					bg="gray")

	#grafico = tk.Label(StartWindow,
	#					text="O grafico fica aqui!",
	#					bg="gray")
	
	AuxLabel1.pack(side=tk.TOP, pady=5)
	StartLabel.pack(side=tk.TOP, padx=100, pady=10)
	MainPacientLabel.pack(side=tk.TOP)

	#tabela.pack(side=tk.LEFT, padx=25, pady=25, ipadx=200, ipady=200)
	TableFrameStart.pack(side=tk.LEFT)
	#grafico.pack(side=tk.RIGHT, padx=25, pady=25, ipadx=200, ipady=200)

	data = {
		'r1':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r2':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r3':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r4':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r5':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r6':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r7':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r8':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r9':  {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r10': {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r11': {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0},
    	'r12': {'Time': 0, 'Voltage': 0, 'Current': 0, 'Impedance': 0}
    }

	TableModelStart = TableModel()

	TableStart = TableCanvas(TableFrameStart,
							model=TableModelStart,
							cellwidth=120,
							columnheight=40,
							editable=False
							)
	TableModelStart.importDict(data)
	TableStart.setSelectedRow(-1)
	TableStart.show()

	#Changing values
	TableModelStart.setValueAt(5, 0, 0)
	TableStart.redrawTable()

	#Ploting a graph in the interface
	a.plot(vectorx,vectory)
	a.set_xlabel('X axis')
	a.set_ylabel('Y axis')
	canvas = FigureCanvasTkAgg(f, master= StartWindow)
	canvas.draw()
	canvas.get_tk_widget().pack(side = tk.RIGHT, expand = False, ipadx=2, ipady=2, padx=25, pady=25)

	#Calls the function to pdate the graph
	ani = animation.FuncAnimation(f, animate, interval=100, blit=False)	
	StartWindow.mainloop()