Pysimplegui: [问题] * MAC用户* no_titlebar对您有用吗?

创建于 2020-10-28  ·  30评论  ·  资料来源: PySimpleGUI/PySimpleGUI

问题类型(增强,错误,错误,问题)

错误/ tkinter问题

no_titlebar有效吗?
工具提示有效吗?

操作系统

苹果电脑

Python版本

3.6+

PySimpleGUI端口和版本

在这里,事情变得重要起来很重要。

我想从运行8.610的人和不运行8.6.10的人那里得知。

我试图了解这是否特定于8.6.10。

您可以通过在代码中添加以下行来获取详细的tkinter版本:

print(sg.tkinter.Tcl().eval('info patchlevel'))

问题/问题/详细信息的描述

我记得在Mac上出现no_titlebar问题,如果有问题,我想齐心协力解决它们。 我确实需要几个Mac用户的可靠帮助。

我需要可以做到这些的人:

  • 获取准确的Tkinter版本信息(提供了我的代码)
  • 发布到GitHub时可以尝试几个潜在的修复程序

要复制的代码

一个简短的程序,可以隔离并演示该问题(即,请不要粘贴指向您的400行程序的链接...。而是完全粘贴10行程序)。

是的,要缩小问题范围很痛苦,但这是调试过程的一部分。 通过提供可以执行的内容来帮助我,以帮助您立即进行修复或解决方法。

此预格式化的代码块已全部设置好,可粘贴到您的代码中:

print(sg.tkinter.Tcl().eval('info patchlevel'))

您可以通过运行以下命令来测试是否有问题:

import PySimpleGUI as sg

sg.popup_no_titlebar('This should not have a titlebar')

image

Mac Specific Issue community input desired help wanted

所有30条评论

过去进行调试的部分问题是,从来没有真正制作过合适的表来进行调试。 有3个变量在起作用:

  1. PySimpleGUI版本
  2. tkinter版本
  3. MacOS版本

很多时候,重点是tkinter版本。 我不确定tkinter是否负责所有看到的问题。

这是我的细分:

PySimpleGUI v4.30.0
tkinter v8.6
MacOS 10.15.7

我还想提到我将Homebrew用于python二进制文件。

Screen Shot 2020-10-28 at 8 10 31 PM

编辑:

Python v3.8.1

macOS High Sierra版本10.13.6
PySimpleGUI版本4.30.0.12
tcl ver = 8.6 tkinter版本= 8.6
tcl详细版本= 8.6.10
Python版本3.8.6

而且...有效!
it_works

编辑:使我对tkinter的头痛最少的环境:

自制-> brew install tcl-tk
自制-> brew install pyenv-> Python(见下文)

env \
  PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
  LDFLAGS="-L$(brew --prefix tcl-tk)/lib" \
  CPPFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
  CFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PYTHON_CONFIGURE_OPTS="--enable-framework --with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl8.6 -ltk8.6'" \
  pyenv install 3.8.6

pyenv global 3.8.6

并使其成为我的默认python:

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

我遵循了@norambna列出的所有步骤,并为我工作。 不过,跳过所有障碍有点麻烦。

Python v3.8.6
PySimpleGUI v4.30.0
tkinter v8.6
MacOS 10.15.7
pyenv v1.2.21
tcl-tk v8.6.10

image

我很高兴它有所帮助! 我知道我很难找到解决所有macOS / tkinter问题的解决方案。 这不能解决所有的tkinter问题,但是显然,这是在macOS上使用它的最佳方法。

看来tkinter版本8.6.10是什么解决了此问题?

如果除8.6.10之外的所有版本都有问题,那么我可以检查该版本并将“修复”仅应用于非8.6.10版本。

我真正感到困惑的是,如果这是最近出现的问题,或者没有标题栏在Mac上从未使用过。 它永远都不会起作用似乎很奇怪,但是很难确定。

我所看到的“修复”可能会破坏其他内容,这就是为什么我犹豫将其添加到代码中的原因。

这些步骤非常丑陋,所以我认为我必须对此做些事情。 不能指望用户会遇到这么多麻烦。 我将整理一个GitHub发行版,其中包含检查tkinter版本号并仅在版本不是8.6.10时应用的修补程序。

看来tkinter版本8.6.10是什么解决了此问题?

对我来说,是的。 8.6.10解决了很多问题。

我刚刚发布了4.30.0.13,其中包含一个补丁(如果该版本低于8.6.10)。

如果这“解决”了问题,那么我想再尝试一个补丁。 首次设置后,此新补丁将清除wm_overrideredirect标志。

root.wm_overrideredirect(True)
root.wm_overrideredirect(False)

我接下来要尝试的是再次将其设置为True,以便该操作为True False True。 这里的想法是,对于某些系统,如果将该值设置为True,它可能会正常工作。 我不希望做的是中断所有今天可以正常运行的安装,然后再次将其设置为True,这可能会提供一种解决方法,可以在Mac上的所有tkinter版本上执行正确的操作。

如果应用了补丁,您将在控制台上看到此消息:
* Applying Mac no_titlebar patch *

一种测试方法是通过测试工具,这将使您不必编写代码即可调用和测试弹出窗口。 测试工具中的一个标签(通过运行PySimpleGUI.py文件或调用sg.main()调用)用于测试弹出窗口。

image

这将使您快速检查无标题栏窗口以及带有标题栏的弹出窗口。

由于背景与测试窗口相同,因此可能很难发现。 如果单击No Titlebar按钮,您将看到这个小窗口

image

我希望这可以修复非8.6.10版本,并且不能在8.6.10+上运行。 如果没有,我将迅速进行另一项测试,以查看是否再次将其设置为可行。

如果我们确定了这一点,我会将发布作为高优先级发布发布到PyPI。

我需要Mac用户的帮助

有一个发布到GitHub的补丁程序试图解决这个没有标题栏的问题。 我需要了解是否:

  • 该修补程序解决了非8.,6.10系统上的问题
  • 该修补程序不会导致8.6.10出现问题

有人可以下载GitHub版本并尝试吗?

我很乐意提供帮助。 我已经完成了tkinter版本的所有设置,但是我不确定如何导入PySimpleGUI的4.30.0.13版本。 您如何精确下载并使用该版本?

大多数更新版本中应具有相同的补丁程序。

使用PySimpleGUI从GitHub升级

不确定该补丁如何处理。 我现在将发布的内容汇总到PyPI,并且没有在Mac上对其进行正确的测试,我将不得不从发布中提取代码。 我宁愿发布一个已知的问题,也不愿发布一系列潜在的新问题。 当然,我更喜欢将其永久修复并发布到PyPI。

如果有Mac用户能够运行一些测试,我(我猜想您的Mac同事中的一些用户)将很乐意提供帮助。

在等待Mac用户测试新代码时,我不想延迟发布。 因此,我添加了更多代码来控制补丁执行的时间。 我不能只是丢掉这个“修复程序”,并可能破坏现有的Mac用户。 嗯,从技术上讲我可以,但是我不希望为今天拥有有效代码的用户创建问题。

要在Mac上的无标题栏窗口中启用补丁,请调用set_options ,并将参数enable_mac_notitlebar_patch设置为True。

    sg.set_options(enable_mac_notitlebar_patch=True)

创建无标题栏窗口时,该补丁将引起其他呼叫:

root.wm_overrideredirect(False)

该修补程序仅在运行tkinter版本<8.6.10的Mac上执行。

默认情况下,补丁是禁用的。 您必须采取肯定性措施才能通过调用set_options获得补丁。

该代码的版本为4.30.0.26,现在在GitHub上。 它将很快在版本4.31.0中发布。

就像我之前说过的,我愿意在您先前的补丁上运行任何测试。 我有两个运行不同版本操作系统的不同Mac设备。 我也在运行各种版本的python和tcl / tk。

抱歉,这是一个愚蠢的问题,但是如何安装这些版本(4.30.0.13或4.30.026)? 我通常使用pip install,但是如果我做了一些其他的事情,那么我需要一些指导来帮助您。

4.31.0已于今天早些时候发布到PyPI。 您可以像安装其他版本一样安装它。

在上一篇文章中添加代码行,您将在启用补丁的情况下运行。

 sg.set_options(enable_mac_notitlebar_patch=True)

您可以使用sg.main()用户界面安装GitHub版本,方法是单击显示“ Upgade”的红色按钮。 4.31.0是GitHub上的当前版本,已发布到PyPI。

我对tcl / tk的不同版本(8.5.9、8.6.8、8.6.10)进行了一些不同的测试,发现原始代码
image
将使标题栏看起来被禁用,但是我可以单击最小化或x按钮。 如果我将其最小化然后再备份,则标题栏将被完全禁用。 这在8.5.9和8.6.8上都发生。 一切对于8.6.10都有效。 (如之前的评论中所述)

