В предыдущей части моего сериала про Tkinter я разбирался с событиями и обработчиками событий. Однако суть пользовательского интерфейса также принимать данные пользователя и/или показывать данные пользователю. То есть при создании интерфейса на Python с помощью Tkinter я должен уметь передавать виджетам данные (для отображения) и получать данные из виджетов, полученные виджетом в результате пользовательского ввода.
Сегодня я покажу как работать с текстовыми данными в метках и полях ввода, однако, строго говоря, данными могут быть не только текст, но и изображения, положения мыши при клике, цвета, номера строк в списках и т.п., но сегодня только про текст.
В сегодняшнем видео передача данных и получение данных из виджетов Label и Entry. Также немного вспомним о позиционировании виджетов и их стилизации.
Полезные ссылки
- Документация Tk, где можно посмотреть options виджетов, в частности Label, Entry и Button.
- Методы виджета Entry.
- Список классов переменных для связывания StringVar, IntVar etc.
Установка значений виджетов (текст) в Tkinter
Способы передачи текстовых данных условно три штуки:
1. Через параметры при создании или через явную передачу значений в словарь настроек виджета
2. Через связывание с глобальной переменной классов Tkinter StringVar, IntVar, DoubleVar В этом случае содержимое виджета на экране обновляется автоматически при изменении связанной переменной.
3. С помощью методов некоторых виджетов (delete, insert)
Можно гуглить по запросам: tkinter configure, tkinter stringvar, tkinter intvar, tkinter text, tkinter texvariable.
Получение значений виджетов (текст) в Tkinter
1. Из словаря конфига
2. С помощью методов виджета (напр. get)
3. Из связанной переменной
Можно гуглить по запросам: tkinter textvariable, tkinter widget get, tkinter widget cget.
Код на Python к экспериментам в видео
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
import tkinter from datetime import datetime from random import randrange from tkinter import Tk, Label, Frame class Window: def __init__(self): self.r = Tk() self.r.geometry("600x200+960+120") # !!! ЦВЕТА ТАКИЕ вырвиглазные СПЕЦИАЛЬНО !!! # чтобы вспомнить позиционирование и стилизацию в Tkinter # https://www.youtube.com/watch?v=cMKMq8ux3_Y&list=PLWVnIRD69wY6vAtxRtLwHz93UhEPQiv34 finputs = Frame(bg="#e4e") fbtns = Frame(bg="aqua") linfo = Label(finputs) linfo['text'] = "Твой год" linfo.pack(anchor=tkinter.W, padx=10, pady=10) # https://tcl.tk/man/tcl8.6/TkCmd/entry.htm self.entry = tkinter.Entry(finputs) self.entry.bind("<Return>", self.action) # self.entry.insert(0, randrange(1900, 2010)) self.entry_val = tkinter.IntVar() self.entry_val.set(randrange(1900, 2010)) self.entry['textvariable'] = self.entry_val self.entry.pack(anchor=tkinter.W, fill=tkinter.X, padx=10) self.result_label = tkinter.Label( finputs, text="00 лет", font=("Arial", 24, 'bold'), bg="pink", fg="red" ) self.result_label.pack(pady=10, ipadx=10, expand=1, fill=tkinter.BOTH) self.btn_rand = tkinter.Button(fbtns, text="Случайный", width=10) # можно проще но давай вспомним предыдущее видео про события в Tkinter # https://youtu.be/IcXPPN832Gw self.btn_rand.bind( "<Button-1>", # эта лямбда ниже исключительно в образовательных целях # автор в курсе что за такое в приличном коллективе ломают мизинчик lambda x: [ # self.entry.delete(0, tkinter.END), # self.entry.insert(0, randrange(1900, 2010)), self.entry_val.set(randrange(1900, 2010)), self.result_label.config(text="00 лет"), self.action() ] ) self.btn_rand.pack(side=tkinter.RIGHT) tkinter.Button( fbtns, text="Рассчитать", width=10, bg="green", activebackground="lightgreen", fg="white", command=self.action ).pack(side=tkinter.RIGHT, padx=5) finputs.pack(expand=1, fill=tkinter.BOTH) fbtns.pack(fill=tkinter.BOTH, padx=5, pady=5) self.r.mainloop() def action(self, e=None): # val = int(self.entry.get()) val = self.entry_val.get() # https://www.tcl.tk/man/tcl/TkCmd/label.html self.result_label['text'] = "%d лет" % (datetime.now().year - val) """ Tkinter p.6 widget values get/set """ if __name__ == '__main__': print("** Hola Hey, Azzrael_YT subs!!!\n") Window() |
Данные могут быть разными. В ткинтере есть, например, списки — в них также нужно передавать данные и получать из списков пользовательский ввод. Иногда пользователю в интерфейсе нужно показать график или картинку. В Tkinter есть виджеты которые могут это сделать. В сегодняшнем видео я всего этого не касался. А мог бы ;) Если вам интересно продолжение про Tkinter — подписывайтесь на канал, не поскупитесь на лайк и напишите в комментариях (лучше к видео) какие темы в Tkinter вам особенно интересны…