Окно сообщений Tkinter не исчезает после нажатия 'ok / подтверждения - PullRequest
0 голосов
/ 31 октября 2019

Я написал небольшой скрипт для отслеживания емкости аккумулятора моего устройства. В основном для изучения Python.

Я решил использовать цикл для распознавания малой емкости. Пока все в порядке, но когда я использую tkinter messagebox, окно не исчезает после подтверждения предупреждения.

import os
from time import sleep
import tkinter as tk 
from tkinter import *
from tkinter import messagebox

stat = "/sys_vars/status"
plugged = "PLUGGED"
unplugged = "UNPLUGGED"
batfile = "/sys_vars/capa"

root = tk.Tk() 
root.withdraw() 

def read(sysfile):
    with open(sysfile, "r") as f:
        return f.read()

def loopcheck():
    plug = str(read(stat).strip())
    bat = int(read(batfile))
    if plug == plugged:
        sleep(2)
    if plug == unplugged and 6 <= bat <= 15:
        messagebox.showwarning("Alert!","Battery Low!\nCharging  Required!")
        sleep(2)
    if plug == unplugged and bat <= 5:
        messagebox.showwarning("ALERT!","Battery ULTRA Low!\nCharging  Required!")
        sleep(2)

if __name__ == "__main__":
    messagebox.showinfo("Running!","Battry Status Tracker is now running on machine")
    while True: 
        loopcheck()

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

Переменные и короткий таймер сна в этом примере предназначены для тестов.

1 Ответ

1 голос
/ 01 ноября 2019

Вместо while True и sleep(2) вы должны использовать root.after(2000, loopcheck) для запуска функции с задержкой. Он не будет блокировать root.mainloop(), который должен запускаться все время, чтобы получать события клавиатуры / мыши из системы, отправлять события в виджеты и перерисовывать окна / виджеты.

У меня нет этих /sys_vars для проверкино это может быть что-то вроде этого:

import tkinter as tk 
from tkinter import messagebox

stat = "/sys_vars/status"
plugged = "PLUGGED"
unplugged = "UNPLUGGED"
batfile = "/sys_vars/capa"

def read(sysfile):
    with open(sysfile, "r") as f:
         return f.read()

def loopcheck():
    plug = str(read(stat).strip())
    bat  = int(read(batfile))

    if plug == unplugged:
        if 6 <= bat <= 15:
            messagebox.showwarning("Alert!","Battery Low!\nCharging  Required!")
        elif bat <= 5:
            messagebox.showwarning("ALERT!","Battery ULTRA Low!\nCharging  Required!")

    root.after(2000, loopcheck)

if __name__ == "__main__":

    root = tk.Tk() 
    root.withdraw() 

    messagebox.showinfo("Running!","Battry Status Tracker is now running on machine")
    root.after(2000, loopcheck)

    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...