接下来,我尝试用您的补丁程序运行它。
image
最终发生的事情是标题栏处于活动状态,最小化按钮和x按钮均起作用,当我最小化它并使窗口重新备份时,它会被禁用,类似于我上面提到的。

因此,问题在8.6.8和更低版本中仍在发生。

这是使用tkinter获取无标题栏可拖动窗口的原始代码。
image
我在四处搜寻以解决此隐藏标题栏的问题时找到了这段代码。 这是使用tcl / tk 8.6.8或更低版本
https://stackoverflow.com/questions/29641616/drag-window-when-using-overrideredirect

版本号
MacOS:10.15.7
PySimpleGUI:最新4.31.0
的Python:3.8.1,3.8.6,3.9.0

对于tcl / tk 8.6.8或更低版本
补丁程序或原始示例均无效

您是否在控制台上看到一条消息,说明正在应用补丁?

测试奇怪的是,我用来实现无标题栏的技术是以前在此处发布的一种技术。 基本上是重复覆盖,但值为False。 奇怪的是,似乎有一种新的锁定行为。

您能否确保看到以下消息:

'* Applying Mac no_titlebar patch *

如果您没有看到此消息,则说明未应用补丁。

如果您除了打印tkinter的版本之外,还打印了PySimpleGUI的版本,这将很有帮助,以确保我们正在使用我们认为是的变量组合。

我越来越怀疑MacOS也可以在这里发挥作用。 直到今年年初,我才听说没有标题栏问题和工具提示问题。 这些功能是PySimpleGUI中第一个发布的功能,但是直到不久之前,还没有关于这些功能存在问题的报告。

拖动的任何地方都没有讨论过,它是新数据。 我们能集中精力测试无标题栏代码并使其正常工作吗?

Mac的用户必须运行tkinter 8.6.10才能解决此问题。 我花了太多时间和精力在一个显然是Mac软件中的错误的问题上。 无法测试代码使这几乎是不可能完成的任务。

我以前曾经在这里碰过tk按钮错误,这是6年来一个已知的问题,但尚未解决。 解决的方法是在PySimpleGUI中添加对ttk按钮的支持。 这是很多工作,但最终允许Mac用户使用PySimpleGUI。 与该错误不同,此错误似乎引起了tkinter / Mac开发人员的注意,并已在8.6.10中修复。 这意味着Mac用户有一条自己可以遵循的途径,而无需在代码中添加此类黑客和变通方法。

我喜欢我的Mac用户,但是当用户数量很少时,很难证明为支持该平台投入过多资金是合理的。 我认为Mac的安装量从未突破10%。

image

是的,对于一小群用户而言,这似乎是一个巨大的麻烦。 我刚刚下载了macOS v11(本周新增),并且似乎有一些不同的行为。 例如,与我以前的帖子不同,现在最小化和x按钮已完全禁用。

我还注意到在macOS v11上使用tkinter的一件事是,对于tk / tcl v8.5.9,我只需要说root.overrideredirect(True)就没有标题栏,但是当我尝试在tk / tcl v8.6.8上做同样的事情时它不起作用。 我还是要做

root.overrideredirect(True)
root.overrideredirect(False)

为了使它工作。

仅供参考,我收到一条日志消息,指出正在应用补丁。 我使用的PySimpleGUI的版本是4.31.0,发布于2020年11月13日。

我不介意使用Mac平台特有的代码来支持一小部分用户。 问题在于它一直是一个移动的目标。 我最近找不到稳定的立足点。 Mac用户切换到从Python.org而不是Homebrew安装后,事情似乎进展顺利。 这使每个人都摆脱了按钮和表格存在问题的发行版。 但是后来似乎有所改变。 我认为可能是Mac OS。

正如我前面提到的,有3个变量在起作用。 有tkinter版本,PySimpleGUI版本和MacOC版本。 我要从该列表中删除Python版本,因为尽管tkinter与Python打包在一起,并且可能在一个Python版本与另一个Python版本之间有所不同,只要我们跟踪tkinter版本,那么Python版本并不重要。 我对结果没有把握,因为组合是针对这3个变量的,而不是有时报告“它不起作用”的报告。

用8.5.9做任何事情都太早了。 PySimpleGUI支持Python 3.4及更高版本,距今已有6年了。 这是一个挑战,但是这是合理的,因为Raspberry Pi通常随该版本的Python一起提供。 除了强迫Pi用户更新其Python版本外,我无能为力,而我宁愿不发生这种情况,因为这不是一件容易的事。

8.5.9于10年前发布。 某些情况下...同年发布了8.5.9,因此发布了2.7.0。 Python 3的版本为3.1。 它退回的路太远,没有任何实际价值。 我了解您使用它的上下文,这是为了证明一次没有标题栏起作用,但是十年前找到任何东西的有效版本是相当极端的。 这是软件的一生。

听说MacOS v11与tkinter的运行方式有任何关系,这更加令人气愤。 操作系统本身对tkinter和Python的工作方式没有影响……为零。

令人遗憾的是,该修补程序没有产生积极的影响,因为它将wm_overrideredirect设置回False可以解决此问题。 这是在Mac上为无标题栏执行的代码:

                MyFlexForm.TKroot.wm_overrideredirect(True)
                # Special case for Mac. Need to clear flag again if not tkinter version 8.6.10+
                if sys.platform.startswith('darwin') and ENABLE_MAC_NOTITLEBAR_PATCH and (sum([int(i) for i in tclversion_detailed.split('.')]) < 24):
                    print('* Applying Mac no_titlebar patch *')
                    MyFlexForm.TKroot.wm_overrideredirect(False)

在将wm_overrideredirect设置回False之前,将显示消息“ Application Mac no_titlebar修补程序”。

我很想发布一个PySimpleGUI版本,该版本可在所有tkinter的所有版本上与所有Mac OS版本一起使用,但这是自PySimpleGUI首次启动以来我一直在尝试的工作,并且似乎最新的努力一直在达不到。

我目前所知道的唯一已知的可行修复程序是要求Mac用户安装8.6.10。 这似乎产生了有效的结果。 当有人尝试创建无标题栏窗口或尝试设置工具提示时,PySimpleGUI“修复程序”将逐渐变为一条错误消息。 从可用性角度来看,这是一个糟糕的解决方案,但我认为没有其他方法可以解决此问题。 它超越了要求用户安装十年版本的tkinter的要求。

我担心使用Python和tkinter的自制软件安装。 仅在去年,我们才发现自制软件是问题的根源,而从Python.org进行安装可以解决这些问题。

如果要尝试将其他调用添加到wm_overrideredirect或对tkinter root对象执行其他操作,则可以使用Window成员变量window.TKroot直接访问它

我不认为它们相关,但是您可能想尝试关闭窗口的modal设置作为测试。

我只想清除有关tk / tcl 8.5.9的信息...我使用该版本的唯一原因是因为它与Homebrew python 3.9.1安装一起打包。 我只是在使用他们给我的东西。 因此,就像您说的那样,这可能是一个自制问题。

我会花一些时间来下载一些python.org版本。 我帮您解决这个问题没有问题。 也许我可以进行一些测试,以更好地控制不同的变量。 我可能需要一些时间来执行此操作,但是如果您有除我之前提到的内容之外想让我尝试的特定内容,请告诉我。

我想提到的另一件事是,当我使用tkinter并调用root.overrideredirect(True)一个窗口甚至都不会出现。 因此,如果您问我,这里还有更多事情要做,因为使用PySimpleGUI时,该窗口会出现,尽管它不会删除标题栏,只会禁用它。 (对于版本<8.6.10)

我帮您解决这个问题没有问题。

好吧....我要抓住这个机会。 我想解决这个问题,以免Mac用户被迫安装8.6.10。 正如上面的注释所示,这不是一件容易的事。

tk / tcl 8.5.9 ...我使用该版本的唯一原因是因为它与Homebrew python 3.9.1安装一起打包。

哇。。。。

为什么使用Homebrew进行Python安装不是一个好例子。 一方面,我可以看到有人在说,因为“它有效”,所以可以使用,但并不是那么简单。 自从8.5.9起,tkinter的代码添加量必须很大,因为tkinter十年来一直没有停滞。

