2017-06-05 5 views
1

Okay, also habe ich etwa 10 Tage gesucht und ich habe nachgegeben, also wende ich mich an die Community um Hilfe. Ich benutze Python 3.6 und Tkinter als Benutzeroberfläche. Das grundlegende was ich versuche zu erreichen ist, dass ich eine Datei habe, die ich öffne und suche nach einem Wort innerhalb der Datei und füge alle Zeilen ein, auf die das Wort fällt. Mein Problem ist, dass es nur die erste Zeile findet, die es findet, und ich brauche es, um alle gefundenen Zeilen einzufügen. Sorry für feuchte Codierung Ich werde es austrocknen, sobald ich Funktionalität später habePython 3 tkinter füge Dateiinhalte in ein Textfeld ein

hier ist ein Beispiel für meinen Code (es ist nicht die ganze Sache, aber es sollte Ihnen mehr als genug Informationen über das, was ich erreichen möchte):

import tkinter as tk 
from tkinter import ttk 
# i added all my imports that this class use's in case you guys think they could pose a problem but they shouldn't be a issue 

class EXAMPLEapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.iconbitmap(self, default = "dlm64.ico") 
     tk.Tk.wm_title(self, "Example.") 
     self.FILE_MENU_BAR() 
     self.minsize(width = 360, height = 200) 
     container = tk.Frame(self) 
     container.grid(row=0,column=0, sticky="nsew") 
     container.grid_rowconfigure(0, weight = 1) 
     container.grid_columnconfigure(0, weight = 1) 
     self.frames = {} 
     for FRAME in (SearchPage): 
      frame = FRAME(container, self) 
      self.frames[FRAME] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 
     self.show_frame(SearchPage) 
    def FILE_MENU_BAR(self): 
     #File 
     self.menubar = tk.Menu() 
     self.configure(menu = self.menubar) 
     File_Menu = tk.Menu(self.menubar, tearoff = False) 
     self.menubar.add_cascade(label = "File", menu = File_Menu) 
     File_Menu.add_command(label = "EXIT" , command = self.File_EXIT) 
     # Edit Menu 
     Edit_Menu = tk.Menu(self.menubar, tearoff = False) 
     self.menubar.add_cascade(label = "Edit", menu = Edit_Menu) 
     Edit_Menu.add_command(label = "cut", underline = 2, command = self.Edit_Cut) 
     Edit_Menu.add_command(label = "copy", underline = 0, command = self.Edit_Copy) 
    def File_EXIT(self): 
     sys.exit(0) 
    def Edit_Cut(self): 
     print("CUT") 
    def Edit_Copy(self): 
     print("COPY") 
    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 



class SearchPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text = "Search Inventory", font = ("Helvetica", 20, 'bold', 'underline')) 
     label.grid(row = 0, column = 1, sticky = "nsew", pady = (0,0), padx = (0,0)) 
     button0 = ttk.Button(self, text = "Inventory Search") 
     button0.grid(row = 0, column = 0, sticky = "nsew", pady = 0, padx = (0,10))  
     button1 = ttk.Button(self, text = "New Inventory", command = lambda: controller.show_frame(CreatePage)) 
     button1.grid(row = 1, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 
     button2 = ttk.Button(self, text = "Edit Invetory", command = lambda: controller.show_frame(EditPage)) 
     button2.grid(row = 2, column = 0, sticky = "nsew", pady = 0, padx = (0,10))   
     button3 = ttk.Button(self, text = "Ship", command = lambda: controller.show_frame(ShipPage)) 
     button3.grid(row = 3, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 
     button4 = ttk.Button(self, text = "Graph", command = lambda: controller.show_frame(PlotPage)) 
     button4.grid(row = 4, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 

     DATE_VAR = tk.StringVar() 
     def DATE_SEARCH(): 
      USER_TEXT = DATE_VAR.get() 
      with open('SAMPLE.txt', 'r') as searchfile: 
       for line in searchfile: 
        if USER_TEXT == '': 
         LABEL = tk.Text(self, width = 30, height = 2, wrap = tk.WORD, foreground = 'red') 
         LABEL.grid(row = 6, column = 3, sticky = "nsew", pady = (0,0), padx = (20,0)) 
         LABEL.insert(1.0, "PLEASE ENTER A VALUE") 
         LABEL.configure(state = 'disabled') 
         break 
        elif USER_TEXT in line: 
         LABEL = tk.Text(self, width = 100, height = 4, wrap = tk.WORD) 
         LABEL.grid(row = 6, column = 3, sticky = "e", pady = (0,0), padx = (20,0)) 
         LABEL.insert(1.0, line) 
         LABEL.configure(state = 'disabled') 
         ScrollBar = tk.Scrollbar(self) 
         ScrollBar.config(command = LABEL.yview) 
         LABEL.config(yscrollcommand = ScrollBar.set) 
         ScrollBar.grid(row = 6, column = 4, sticky = "e") 
         break    
        else: 
         LABEL = tk.Text(self, width = 30, height = 2, wrap = tk.WORD, foreground = 'red') 
         LABEL.grid(row = 6, column = 3, sticky = "nsew", pady = (0,0), padx = (20,0)) 
         LABEL.insert(1.0, "INVENTORY DOES NOT EXIST") 
         LABEL.configure(state = 'disabled') 
     DATE_Search_label = tk.Label(self, text = "Search by DATE", font = ("Helvetica", 9)) 
     DATE_Search_label.grid(row = 5, column = 1, sticky = "nsew") 
     DATE_Search_Entry = tk.Entry(self, textvariable = DATE_VAR) 
     DATE_Search_Entry.grid(row = 6, column = 1, sticky = "nsew", pady = 0, padx = 2) 
     DATE_SEARCH_BUTTON = ttk.Button(self, text = "Search", command = DATE_SEARCH) 
     DATE_SEARCH_BUTTON.grid(row = 6, column = 2, sticky = "nsew") 


app = EXAMPLEapp() 
app.mainloop() 
+0

Auch ich habe versucht, die Dateierweiterung .csv und das gleiche Ergebnis. – kytexaranort

+0

Gibt es einen Grund für die 'Break'-Anweisung? Ich denke, das könnte das Problem sein. –

+0

10 Ich dachte das Gleiche, aber wenn ich das dort nicht platziere, um die for-Schleife zu beenden, läuft die if-and-else-Anweisung beide, wenn ich nur eine will. Das ist der Grund für die Pause.Auch wenn ich die Pause entferne, nimmt es nur die letzte Zeile im Textdokument und wenn ich versuche, die Suche nach den anderen Zeilen zu erzwingen, bekomme ich nur die Else-Anweisung. Das gleiche passiert, wenn ich das tkinter-Modul entferne und den Code als nur Python im Interpreter-Fenster ausführe. Irgendwelche Vorschläge, die du hast, werde ich auch versuchen. – kytexaranort

Antwort

0

EDIT:

ich einige Änderungen an Ihrem Code vorgenommen haben.

Es gab viel zu viele Embleme mit der Art, wie Sie es eingerichtet hatten.

Da ich mir nicht 100% ig sicher bin, was Sie erreichen möchten, habe ich Fortschritte mit Ihrem Code gemacht.

Unten ist die bearbeitete Version Ihres Codes. Ich habe auch eine Textdatei an meinem Ende erstellt, um mit zu testen, und es hat funktioniert, also lassen Sie mich wissen, wenn dies nahe kommt, was Sie versuchen zu tun.

Ein paar Anmerkungen:

1. zog ich alles in eine Klasse. Die Art und Weise, wie Sie es eingerichtet hatten, ging einfach nicht ohne größere Veränderungen vonstatten.

2. Ich musste self. zu vielen Ihrer Variablen hinzufügen, weil sie Variablen sind, mit denen wir in der Klasse interagieren müssen.

3. Ich änderte sie so, wie Sie die Daten aus dem Eingabefeld erhalten. Die Art und Weise, wie Sie es gemacht haben, funktionierte einfach nicht, also vereinfachte ich es, indem ich die .get() Funktion der Eingangsvariablen hinzufügte.

4. aber wahrscheinlich sollte das erste Ding sein, das ich erwähne. Die Art, wie Sie Ihr Hauptfenster hatten, war seltsam. Ich habe geändert, wie root erstellt wurde und wie wir es in die Klasse übertragen haben. Das macht für mich mehr Sinn.

Dies ist viel besser, IMO zu verwenden.

Lassen Sie mich wissen, an welchen Teilen Sie noch eine Erklärung benötigen, und ich werde bei Bedarf Aktualisierungen vornehmen.

Update:

Änderung der während Open-Anweisung ein bisschen. Sie müssen das Textfeld nicht neu erstellen und es nie für die Schleife neu konfigurieren. Dies ist nicht gut und verhindert, dass Sie mehrere Elemente sehen. Ich glaube auch nicht, dass Sie ein Multiline-Label haben können, das ich nie probiert habe. Lassen Sie uns das in ein Textfeld ändern, das sollte tun, was wir brauchen.

import tkinter as tk 
from tkinter import ttk 


class EXAMPLEapp(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.root = parent 
     self.root.wm_title("TM Duch\'e Nut CO.") 
     self.FILE_MENU_BAR() 
     self.root.minsize(width = 360, height = 200) 
     self.container = tk.Frame(self.root) 
     self.container.grid(row=0,column=0, sticky="nsew") 
     self.container.grid_rowconfigure(0, weight = 1) 
     self.container.grid_rowconfigure(6, weight = 0) 
     self.container.grid_columnconfigure(0, weight = 1) 
     self.container.grid_columnconfigure(3, weight = 0) 

     self.label = tk.Label(self.root, text = "Search Inventory", font = ("Helvetica", 20, 'bold', 'underline')) 
     self.label.grid(row = 0, column = 1, sticky = "nsew", pady = (0,0), padx = (0,0)) 
     self.button0 = ttk.Button(self.root, text = "Inventory Search") 
     self.button0.grid(row = 0, column = 0, sticky = "nsew", pady = 0, padx = (0,10))  
     self.button1 = ttk.Button(self.root, text = "New Inventory", command = lambda: controller.show_frame(CreatePage)) 
     self.button1.grid(row = 1, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 
     self.button2 = ttk.Button(self.root, text = "Edit Invetory", command = lambda: controller.show_frame(EditPage)) 
     self.button2.grid(row = 2, column = 0, sticky = "nsew", pady = 0, padx = (0,10))   
     self.button3 = ttk.Button(self.root, text = "Ship", command = lambda: controller.show_frame(ShipPage)) 
     self.button3.grid(row = 3, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 
     self.button4 = ttk.Button(self.root, text = "Graph", command = lambda: controller.show_frame(PlotPage)) 
     self.button4.grid(row = 4, column = 0, sticky = "nsew", pady = 0, padx = (0,10)) 
     self.DATE_Search_label = tk.Label(self.root, text = "Search by DATE", font = ("Helvetica", 9)) 
     self.DATE_Search_label.grid(row = 5, column = 1, sticky = "nsew") 
     self.DATE_Search_Entry = tk.Entry(self.root) 
     self.DATE_Search_Entry.grid(row = 6, column = 1, sticky = "nsew", pady = 0, padx = 2) 
     self.DATE_SEARCH_BUTTON = ttk.Button(self.root, text = "Search", command = lambda: self.DATE_SEARCH()) 
     self.DATE_SEARCH_BUTTON.grid(row = 6, column = 2, sticky = "nsew") 

    def DATE_SEARCH(self): 
     with open('SAMPLE.txt', 'r') as f: 
      search_f = f.readlines() 
      self.text = tk.Text(self.root, width = 30, height = 2) 
      self.text.grid(row = 6, column = 3, sticky = "ew", pady = (0,0), padx = (20,0)) 
      self.ScrollBar = tk.Scrollbar(self.root) 
      self.ScrollBar.config(command = self.text.yview) 
      self.text.config(yscrollcommand = self.ScrollBar.set) 
      self.ScrollBar.grid(row = 6, column = 4, sticky = "ns") 
      self.text.delete(1.0, "end-1c") 

      USER_TEXT = self.DATE_Search_Entry.get() 
      if USER_TEXT == '': 
       self.text.config(foreground = 'red') 
       self.text.insert(tk.END, "PLEASE ENTER A VALUE") 
      else: 
       match_in_file = False 
       for line in search_f: 
        if USER_TEXT in line: 
         self.text.config(foreground = 'black') 
         self.text.insert(tk.END, "{}".format(line)) 
         match_in_file = True 
       if match_in_file == False: 
        self.text.config(foreground = 'red') 
        self.text.insert(tk.END, "INVENTORY DOES NOT EXIST") 


    def FILE_MENU_BAR(self): 
     #File 
     self.menu = tk.Menu(self.root) 
     self.root.config(menu = self.menu) 
     self.fileMenu = tk.Menu(self.menu, tearoff = 0) 
     self.menu.add_cascade(label = "File", menu = self.fileMenu) 
     self.fileMenu.add_separator() 
     self.fileMenu.add_command(label = "Exit", command = lambda: self.root.destroy()) 
     # Edit Menu 
     self.Edit_Menu = tk.Menu(self.menu) 
     self.menu.add_cascade(label = "Edit", menu = self.Edit_Menu) 
     self.Edit_Menu.add_command(label = "cut", underline = 2, command = self.Edit_Cut) 
     self.Edit_Menu.add_command(label = "copy", underline = 0, command = self.Edit_Copy) 

    def File_EXIT(self): 
     sys.exit(0) 

    def Edit_Cut(self): 
     print("CUT") 

    def Edit_Copy(self): 
     print("COPY") 

root = tk.Tk() 
app = EXAMPLEapp(root) 
app.mainloop() 
+0

Das ist nur ein Teil Sie stapeln auch eine Reihe von Text-Widgets (eine pro Spiel) in der gleichen Zeile und Spalte –

+0

oh ich sehe das in der for-Schleife.Ich werde meine Antwort in ein bisschen überprüfen müssen, ich bin nicht in Anspruch nehmen in der Lage, meine Antwort sofort zu aktualisieren. –

+0

@Kyte: Hey ich habe gerade meine Antwort aktualisiert. Schau es dir an und lass es mich wissen, wenn es hilft. –

Verwandte Themen