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