Как сделать незакрываемое окно в python

Обновлено: 18.05.2024

Как обработать событие закрытия окна в Tkinter?

Как мне обрабатывать событие закрытия окна (нажатие кнопки "X" ) в программе Python Tkinter?

ОТВЕТЫ

Ответ 1

Tkinter поддерживает механизм, называемый обработчики протоколов. Здесь термин "протокол" относится к взаимодействию между приложением и диспетчером окон. Наиболее часто используемый протокол называется WM_DELETE_WINDOW и используется для определения того, что происходит, когда пользователь явно закрывает окно с помощью диспетчера окон.

Вы можете использовать метод protocol для установки обработчика для этого протокола (виджет должен быть виджем Tk или Toplevel ):

Здесь у вас есть конкретный пример:

Ответ 2

Мэтт показал одну классическую модификацию кнопки закрытия.
Другой заключается в том, чтобы закрыть кнопку закрытия окна.
Вы можете воспроизвести это поведение, используя метод iconify protocol второй аргумент.

Вот рабочий пример, протестированный в Windows 7:

Ответ 3

В зависимости от активности Tkinter, и особенно при использовании Tkinter.after, остановка этой активности с помощью destroy() - даже с использованием protocol(), кнопки и т.д. - будет нарушать эту активность (ошибка "во время выполнения"), а не просто прекратить это. Лучшее решение почти в каждом случае - использовать флаг. Вот простой, глупый пример того, как его использовать (хотя я уверен, что большинству из вас это не нужно! :)

Это хорошо завершает графическую активность. Вам нужно только проверить running в нужном месте (ах).

Ответ 4

Попробуйте простую версию:

Или, если вы хотите добавить больше команд:

Ответ 5

Я хотел бы поблагодарить ответ апостола за то, что он привлек мое внимание. Вот гораздо более подробный пример для Python 3 в 2019 году, с более ясным описанием и примером кода.

Остерегайтесь того факта, что destroy() (или вообще не имеющий собственного обработчика закрытия окна) уничтожит окно и все его текущие обратные вызовы мгновенно, когда пользователь закроет его.

Это может быть плохо для вас, в зависимости от текущей активности Tkinter, особенно при использовании tkinter.after (периодические обратные вызовы). Возможно, вы используете обратный вызов, который обрабатывает некоторые данные и записывает их на диск. в этом случае вы, очевидно, хотите, чтобы запись данных завершилась без внезапного уничтожения.

Лучшее решение для этого - использовать флаг. Поэтому, когда пользователь запрашивает закрытие окна, вы отмечаете это как флаг, а затем реагируете на него.

(Примечание: я обычно проектирую GUI как хорошо инкапсулированные классы и отдельные рабочие потоки, и я определенно не использую "глобальный" (вместо этого я использую переменные экземпляра класса), но это должен быть простой, урезанный пример для демонстрации как Tk внезапно убивает ваши периодические обратные вызовы, когда пользователь закрывает окно. )

Этот код покажет вам, что обработчик WM_DELETE_WINDOW работает, даже когда наш пользовательский periodic_call() занят посреди работы/циклов!

Мы используем довольно преувеличенные значения .after() : 500 миллисекунд. Это просто для того, чтобы вам было очень легко увидеть разницу между закрытием, когда периодический вызов занят, или нет. Если вы закроете, когда номера обновляются, вы увидите, что WM_DELETE_WINDOW произошло, когда ваш периодический вызов "был занят обработкой: True". Если вы закроете, когда номера приостановлены (это означает, что периодический обратный вызов в этот момент не обрабатывается), вы увидите, что закрытие произошло, когда оно "не занято".

В реальных условиях ваш .after() будет использовать что-то вроде 30-100 миллисекунд, чтобы иметь отзывчивый графический интерфейс. Это просто демонстрация, чтобы помочь вам понять, как защитить себя от Tk по умолчанию, "мгновенно прерывать всю работу при закрытии".

В итоге: сделайте так, чтобы обработчик WM_DELETE_WINDOW установил флаг, а затем периодически проверяйте этот флаг и вручную .destroy() окно, когда оно безопасно (когда ваше приложение выполнено со всей работой).

Как заблокировать изменение окна в eel?

Bad-Coder

