[英]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
。 因此,通过自己计算持续时间来完成更复杂的工作。 两种方法
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.