pysimplegui之运行多个窗口

运行多个窗口

这就是 PySimpleGUI 继续简单的地方,但问题空间刚刚进入“复杂”领域。

如果您希望在事件循环中运行多个窗口,那么有两种方法可以做到这一点。

  1. 当第二个窗口可见时,第一个窗口不保持活动状态
  2. 第一个窗口保持活动状态,而第二个窗口可见

您将在 GitHub(http://www.PySimpleGUI.com)的 Demo Program 区域中的 2 个演示程序中找到 2 个设计事项

非常重要 在创建新窗口时,您必须每次都使用“新”布局。您不能重复使用前一个窗口中的布局。结果,您将看到窗口 2 的布局是在更大的事件循环内定义的。

如果您有一个与窗口一起使用的窗口布局并且您已关闭该窗口,则您不能使用该窗口中的特定元素。layout每次创建新窗口时都必须重新创建变量。再读一遍那句话……layout每次创建新窗口时,都必须重新创建变量。这意味着您应该有一个以 . 开头的语句layout =很抱歉被困在这一点上,但是很多人似乎在遵循这个简单的指令时遇到了麻烦。

窗口布局的黄金法则

你不应该重复使用 Windows 的布局......永远!

或者更明确地说....

如果您正在调用,Window那么您应该在调用之前的语句中定义您的窗口布局Window

多窗口的演示程序

有几个“演示程序”可以帮助您运行多个窗口。请下载这些程序并按照他们为您创建的示例进行操作。

以下是您在查看演示程序时会发现的一些代码模式。

多窗口设计模式 1 - 两个窗口都处于活动状态

import PySimpleGUI as sg
# Design pattern 2 - First window remains active
layout = [[ sg.Text('Window 1'),],
[sg.Input(do_not_clear=True)],
[sg.Text(size=(15,1), key='-OUTPUT-')],
[sg.Button('Launch 2'), sg.Button('Exit')]]
win1 = sg.Window('Window 1', layout)
win2_active = False
while True:
ev1, vals1 = win1.read(timeout=100)
win1['-OUTPUT-'].update(vals1[0])
if ev1 == sg.WIN_CLOSED or ev1 == 'Exit':
break
if not win2_active and ev1 == 'Launch 2':
win2_active = True
layout2 = [[sg.Text('Window 2')],
[sg.Button('Exit')]]
win2 = sg.Window('Window 2', layout2)
if win2_active:
ev2, vals2 = win2.read(timeout=100)
if ev2 == sg.WIN_CLOSED or ev2 == 'Exit':
win2_active = False
win2.close()

多窗口设计模式 2 - 只有 1 个活动窗口

import PySimpleGUIQt as sg
# Design pattern 1 - First window does not remain active
layout = [[ sg.Text('Window 1'),],
[sg.Input(do_not_clear=True)],
[sg.Text(size=(15,1), key='-OUTPUT-')],
[sg.Button('Launch 2')]]
win1 = sg.Window('Window 1', layout)
win2_active=False
while True:
ev1, vals1 = win1.read(timeout=100)
if ev1 == sg.WIN_CLOSED:
break
win1.FindElement('-OUTPUT-').update(vals1[0])
if ev1 == 'Launch 2' and not win2_active:
win2_active = True
win1.Hide()
layout2 = [[sg.Text('Window 2')], # note must create a layout from scratch every time. No reuse
[sg.Button('Exit')]]
win2 = sg.Window('Window 2', layout2)
while True:
ev2, vals2 = win2.read()
if ev2 == sg.WIN_CLOSED or ev2 == 'Exit':
win2.close()
win2_active = False
win1.UnHide()
break
posted @   菩提浪子  阅读(2155)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示

目录导航