2016-04-13 8 views
0

Also, ich mache gerade ein Programm, das als BMI-Rechner dient, wo Sie Ihr Gewicht und Ihre Körpergröße eingeben können und es als BMI ausgeben wird Ihre Gewichtsgruppe, mit der Option, Ihre Ergebnisse in einer Datenbank zu speichern, in der Sie dann zurückgehen und Ihre vorherigen Ergebnisse überprüfen können. Ich habe Probleme, die Informationen von einer Datenbank zu bekommen und sie in die GUI zu bringen, damit der Benutzer sie sehen kann. Das Schreiben der Daten in die Datenbank ist ein Problem, das ich bereits verkauft habe. Ich benutze sqlite3 für meine Datenbank und Tkinter für meine GUI. Wie kann ich diese Funktion meinem Code hinzufügen? Hier ist mein aktueller CodeDaten aus einer Datenbank übernehmen und in eine Tabelle in einer GUI einbinden

from Tkinter import * 
import sqlite3 
import time 
import datetime 

conn = sqlite3.connect('bmidatabase.db') 
c = conn.cursor() 

class Welcome(): 
#This is the class defining the first welcoming window. This window is used to navigate between previous weights and the calculator. 
    def __init__(self,master): 
     #This is the GUI for the starting Menu area. Features three buttons for navigating towards the BMI Calculator, the Records where we have to store variables entered and the exit# 

      self.master=master 
      self.master.geometry('170x110+100+200') 
      self.master.title('Welcome!') 

      self.label1=Label(self.master,text='Welcome to the BMI Calculator',fg='red').grid(row=0,column=1) 
      self.button1=Button(self.master,text="BMI Calculator",fg='green',command=self.gotobmicalculator).grid(row=1,column=1) 
      self.button2=Button(self.master,text="Records",fg='blue',command=self.gotorecords).grid(row=2,column=1) 
      self.button3=Button(self.master,text="Exit",fg='red',command=self.exit).grid(row=3,column=1) 

    def exit(self): 
     #Exit protocol for the exit button. This part is completely done.# 
      self.master.destroy() 

    def gotobmicalculator(self): 
     #This is the BMI Calculator GUI#  
      root2=Toplevel(self.master) 
      myGUI=bmicalculator(root2) 

    def gotorecords(self): 
     #This is where the previous records of BMI will be kept, hasn't been put in yet# 
      root2=Toplevel(self.master) 
      mygui=records(root2) 

class bmicalculator(): 
    #class created for the bmi calculator GUI and processing the numbers (pain in the ass to make)# 
    def __init__(self,master): 

      c.execute('CREATE TABLE IF NOT EXISTS BMIStorage(timestamp TEXT,bodymassindex REAL,weightclass TEXT)') 

      self.heightcm=DoubleVar() 
      self.weightkg=DoubleVar() 

      self.master=master 
      self.master.geometry('250x200+100+200') 
      self.master.title('BMI Calculator') 

      self.label2=Label(self.master,text='Welcome to the BMI Calculator',fg='red').grid(row=0,column=0) 
      self.label2=Label(self.master,text='Please enter your height in centimetres',fg='black').grid(row=3,column=0) 
      self.label2=Label(self.master,text='Please enter your weight in kilograms',fg='black').grid(row=4,column=0) 

      self.myheight=Entry(self.master,textvariable=self.heightcm).grid(row=3,column=1) 
      self.myweight=Entry(self.master,textvariable=self.weightkg).grid(row=4,column=1) 
      self.button4=Button(self.master,text="Calculate BMI",fg='red',command=self.bmicalculation).grid(row=7,column=0) 
      self.button5=Button(self.master,text="Exit",fg='red',command=self.exit).grid(row=9,column=0) 

    def bmicalculation(self): 
      bmiheight=self.heightcm.get() 
      print bmiheight 
      bmiweight=self.weightkg.get() 
      bmi= float((bmiweight)/((bmiheight/100)**2)) 
      self.bmi = bmi 
      print bmi 
      self.label1=Label(self.master,text='Your BMI is %.2f' % bmi).grid(row=5,column=0) 

      if bmi <= 18.5: 
       self.label2=Label(self.master,text='This places you in the underweight group.',fg='blue').grid(row=6,column=0) 
       totalindex = 'underweight' 
       self.totalindex = totalindex 
      elif bmi >18.5 and bmi <25: 
       self.label3=Label(self.master,text='This places you in the healthy weight group.',fg='green').grid(row=6,column=0) 
       totalindex = 'healthy' 
       self.totalindex = totalindex 
      elif bmi >= 25 and bmi < 30: 
       self.label4=Label(self.master,text='This places you in the overweight group.',fg='orange').grid(row=6,column=0) 
       totalindex = 'overweight' 
       self.totalindex = totalindex 
      elif bmi >=30: 
       self.label5=Label(self.master,text='This places you in the obese group.',fg='red').grid(row=6,column=0) 
       totalindex = 'obese' 
       self.totalindex = totalindex 

      if bmi >0 and bmi <999999999999999999999: 
       self.button6=Button(self.master,text="Store Data",fg='red',command=self.dynamic_data_entry).grid(row=8,column=0) 

    def dynamic_data_entry(self): 
      global dynamic_data_entry 
     #this is what adds the data to the database. Bmi has to be changed to the value of bmi and weightclass has to be change to the weightclass 
      timestamp = str(datetime.datetime.now().date()) 
      bodymassindex = self.bmi 
      weightclass = self.totalindex 
      c.execute("INSERT INTO BMIStorage (timestamp, bodymassindex, weightclass) VALUES (?, ?, ?)",(timestamp, bodymassindex, weightclass)) 
      conn.commit() 
      self.writetodatabase() 

    def writetodatabase(self): 
      for i in range(1): 
       time.sleep(1) 
      c.close() 
      conn.close() 

    def exit(self): 
      #Exit protocol for the exit button. This part is completely done.# 
      self.master.destroy() 

