geekdoc-python-zh/docs/askpython/stringvar-with-examples.md

5.7 KiB
Raw Permalink Blame History

带示例的 Tkinter string varTkinter 教程

原文:https://www.askpython.com/python-modules/tkinter/stringvar-with-examples

大家好!在本教程中,我们将了解如何在 Tkinter 中使用 StringVar 函数来存储文本变量和编辑小部件中的文本。我们还将看到一个例子,当文本变量发生变化时,编写回调函数进行通知。所以让我们开始吧。

什么是 StringVar()

Tkinter 包含内置的编程类型,其工作方式类似于普通的 python 变量,具有额外的特性,用于更有效地操纵像LabelEntry这样的小部件的值,这使它们不同于 python 数据类型。这些变量还包含 getter 和 setter 方法来访问和更改它们的值。StringVar就是其中的一个例子。

使用StringVar()定义的变量保存一个字符串数据,我们可以在其中设置文本值并检索它。此外,我们可以将这个变量传递给类似条目的小部件的 textvariable 参数。每当StringVar()变量的值改变时,小部件将自动用新值更新。

定义 StringVar()变量

下面是使用 Tkinter StringVar()定义字符串变量的步骤:

  • :是StringVar对象关联的一个小部件。如果未指定任何内容,则默认为根窗口。
  • value :字符串变量的初始值。默认为“”。
  • 名称:已定义变量的名称。默认值为 PY_VARnum(如 PY_VAR1、PY_VAR2 等)。

例如,在下面的代码中,我们使用StringVar()创建一个字符串变量,并将其赋给Label小部件的 textvariable 参数。

import tkinter as tk

master_window = tk.Tk()
master_window.geometry("150x150")
master_window.title("StringVar Example")

string_variable = tk.StringVar(master_window, "Hello Everyone!!")

label = tk.Label(master_window, textvariable=string_variable, height=150)
label.pack()

master_window.mainloop()

Defining StringVar

Defining StringVar

设置 StringVar()变量的值

可以通过两种方式将值分配给使用StringVar()定义的字符串变量:

  • 在构造函数中传递值:定义 Tkinter 变量时,可以在构造函数的value参数中传递字符串变量的值。
string_variable = tk.StringVar(master=master_window, value="Initial value of string variable")

  • 使用set()方法:你可以使用set()方法来改变字符串的值。例如:
string_variable = tk.StringVar(master_window)
string_variable.set("Some Text")

检索 StringVar()变量的值

我们可以对StringVar()变量使用get()方法来检索变量中的文本值。

import tkinter as tk

master_window = tk.Tk()

string_variable = tk.StringVar(master_window)
string_variable.set("Welcome to AskPython!!")

print(string_variable.get())

使用这种方法,当 StringVar 变量被传递给小部件时,我们还可以检索出现在Entry小部件中的数据。例如:

import tkinter as tk

master_window = tk.Tk()
master_window.geometry("300x300")
master_window.title("StringVar get() example")

def print_data():
    print(string_variable.get())

string_variable = tk.StringVar(master_window)

label = tk.Label(master_window, text="Enter Data: ")
label.grid(row=0, column=0)

entry = tk.Entry(master_window, textvariable=string_variable)
entry.grid(row=0, column=1)

button = tk.Button(master_window, text="Print data", command=print_data)
button.grid(row=1, column=0, columnspan=2)

master_window.mainloop()

编写回调来跟踪 StringVar()变量

Tkinter-defined 对象的一个有趣的特性是,每当对象的值被更改、读取或删除时,对象都会得到通知。如果您想在对内部定义的对象进行某些操作时自动更新其他小部件,这个特性会很有帮助。

要在StringVar()对象上定义回调,我们可以在StringVar()对象上使用trace()方法,该方法有两个参数:

  • 模式:对StringVar()对象的操作类型。
    • 'w' (write):当值改变时调用回调
    • 'r' (read):读取值时调用回调
    • 'u'(未设置):删除值时调用回调
  • 回调:当对象上有操作时调用的方法。

让我们考虑一个例子,其中将为在Entry小部件中输入的名字生成一条问候消息。当我们通过Entry小部件改变StringVar()对象中的数据时,将会调用一个方法来同时改变问候消息。

import tkinter as tk

class GreetingApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Greeting Application')
        self.geometry("300x300")

        self.name_var = tk.StringVar()
        self.name_var.trace('w', self.create_greeting_message)

        self.create_widgets()

    def create_widgets(self):
        self.description_label = tk.Label(self, text="Enter your name:")
        self.description_label.grid(column=0, row=0)

        self.entry = tk.Entry(self, textvariable=self.name_var)
        self.entry.grid(column=1, row=0)
        self.entry.focus()

        self.greeting_label = tk.Label(self)
        self.greeting_label.grid(column=0, row=1, columnspan=2)

    def create_greeting_message(self, *args):
        name_entered = self.name_var.get()

        greeting_message = ""
        if name_entered != "":
            greeting_message = "Hello " + name_entered

        self.greeting_label['text'] = greeting_message

if __name__ == "__main__":
    app = GreetingApp()
    app.mainloop()

结果如下:

https://www.askpython.com/wp-content/uploads/2021/09/Stringvar-Greeting-Example.webm

结论

在本教程中,我们学习了 Tkinter 中的StringVar(),以及如何使用它来设置字符串值、检索它以及编写自动更改数据的回调函数。

感谢阅读!!