2017-06-05 278 views
1

好吧,我已经完成了大约10天的搜索,并且我陷入困境,因此我正在向社区寻求帮助。 我使用python 3.6和tkinter作为用户界面。 我想要完成的基本功能是我有一个文件,我打开并搜索文件中的单词并插入所有单词落在的行。 我的问题是,它只插入找到的第一行,我需要它插入找到的所有行。对不起,湿编码我会干起来,一旦我有功能后Python 3 tkinter将文件内容插入文本框

这里是我的代码示例(这不是完整的东西,但它应该给你足够多的有关我想要完成的信息):

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

此外我试过文件扩展名.csv和相同的结果。 – kytexaranort

+0

是否有“break”语句的原因?我认为这可能是问题所在。 –

+0

我以为同样的事情,但如果我不放在那里结束for循环if和else语句都运行时,我只想要一个。所以这就是休息的原因。此外,如果我删除中断它将只抓住文本文档中的最后一行,如果我试图强制搜索其他行,我只得到其他语句。当我删除tkinter模块并在解释器窗口中仅以python的身份运行代码时,会发生同样的事情。你有任何建议我也会尝试。 – kytexaranort

回答

0

编辑:

我已经做了一些改动你的代码。

你设置的方式有太多的标志。

由于我不是百分之一百确定你正在努力完成的事情,我已经在你的代码中取得了进展。

下面是你的代码的编辑版本。 我还在我的结尾创建了一个文本文件进行测试,并且它接缝工作,所以让我知道这是否越来越接近你正在尝试做的事情。

一些注意事项:

1st我把所有东西都搬进了一个班。没有一些重大改变,你建立的方式就无法工作。

第二我需要将self.添加到许多变量中,因为它们是我们需要在类中进行交互的变量。

第3我改变了他们的方式,你从输入框中获取数据。你这样做的方式只是不工作,所以我通过将.get()函数添加到入口变量来简化它。

4th但可能应该是我提到的第一件事。你开始主要的Tk()窗口的方式很奇怪。我改变了根的创建方式以及我们如何将它传递给课堂。这接缝对我更有意义。

这对使用IMO来说要好得多。

让我知道你仍然需要解释什么部分,我会根据需要更新我的答案。

更新:

更改while while打开语句有点。你不需要重新创建文本框,并重新配置它的循环,这是不好的,并会阻止你看到多个项目。我也不相信你可以有一个多线标签,我认为我从来没有尝试过。让我们改变这个文本框,这应该做我们需要的。

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

这只是一部分的问题,他们也在同一行和列中堆叠了一堆文本小部件(每个匹配一个) –

+0

哦,我在for循环中看到了,我将不得不回顾一下我的答案,我没有用能够立即更新我的答案。 –

+0

@Kyte:嘿,我刚刚更新了我的答案。给它一看,让我知道它是否有帮助。 –