Python 3 tkinter将文件内容插入到文本框中

时间:2017-06-05 21:03:02

标签: python-3.x file tkinter textbox

好的,所以我做了大约10天的搜索,我陷入了困境,所以我转向社区寻求帮助。 我使用python 3.6和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()

1 个答案:

答案 0 :(得分:0)

编辑:

我对您的代码进行了一些更改。

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

由于我不能100%确定您要完成的任务,我已经在您的代码方面取得了进展。

以下是您的代码的编辑版本。 我还在我的最后创建了一个文本文件来测试,并且接缝已经工作了,所以请告诉我这是否接近你试图做的事情。

一些注意事项:

第一天我把所有东西都搬到了一个班级。如果没有一些重大改变,你设置它的方式就不会起作用。

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

第3次我改变了他们从输入框中获取数据的方式。你这样做的方式就是不行,所以我通过在条目变量中添加.get()函数来简化它。

第四,但可能应该是我提到的第一件事。主要Tk()窗口启动的方式很奇怪。我改变了root的创建方式以及如何将它传递到类中。这种接缝对我来说更有意义。

使用IMO要好得多。

让我知道你还需要解释哪些部分,我会根据需要更新我的答案。

更新

稍微更改while open语句。您不需要重新创建文本框并重新配置它以进行循环,这不是很好,并且会阻止您看到多个项目。此外,我不相信你可以有一个我从未尝试过的多线标签。让我们把它改成一个文本框,这应该做我们需要的。

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()