Stringvar tkinter что это
Одной из примечательных особенностей Tkinter является то, что он позволяет привязать к ряду виджетов переменные определенных типов. При изменении значения виджета автоматически будет изменяться и значение привязанной переменной. Для привязки может использоваться переменная следующих типов:
- StringVar
- IntVar
- BooleanVar
- DoubleVar
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") message = StringVar() label = ttk.Label(textvariable=message) label.pack(anchor=NW, padx=6, pady=6) entry = ttk.Entry(textvariable=message) entry.pack(anchor=NW, padx=6, pady=6) button = ttk.Button(textvariable=message) button.pack(side=LEFT, anchor=N, padx=6, pady=6) root.mainloop()
В данном случае определяется переменная message, которая представляет класс StringVar , то есть такая переменная, которая хранит некоторую строку.
С помощью параметра textvariable эта переменная привязана к тексту поля Entry, а также к тексту кнопки и метки:
ttk.Label(textvariable=message)
И если мы изменим текст в поле Entry, автоматически синхронно изменится и значение привязанной переменной message. а поскольку к этой переменной также привязаны кнопка и метка, то автоматически также изменится текст метки и кнопки.

Типы имеют параметр value , который позволяет установить значение по умолчанию. Кроме того, они имеют два метода:
- get() : возвращает значение
- set(value) : устанавливает значение, которое передано через параметр
Применим эти методы. Например, мы могли бы установить привязку к переменной IntVar и выводить количество кликов:
from tkinter import * from tkinter import ttk def click_button(): value = clicks.get() # получаем значение clicks.set(value + 1) # устанавливаем новое значение root = Tk() root.title("METANIT.COM") root.geometry("250x150") clicks = IntVar(value=0) # значение по умолчанию btn = ttk.Button(textvariable=clicks, command=click_button) btn.pack(anchor=CENTER, expand=1) root.mainloop()

