wxPython wx.Frame 获取/设置位置在 Wayland 下不起作用?

问题描述 投票:0回答:1

我有一个 wxPython 应用程序,它通过在关闭时将其写入配置文件来记住其窗口位置和大小,并在启动时从配置文件中恢复它们。在 Windows 上运行多年没有任何问题。最近我不得不在 Linux 上使用它。我尝试过以下两种配置:

#1 MX Linux KDE
Python 3.11.2
wx.__version__
'4.2.0'
KDE Plasma 5.27.5
Kernel 6.1.0-17-amd64
X11

#2 Fedora 40 KDE
Python 3.12.3
wx.__version__
4.2.1
KDE Plasma 6.0.5
Kernel 6.8.10-300.fc40.x86_64
Wayland

在 MX Linux 上,它的工作原理与 Windows 上大致相同。然而,在 Fedora 上,我只能获取或设置窗口的宽度和高度,而不能获取其左上角位置:

GetPosition()
GetScreenPosition()
始终返回
(0, 0)
GetRect()
始终返回
(0, 0, width, height)
。尽管
SetPosition()
正确设置了宽度和高度,但
SetRect()
SetRect()
对于窗口位置没有明显影响。是什么赋予了? Fedora 40 上的某些应用程序似乎能够记住并恢复其位置(例如 Skype),因此这可能不是系统限制。但是我该如何为我自己的 wxPython 应用程序做到这一点呢?

这是重现我正在谈论的行为的最小示例。我还注意到 Fedora 上未处理

EVT_MOVE
消息,这可能与该问题有关(未包含在本示例中)。

#!/usr/bin/env python3
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, window_id, title):       
        wx.Frame.__init__(self, parent, window_id, title)
        self.Bind(wx.EVT_CLOSE, self.OnClose)       
        self.Show(True)

    def ReadSettings(self):
        rect = [0, 0, 100, 100]
        try:
            with open("settings.txt", "r") as f:
                rect = [int(s) for s in f.read().split(",")]
        except:
            pass
        self.SetSize(*rect)

    def WriteSettings(self):
        with open("settings.txt", "w") as f:
            f.write(",".join((str(s) for s in self.GetRect())))
    
    def OnClose(self, evt):
        self.WriteSettings()
        self.Destroy()

app = wx.App(0)
frame = MainWindow(None, -1, "Test")
frame.ReadSettings()
frame.Show(1)
app.MainLoop()
linux wxpython x11 wayland
1个回答
0
投票

根据我在互联网上读到的内容,这确实是 Wayland 的一个“功能”,一般与 wxPython 或 GUI 库无关(PyQt 的行为方式相同):Wayland 不允许应用程序设置其顶级窗口位置。这是设计使然。没有解决方法。除了远离韦兰之外,没有什么可做的。

© www.soinside.com 2019 - 2024. All rights reserved.