Помоему нельзя никак, если не JS функции. Тем более, если вы правильно работаете в html и css, то изменение окна, вашу программу не испортит. Чтобы установить минимальную длину и высоту Вашей программы можете использовать:

Если высота и ширина не удовлетворяются, то скрипт просто раскрывает его в исх. мин. размер. положение.

Не закрываемое окно с использованием tkinter

Эй, я делаю программу, которая делает снимок с помощью моей веб-камеры, когда я набираю неправильный пароль. Программа будет открыта, и я хочу, чтобы она не закрывалась. Мне нужно знать, как сделать окно не закрываемым с помощью tkinter.

Adailton Júnior 11 Май 2015 в 02:02

2 ответа

Лучший ответ

Вы можете попробовать все то, что предложил @abarnert, но я думаю, что самый простой способ - просто игнорировать событие close.

(отредактированный код для Windows)

Поэтому измените on_closing() на
def on_closing (): передать
и это делает его не подлежащим закрытию. Я пробовал Alt + F4 , кнопку закрытия, закрывая ее с панели задач Windows, но все безрезультатно. Единственный способ убить его - использовать диспетчер задач.

IronManMark20 11 Май 2015 в 01:58

У Tkinter нет никакого способа сделать это напрямую. Но у него есть кое-что, что может быть достаточно хорошим, или это может быть слишком излишним: overrideredirect :

Если не ноль, это препятствует тому, чтобы оконный менеджер украсил окно. Другими словами, окно не будет иметь заголовка или границы, и его нельзя будет перемещать или закрывать обычными средствами.

Это не совсем актуально; на некоторых платформах он может иметь заголовок или границу . но он не будет закрываемым.

Это легко использовать: просто сделайте root.overrideredirect(True) (или, если вы хотите сделать это в другом окне Toplevel вместо своего корня, window.overrideredirect(True) ).

Но обратите внимание, что его нельзя переместить или закрыть , а не только то, что его нельзя закрыть. (Его также нельзя изменить, если вы этого хотите.)

Таким образом, единственное, что вы можете сделать, это установить флаг, а затем привязать события кнопки мыши, чтобы обрабатывать перемещение вручную. Например, в вашем окне __init__ метод:

Очевидно, что если вы хотите, чтобы какие-либо виджеты в окне принимали щелчки, вы, вероятно, не хотите превращать все окно в область перетаскивания. На самом деле, вы можете не захотеть превращать все окно в область перетаскивания, даже если на нем нечего щелкать, потому что на самом деле это не соответствует принципам интерфейса пользователя для Mac или Windows. Вы можете подделать область захвата - строку заголовка, рамку вокруг окна и т. Д. - просто добавив Label , прикрепленный к той стороне (сторонам), с которой хотите захватить, и только > или путем создания вставки «дочернего» окна из главного окна, которая крадет bind . Но это никогда не будет выглядеть как «родное» окно.

Если вам действительно нужно собственное окно, но с отключенным или отсутствующим окном закрытия ( X в верхнем правом углу в Windows, красная точка в верхнем левом углу на Mac и т. Д.) (И, на Windows с отключенным пунктом «Закрыть» в меню окна, Alt + F4 и т. Д., И аналогично для X11…)… Насколько я знаю, в Tkinter нет кроссплатформенного способа сделать это. Вам нужно будет написать код для каждой платформы, который получает базовые объекты собственного окна и выполняет с ними какие-либо действия. В этот момент вы, вероятно, захотите использовать более мощную библиотеку окон, чем Tkinter - например, я считаю, что у Qt, Gtk + и wx есть гораздо более простые способы создания нормального окна, но с отключенным окном закрытия.

Как мне оставить окно консоли открытым после завершения моей программы python, чтобы увидеть возникшие ошибки?

Я использую Python 3 на Win10 и запускаю свой код, открыв окно командной строки и введя местоположение файла. Тем не менее, окно закрывается, как только программа завершается, и, прежде чем я могу прочитать какие-либо ошибки. Редактировать: это происходит независимо от того, есть ли в программе ошибки. Спасибо.

The Samstro 17 Июл 2018 в 17:47

2 ответа

Лучший ответ

Решение 1:

Я только что увидел ваш комментарий:

