#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__
; Я также не могу перетаскивать окно, так как вся верхняя панель находится за кадром. Главная проблема не в размере, а в положении. Фиктивный сценарий, который я написал (по какой-либо причине), выглядит огромным на экране (несмотря на то, что в инструменте проверки отображается правильный размер), но в самом приложении, которое я пишу, рамка имеет правильный размер, просто расположена за кадром. Обновит вопрос, чтобы включить это.