WxPython wx.Frame Get/Set Position не работает в Wayland?Linux

Ответить
Anonymous
 WxPython wx.Frame Get/Set Position не работает в Wayland?

Сообщение Anonymous »

У меня есть приложение 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)< /code>, GetRect() всегда возвращают (0, 0, ширину, высоту). SetPosition() или SetRect() не оказывают видимого влияния на положение окна, хотя SetRect() правильно устанавливает ширину и высоту. Что дает? Некоторые приложения в Fedora 40, похоже, способны запоминать и восстанавливать свою позицию (например, Skype), так что, вероятно, это не системное ограничение. Но как мне сделать это для моего собственного приложения wxPython?
Вот минимальный пример, воспроизводящий поведение, о котором я говорю. Я также заметил, что сообщение EVT_MOVE не обрабатывается в Fedora, что может быть связано с проблемой (не включенной в этот пример).
#!/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()


Подробнее здесь: https://stackoverflow.com/questions/785 ... er-wayland
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»