class records(): 
    #class created to see records that have been previously inputted# 
    def __init__(self,master): 
      self.master=master 
      self.master.geometry('250x200+100+200') 
      self.master.title('Records') 






def main(): 
    root=Tk() 
    myGUIWelcome=Welcome(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Jede Hilfe mit diesem würde sehr geschätzt werden, ich bin sehr fest an dieser Stelle! Danke, Ben

+0

Wo steckst du fest? Sie haben es geschafft, in die Datenbank zu schreiben, so dass Sie diesen Befehl ändern können, um die Werte zurück zu bekommen. Sie haben den Tkinter ausgeführt, so dass Sie Werte anzeigen können. Was genau ist das Problem? – tfv

+0

Ich weiß nicht, welche Befehle zum Abrufen und was zu verwenden ist, um eine Tabelle in die GUI zu bekommen (ich habe versucht, den Befehl und die Etiketten drucken, aber das funktioniert nicht) Ich bin neu beide Tkinter und sqlite3 und wissen nicht viel in der Art von Befehlen, nur was ich in Tutorials gesehen habe –

+0

Werfen Sie einen Blick hier: sqlite Tutorial: http://zetcode.com/db/sqlitepythontutorial/ und hier http://stackoverflow.com/questions/9348264/does-tkinter-have-a-table-widget – tfv

Antwort

0

Tkinter bietet kein eigenes Tabellenwidget, aber Sie können grid verwenden und Beschriftungen darin einfügen. Um alle Daten aus Ihrer Datenbank zu erhalten, müssen Sie nur eine Abfrage SELECT * FROM <Table> ausführen und mit .fetchall() erhalten Sie eine Liste mit dem Dubletten. Das ist Ihre records Klasse:

class records(): 
    #class created to see records that have been previously inputted# 
    def __init__(self,master): 
     self.master=master 
     self.master.geometry('250x200+100+200') 
     self.master.title('Records') 
     self.connection = sqlite3.connect('bmidatabase.db') 
     self.cur = self.connection.cursor() 
     self.dateLabel = Label(self.master, text="Date", width=10) 
     self.dateLabel.grid(row=0, column=0) 
     self.BMILabel = Label(self.master, text="BMI", width=10) 
     self.BMILabel.grid(row=0, column=1) 
     self.stateLabel = Label(self.master, text="Status", width=10) 
     self.stateLabel.grid(row=0, column=2) 
     self.showallrecords() 

    def showallrecords(self): 
     data = self.readfromdatabase() 
     for index, dat in enumerate(data): 
      Label(self.master, text=dat[0]).grid(row=index+1, column=0) 
      Label(self.master, text=dat[1]).grid(row=index+1, column=1) 
      Label(self.master, text=dat[2]).grid(row=index+1, column=2) 

    def readfromdatabase(self): 
     self.cur.execute("SELECT * FROM BMIStorage") 
     return self.cur.fetchall() 

Da Sie Ihre Verbindung zur Datenbank geschlossen haben (das ist ein Fehler, weil Sie einen anderen BMI nicht berechnen kann), müssen wir es wieder öffnen. Danach erstellen wir einen "Header" mit Beschriftungen in das Rasterlayout. Beachten Sie, dass wir grid in einer separaten Zeile verwenden. Der Grund dafür ist, wenn wir self.ourLabel = Label().grid() schreiben, erhalten wir eine None zurück von der grid -Methode und können die Referenz für zukünftige Zwecke nicht verwenden. Sie müssen also Ihren anderen Code korrigieren. Danach holen wir alle Daten aus der Datenbank und erstellen 3 Labels für jede Zeile.

+0

Vielen Dank! Arbeitete wie ein Charme und sehr gut erklärt auch! –

+0

Kein Problem. Der lustige Teil fängt an, wenn Sie versuchen, diese dynamisch hinzugefügten 'Label's zu löschen :) – VRage

Verwandte Themen