Похоже, вы не указали путь к исполняемому файлу python: вам нужно добавить путь к исполняемому файлу python в переменную PATH вашего окна. Вы можете увидеть, как это сделать, здесь: Добавить Python в переменную среды PATH ('python' не распознается как внутренняя или внешняя команда)

Решение 2 .

Вы можете использовать input("enter to exit") в конце вашего кода Python, чтобы программа оставалась активной. Он выйдет, как только вы нажмете Enter.

Вы также можете заключить свой код в оператор try except и поместить th input() в except , чтобы предотвратить выход из программы при возникновении ошибок, но как упоминал @Kevin в комментариях это отловит ошибки времени выполнения, но не синтаксические ошибки.

Решение 3 .

Вы можете записывать ошибки или любую другую информацию в файл, например log.txt , а затем читать этот файл журнала после завершения выполнения кода, например. как писать в файл в Python

Adam Jaamour 17 Июл 2018 в 15:07

FWIW, у меня есть несколько версий Python в моей системе Windows, поэтому я не хочу постоянно добавлять какие-либо каталоги Python в мой путь.

Код для каждой версии находится в отдельной папке (например, «py37») с подпапкой для каждого проекта, например. 'мой проект'. В py37 есть пакетный файл pyEnv.bat с таким содержимым:

В проводнике Windows я перехожу в папку проекта, в которой я хочу работать, нажимаю в адресной строке и набираю ..\pyEnv . Это запускает DOS-окно, в котором я теперь могу сделать python myproject.py . Вы можете увидеть print() вывод, ошибки и так далее.

Вы можете стрелять вверх, чтобы попробовать разные модули, набрав их в первую очередь.

Незакрываемое окно с использованием tkinter

Эй, я делаю программу, которая делает снимок, используя мою веб-камеру, когда я набираю неправильный пароль. Программа будет открыта, и я хочу, чтобы она была закрыта. Мне нужно знать, как сделать окно незамкнутым с помощью tkinter.

спросил(а) 2015-05-11T02:02:00+03:00 6 лет, 4 месяца назад добавить комментарий пожаловаться

Вы можете попробовать все, что предложил @abarnert, но я думаю, что самый простой способ - просто проигнорировать закрытое событие.

Здесь у вас есть конкретный пример:

(отредактированный код для Windows)

Поэтому измените on_closing() на
def on_closing(): pass
и это делает его незамкнутым. Я попробовал Alt + F4 , кнопку закрытия, закрыв ее с панели задач Windows, но безрезультатно. Единственный способ, которым я смог его убить, - использовать диспетчер задач.

ответил(а) 2015-05-11T04:58:00+03:00 6 лет, 4 месяца назад добавить комментарий пожаловаться

У Tkinter нет никакого способа сделать это напрямую. Но у него есть что-то, что может быть достаточно хорошим, или это может быть слишком много излишним: флаг overrideredirect :

Если ненулевое значение, это не позволяет оконному менеджеру украшать окно. Другими словами, у окна не будет названия или границы, и он не может быть перемещен или закрыт обычными способами.

Это не совсем современно; на некоторых платформах он может иметь название или границу. но он не будет закрыт.

Это прост в использовании: просто выполните root.overrideredirect(True) (или, если вы хотите сделать это с другим окном Toplevel а не с вашим корнем, window.overrideredirect(True) ).

Но заметьте, что он не может быть перемещен или закрыт, а не только, что он не может быть закрыт. (Он также не может быть изменен, если вы этого хотите.)

Итак, единственное, что вы можете сделать, это установить флаг, но затем привязать события кнопки мыши, чтобы обрабатывать перемещение вручную. Например, в вашем окне __init__ метод:

Очевидно, что если вы хотите, чтобы какие-либо виджеты в окне принимали клики, вы, вероятно, не хотите, чтобы все окно области перетаскивания. Фактически, вы можете не захотеть сделать все окно областью перетаскивания, даже если ему нечего что-то щелкнуть, потому что это не соответствует рекомендациям по интерфейсу для Mac или Windows. Вы можете подделать область захвата - полосу заголовка, границу вокруг окна и т.д. - например, добавив Label прикрепленный к стороне (сторонам), которую вы хотите захватить, и только bind туда, или создав "дочерняя" вставка окна из главного окна, которое крадет bind . Но это никогда не будет выглядеть как "родное" окно.

