如何在Tkinter中按Tab键后捕获文本小部件的值?

时间:2015-09-06 17:02:38

标签: python python-3.x tkinter

我有一个示例脚本(如下所示),我只是在每次按下“Tab”键时尝试捕获tkinter文本小部件的值。两个函数用于帮助解决这个问题。在Tab更改值之前,应该运行并显示文本小部件的值。应该运行另一个函数,并在Tab更改值后显示文本小部件的值。

问题:

问题是只运行一个函数 - 在选项卡更改其值之前显示文本小部件的值的函数。

我的系统:

Ubuntu 12.04

Python 3.4.3

Tk 8.5

守则:

import tkinter as tk

def display_before_value(value):
        """Display the value of the text widget before the class bindings run"""
        print("The (before) value is:", value)
        return


def display_after_value(value):
        """Display the value of the text widget after the class bindings run"""
        print("The (after) value is:", value)
        return


# Add the widgets
root = tk.Tk()
text = tk.Text(root)

# Add "post class" bindings to the bindtags
new_bindings = list(text.bindtags())
new_bindings.insert(2, "post-class")
new_bindings = tuple(new_bindings)
text.bindtags(new_bindings)
# Show that the bindtags were updated
text.bindtags()
# Outputs ('.140193481878160', 'Text', 'post-class', '.', 'all')

# Add the bindings
text.bind("<Tab>", lambda e: display_before_value(text.get("1.0", tk.END)))
text.bind_class("post-class", "<Tab>", lambda e: display_after_value(text.get("1.0", tk.END)))

# Show the text widget
text.grid()

# Run
root.mainloop()

在命令行/终端中运行上述代码只会显示 display_before_value()功能的输出。所以我假设 post-class 绑定由于某种原因不起作用。但是,如果我将绑定从<Tab>更改为<Key>,则当我键入任何键时, display_before_value() display_after_value()都会正确运行文本小部件(当然除了Tab键)。

提前致谢

1 个答案:

答案 0 :(得分:1)

如果要在选项卡空间之前显示文本,并在之后使用选项卡空间显示文本,请尝试使用root.after()。以下是您的代码示例:

import tkinter as tk

def display_before_value(event):
        """Display the value of the text widget before the class bindings run"""
        value = text.get("1.0", tk.END)
        print("The (before) value is:", value)
        root.after(1, display_after_value)
        return

def display_after_value():
        """Display the value of the text widget after the class bindings run"""
        value = text.get("1.0", tk.END)
        print("The (after) value is:", value)
        return

# Add the widgets
root = tk.Tk()
text = tk.Text(root)

# Add the bindings
text.bind("<Tab>", display_before_value)

# Show the text widget
text.grid()

# Run
root.mainloop()

当按下Tab键时,将执行display_before_value函数,该函数将打印文本小部件的值,而不包含选项卡空间。在1毫秒之后,它进入display_after_value函数,该函数显示文本小部件的值,包括选项卡空间。