2017-04-04 4 views
2

Ich arbeite derzeit an einer Zuweisung, die besagt, dass ich eine GUI mit Tkinter erstellen muss, die Zeichenfolgen aus einer Textdatei lädt und in einem Textfeld anzeigt. Die Anweisungen geben auch an, dass Klassen verwendet werden müssen. Ich bin neu in der Programmierung, ich bin mir nicht sicher, wie das alles funktioniert. Meine aktuelle Textdatei sieht wie folgt aus:Klassen/Attribute in Python

(Artikel Identität #, Menge, Artikel, Ort, Farbe)

(23871243, 20, Isoliert, Kalifornien, Weiß)

(94938443, 10 , Socken, Kanada, Schwarz)

ich nach den Anforderungen, muss jede Zeile ein individuelles Objekt, mit Attributen wie Menge sein, Standort usw. ich bin mit der GUI-Komponente in Ordnung, aber das Hauptproblem Ich sage Python, dass jede Zeile in t Die Textdatei ist ein separates Objekt mit bestimmten Attributen.

Die 'OpenFile' Funktion ist wahrscheinlich, wo das Problem ist. Ab sofort gibt es eine Liste von Strings zurück, aber ich möchte, dass es ein Objekt mit 5 Attributen zurückgibt (wie oben in der Textdatei aufgelistet). Jede Hilfe würde sehr geschätzt werden.

from tkinter import * 
from tkinter import ttk 
from tkinter import font 
from tkinter.filedialog import askopenfile 


class Manager: 

def __init__(self, root): 
    #The frame for the GUI itself 
    mainframe = ttk.Frame(root, relief=SUNKEN, padding="3 10 12 12") 
    mainframe.grid(column=0, row=0, columnspan=10, rowspan=10, sticky="NW") 

    button_load= ttk.Button(mainframe, text="Load",command=self.OpenFile) 
    button_load.grid(row=35, column=17, sticky = "NE", padx=5, pady=10) 
    global text_identity 
    text_identity = Text(mainframe, width = 15, height = 2) 
    text_identity.grid(column=8, row=5, sticky=(N,W)) 

def OpenFile(self): 
    listing=[] 
    name = askopenfile(mode='r',initialdir="D:/Documents", 
        filetypes =(("Text File", "*.txt"),("All Files","*.*")), 
        title = "Choose a file.") 

    with name as rd: 
    global items 

    items=rd.readlines() 
    one=[x.strip('\n') for x in items] 
return one 

class Items: 
    identity='' 
    num='' 
    name = '' 
    location = '' 
    other = '' 

def __init__(self,identity,num,name,location,other): 
self.identity = identity 
self.num = num 
self.name = name 
self.location = location 
self.other = other 

def main(): 
    root = Tk() 
    Manager(root) 
    root.title("Data Management") 
    root.mainloop() 

if __name__ == main(): 
    main() 
+0

Nachdem Sie die Datei gelesen und analysiert haben, rufen Sie einfach die Klasse 'Item' mit den neu empfangenen Informationen auf. – MooingRawr

+0

müssen Sie angeben, dass jede Zeile vom Typ Item ist – WhatsThePoint

Antwort

0

Zunächst einmal sollten Sie eine Datei item_descriptions.csv und füllen Sie es mit dem folgenden Text genannt erstellen:

item_id,quantity,item,location,color 
23871243,20,Remote,California,White 
94938443,10,Socks,Canada,Black 

Die erste Zeile jeder CSV Datei haben müssen eine Reihe von Bezeichnern, die in Python verwendet werden können. Warum? Da das folgende Programm auf Feldnamen setzt automatisch ein benanntes Tupel erzeugen:

#! /usr/bin/env python3 
import collections 
import csv 
import pathlib 
import tkinter.filedialog 
import tkinter.messagebox 
import tkinter.scrolledtext 
import tkinter.ttk 


# Make the constants easy to refer to in the rest of the program. 
from tkinter.constants import * 


class Manager(tkinter.ttk.Frame): 

    """Manager(master=None, **kw) -> Manager instance""" 

    @classmethod 
    def main(cls): 
     """Create a root window for the Manager and display the widget.""" 
     tkinter.NoDefaultRoot() 
     root = tkinter.Tk() 
     root.title('Manager') 
     root.minsize(680, 420) 
     frame = cls(root) 
     frame.grid(sticky=NSEW) 
     root.grid_columnconfigure(0, weight=1) 
     root.grid_rowconfigure(0, weight=1) 
     root.mainloop() 

    def __init__(self, master=None, **kw): 
     """Initialize the Manager instance and its attributes.""" 
     super().__init__(master, **kw) 
     self.initial_dir = pathlib.Path.home() 
     self.scrolled_text = tkinter.scrolledtext.ScrolledText(self) 
     self.load_button = tkinter.ttk.Button(self) 
     self.size_grip = tkinter.ttk.Sizegrip(self) 
     self.setup_widgets() 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_rowconfigure(0, weight=1) 

    def setup_widgets(self): 
     """ Change options on the widgets so they work properly.""" 
     self.scrolled_text.configure(state=DISABLED, wrap=WORD) 
     self.load_button.configure(text='Load', command=self.find_csv_file) 
     # Place widgets where they belong in the frame. 
     self.scrolled_text.grid(row=0, column=0, columnspan=2, sticky=NSEW) 
     self.load_button.grid(row=1, column=0, sticky=EW) 
     self.size_grip.grid(row=1, column=1, sticky=SE) 

    def find_csv_file(self): 
     """Begin the process of loading a CSV file for display.""" 
     source = tkinter.filedialog.askopenfilename(
      parent=self, 
      title='Where is the file you want to open?', 
      multiple=False, 
      defaultextension='.csv', 
      filetypes=(('Spreadsheet', '.csv'), ('All Files', '*')), 
      initialdir=self.initial_dir 
     ) 
     if source: 
      self.initial_dir = pathlib.Path(source).parent 
      self.show_records(self.load_records(source)) 

    def load_records(self, source): 
     """Open the requested file and try to yield out its records.""" 
     with open(source, newline='') as file: 
      reader = csv.DictReader(file) 
      try: 
       Record = collections.namedtuple('Record', reader.fieldnames) 
      except Exception as error: 
       tkinter.messagebox.showerror(
        'Exception', 
        f'{type(error).__name__}: {error}', 
        master=self 
       ) 
      else: 
       self.scrolled_text.configure(state=NORMAL) 
       self.scrolled_text.delete(0.0, END) 
       yield from (Record(**row) for row in reader) 

    def show_records(self, iterable): 
     """Display each record when able without locking up the GUI.""" 
     try: 
      record = next(iterable) 
     except StopIteration: 
      self.scrolled_text.configure(state=DISABLED) 
     else: 
      self.scrolled_text.insert(END, f'{record}\n') 
      self.after_idle(self.show_records, iterable) 


if __name__ == '__main__': 
    Manager.main() 

Wenn Sie weitere Hilfe mit Ihrem Programm benötigen, müssen Sie eine andere Frage für mehr Antworten auf Fragen.

Verwandte Themen