【问题标题】:Python 3 tkinter insert file contents into a text boxPython 3 tkinter 将文件内容插入文本框
【发布时间】:2017-11-06 17:47:33
【问题描述】:

好的,所以我已经进行了大约 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()

【问题讨论】:

  • 我也尝试了文件扩展名 .csv 和相同的结果。
  • break 声明是否有原因?我认为这可能是问题所在。
  • 我也有同样的想法,但如果我不把它放在那里来结束 for 循环,那么当我只想要一个时,if 和 else 语句都会运行。所以这就是中断的原因。此外,如果我删除中断,它只会抓取文本文档中的最后一行,如果我尝试强制搜索其他行,我只会得到 else 语句。当我删除 tkinter 模块并在解释器窗口中仅将代码作为 python 运行时,也会发生同样的事情。你有什么建议我也会试试的。
  • Bryan - 我查看了你所说的关于重叠小部件的内容,我将它们更改为单独的列和行,它修复了我所说的强制搜索其他行,但它仍然插入 else 语句。无论如何,我的主要问题仍然是它不会打印用户输入到输入框中的所有行。不过还是谢谢 :D
  • 此时我什至会重新格式化脚本,只需要回答我的问题:(

标签: python-3.x file tkinter textbox


【解决方案1】:

编辑:

我对您的代码做了几处更改。

你设置的标志太多了。

由于我不能 100% 确定您的目标是如何完成的,因此我在您的代码方面取得了进展。

以下是您的代码的编辑版本。 我还在我的末端创建了一个文本文件进行测试,它似乎已经工作了,所以让我知道这是否接近你正在尝试做的事情。

几点说明:

第一,我把所有东西都搬到了一个班级。如果不进行一些重大更改,您的设置方式将无法正常工作。

第二,我需要将self. 添加到您的许多变量中,因为它们是我们需要在课堂上与之交互的变量。

3rd 我改变了他们从输入框中获取数据的方式。你这样做的方式不起作用,所以我通过将.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()

【讨论】:

  • 这只是问题的一部分。他们还在同一行和同一列中堆叠了一堆文本小部件(每个匹配一个)
  • 哦,我在 for 循环中看到了。我将不得不稍后检查我的答案我现在无法更新我的答案。
  • @Kyte:嘿,我刚刚更新了我的答案。看看,如果有帮助,请告诉我。
  • 这种方式也有效,但我仍然有一个问题 self.LABEL.insert(1.0, line) 它只会插入单词所在的第一行而不是全部.例如,如果我输入 2013 年,我在文本文档中有 6 个条目,但它只抓取它看到的第一个条目。我真的很感谢及时的反馈!您添加的任何内容对我都有很大帮助!
  • @Kyte:我做了一些更改,如果有帮助请告诉我
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 2017-01-10
  • 2012-08-29
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多