Отслеживание изменения переменной
Класс Stringvar позволяет отслеживать чтение и изменение своего значения. Для отслеживания у объекта StringVar вызывается метод trace_add()
trace_add(trace_mode, function)
Первый параметр представляет отслеживаемое событие и может принимать следующие значения:
- write : изменение значения
- read : чтение значения
- unset : удаление значения
Также можно передать список из этих значений, если нам надо отслеживать несколько событий.
Второй параметр представляет функцию, которая будет вызываться при возникновении события из первого параметра. Эта функция должна принимать один параметр.
Посмотрим на примере:
from tkinter import * from tkinter import ttk def check(*args): print(name) if name.get()=="admin": result.set("запрещенное имя") else: result.set("норм") root = Tk() root.title("METANIT.COM") root.geometry("250x200") name = StringVar() result = StringVar() name_entry = ttk.Entry(textvariable=name) name_entry.pack(padx=5, pady=5, anchor=NW) check_label = ttk.Label(textvariable=result) check_label.pack(padx=5, pady=5, anchor=NW) # отслеживаем изменение значения переменной name name.trace_add("write", check) root.mainloop()
В данном случае текстовое поле name_entry привязано к переменной name, а метка check_label — к переменной result.
Здесь мы отлеживаем изменение значения переменной name — при изменении срабатывает функция check, в которой изменяем переменную result в зависимости от значения name. Условимся, что name представляет имя пользователя, но имя «admin» запрещено.
Stringvar tkinter что это
На этом шаге мы рассмотрим реализацию этого механизма и дадим определение метапеременных .
Многие компоненты позволяют пользователю заносить в них какие-либо значения. Так, компонент поля ввода, представляемый классом Entry , служит для ввода строки текста. После того как пользователь занесет в компонент значение, его следует извлечь и обработать. Как это сделать?
Специально для этого библиотека Tkinter предусматривает так называемые метапеременные — особые сущности, предназначенные для хранения значений, которыми манипулируют компоненты. Компонент выводит на экран значение, хранящееся в метапеременной, и, наоборот, помещает в метапеременную значение, если оно было изменено пользователем.
- stringVar — хранит строку (тип str );
- intVar — хранит целое число (тип int );
- DoubleVar — хранит вещественное число (тип float );
- BooleanVar — хранит логическую величину (тип boolean ).
Конструкторы всех этих четырех классов вызываются без параметров.
- get () — возвращает значение, хранящееся в метапеременной;
- set (< Значение >) — заносит значение в метапеременную.
В примере ниже приведен код приложения, которое выводит окно с полем ввода и кнопкой. При нажатии на кнопку значение, занесенное в поле ввода, выводится в Python Shell .
import tkinter import tkinter.ttk class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.create_widgets() self.master.title("Использование метапеременных") self.master.resizable(False, False) def create_widgets(self): self.varValue = tkinter.StringVar() self.varValue.set("Значение") self.entValue = tkinter.ttk.Entry(self, textvariable=self.varValue) self.entValue.pack() self.btnShow = tkinter.ttk.Button(self, text="Вывести значение", command=self.show_value) self.btnShow.pack(side="bottom") def show_value(self): print(self.varValue.get()) root = tkinter.Tk() app = Application(master=root) root.mainloop()
Архив с файлом можно взять здесь.
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Как уже говорилось, класс Entry представляет компонент поля ввода. Опция textvariable этого компонента служит для указания метапеременной, с которой он будет связан.
Некоторые компоненты, например Checkbutton ( флажок ) , могут быть связаны с метапеременной любого типа. По умолчанию предполагается, что такой компонент связан с метапеременной целочисленного типа (класс intVar ) — тогда в таковую будет занесено число 1, если флажок установлен, и 0, если он сброшен:
self.varState = tkinter.IntVar() # Делаем флажок изначально сброшенным, занеся в метапеременную число 0 self.varState.set(0) # Опция text указывает надпись у флажка, a variable - связанную с ним # метапеременную self.chkState = tkinter.ttk.Checkbutton(self, text="дa или нет?", variable=self.varState)
Но мы можем связать с флажком метапеременную любого другого типа, скажем, строкового (класс stringVar ). Но тогда нам придется указать значения, которые будут занесены в метапеременную для установленного и сброшенного состояния флажка:
self.varState = tkinter.StringVar() # Делаем флажок изначально сброшенным, занеся в метапеременную # строку "Нет" self.varState.set("Нет") # Опция onvalue указывает значение метапеременной для установленного # состояния флажка, а опция offvalue - для сброшенного self.chkState = tkinter.ttk.Checkbutton(self, text="дa или нет?", variable=self.varState, onvalue="дa", offvalue="нет")
Более подробно о применении метапеременных для связывания компонентов с данными мы поговорим позже, когда поведем рассказ о компонентах, поддерживаемых библиотекой Tkinter .
Со следующего шага мы начнем рассматривать обработку событий .
Python StringVar примеры использования
Python StringVar — 3 примера найдено. Это лучшие примеры Python кода для tkinter.ttk.StringVar, полученные из open source проектов. Вы можете ставить оценку каждому примеру, чтобы помочь нам улучшить качество примеров.
def createOrder(frame): import tkinter as ttk meatType = ttk.Label(frame, text="Type of Meat:") meatType.grid(column=0, row=1, sticky=(N)) varType = ttk.StringVar(frame) choices = varType.set('Please Select. ') popupMenu = ttk.OptionMenu(frame, varType, *choices) popupMenu.grid(column=2, row=1) meatPart = ttk.Label(frame, text="Part of Meat:") meatPart.grid(column=0, row=3, sticky=(N)) varType = ttk.StringVar(frame) choices = varType.set('Chicken') popupMenu = ttk.OptionMenu(frame, varType, *choices) popupMenu.grid(column=2, row=3) meatWeight = ttk.Label(frame, text="Weight of Meat:") meatWeight.grid(column=0, row=5, sticky=(N)) weightEntry = ttk.Entry(frame, text="(kg)") weightEntry.grid(column=2, row=5, sticky=(N)) weightEntry.insert(END, "(kg)") content.grid_columnconfigure(0, weight=1) content.grid_columnconfigure(2, weight=1) content.grid_columnconfigure(4, weight=1) content.grid_rowconfigure(0, weight=2) content.grid_rowconfigure(2, weight=2) content.grid_rowconfigure(3, weight=2) content.grid_rowconfigure(4, weight=2) content.grid_rowconfigure(6, weight=2)
def __init__(self, root, show_login_view, show_create_user_view): self._frame = None self._plaintext = ttk.StringVar() self._ciphertext = ttk.StringVar() self._key = ttk.IntVar(master=self._frame) self._plain_label = None self._plain_entry = None self._encrypt_button = None self._key_label = None self._key_entry = None self._cipher_label = None self._cipher_entry = None self._decrypt_button = None self.initialize()
Tkinter/Entry
Entry — Виджет Tkinter который создаёт текстовое поле для ввода текста.
Параметры [ ]
- show: задает маску для вводимых символов
- state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
- textvariable: устанавливает привязку к элементу StringVar
Методы [ ]
.get() [ ]
Можно получить данные из текстового поля. Пример:
from tkinter import * window = Tk() window.geometry('400x400') def data(): text = entry.get() label['text'] = text label = Label(font = 'Ariel 30') button = Button(text = 'Преобразовать', command = data) entry = Entry() entry.pack() button.pack() label.pack() window.mainloop()
.insert() [ ]
from tkinter import * window = Tk() window.geometry('400x400') add = lambda: entry.insert(1, 'Сделано Python вики!') button = Button(text = 'Базовый текст', command = add) entry = Entry() entry.pack() button.pack() label.pack() window.mainloop()
.delete() [ ]
from tkinter import * window = Tk() window.geometry('400x400') clear = lambda: entry.delete(0, END) # До каких символов будет удалятся button = Button(text = 'Очистить', command = clear) entry = Entry() entry.pack() button.pack() window.mainloop()
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA, если не указано иное.