wxPython — кадр, появляющийся в основном за кадром, сам по себе.Центр() не работает — связано с настройками системного дисплея?

#python-3.x #wxpython

Вопрос:

*Примечание: Я определил, что эта проблема связана с настройками моего дисплея. Когда я запускаю свой код на своем ноутбуке (настройки дисплея win. 10: разрешение = 1920×1080, масштаб = 150%), возникает проблема. Когда я на работе, с ноутбуком, подключенным к внешнему монитору большего размера (настройки дисплея w10: разрешение 1920×1080, масштаб=100%), все в порядке и отлично. Есть ли способ создать этот кадр таким образом, чтобы он отображался правильно независимо от настроек дисплея пользователя? Я подозреваю, что многие из моих пользователей столкнутся с этой проблемой-мы все используем одну и ту же модель ноутбука и аналогичные внешние дисплеи, и настройки дисплея, о которых я упоминал выше, являются настройками дисплея W10 по умолчанию (/»Рекомендуется») для соответствующих дисплеев.

У меня есть программа, которая работает нормально до самого последнего кадра. В предыдущих версиях последний кадр отображался нормально. Затем, когда я добавил холст сюжета в рамку, нуждаясь в том, чтобы он был шире, мне было чертовски трудно изменить размер рамки, чтобы она соответствовала сюжету- Layout() не сработало, SetSizerAndFit(sizer) не сработало … Поэтому я просто жестко задал размер.

Теперь моя проблема в том , что при отображении кадра (просто resframe = ResultsFrame(None); resframe.Show() он отображается с большей частью верхней левой половины экрана (см. Изображение ниже). Вот код для макета проблемы. На самом деле он выглядит огромным — все еще расположен за пределами границы экрана, но теперь также простирается за пределы экрана во всех направлениях. Инструмент проверки по-прежнему показывает, что это всего лишь 1290×945 (я использую ноутбук с экраном 1920х1080), но это явно неправильно. Несмотря на это, кадр по-прежнему находится в том же месте (за кадром), что и реальный кадр из моей программы.

Что я делаю не так?

Скопируйте/вставьте важный бит, который я пропустил в ответ на комментарии: забыл упомянуть, что поведение такое же при использовании pos = wx.DefaultPosition , а также просто не включаю pos __init__ ; Я также не могу перетащить окно, так как вся верхняя панель находится за кадром. Главная проблема не в размере, а в положении. Фиктивный сценарий, который я написал (по какой-либо причине), выглядит огромным на экране (несмотря на то, что в инструменте проверки отображается правильный размер), но в самом приложении, которое я пишу, рамка имеет правильный размер, просто расположена за кадром. Проблема с размером, наблюдаемая в фиктивном сценарии, странная (размеры в InspectionTool все возвращают 1920×945, но кадр кажется намного больше размера экрана, несмотря на то, что он равен 1920х1080), но в моей реальной программе этого не происходит, поэтому меня больше беспокоит позиционирование.

 import wx

class ResultFrame(wx.Frame):
    def __init__(self, parent):
        super(ResultFrame, self).__init__(parent, -1, title = "Results",
         size = wx.Size(1290,945), pos = wx.Point(50,50), style = wx.CAPTION|
         wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU)

        self.InitUI()
        self.Layout()
        self.Center()

    def InitUI(self):
        self.mainpnl = wx.Panel(self)
        self.nbpnl = wx.Panel(self.mainpnl)
        self.ctrlpnl = wx.Panel(self.mainpnl)
        self.mainsizer = wx.BoxSizer(wx.HORIZONTAL)
        self.ctrlsizer = wx.BoxSizer(wx.VERTICAL)

        self.restart = wx.Button(self.ctrlpnl, wx.ID_ANY, "Start Over",
         size=(100,40))
        self.interp = wx.Button(self.ctrlpnl, wx.ID_ANY, "Help Interpretingn"
         "Results", size=(100,40))
        self.nb = wx.Notebook(self.mainpnl)
        for tar in range(0,4):
            self.nb.AddPage(wx.Panel(self.nb), f"page {tar}")
        self.ctrlsizer.Add(self.restart, 0, wx.ALL, 5)
        self.ctrlsizer.AddStretchSpacer()
        self.ctrlsizer.Add(self.interp, 0, wx.ALL, 5)
        self.ctrlpnl.SetSizerAndFit(self.ctrlsizer)
        self.mainsizer.Add(self.ctrlpnl, 0, wx.ALL, 0)
        self.mainsizer.Add(self.nb, 1, wx.EXPAND)
        self.mainpnl.SetSizerAndFit(self.mainsizer)

        self.CreateStatusBar()
        self.SetStatusText("Results")

def main():
    import wx.lib.mixins.inspection
    app = wx.App()
    frm = ResultFrame(None)
    frm.Show()
    wx.lib.inspection.InspectionTool().Show(refreshTree=True)
    app.MainLoop()

if __name__ == "__main__":
    main()
    
 

Кадр, появляющийся за кадром, с инспектором для получения подробной информации

Комментарии:

1. Вы даете ему фиксированную стартовую позицию pos = wx.Point(50,50) , так что не Center делайте этого. Если он слишком велик для экрана, вам придется его перетаскивать.

2. Забыл упомянуть, что поведение такое же при использовании pos = wx.DefaultPosition , а также при pos выходе из __init__ ; Я также не могу перетаскивать окно, так как вся верхняя панель находится за кадром. Главная проблема не в размере, а в положении. Фиктивный сценарий, который я написал (по какой-либо причине), выглядит огромным на экране (несмотря на то, что в инструменте проверки отображается правильный размер), но в самом приложении, которое я пишу, рамка имеет правильный размер, просто расположена за кадром. Обновит вопрос, чтобы включить это.