Tkinter StringVar на примерах

В этом уроке вы узнаете об объекте Tkinter StringVar и о том, как использовать его для управления значениями виджетов.

Содержание

Что такое Tkinter StringVar?

Tkinter StringVar помогает более эффективно управлять значением виджета, например метки или записи.

Чтобы создать новый объект StringVar, используйте конструктор StringVar следующим образом:

string_var = tk.StringVar(container, value, name)

Конструктор StringVar принимает три необязательных аргумента:

  • container — это виджет, с которым связан объект StringVar. Если вы пропустите контейнер, по умолчанию будет корневое окно.
  • value — это начальное значение, которое по умолчанию равно пустой строке ‘ ‘.
  • name — это имя Tcl, которое по умолчанию равно PY_VARnum, например, PY_VAR1, PY_VAR2 и т. д.

После создания объекта StringVar вы можете назначить его текстовой переменной виджета, который принимает объект StringVar.

Например, следующий код присваивает string_var текстовой переменной виджета Entry:

name_entry = ttk.Entry(root, textvariable=string_var)

Чтобы получить текущее значение виджета Entry, можно использовать метод get() объекта StringVar:

name_var.get()

Объект StringVar будет уведомлять вас всякий раз, когда его значение изменится. Эта функция полезна, если вы хотите автоматически обновлять другие виджеты на основе текущего значения объекта StringVar.

Чтобы вызвать обратный вызов всякий раз, когда изменяется значение объекта StringVar, используйте метод trace() объекта StringVar:

string_var.trace('w', callback)

Режим «w» автоматически вызывает обратный вызов всякий раз, когда изменяется значение string_var.

StringVar также предоставляет вам два других режима «r» и «u»:

  • ‘r'(read) – вызывать обратный вызов всякий раз, когда считывается переменная.
  • ‘u'(unset) – вызывать обратный вызов всякий раз, когда удаляется переменная.

Пример StringVar в Tkinter

В следующем примере показано, как использовать объект StringVar для виджета Entry:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Tkinter StringVar')
        self.geometry("300x80")

        self.name_var = tk.StringVar()

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        self.create_widgets()

    def create_widgets(self):

        padding = {'padx': 5, 'pady': 5}
        # label
        ttk.Label(self, text='Name:').grid(column=0, row=0, **padding)

        # Entry
        name_entry = ttk.Entry(self, textvariable=self.name_var)
        name_entry.grid(column=1, row=0, **padding)
        name_entry.focus()

        # Button
        submit_button = ttk.Button(self, text='Submit', command=self.submit)
        submit_button.grid(column=2, row=0, **padding)

        # Output label
        self.output_label = ttk.Label(self)
        self.output_label.grid(column=0, row=1, columnspan=3, **padding)

    def submit(self):
        self.output_label.config(text=self.name_var.get())


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

Выход:

Пример использования StringVar в Tkinter

Как это работает.

  • Сначала создайте новый объект StringVar в методе __init__() класса App:
self.name_var = tk.StringVar()
  • Во-вторых, назначьте объект StringVar параметру textvariable виджета Entry в методе create_widgets():
name_entry = ttk.Entry(self, textvariable=self.name_var)
  • В-третьих, при нажатии кнопки установите текст виджета output_label равным значению объекта name_var.
self.output_label.config(text=self.name_var.get())

Tkinter StringVar – пример отслеживания изменений текста

Следующий пример иллюстрирует, как использовать объект StringVar для отслеживания изменений текста.

В корневом окне есть два виджета Entry: пароль и подтверждение пароля. Если вы введете подтверждение пароля, отличное от пароля, то появится сообщение об ошибке. В противном случае появится сообщение об успешном завершении:

Демонстрация StringVar Tkinter

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    ERROR = 'Error.TLabel'
    SUCCESS = 'Success.TLabel'

    def __init__(self):
        super().__init__()
        self.title('Change Password')
        self.geometry("300x130")

        self.password_var = tk.StringVar()
        self.confirm_password_var = tk.StringVar()

        self.confirm_password_var.trace('w', self.validate)

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        # set style
        self.style = ttk.Style(self)
        self.style.configure('Error.TLabel', foreground='red')
        self.style.configure('Success.TLabel', foreground='green')

        self.create_widgets()

    def create_widgets(self):
        """ create a widget
        """
        padding = {'padx': 5, 'pady': 5, 'sticky': tk.W}
        # message
        self.message_label = ttk.Label(self)
        self.message_label.grid(column=0, row=0, columnspan=3, **padding)

        # password
        ttk.Label(self, text='New Password:').grid(column=0, row=1, **padding)

        password_entry = ttk.Entry(
            self, textvariable=self.password_var, show='*')
        password_entry.grid(column=1, row=1, **padding)
        password_entry.focus()

        # Confirm password
        ttk.Label(self, text='Confirm Password:').grid(
            column=0, row=2, **padding)

        confirm_password = ttk.Entry(
            self, textvariable=self.confirm_password_var, show='*')
        confirm_password.grid(column=1, row=2, **padding)
        confirm_password.focus()

        # Change button
        submit_button = ttk.Button(self, text='Change')
        submit_button.grid(column=0, row=3, **padding)

    def set_message(self, message, type=None):
        """ set the error or success message
        """
        self.message_label['text'] = message
        if type:
            self.message_label['style'] = type

    def validate(self, *args):
        """ validate the password
        """
        password = self.password_var.get()
        confirm_password = self.confirm_password_var.get()

        if confirm_password == password:
            self.set_message(
                "Success: The new password looks good!", self.SUCCESS)
            return

        if password.startswith(confirm_password):
            self.set_message('Warning: Keep entering the password')


        self.set_message("Error: Passwords don't match!", self.SUCCESS)



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

Как это работает:

  • Сначала определите две константы ERROR и SUCCESS, которые будут установлены в message_label на основе результата проверки:
ERROR = 'Error.TLabel'
SUCCESS = 'Success.TLabel'
WARNING = 'Warning.TLabel'
  • Во-вторых, создайте два объекта StringVar:
self.password_var = tk.StringVar()
self.confirm_password_var = tk.StringVar()
  • В-третьих, используйте метод trace() для вызова метода self.validate() всякий раз, когда изменяется текст виджета подтверждения пароля:
self.confirm_password_var.trace('w', self.validate)
  • Наконец, покажите сообщение об успешном завершении, если пароли совпадают в методе validate(). В противном случае покажите предупреждающее сообщение, если пароль начинается с подтвержденного пароля. Если пароли не совпадают, покажите сообщение об ошибке.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *