【问题标题】:PySimpleGUI / Tk: very slow startup on MacPySimpleGUI / Tk:在 Mac 上启动非常慢
【发布时间】:2021-04-29 12:44:38
【问题描述】:

我花了很多时间试图理解为什么在 Mac OS X 上使用 Tk 加载 PySimpleGUI 需要这么多时间。

更具体一点:

window.refresh()

我的(非常简单的)完整 UI 需要 9 秒。我为调查减少了它,所以现在需要 3 秒。

大约有 1/7 的时间发生这种情况,而其他时间通常很短。 Windows 上的同一个应用程序不会显示此问题。

简化后的 UI 是这样的:

布局如下:

Top (2)
--- Row ------->
------- Column ()
--------|--- Btn "Camera" | Btn "Close"
--------|--- 
--- Row ------->
------- Column (left-col)
--------| Row ------->
--------|--- Btn "4" | Btn "10" | Btn "20" | Btn "40" | 
--------|---- Column ()
--------|-----|--- CB "Scale Bar"
--------|-----|--- CB "White Bar"
--------| Row ------->
--------|--- Btn "BrFd" | Btn "DAPI" | Btn "FITC" | Btn "CY3"
--------| Row ------->
--------|--- Multiline | Btn ""
--------| Row ------->
--------|--- Multiline | Btn ""
--------| Row ------->
--------|--- Btn "" | Btn "Show Last" | Btn "Save" | Btn "Export IJ"
--------| Row ------->
--------|--- Btn "Export TIF" | Btn "Delete Checked"

我使用分析器运行它:

rm prof && python -m cProfile -o prof uscope.py

然后使用此代码:

import pstats
from pstats import SortKey
p = pstats.Stats('prof')
p.sort_stats(SortKey.CUMULATIVE).print_stats(10)

得到这个分析:

2021 年 4 月 29 日星期四 15:10:39 教授 在 4.099 秒内完成 204224 次函数调用(199897 次原始调用) 排序:累计时间 由于限制,名单从 2141 减少到 10 ncalls tottime percall cumtime percall filename:lineno(function) 552/1 0.003 0.000 4.100 4.100 {内置方法builtins.exec} 1 0.000 0.000 4.100 4.100 uscope.py:24() 1 0.000 0.000 3.460 3.460 /Users/u/Prog/c/pbio-printer/camera2/VerySimpleGUI2.py:335(build_and_run) 393/389 3.170 0.008 3.170 0.008 {“_tkinter.tkapp”对象的“调用”方法} 1 0.000 0.000 2.978 2.978 /Users/u/opt/miniconda3/envs/camera/lib/python3.7/site-packages/PySimpleGUI/PySimpleGUI.py:8247(刷新) 1 0.000 0.000 2.978 2.978 /Users/u/opt/miniconda3/envs/camera/lib/python3.7/tkinter/__init__.py:1175(更新) 278/10 0.002 0.000 0.638 0.064 :978(_find_and_load) 277/10 0.001 0.000 0.638 0.064 :948(_find_and_load_unlocked) 386/11 0.000 0.000 0.636 0.058 :211(_call_with_frames_removed) 258/8 0.001 0.000 0.635 0.079 :663(_load_unlocked)

有问题的行似乎是这一行:

 393/389    3.170    0.008    3.170    0.008 {method 'call' of '_tkinter.tkapp' objects}

非常感谢您提供有关此问题的任何线索!

【问题讨论】:

  • 致@TkinterLover:我看了看,无法理解这种关系。问题是无限添​​加元素,而在这里我正在构建一个静态 GUI
  • @TheLizzard,这不是我的代码,而是PySimpleGUI,无论如何:为什么只有 Mac?为什么只有 15% 的时间?
  • @TheLizzard 我试图用 tkinter 调用替换 PySimpleGUI 调用 window.refresh() 直接访问窗口的各个 tkinter 组件 window.TKroot.update(),但结果是一样的 - 只是这个函数时不时地占用 9 秒甚至更长的时间。所以,在我看来,这里的问题不是 PySimpleGUI 造成的。 (正如@ishahak 所提到的,为什么当 PySimpleGUI 在两者上的代码相同时,MacOS 和 Win 之间会有所不同?)
  • @ishahak 您是否仅在开始时(第一次设置 GUI)或一直观察到刷新问题?我注意到,在开始添加欢迎窗口后,我能够删除 Mac 上的大部分 refresh() 调用(在 Win 中仍然需要,但在 Win 中刷新要快得多,所以没什么大问题) - 就像 tkinter 需要某种开始/初始事件,然后它的反应要快得多。昨天在测试中(在如上所述进行代码更改之后),我已经连续启动了 40 多次应用程序,每次都花费不到 3 秒;比以前好多了!

标签: tkinter pysimplegui cprofile


【解决方案1】:

对此我没有很好的解释,但感谢@lenka_cizkova 添加的评论,我现在可以提供解决方法

通过添加一个启动屏幕,即使是一个非常短的屏幕(100 毫秒),主屏幕也会立即加载:

# Splash screen to eliminate long loading time on Mac OSX
if os.name != 'nt':
    SPLASH_IMAGE_FILE = 'img/my-logo.png'
    DISPLAY_TIME_MILLISECONDS = 100
    sg.Window('',
              [[sg.Image(SPLASH_IMAGE_FILE)]], transparent_color=sg.theme_background_color(),
              no_titlebar=True, keep_on_top=True).read(timeout=DISPLAY_TIME_MILLISECONDS, close=True)

此代码应在构建和显示主窗口之前放置。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 2016-02-28
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多