Как продолжить выполнение программы после открытия диалогового окна из tkinter?

BruT|4rce

Пользователь
Пользователь
Апр 10, 2020
7
5
3
Интернет.
Опять лезу на форум, т.к. в гугле ничего не нашёл даже в англоязычном сегменте.
Собственно суть проблемы заключается в том, что если я создаю окно tkinter, после этого действия программа останавливается, до конца взаимодействия с окном, а мне нужно чтобы после открытия окна дальше использовался код. Я слышал про создание каких-то события для tkinter окна, но как я понял там можно использовать только однострочный код, или как то так.
Надеюсь кто-нибудь с этим сталкивался и поможет мне.
Вот сам ОТРЕЗОК кода:
Код:
# Импортируем модуль ткинтер для остановки секундомера.
from tkinter import *

sek = input("Запустить секундомер?\n")
sek = sek.lower()
if sek in ("да",
          "йеп", "конечно",
          "го", "разумеется",
          "естественно", "запускай",
          "заводи", "включи",
          "включай", "yes"):
    
              print("Секундомер запущен...")

              # Переменная для остановки секундомера.
              stop = 1

              # Создаём команду обрывания цикла секундомера, для его закрытия.
              def click_button():
                  global stop
                  stop += 1
                  sekmenu.destroy()

              # Создание и персонализация окна остановки секундомера.
              sekmenu = Tk()
              sekmenu.title("Остановка секундомера")
              sekmenu.geometry("250x250")

              # Создание и настройка кнопки остановки секундомера.
              stopper = Button(text = "СТОП", background = "#555",
                               foreground = "#ccc", padx = "20",
                               pady = "8", font = "16",
                               command = click_button).pack()
              sekmenu.mainloop()

              # Объявляем переменные времени для секундомера.
              secs = 0
              mins = 0
              hours = 0

              while stop == False:
                   print("Проверка")
Уже после sekmenu.mainloop() код начинает ждать конца действия с sekmenu, а так как в теории после нажатия кнопки stopper это бы разрушало последующий цикл, для конца работы секундомера, то после нажатия этой кнопки тут программа будет завершаться.

Windows 7
Python 3.8.2
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Собственно суть проблемы заключается в том, что если я создаю окно tkinter, после этого действия программа останавливается, до конца взаимодействия с окном, а мне нужно чтобы после открытия окна дальше использовался код.
Чтобы tkinter, а точнее его основной цикл (mainloop) не блокировал основной поток вашей программы нужно запускать его (tkinter) в отдельном потоке. Вот пример:
Python:
# Импортируем модуль ткинтер для остановки секундомера.
import tkinter as tk
import threading
import time

stop = False


def make_window():

    def click_button():
        global stop
        stop = True
        sekmenu.destroy()

    # Создание и персонализация окна остановки секундомера.
    sekmenu = tk.Tk()
    sekmenu.title("Остановка секундомера")
    sekmenu.geometry("250x250")

    # Создание и настройка кнопки остановки секундомера.
    tk.Button(text="СТОП", background="#555", foreground="#ccc",
              padx="20", pady="8", font="16", command=click_button).pack()
    sekmenu.mainloop()


sek = input("Запустить секундомер?\n")
sek = sek.lower()
# поток для создания окна с кнопкой стоп
t1 = threading.Thread(target=make_window)
if sek in ("да", "йеп", "конечно", "го", "разумеется", "естественно",
           "запускай", "заводи", "включи", "включай", "yes"):

    print("Секундомер запущен...")
    # запуск потока
    t1.start()

while not stop:
    print("Проверка")
    time.sleep(1)
 
  • Мне нравится
Реакции: BruT|4rce

Форум IT Специалистов