Как сделать неизменяемым окно tkinter
Добавил пользователь Владимир З. Обновлено: 21.08.2024
См., что '.toLowerCase()' необходимо для предотвращения ошибок при сравнении строк.
Если вы хотите установить для полноэкранного атрибута значение True, это так же просто, как:
Однако, он не показывает строку заголовка. Если вы хотите, чтобы он был видимым, вы можете изменить размер элемента Tk с помощью метода geometry() :
С помощью winfo_width() и winfo_height() вы можете получить ширину и высоту или окно, и также вы можете привязать обработчик события к событию :
Вы можете сделать это, позвонив
Первый подход заключается в использовании root.state('zoomed') , но он не должен быть универсально доступным. Он работает как на Windows, так и на моей машине с Ubuntu. Однако, под моей машиной Arch это не так.
Второе - сначала получить максимальный размер , а затем установить геометрию вручную, например:
Это работает на большинстве машин, но не на всех. Например, в моем Arch maxsize() возвращает (1425, 870) , а реальная геометрия развернутого окна должна быть (1440, 848) . Таким образом, вы также не можете полагаться на это.
tkinter создание окна
Всем привет. Продолжим изучение библиотеки tkinter в python которая позволяет писать нам графический интерфейс. Тема сегодняшней статьи работа с окнами программы.
Рассмотрим следующий код:
Здесь мы создали главное окно программы. Заметьте что оно имеет определенные размеры и заголовок Tk.
Допустим мы хотим чтобы наше главное окно имело заголовок 'main' и размеры 400x400.
Для этого в библиотеке tkinter существует метод title() который устанавливает заголовок и minize(), устанавливает ширину и высоту окна.
Для того чтобы окну задать определенный фон мы можем воспользоваться элементом frame:
здесь через класс Frame мы создали элемент frame.
В класс мы передали следующие аргументы:
window - объект главного окна
width и height - ширина и высота(совпадают с параметрами главного окна)
bg - цвет фона(green - зеленный)
В результате цвет фона нашего главного окна стал зеленым. Сам по себе виджет frame представляет собой рамки с помощью которых мы можем более гибко структурировать данные в окне.
Мы нарисовали флаг Российской Федерации в самом центре нашего главного окна используя виджет Frame. Помимо всего прочего мы можем в фрейм помещать другие элементы.
Например здесь мы текстовое поле поместили в frame2
И напоследок мы рассмотрим как создавать дополнительные(дочерние окна).
Дочерние окна создаются с помощью класса Toplevel которому передается в качестве аргумента объект главного окна.
В данном примере мы создали дополнительное окно с размерами 400x200 и заголовком 'Дочернее окно'. Теперь мы можем обращаться и работать с ним через объект children. Отмечу что дочерних окон мы можем создавать сколько угодно.
Однако стоит помнить, что если мы закрываем наше главное окно, то все дочерние элементы закроются вместе с ним.
На этом данная статья подошла к концу. Надеюсь она была для вас полезной.
Желаю удачи и успехов! Пока!
Оцените статью:
Статьи
Комментарии
Внимание. Комментарий теперь перед публикацией проходит модерацию
Все комментарии отправлены на модерацию
Запись экрана
Данное расширение позволяет записывать экран и выводит видео в формате webm
Возможность реагировать на события — одна из базовых, но важных тем в приложениях с графическим интерфейсом. Именно она определяет, как пользователи смогут взаимодействовать с программой.
Нажимание клавиш на клавиатуре и клики по элементам мышью — базовые примеры событий, все из которых автоматически обрабатываются в некоторых классах Tkinter. Например, это поведение уже реализовано в параметре command класса виджета Button , который вызывает определенную функцию.
Некоторые события можно вызвать и без участия пользователя. Например, фокус ввода можно сместить с одного виджета на другой.
Выполнить привязку события к виджету можно с помощью метода bind . Следующий пример привязывает некоторые события мыши к экземпляру Frame :
Следующий пример содержит виджет поля ввода и несколько привязок. Одна из них срабатывает в тот момент, когда фокус оказывается в виджете, а вторая — при нажатии кнопки:
Как работает отслеживание событий
Метод bind определен в классе widget и принимает три аргумента: событие sequence , функцию callback и опциональную строку add :
Строка sequence использует синтаксис .
Модификаторы являются опциональными и позволяют задать дополнительные комбинации для общего типа события:
- Shift – когда пользователь нажимает клавишу Shift.
- Alt – когда пользователь нажимает клавишу Alt.
- Control – когда пользователь нажимает клавишу Control.
- Lock – когда пользователь нажимает клавишу Lock.
- Shift – когда пользователь нажимает клавишу Shift.
- Shift – когда пользователь нажимает клавишу Shift lock.
- Double – когда событие происходит дважды подряд.
- Triple – когда событие происходит трижды подряд.
Типы события определяют общий тип события:
- ButtonPress или Button – события, которые генерируются при нажатии кнопки мыши.
- ButtonRelease – событие, когда кнопка мыши отпускается.
- Enter – событие при перемещении мыши на виджет.
- Leave – событие, когда мышь покидает область виджета.
- FocusIn – событие, когда фокус ввода попадает в виджет.
- FocusOut – событие, когда виджет теряет фокус ввода.
- KeyPress или Key – событие для нажатия кнопки.
- KeyRelease – событие для отпущенной кнопки.
- Motion – событие при перемещении мыши.
detail – также опциональный параметр, который отвечает за определение конкретной клавиши или кнопки:
- Для событий мыши 1 — это левая кнопка, 2 — средняя, а 3 — правая
- Для событий клавиатуры используются сами клавиши. Если это специальные клавиши, то используется специальный символ: enter, Tab, Esc, up, down, right, left, Backspace и функциональные клавиши (от F1 до F12).
Функция callback принимает параметр события. Для событий мыши это следующие атрибуты:
- x и y – текущее положение мыши в пикселях
- x_root и y_root — то же, что и x или y, но относительно верхнего левого угла экрана
- num – номер кнопки мыши
Для клавиш клавиатуры это следующие атрибуты:
- char – нажатая клавиша в виде строки
- keysym – символ нажатой клавиши
- keycode – код нажатой клавиши
В обоих случаях у события есть атрибут widget , ссылающийся на экземпляр, который сгенерировал событие и type , определяющий тип события.
Рекомендуется определять метод для функции callback , поскольку всегда будет иметься ссылка на экземпляр класса, и таким образом можно будет легко получить доступ к атрибутам widget .
Наконец, параметр add может быть пустым ( "" ) для замены функции callback , если до этого была привязка или + для добавления функции обратного вызова и сохранения старых.
Помимо описанных типов событий есть и другие, которые оказываются полезными в определенных сценариях: например, генерируется при уничтожении виджета, а — при изменении размера или положения.
Полный список событий доступен в документации Tcl/Tk.
Настройка иконки, названия и размера основного окна
Экземпляр Tk отличается от обычных виджетов тем, как он настраивается. Рассмотрим основные методы, которые позволяют настраивать внешний вид.
Этот кусок кода создает основное окно с заданными названием и иконкой. Его ширина — 400 пикселей, а высота — 200. Плюс, есть разделение в 10px по каждой оси к левому верхнему углу экрана.
Проблема следующая. Пользуюсь модулем messagebox, который, помимо окна диалога, создает пустое окно root. Чтобы спрятать это окно, на форумах советуют использовать root.withdraw(). Однако мой скрипт создает много разнообразных окон tkinter, и после того, как я что-нибудь нажал в диалоге messagebox, tkinter не может создать новое окно (терминал просто висит) - видимо, ждет, когда я закрою пустое окно root (оно, напомню, спрятано, т.е. мне остается только Ctrl+C). root_destroy() в конце таких процедур как ниже не помогает. Если же withdraw убрать, tkinter начинает плодить сущности: 1, 2 - некрасиво. Как можно решить этот вопрос?
Никак. В Tk обязательно есть root-окно. Цикл wm (основной цикл для Windows Manager'a Tk) обязательно должен содержать рутовое окно (иначе просто не к чему привязать цикл). Ну, и для Tk использование диалоговых окон вне цикла - просто не возможно. Дело в том, что исходя из архитектуры Tk, элемент message box - это просто дочернее окно (следовательно, оно должно быть привязано к root'овому), у которого заранее заданы определенные параметры.
Я такую проблему обходил просто - сделал класс, который описывал нужный мне диалог и создавал/убивал окно по мере надобности (каждый раз это было просто заново создаваемое root'овое окно). Для Tk это более правильный подход, нежели скрывать корневое окно, а потом плодить мессадж-боксы.
Второй путь: забить на Tk и юзать Gtk :)
А смысл? Для маленьких скриптов - tk самое оно. Тем более, что Tkinter - гвидоугодный.
Пример класса можете привести?
Для Tk это более правильный подход, нежели скрывать корневое окно, а потом плодить мессадж-боксы.
Читайте также: