【问题标题】:Tkinter Label Text Overlaps in Specific LoopTkinter 标签文本在特定循环中重叠
【发布时间】:2018-05-17 20:50:05
【问题描述】:

我正在使用 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()

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

【问题讨论】:

  • 每次您的事件处理程序 (fetch) 运行时,您都会创建一个新标签 result_out。您总是将 result_out 放入网格位置 0、3。这会将所有这些标签堆叠在一起。那将是一团糟,几乎可以肯定不是您想要的。由于我无法运行您的代码并且您没有解释您想要它做什么,所以我无法告诉您如何解决这个问题。

标签: python python-3.x user-interface tkinter


【解决方案1】:

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

您为每个问题创建一个新的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()

【讨论】:

  • 感谢您的回复。在循环外使用 StringVar() 和 result_out 标签解决了我的问题。我会标记为已解决。
猜你喜欢
  • 2018-11-05
  • 2017-02-25
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多