pysimplegui之运行多个窗口
运行多个窗口
这就是 PySimpleGUI 继续简单的地方,但问题空间刚刚进入“复杂”领域。
如果您希望在事件循环中运行多个窗口,那么有两种方法可以做到这一点。
- 当第二个窗口可见时,第一个窗口不保持活动状态
- 第一个窗口保持活动状态,而第二个窗口可见
您将在 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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库