Tkinter StringVar на примерах
В этом уроке вы узнаете об объекте Tkinter StringVar и о том, как использовать его для управления значениями виджетов.
- Что такое Tkinter StringVar?
- Пример StringVar в Tkinter
- 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 в методе __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: пароль и подтверждение пароля. Если вы введете подтверждение пароля, отличное от пароля, то появится сообщение об ошибке. В противном случае появится сообщение об успешном завершении:
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(). В противном случае покажите предупреждающее сообщение, если пароль начинается с подтвержденного пароля. Если пароли не совпадают, покажите сообщение об ошибке.