Если вам действительно нужно собственное окно, но с закрывающей рамкой ( X в верхнем правом углу Windows, красная точка в верхнем левом углу на Mac и т.д.) Отключена или отсутствует (и в Windows с помощью "закрыть" пункт в меню окна отключен, а также Alt + F4 и т.д., а также для X11. ). Насколько я знаю, в Tkinter нет кросс-платформенного способа сделать это. Вам нужно будет написать код для каждой платформы, которая попадает в основные исходные объекты окна и делает для них родные окна. В этот момент вы, вероятно, захотите использовать более мощную библиотеку окон, чем Tkinter-eg, я полагаю, что Qt, Gtk+ и wx имеют гораздо более простые способы создания обычного окна, но при отключенном флажке закрытия.

Как скрыть окно консоли в python?

Я хочу создать автономные двоичные файлы для Linux и Windows. И в основном я хочу, чтобы при запуске бота окно консоли должно скрываться, и пользователь не должен был видеть это окно.

Что я могу сделать для этого?

спросил(а) 2009-04-19T04:35:00+04:00 12 лет, 5 месяцев назад добавить комментарий пожаловаться

Просто сохраните его с расширением .pyw . Это предотвратит открытие окна консоли.

В системах Windows нет понятия "исполняемый режим". Установщик Python автоматически связывает файлы.py с файлом python.exe, чтобы двойной щелчок на файле Python запускал его как скрипт. Расширение также может быть.pyw, в этом случае окно консоли, которое обычно появляется, подавляется.

ответил(а) 2009-04-19T04:51:00+04:00 12 лет, 5 месяцев назад добавить комментарий пожаловаться

В linux просто запустите его, без проблем. В Windows вы хотите использовать исполняемый файл pythonw.

Update

Хорошо, если я понимаю вопрос в комментариях, вы спрашиваете, как сделать окно команд, в котором вы запустили бот из командной строки?

Я думаю, что правильно. В любом случае, теперь вы можете закрыть терминал.

ответил(а) 2009-04-19T04:44:00+04:00 12 лет, 5 месяцев назад добавить комментарий пожаловаться

В Unix-системах (включая Linux, macOS и BSD)

Используйте nohup mypythonprog & , и вы можете закрыть окно терминала, не нарушая процесс. Вы также можете запустить exit , если вы работаете в облаке, и не хотите оставлять зависающий процесс оболочки.

В системах Windows

Сохраните программу с расширением .pyw , и теперь она будет открыта с помощью pythonw.exe . Нет окна оболочки.

Например, если у вас есть foo.py , вам нужно переименовать его в foo.pyw .

ответил(а) 2013-03-01T03:30:00+04:00 8 лет, 6 месяцев назад добавить комментарий пожаловаться

Если все, что вы хотите сделать, это запустить Python Script на компьютере с Windows, на котором установлен Python Interpreter, преобразование расширения вашего сохраненного Script из '.py' в '.pyw' должно сделать трюк,

Но если вы используете py2exe для преобразования вашего Script в автономное приложение, которое будет запускаться на любой машине Windows, вам нужно внести следующие изменения в ваш файл setup.py.

Следующий пример представляет собой простой python-GUI, созданный с использованием Tkinter:

Измените "консоль" в приведенном выше коде на "windows"..

Это откроет только созданный графический интерфейс Tkinter и отсутствие окна консоли.

Как закрыть окно Tkinterа с помощью кнопки

Мы можем использовать функцию или команду, прикрепленную к кнопке в графическом интерфейсе Tkinter, чтобы закрыть окно Tkinter при нажатии на него пользователем.

root.destroy() Метод класса для закрытия окна индикатора

destroy() разрушает или закрывает окно.

destroy() Неклассический метод закрытия окна индикатора

Ассоциированная функция root.destroy к атрибуту command кнопки непосредственно

Мы могли бы напрямую привязать функцию root.destroy к атрибуту кнопки command без определения дополнительной функции close_window .

root.quit для закрытия окна Tkinter

root.quit выходит не только из окна Tkinter Window, а точнее из всего интерпретатора Tcl.

