首页 > 解决方案 > Tkinter 标签文本在特定循环中重叠

问题描述

我正在使用 Python 和 Tkinter 开发一个“简单”的搜索界面。这是我所拥有的一些示例代码:

#!/usr/bin/env/python

from tkinter import *
import os
import csv
import sys

def fetch()

    word = e1.get()
    definitions = []

    with open(file) as db:
        dbreader = csv.reader(db, delimiter="\t")
        for row in dbreader:
            if word in row[1]:
                definitions.append(row[4])

    if not definitions:
        output_string = word + " not in database"

    else:
        output_string = "Found " + word

    result_out = Label(master)
    result_out.config(text=output_string)
    result_out = result_out.grid(row=3, column = 0)

master = Tk()

word_entry = Label(master, text = "word")
word_entry.grid(row=0, column = 0)

e1 = Entry(master)

e1.grid(row=0, column=1)

Button(master, text='Search', command=fetch).grid(row=2, column=1, sticky=(N, S, W, E), pady=4)

mainloop()

如果我正在搜索在数据库中找到的单词,则代码会按预期运行。如果我搜索一个不在数据库中的单词,我下一次搜索存在的单词将与之前的输出重叠。反之亦然,如果我只搜索数据库中未找到的项目,标签会按预期刷新。当这些循环“交替”时,我会遇到问题。世界上到底发生了什么?

标签: pythonpython-3.xuser-interfacetkinter

解决方案


你想每次调用时都从文件中加载 dafinitionsfetch()吗?我想不是。我已将定义放在函数之外。此外,我没有从文件中加载定义,而是定义了一组随机奶酪用于测试目的。

您为每个问题创建一个新result_out标签,@Paul Cornelius 指出了这一点。最好为标签分配一个文本变量并使用它来更改文本。所以,也要在函数之外创建这个标签。

from tkinter import *

definitions = ['Stilton','Cheshire','Tilsit','Brie'] # Instead of file read

def fetch():
    word = e1.get()
    if not (word in definitions):
        output_string = word + " not in database"
    else:
        output_string = "Found " + word
    query.set(output_string) # Set result_out to output_string

master = Tk()

word_entry = Label(master, text = "word")
word_entry.grid(row=0, column = 0)

e1 = Entry(master)
e1.grid(row=0, column=1)

query = StringVar() # Use StringVar to interact with result_out
result_out = Label(master, textvariable=query)
result_out = result_out.grid(row=3, column = 0)

Button(master, text='Search', command=fetch).grid(row=2, column=1,
                                                  sticky=(N, S, W, E), pady=4)

mainloop()

推荐阅读