Tkinter StringVar

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

Введение в Tkinter StringVar

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

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

string_var = tk.StringVar(container, value, name)
Code language: Python (python)

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

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

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

Например, следующее назначение string_var на textvariable виджета Entry:

name_entry = ttk.Entry(root, textvariable=string_var)
Code language: Python (python)

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

name_var.get()
Code language: Python (python)

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

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

string_var.trace('w', callback)
Code language: Python (python)

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

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

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

Пример Tkinter StringVar

Следующий пример иллюстрирует использование объекта 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()
Code language: Python (python)

Вывод:

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

Во-первых, создайте новый объект StringVar в методе __init__() класса App:

self.name_var = tk.StringVar()
Code language: Python (python)

Во-вторых, присвойте объект StringVar параметру textvariable виджета Entry в методе create_widgets():

name_entry = ttk.Entry(self, textvariable=self.name_var)
Code language: Python (python)

В-третьих, установите текст виджета output_label в значение объекта name_var при нажатии на кнопку.

self.output_label.config(text=self.name_var.get())
Code language: Python (python)

Tkinter StringVar — Пример отслеживания изменения текста

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

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

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()
Code language: Python (python)

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

Во-первых, определите две константы ERROR и SUCCESS, которые будут установлены в message_label в зависимости от результата проверки:

ERROR = 'Error.TLabel' SUCCESS = 'Success.TLabel' WARNING = 'Warning.TLabel'
Code language: Python (python)

Во-вторых, создайте два объекта StringVar:

self.password_var = tk.StringVar() self.confirm_password_var = tk.StringVar()
Code language: Python (python)

В-третьих, используйте метод trace() для вызова метода self.validate() при каждом изменении текста виджета подтверждения пароля:

self.confirm_password_var.trace('w', self.validate)
Code language: Python (python)

Наконец, покажите сообщение об успехе, если пароли совпадают в методе validate(). В противном случае покажите предупреждающее сообщение, если пароль начинается с подтвержденного пароля. Если пароли не совпадают, покажите сообщение об ошибке.

Резюме

  • Используйте объект Tkinter StringVar для более эффективного управления значениями виджетов.
  • Присвойте объект StringVar переменной textvariable виджета.
  • Используйте метод trace() объекта StringVar для отслеживания изменений текста.

Оцените статью
devanswers.ru
Добавить комментарий