Он может быть использован, если ваше Tkinter-приложение не запущено с Python бездействующим. Не рекомендуется использовать root.quit , если ваше Tkinter-приложение вызвано из idle, потому что quit убьет не только ваше Tkinter-приложение, но и из idle, потому что idle также является Tkinter-приложением.

Сопутствующая статья - Tkinter Button


report this ad

Как скрыть окно консоли в python?

Я хочу создать автономные двоичные файлы для Linux и Windows. И в основном я хочу, чтобы при запуске бота окно консоли должно скрываться, и пользователь не должен был видеть это окно.

Что я могу сделать для этого?

ОТВЕТЫ

Ответ 1

Просто сохраните его с расширением .pyw . Это предотвратит открытие окна консоли.

В системах Windows нет понятия "исполняемый режим". Установщик Python автоматически связывает файлы.py с файлом python.exe, чтобы двойной щелчок на файле Python запускал его как скрипт. Расширение также может быть.pyw, в этом случае окно консоли, которое обычно появляется, подавляется.

Ответ 2

В linux просто запустите его, без проблем. В Windows вы хотите использовать исполняемый файл pythonw.

Update

Хорошо, если я понимаю вопрос в комментариях, вы спрашиваете, как сделать окно команд, в котором вы запустили бот из командной строки?

  • для Windows

Я думаю, что правильно. В любом случае, теперь вы можете закрыть терминал.

Ответ 3

В Unix-системах (включая Linux, macOS и BSD)

Используйте nohup mypythonprog & , и вы можете закрыть окно терминала, не нарушая процесс. Вы также можете запустить exit , если вы работаете в облаке, и не хотите оставлять зависающий процесс оболочки.

В системах Windows

Сохраните программу с расширением .pyw , и теперь она будет открыта с помощью pythonw.exe . Нет окна оболочки.

Например, если у вас есть foo.py , вам нужно переименовать его в foo.pyw .

Ответ 4

Если все, что вы хотите сделать, это запустить Python Script на компьютере с Windows, на котором установлен Python Interpreter, преобразование расширения вашего сохраненного Script из '.py' в '.pyw' должно сделать трюк,

Но если вы используете py2exe для преобразования вашего Script в автономное приложение, которое будет запускаться на любой машине Windows, вам нужно внести следующие изменения в ваш файл setup.py.

Следующий пример представляет собой простой python-GUI, созданный с использованием Tkinter:

Измените "консоль" в приведенном выше коде на "windows"..

Это откроет только созданный графический интерфейс Tkinter и отсутствие окна консоли.

Ответ 5

Это скроет вашу консоль. Сначала выполните эти строки в коде, чтобы сначала скрыть консоль.

Ответ 6

Дополнительная информация. для ситуаций, в которых потребуется решение win32gui, опубликованное Мохсеном Хаддади ранее в этой теме:

Начиная с python 361, win32gui & win32con не являются частью std-библиотеки python. Для их использования необходимо установить пакет pywin32; теперь возможно через pip.

Дополнительная информация о пакете pywin32 находится на: Как использовать модуль win32gui с Python? ,

Кроме того, чтобы применить дискрецию при закрытии окна, чтобы случайно не закрыть какое-либо окно на переднем плане, разрешение можно расширить по следующим строкам:

Как создать новое окно, нажав кнопку в Tkinter

В этом уроке мы покажем, как создать и открыть новое окно Tkinter, нажав на кнопку в Tkinter.

Создать новое окно Tkinter

Обычно мы используем tk.Tk() для создания нового окна Tkinter, но это недействительно, если мы уже создали корневое окно, как показано в вышеприведенных кодах.

Toplevel является подходящим виджетами в данном случае, так как виджет Toplevel предназначен для отображения дополнительных всплывающих окон.

Он привязывает функцию createNewWindow к кнопке.

Новое окно в приведенном выше примере является пустым, и вы можете добавить в него больше виджетов, так же как и в обычное корневое окно, но при этом необходимо изменить родительский виджет на созданное окно Toplevel .

Как вы могли видеть, labelExample и buttonExample имеют свой родительский виджет как newWindow , но не app .

Сопутствующая статья - Tkinter Button


report this ad

Читайте также: