python-3.x 在tkinter中通过前缀过滤文本

s5a0g9ez  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(125)

大家好,Stack Overflow的开发者们,
我希望这条消息能找到你。我想与你分享一个代码片段,它利用Python 3中的tkinter库创建一个窗口,其中包含一个文本小部件,一个“运行”按钮,以及“编辑”菜单下的“按前缀过滤”菜单选项。此代码的目的是允许用户在文本小部件中输入文本,并使用“按前缀过滤”选项指定前缀,然后单击“运行”按钮,过滤掉文本中不以指定前缀开头的单词。
然而,代码目前没有按预期运行。尽管遵循了tkinter的正确语法和结构,但前缀过滤操作没有提供所需的输出。单击“运行”按钮或从菜单中选择“前缀过滤”选项后,文本小部件中的文本将被完全删除,而不是根据指定的前缀进行过滤。
我已经彻底地检查了代码,经过进一步的调查,发现这个问题可能与filter_by_prefix有关()功能,由“运行”按钮和“按前缀过滤”菜单选项触发,该功能旨在从一个条目小部件中提取输入的前缀,从文本小部件中检索文本,执行过滤操作并使用过滤后的文本更新文本小部件。但是,该函数似乎没有按预期执行,导致删除文本小部件中的所有文本,而不是过滤它。下面是代码:

import tkinter as tk
from tkinter import messagebox

# Function to run the filter by prefix operation
def filter_by_prefix():
    prefix = prefix_entry.get()
    text = text_widget.get(1.0, tk.END)
    lines = text.split('\n')
    filtered_lines = []
    for line in lines:
        words = line.split()
        filtered_words = [word for word in words if word.startswith(prefix)]
        filtered_line = ' '.join(filtered_words)
        filtered_lines.append(filtered_line)
    filtered_text = '\n'.join(filtered_lines)
    text_widget.delete(1.0, tk.END)
    text_widget.insert(tk.END, filtered_text)

# Function to handle "Filter by Prefix" menu option
def on_filter_by_prefix():
    prefix_window = tk.Toplevel(root)
    prefix_window.title("Filter by Prefix")
    prefix_window.geometry("300x100")
    prefix_label = tk.Label(prefix_window, text="Enter prefix:")
    prefix_label.pack()
    global prefix_entry
    prefix_entry = tk.Entry(prefix_window)
    prefix_entry.pack()
    prefix_button = tk.Button(prefix_window, text="Filter", command=filter_by_prefix)
    prefix_button.pack()

# Create main window
root = tk.Tk()
root.title("Text Filter")
root.geometry("400x400")

# Create text widget
text_widget = tk.Text(root)
text_widget.pack(expand=True, fill=tk.BOTH)

# Create "Run" button
run_button = tk.Button(root, text="Run", command=filter_by_prefix)
run_button.pack()

# Create menu bar
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)

# Create "Edit" menu
edit_menu = tk.Menu(menu_bar, tearoff=False)
menu_bar.add_cascade(label="Edit", menu=edit_menu)

# Add "Filter by Prefix" menu option
edit_menu.add_command(label="Filter by Prefix", command=on_filter_by_prefix)

# Run tkinter event loop
root.mainloop()

如果您能帮助我识别并解决此代码中的问题,我将不胜感激。您的专业知识和见解将非常宝贵,有助于我确定问题的根本原因,并找到解决方案,使代码按预期运行,即根据指定的前缀过滤文本,而不删除整个文本。
在此先感谢您的协助,并期待您的宝贵贡献。

nbysray5

nbysray51#

我已经意识到这个错误是由于我的一个简单的疏忽。
我使用的文本小部件没有启用自动换行和滚动条,导致长行文本隐藏在可见窗口区域之外。我现在已经通过向文本小部件添加必要的功能解决了这个问题。

相关问题