繁体   English   中英

使用 Pysimplegui 一段时间后自动返回顶部 window 不活动

[英]Automatically back to top window after a certain time not active using Pysimplegui

我正在使用 PySimpleGUI(版本 4.55.1)为基于 python 的 Window 应用程序制作 GUI。 此应用程序中有许多屏幕。 出于安全原因,我需要实现:“如果在一段时间内(例如 1 分钟)GUI 上没有任何操作,则程序将自动返回顶部屏幕”

有什么方法可以用 PysimpleGUI 实现吗? 这个想法也对我有很大帮助。

谢谢

sg.Window 中有选项sg.Window auto_close=True ,但它现在不适用于多窗口sg.read_all_windows 因此,通过自己计算持续时间来完成更复杂的工作。 两种方法

  • 按 main_window 中的超时事件计数,它需要更多的编程技术。
  • 在 sub_window 中按element.Widget.after计数,它使代码更清晰,但使用 tkinter 代码。

案例 1 的演示代码。

import PySimpleGUI as sg

class Marqueen(sg.Text):

    def __init__(self, texts, size=80, font=('Courier New', 11), sep='  ~~~  ',
            t=200, fg='white', bg='green'):
        self.texts  = texts
        self.size   = size
        self.font   = font
        self.sep    = sep
        self.t      = t
        self.running = False
        self.index  = 0
        super().__init__('', size=size, font=self.font, relief=sg.RELIEF_SUNKEN,
            text_color=fg, background_color=bg)

    def start(self):
        message = self.sep.join(self.texts)
        text = message
        while len(text) < self.size:
            text += self.sep + message
        self.text = text + self.sep + text[:self.size]
        self.limit = len(text+self.sep)
        self.running = True
        self.run()

    def run(self):
        if not self.running:
            return
        self.update(self.text[self.index:self.index+self.size])
        self.update()
        self.index += 1
        if self.index == self.limit:
            self.index = 0
        self.Widget.after(self.t, self.run)

    def pause(self):
        self.running = False

    def stop(self):
        self.running = False
        self.index = 0

def new_window(index, duration=5):
    marqueen = Marqueen(news[index])
    layout = [[marqueen]]
    window = sg.Window(f'News', layout, finalize=True, no_titlebar=True,
        location = (450, 50*(index+2)))
    window.marqueen = marqueen
    window.duration = duration
    return window

font = ("Courier New", 16)
sg.theme("DarkGreen1")
sg.set_options(font=font)

index = 0
limit = 5
sub_wins = []

news = [
    ["France to start vaccinating children aged 5-11"],
    ["Comet Leonard has been dazzling the night sky in a pre-Christmas show"],
    ["Plans unveiled for high-tech '10-minute city' in Seoul"],
    ["France's $19 billion weapons deal is sweet revenge"],
    ["'Koala massacre' prompts hundreds of cruelty charges"],
]

frame = [[sg.Checkbox(f'Sub Window {i+1}', disabled=True, key=f'Check {i}')] for i in range(limit)]
layout = [[sg.Frame('', frame), sg.Button('New')]]
window = sg.Window("Multi-Window", layout, location=(100, 100), size=(300, 220), finalize=True)
for i in range(limit):
    window[f'Check {i}'].Widget.configure(disabledforeground='white')

while True:
    win, event, values = sg.read_all_windows(timeout=100)
    if event in (sg.WINDOW_CLOSED, 'Exit'):
        if win in sub_wins:
            win.marqueen.stop()
            win.close()
            sub_wins.remove(win)
            index -= 1
            window[f'Check {index}'].update(value=False)
            for i, w in enumerate(sub_wins):
                w.move(450, 50*(i+2))
        else:
            break
    elif event == 'New':
        if index == limit:
            continue
        w = new_window(index)
        w.marqueen.start()
        sub_wins.append(w)
        window[f'Check {index}'].update(value=True)
        index += 1
    elif event == sg.TIMEOUT_EVENT and sub_wins:
        for w in sub_wins:
            w.duration -= 0.1
            if w.duration <= 0:
                w.write_event_value(None, None)

for win in sub_wins:
    win.close()
window.close()

在此处输入图像描述

这是案例 2 的另一个最简单的演示代码

from random import randint
import PySimpleGUI as sg

def sub_win(duration=5):
    text = 'Sub Window'
    location = (randint(100, width-100), randint(100, height-100))
    layout = [[sg.Text(text)]]
    window = sg.Window(text, layout, location=location, finalize=True)
    window.TKroot.after(int(duration*1000), lambda win=window:win.write_event_value(sg.WINDOW_CLOSED, None))
    return window

width, height = sg.Window.get_screen_size()

layout = [[sg.Button('New Window')]]
window = sg.Window('Main Window', layout, keep_on_top=True, finalize=True)
windows = []
while True:

    win, event, values = sg.read_all_windows()
    if event in (sg.WINDOW_CLOSED, 'Exit'):
        if win in windows:
            windows.remove(win)
            win.close()
        else:
            break
    elif event == 'New Window':
        w = sub_win()
        windows.append(w)

for w in windows:
    w.close()
window.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM