i = 10
f = lambda: print(i)
i = 20
f() # выведет 20
i = 10
# сохраняем глобальную i как значение по умолчанию параметра i
f = lambda i=i: print(i)
i = 20
f() # выведет 10
f(30) # выведет 30
i = 10
# сохраняем глобальную i как значение по умолчанию параметра i
# Параметр i может быть передан только по имени: i=30
f = lambda *,i=i: print(i)
i = 20
f() # выведет 10
f(i=30) # выведет 30
f(30) # TypeError: <lambda>() takes 0 positional arguments but 1 was given
import tkinter as tk
root = tk.Tk()
root.geometry('200x100')
frame_outer = tk.Frame(root, bg='blue')
frame_outer.pack(expand=True, fill='both')
frame = tk.Frame(frame_outer, bg='green')
btn1 = tk.Button(frame, text='Button1')
btn2 = tk.Button(frame, text='Button2')
btn1.pack(side='left', padx=5, pady=5)
btn2.pack(side='left', padx=5, pady=5)
frame.pack(side='top', anchor='center')
root.mainloop()
Python 3.11.7 (tags/v3.11.7:fa7a6f2, Dec 4 2023, 19:24:49) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> l = locals()
>>> l['x'] = 1
>>> x
1
>>>
class MainWindow(tk.Tk):
"""Главное окно приложения."""
def __init__(self):
"""Конструктор вызывается при создании окна"""
super().__init__()
self.title('Моё окно')
self.protocol('WM_DELETE_WINDOW', self.__done) # прописываем реакцию на закрытие окна
... # тут создаёшь элементы управления и проводишь прочую инициализацию
# в том числе создаёшь и запоминаешь вспомогательные окна
def __done(self):
"""Вызовется при попытке закрытия окна"""
... # тут делаешь что тебе нужно при закрытии
# например, закрываешь вспомогательные окна
self.destroy() # если не сделать этот вызов, окно на самом деле не закроется - иногда это нужно
if __name__ == '__main__':
root = MainWindow()
root.mainloop()
select "Route_num" from "Route TB"
root_changes_2.mainloop()
запускает основной рабочий цикл. В нём программа получает сообщения от ОС о действиях пользователя и реагирует на них. Цикл прерывается, когда закрывается основное окно (ты хранишь ссылку на него в root_changes_2).import tkinter as tk
import tkinter.messagebox as tkmb
class MainWindow(tk.Tk):
"""Главное окно программы наследуется от Tk.
Вспомогательные окна - от TopLevel.
Составные элементы управления - от Frame."""
def __init__(self):
"""Метод __init__() автоматически вызывается при создании нового экземпляра класса."""
super().__init__() # обязательно вызываем конструктор родительского класса!
# при закрытии нашего окна вызовется метод __done()
# если эта функциональность не нужна, можно убрать эту строку
self.protocol('WM_DELETE_WINDOW', self.__done)
# пример создания элементов управления
# имена, начинающиеся с __, не видны снаружи класса
# мы присваиваем не просто переменным, а полям объекта. Эти поля будут видны в других методах.
self.__entry = tk.Entry(self) # поле ввода будет вложено непосредственно в наше окно
self.__entry.pack(side=tk.TOP, fill=tk.X, expand=True)
self.__btn = tk.Button(self, text='Нажми меня', command=self.__btn_pressed) # кнопка и реакция на неё
self.__btn.pack(side=tk.TOP)
def __done(self):
"""Мы прописали вызов этого метода при закрытии окна.
Тут мы можем корректно завершить работу нашей программы, а потом подтвердить закрытие."""
self.destroy() # подтверждаем закрытие. Если этот вызов не сделать, окно не закроется. Иногда это нужно.
def __btn_pressed(self):
"""Реакция на кнопку."""
text = self.__entry.get() # мы можем обращаться к полям объекта
tkmb.showinfo(
title='Вы ввели',
message=text,
parent=self
)
if __name__ == '__main__':
# это условие выполнится, только если скрипт запущен непосредственно
# оно не выполнится, если скрипт импортируется другим скриптом
# поэтому в такое условие обычно заворачивают "тело" скрипта
wnd = MainWindow() # создаём окно
wnd.mainloop() # главный рабочий цикл
# сюда управление будет передано после закрытия окна
print('Окно закрыто, пока!')
зашитая в кнопку команда объектом энтри игнорируется
import tkinter as tk
class InputBox(tk.Frame):
def __init__(self, master, **kwargs):
# вызываем унаследованный конструктор
super().__init__(master, **kwargs)
# переменные tkinter можно связывать с элементами управления
# тогда изменение в переменной отобразится в элементе, и наоборот
# это бывает удобнее, чем дёргать элемент напрямую
# а ещё можно самим реагировать на изменения значения такой переменной
self.__value = tk.StringVar()
# наше поле ввода
self.__entry = tk.Entry(self, justify=tk.RIGHT, width=22, textvariable=self.__value)
self.__entry.pack(side=tk.RIGHT, padx=10, pady=15)
# метка с пояснением
self.__helptext = tk.Label(self, bg=self['background'], height=3, text="Введите мат. выражение:")
self.__helptext.pack(side=tk.LEFT)
def get_value(self) -> str:
"""Возвращает введённую строку."""
return self.__value.get() # метод get() позволяет прочитать значение переменной tkinter
def set_value(self, value: str) -> None:
"""Заменяет содержимое введённой строки новым."""
self.__value.set(value) # метод set() позволяет задать новое значение для переменной
def append(self, symbol: str) -> None:
"""Добавляет символ(ы) к уже введённой строке."""
self.__value.set(self.__value.get() + symbol)
if __name__ == '__main__':
root = tk.Tk()
box = InputBox(root)
box.pack(side=tk.TOP, expand=True, fill=tk.BOTH)
box.set_value('Hello')
box.append(', world!')
root.mainloop()
label1.update_idletasks()
после изменения текста, чтобы попросить tkinter перерисовать окно немедленно.