2017-06-05 277 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:嘿,我剛剛更新了我的答案。給它一看,讓我知道它是否有幫助。 –