首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PySimpleGui中打开几个窗口,每个窗口使用相同的函数,每个窗口都有一个时间间隔执行此函数。

如何在PySimpleGui中打开几个窗口,每个窗口使用相同的函数,每个窗口都有一个时间间隔执行此函数。
EN

Stack Overflow用户
提问于 2022-08-09 20:02:25
回答 1查看 143关注 0票数 0

如何在PySimpleGui中打开几个窗口,每个窗口使用相同的函数,每个窗口以一个时间间隔执行此函数。

该窗口具有相同的布局,它只是一个输出或多行来显示该函数正在做什么。

该函数有一个循环,运行时间约为24小时,但它可以运行0到'x‘小时。我使用Python和PySimpleGui

EN

回答 1

Stack Overflow用户

发布于 2022-08-10 02:52:15

不确定它是否一直工作,没有做更多的测试,只是为了演示,弹出窗口打开时放置不好。

注意:如果选项WINDOW_CLOSE_ATTEMPTED_EVENTenable_close_attempted_event设置为True,则当单击window的close按钮时,将不会从enable_close_attempted_event返回Window。这个时候可能是个虫子。

代码语言:javascript
复制
from time import sleep
import threading
import PySimpleGUI as sg

def function(win, username):
    global login
    while login[username][3]:
        sleep(1)
        win.write_event_value('ACK', username)
    win.write_event_value('Done', username)

def popup(username):
    sg.theme('DarkBlue4')
    layout = [[sg.ProgressBar(100, orientation='H', size=(20, 20), key='Progress')]]
    win = sg.Window(username, layout, finalize=True, enable_close_attempted_event=True)
    return win

users = {
    'Jason'  : '778877',
    'Michael': '123456',
    'William': 'aabbcc',
}

sg.theme('DarkBlue3')
layout = [
    [sg.Text('Username'), sg.Push(), sg.Input(do_not_clear=False, key='Username')],
    [sg.Text('Password'), sg.Push(), sg.Input(do_not_clear=False, key='Password')],
    [sg.StatusBar('', size=10, expand_x=True, key='Status')],
    [sg.Push(), sg.Button('Execute'), sg.Push()],
]
window = sg.Window('System', layout, finalize=True, enable_close_attempted_event=True)
status = window['Status']
login, windows, bye = {}, {}, False

while True:

    win, event, values = sg.read_all_windows()
    print(repr(event))
    if event == sg.WIN_CLOSED:  # sg.WINDOW_CLOSE_ATTEMPTED_EVENT:
        sg.theme('DarkBlue5')
        if sg.popup_yes_no("Are you sure to close ?") == 'Yes':
            if win in windows:
                username = windows[win]
                login[username][3] = False
            else:
                if login:
                    bye = True
                    for username in login:
                        login[username][3] = False
                else:
                    break
    elif event == 'Execute':
        username, password = values['Username'], values['Password']
        if username not in users:
            status.update('Wrong username !')
        elif password != users[username]:
            status.update('Wrong password !')
        elif username in login:
            status.update('User executing !')
        else:
            w = popup(username)
            thread = threading.Thread(target=function, args=(w, username), daemon=True)
            login[username] = [w, thread, 0, True]
            windows[w] = username
            thread.start()

    elif event == 'ACK':
        username = values[event]
        login[username][2] = count = (login[username][2] + 10) % 101
        win['Progress'].update(count)

    elif event == 'Done':
        username = values[event]
        win.close()
        del login[username]
        del windows[win]
        if not login and bye:
            break

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73297469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档