我发现这是一个令人震惊的消息。 :-(多么艰难的战斗。

请尝试从Python.org安装。 一段时间以前,我在文档中添加了从Python.org安装的需要:

https://pysimplegui.readthedocs.io/zh-CN/latest/#macs

真奇怪,这些问题似乎无处不在。 即使Mac用户数量很少,他们的确存在并且他们在tkinter上使用PySimpleGUI。 我敢肯定,如果此功能在2年前被破坏,那么有人会说些什么。 他们最肯定抱怨按钮的颜色问题。

如果对测试进行了精心组织和跟踪,那就太好了。 组合矩阵将非常有帮助。

_我想看看是否有办法尝试所有版本的较旧版本,然后继续前进直至出现问题。

那是我理想的计划。

只是我的2美分。 我不是Mac用户,但是我必须在python中为macOS开发某些东西,所以这是我有限的经验。

几个月前,当我尝试选择选项时,我尝试了直接从python.org下载的python版本。 那时,我花了大量时间使用python.org版本3.6.8,该版本与Tcl / Tk 8.6.8捆绑在一起。 当尝试使用PySimpleGUI的各种元素时,它肯定存在错误。 我认为这只是tkinter,对于macOS来说还不够完善。 默认情况下,Python的Homebrew版本不随Tcl / Tk一起提供(请参阅此处此处),但是当然可能有许多非官方的“ brew”。 Pyenv版本不随Tcl / Tk一起提供。 我使用上面发布的技巧尝试Tcl / Tk 8.6.10。 如我所说,它仍然不是完美的,但是在我的测试中,它绝对是更好的选择。 我必须制造一个产品,测试什么有效,什么无效,然后使用对我的项目有用的东西。

顺便说一句,模态窗口不适用于python.org版本3.6.8,该版本与Tcl / Tk 8.6.8捆绑在一起,它们也给pyenv python和Tcl / Tk 8.6.10带来了问题。 看这里

编辑:macOS随附Tcl / Tk 8.5.9作为操作系统的一部分。 这就是为什么如果您的python没有与较新版本的Tcl / Tk捆绑在一起,则获得该版本的原因。 因此,如果您正在使用python的常规brew安装,则该python将使用操作系统随附的Tcl / Tk版本。 这就是为什么使用常规的自制python时会得到Tcl / Tk 8.5.9的原因。 这就是为什么我的把戏必须明确指示pyenv的python使用tcl-tk的较新brew安装

哦...我忘了那个模态的东西。

我们一直在运行的弹出测试可以在禁用模式的情况下进行尝试。

@tkozzer ....您能尝试这个弹出测试吗?

sg.popup_no_titlebar('This should not have a titlebar', modal=False)

另外,为确保drag_anywhere不会造成麻烦,也请尝试此弹出窗口。

sg.popup_no_titlebar('This should not have a titlebar', modal=False, grab_anywhere=False)

为了最大程度地控制和查看设置的选项,切换到制作Window可能是一种更好的测试方法。 这是我们可以处理此问题的程序:

import PySimpleGUI as sg


layout = [[sg.Text('A no-titlebar test')],
          [sg.Button('Ok'), sg.Button('Exit')]]

window = sg.Window('Title', layout, no_titlebar=True, grab_anywhere=False, modal=False)

while True:
    event, values = window.read()
    print(event, values)
    if event in (sg.WIN_CLOSED, 'Exit'):
        break

window.close()

我今天将发布一个版本,因为需要一些更改才能快速了解PyPI。 如果Mac,所有tkinter所有版本的模式窗口确实被破坏,那么我将在此版本中禁用它们。 有人可以验证模式窗口对于8.6.10和其他版本不能正常工作吗? 我仍然不清楚产生这些不同问题的tkinter和MacOS的组合。

我可以确认模式窗口不适用于Tcl / Tk 8.6.8附带的python.org python 3.6.8。 而且它们不适用于pyenv的python 3.6.11和Homebrew的Tcl / Tk 8.6.10。 那是我尝试解决该特定问题的唯一版本。

pyenv本身不提供任何软件包/库。 它有助于配置。 您仍然必须选择安装什么,然后选择要切换的内容。

对于Mac,Python版本与tkinter无关紧要,我认为是MacOS版本。 tkinter 8.6.8应该在3.6、3.7、3.8、3.9上完全相同地运行。 至少在Windows上安装3.6、3.7等时,可以安装哪种版本的tkinter。 从Python.org获得Python的一个原因是,您确实获得了与安装一起打包的特定版本的tkinter。

Python版本与tkinter无关紧要,我认为MacOS版本

适用于我所有测试的macOS High Sierra版本10.13.6。

此页面是否有帮助?
0 / 5 - 0 等级