2017-02-15 13 views
0

Ich bin neu in Python und versuche eine GUI zu erstellen, die von Datum und Datum vom Benutzer dauert und liest die Daten entsprechend aus einer CSV-Datei und zeigt die Urinausgabe (berechnet in der csvimport-Funktion)). Ich möchte auch die Grafik für eine bestimmte Zeit und Urin-Ausgabe in dieser Zeit grafisch darstellen.Python GUI und Funktionsaufruf mit Tkinter

Kann mir jemand helfen? Mein Code ist bis jetzt unten und es zeigt keine GUI an. Kann jemand bitte die Grundfehler korrigieren und mir dabei helfen?

  import csv 
      from tkinter import * 
      from tkinter.filedialog import askopenfilename 
      from tkinter.messagebox import showwarning, showinfo 
      import datetime 




      #csv_file = csv.reader(open("C:\Users\Lala Rushan\Downloads\ARIF Drop Monitoring Final\ARIF Drop Monitoring Final\DataLog.csv")) 
      from Tools.scripts.treesync import raw_input 
      class App(Frame): 
       def __init__(self, master): 
        Frame.__init__(self, master) 
        self.in_file = None 
        button1 = Button(self, text="Browse for a file", command=self.askfilename) 
        button2 = Button(self, text="Count the file", command=self.takedate()) 
        button3 = Button(self, text="Exit", command=master.destroy) 
        button1.grid() 
        button2.grid() 
        button3.grid() 
        self.grid() 

       def askfilename(self): 
        in_file = askopenfilename() 
        if not in_file.endswith(('.csv')): 
         showwarning('Are you trying to annoy me?', 'How about giving me a CSV file, genius?') 
        else: 
         self.in_file=in_file 

       def CsvImport(csv_file): 


        dist = 0 
        for row in csv_file: 
         _dist = row[0] 
         try: 
          _dist = float(_dist) 
         except ValueError: 
          _dist = 0 

         dist += _dist 
        print ("Urine Volume is: %.2f" % (_dist*0.05)) 


       def takedate(self): 
        from_raw = raw_input('\nEnter FROM Date (e.g. 2013-11-29) :') 
        from_date = datetime.date(*map(int, from_raw.split('/'))) 
        print ('From date: = ' + str(from_date)) 
        to_raw = raw_input('\nEnter TO Date (e.g. 2013-11-30) :') 
        to_date = datetime.date(*map(int, to_raw.split('/'))) 
        in_file = ("H:\DataLog.csv") 
        in_file= csv.reader(open(in_file,"r")) 

        for line in in_file: 
         _dist = line[0] 
         try: 
          file_date = datetime.date(*map(int, line[1].split(' ')[1].split('/'))) 
          if from_date <= file_date <= to_date: 
           self.CsvImport(in_file) 

         except IndexError: 
          pass 






      root = Tk() 
      root.title("Urine Measurement") 
      root.geometry("500x500") 
      app = App(root) 
      root.mainloop() 

Antwort

1

Du Aufruftakedate Methode, sobald Sie Ihre Klasse initialisiert wird. Das Entfernen von Klammern (dh Aufruf die Methode) würde Ihr Problem lösen.

button2 = Button(self, text="Count the file", command=self.takedate()) 
                    ^^ remove these 

Ihre GUI nicht zu sehen, weil takedate Methode Ihr Programm macht für Benutzereingaben warten, weil der raw_input(..) Anrufe.

Sie sollten Entry anstelle von raw_input() verwenden, um Benutzereingaben zu erhalten.

BEARBEITEN: Sie können zwei Einträge in Ihre __init__ setzen und dann die Methode "get" von Entry in takedate verwenden. Etwa so etwas wie unten.

Außerdem sollten Sie selbst Parameter bei der Definition Ihrer Methode hinzufügen, da es Teil dieser Klasse ist.

def CsvImport(self, csv_file): 
+0

Danke für Ihre Antwort. Ich bin verwirrt, wo sollte ich ** Eintrag ** verwenden? in der ** takedate ** Funktion? und wie werde ich das in der GUI zeigen, wenn es in der ** Takedate ** Methode verwendet wird? – rushan

+0

@rushan Code hinzugefügt. – Lafexlos

+0

Hallo. jetzt, wenn ich die Daten in das Textfeld eingeben, tritt der folgende Fehler auf: ** TypeError: CsvImport() nimmt 1 Positionargument, aber 2 wurden gegeben ** können Sie mir dabei helfen? – rushan

1

Wenn Sie keine Parameter in self.takedate() entfernen () wie unten weitergeben wollen:

button2 = Button(self, text="Count the file", command=self.takedate) 

oder

button2 = Button(self, text="Count the file", command=lambda e=Null: self.takedate()) 

Sie e Parameter In diesem Fall ändern self.takedate() passieren kann. Pass es zu dieser Manier:

command=lambda e=Null: self.takedate(e) 
def takedate(self, parameter): pass