【问题标题】:Dynamic tkinter entry box动态 tkinter 输入框
【发布时间】:2016-01-25 17:24:36
【问题描述】:

我想知道这是否可能......?

想象一个带有用于输入 PC 名称的输入框小部件的 tkinter 应用程序。一旦用户开始在框中输入,该应用程序将根据您输入的内容显示可能的名称,因此您输入的越多,您看到的选项就越少,直到您只剩下一个或足够小的选项来单击从可用选项中选择它。

如果这在 tkinter 中是可能的,如果有人能指出一个简单示例的方向,那就太好了!

我不能发布任何示例代码,因为这是一个一般问题而不是具体问题。

【问题讨论】:

  • 是的,这是可能的。你卡在哪一部分了?
  • 谢谢@jonrsharpe!在这方面我还是个菜鸟,我当然可以做一个基本的文本输入框,但是让它变得动态 - 不知道从哪里开始......
  • 查看绑定。您需要绑定到 ,然后运行显示选项所需的任何代码。
  • @anderswb:绑定到<Key> 不是唯一的解决方案,它只是a 解决方案。
  • @BryanOakley:因此我没有把它作为答案。我是 tkinter 的新手,您可能已经从我的其他一些答案中收集到了。我喜欢你的跟踪解决方案!

标签: python windows python-2.7 tkinter


【解决方案1】:

您可以将StringVar 的实例与入口小部件相关联,然后对该实例进行跟踪以在值更改时调用回调。然后你可以在回调中做任何你想做的事情——更新列表、弹出窗口等。

这是一个简单地根据您输入的内容过滤列表的示例。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.choices = ("one", "two", "three", "four", "five", 
                        "six", "seven", "eight", "nine", "ten",
                        "eleven", "twelve", "thirteen", "fourteen",
                        "fifteen", "sixteen", "seventeen", "eighteen",
                        "nineteen", "twenty")

        self.entryVar = tk.StringVar()
        self.entry = tk.Entry(self, textvariable=self.entryVar)
        self.listbox = tk.Listbox(self)
        self.listbox.insert("end", *self.choices)

        self.entry.pack(side="top", fill="x")
        self.listbox.pack(side="top", fill="both", expand=True)

        self.entryVar.trace("w", self.show_choices)
        self.listbox.bind("<<ListboxSelect>>", self.on_listbox_select)

    def on_listbox_select(self, event):
        """Set the value based on the item that was clicked"""
        index = self.listbox.curselection()[0]
        data = self.listbox.get(index)
        self.entryVar.set(data)

    def show_choices(self, name1, name2, op):
        """Filter choices based on what was typed in the entry"""
        pattern = self.entryVar.get()
        choices = [x for x in self.choices if x.startswith(pattern)]
        self.listbox.delete(0, "end")
        self.listbox.insert("end", *choices)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

【讨论】:

  • 看起来很棒,@Bryan Oakley!一个问题 - 如果隐藏所有列表框,然后在您开始在输入框中输入后才开始显示前 5 个或 10 个可能的选项,它是否仍然有效? (最好显示与输入框下方的任何其他 tkinter 元素重叠...)
  • @user3514446:是的。但是,要获得您正在寻找的确切效果需要一些工作。 tkinter 中没有什么可以阻止您这样做,尽管切换到使用 ttk.Combobox 小部件而不是条目和列表框可能更有意义。
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-24
相关资源
最近更新 更多