python - 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()
如果我正在搜索在数据库中找到的单词,则代码会按预期运行。如果我搜索一个不在数据库中的单词,我下一次搜索存在的单词将与之前的输出重叠。反之亦然,如果我只搜索数据库中未找到的项目,标签会按预期刷新。当这些循环“交替”时,我会遇到问题。世界上到底发生了什么?
解决方案
你想每次调用时都从文件中加载 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()