Рубрики
Без рубрики

WXPYPHON: набор, который отображать кадр включен

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

На днях я видел интересный вопрос в канале WXPYPHON IRC. Они спрашивали, был ли способ установить, на котором отображается их приложение. Робин Данн, создатель Wxpython, дал вопрос некоторым указателям, но я решил пойти дальше и написать быстрый учебник по теме.

Инструментарий WXPYPHON на самом деле имеет все биты и куски, которые вам нужны для такого рода вещей. Первый шаг получает комбинированный размер экрана. То, что я имею в виду под этим, спрашивает WxPython, что он думает, это общий размер экрана. Это будет общая ширина и высота всех ваших дисплеев. Вы можете получить это, позвонив wx.displaysize () , который возвращает кортеж. Если вы хотите получить индивидуальные резолюции отображения, то вам нужно позвонить wx.display и пройти в индекс дисплея. Поэтому, если у вас есть два дисплея, то разрешение первого дисплея может быть приобретена так:

index = 0
display = wx.Display(index)
geo = display.GetGeometry()

Давайте напишем быстрое небольшое приложение, которое имеет одну кнопку, которая просто переключается, на каком отображении приложение включено.

import wx

class MyPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.frame = parent
        
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        btn = wx.Button(self, label='Switch Display')
        btn.Bind(wx.EVT_BUTTON, self.switch_displays)
        
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        mainsizer.AddStretchSpacer(prop=1)
        mainsizer.Add(sizer, 0, wx.ALL|wx.CENTER, 5)
        mainsizer.AddStretchSpacer(prop=1)
        self.SetSizer(mainsizer)
        
    def switch_displays(self, event):
        combined_screen_size = wx.DisplaySize()
        for index in range(wx.Display.GetCount()):
            display = wx.Display(index)
            geo = display.GetGeometry()
            print(geo)
            
        current_w, current_h = self.frame.GetPosition()
        
        screen_one = wx.Display(0)
        _, _, screen_one_w, screen_one_h = screen_one.GetGeometry()
        screen_two = wx.Display(1)
        _, _, screen_two_w, screen_two_h = screen_two.GetGeometry()
        
        if current_w > combined_screen_size[0] / 2:
            # probably on second screen
            self.frame.SetPosition((int(screen_one_w / 2),
                                   int(screen_one_h / 2)))
        else:
            self.frame.SetPosition((int(screen_one_w + (screen_two_w / 2)),
                                   int(screen_two_h / 2)))
        
class MainFrame(wx.Frame):
    
    def __init__(self):
        wx.Frame.__init__(self, None, title='Display Change')
        panel = MyPanel(self)
        self.Show()
        
if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Здесь мы создаем два класса. Первый содержит почти весь код и определяет кнопку и его обработчик событий. Другой класс предназначен для создания самого кадра. Обработчик событий – это то, куда все веселье, поэтому давайте посмотрим на это. Для контекста у меня есть два монитора того же изготовления, модели и ориентации.

def switch_displays(self, event):
    combined_screen_size = wx.DisplaySize()
    for index in range(wx.Display.GetCount()):
        display = wx.Display(index)
        geo = display.GetGeometry()
        print(geo)

    x, y = self.frame.GetPosition()

    screen_one = wx.Display(0)
    _, _, screen_one_w, screen_one_h = screen_one.GetGeometry()
    screen_two = wx.Display(1)
    _, _, screen_two_w, screen_two_h = screen_two.GetGeometry()

    if x > combined_screen_size[0] / 2:
        # probably on second screen
        self.frame.SetPosition((int(screen_one_w / 2),
                                    int(screen_one_h / 2)))
    else:
        self.frame.SetPosition((int(screen_one_w + (screen_two_w / 2)),
                                    int(screen_two_h / 2)))

Здесь мы вытаскиваем общее разрешение обоих мониторов. Затем для демонстрационных целей мы петли по дисплеям и распечатаем их геометрию. Вы можете прокомментировать эти линии, поскольку они не делают ничего, кроме помощи с отладкой.

Тогда мы получаем текущую позицию кадра, позвонив на Цепочка метод. Затем мы извлеким два разрешения дисплея через вызов каждому из объектов отображения Гемгеметрия метод. Затем мы проверяем, если координата x для кадра больше, чем комбинированная ширина дисплея, разделенных на два. Поскольку я знаю, что оба моих монитора – это одинаковое разрешение и ориентация, я знаю, что это будет работать. Во всяком случае, если это больше, то мы пытаемся переместить приложение к противоположному монитору, позвонив Установка Отказ

Обертывание

Вы должны дать этот код попробовать и посмотреть, работает ли он на вашем множественном настройке дисплея. Если это не так, вам может потребоваться отрегулировать математику немного или попытаться выяснить, где ваша ОС думает, что ваши мониторы, чтобы вы могли соответственно исправить код.

Дополнительное чтение

  • Страница документации WXPYPHON на wx.display