def __insert(self, item, target=None, after=False): if not isinstance(item, AbstractItem): raise TypeError( t('incompatible_type_argument', name='item', type='AbstractItem')) self.validate(item) item.reset() item.set_layout(self) if self.__head is None: self.__head = item self.__tail = item return if not isinstance(target, AbstractItem): raise TypeError( t('incompatible_type_argument', name='target', type='AbstractItem')) self.__do_insert_after( item, target) if after else self.__do_insert_before(item, target)
def set_prev(self, item): if item and not isinstance(item, AbstractItem): raise TypeError( t('incompatible_type_argument', name='item', type='AbstractItem')) self.__prev = item
def validate(self, item, throw=True): if not isinstance(item, AbstractItem): raise TypeError( t('incompatible_type_argument', name='item', type='AbstractItem')) if self.last() is None: return True _, src_unit = self.last().size() _, unit = item.size() if unit != src_unit: if throw: raise RuntimeError( t('invalid_units', unit=unit, layout_unit=src_unit)) return False return True
def set_window(self, wnd, select_by_click=False): if isinstance(wnd, int): self.__hwnd = wnd if WindowManager.is_exists( wnd) else WindowManager.find_by_pid(wnd) return if isinstance(wnd, str): self.__hwnd = WindowManager.find_by_title(wnd) return if select_by_click: self.__hwnd = WindowManager.find_by_mouse_click() return raise ValueError(t('invalid_argument_value', name='wnd'))
def remove(self, item): if not isinstance(item, AbstractItem): raise TypeError( t('incompatible_type_argument', name='item', type='AbstractItem')) if item.prev() is None: self.__head = item.next() else: item.prev().set_next(item.next()) if item.next() is None: self.__tail = item.prev() else: item.next().set_prev(item.prev()) item.reset()
def Popen(self, cargs, attempts=10, shell=False, **kwargs): """Каждая попытка выполняется раз в половину секунды.""" opened = self.get_opened() proc = psutil.Popen(cargs, shell=shell, **kwargs) cmd = ' '.join(proc.cmdline()) def find(latest): for hwnd in latest: pid = self.get_pid_by_hwnd(hwnd) p = psutil.Process(pid) if shell: if psutil.pid_exists(proc.pid): for child in proc.children(): if child.pid == p.pid: return hwnd, proc name = Path.basename(' '.join(p.cmdline())) if cmd.find(name) != -1: return hwnd, None else: if pid == proc.pid: return hwnd, proc if p.name() == proc.name(): return hwnd, None while attempts: result = find(self.get_last_opened(opened)) if result: return result attempts -= 1 sleep(0.5) raise NoSuchWindowException(t('started_process_without_gui'))
def find_by_title(self, title): """Найти окно по заголовку, используется точное совпадение.""" raise NotImplementedError( t('abstract_method', method='WindowManager.find_by_title()'))
def find_by_pid(self, pid): """Найти окно по идентификатору процесса.""" raise NotImplementedError( t('abstract_method', method='WindowManager.find_by_pid()'))
def close(self, hwnd): """Закрыть указанное окно.""" raise NotImplementedError( t('abstract_method', method='WindowManager.close()'))
def borders(self, hwnd): """Возвращает размеры декорации окна.""" raise NotImplementedError( t('abstract_method', method='WindowManager.borders()'))
def move(self, hwnd, x, y, width, height): """Изменяет размеры окна и перемещает его в указанную позицию.""" raise NotImplementedError( t('abstract_method', method='WindowManager.move()'))
def get_pid_by_hwnd(self, hwnd): raise NotImplementedError( t('abstract_method', method='WindowManager.get_pid_by_hwnd()'))
def close(self): """Завершает работу элемента.""" raise NotImplementedError(t('abstract_method', method='Item.close()'))
def set_y(self, y): if self.layout() is not None: raise RuntimeError(t('property_calculated_automatically')) self.__y = int(y)
def geometry(self, hwnd): """Возвращает позицию и размеры окна относительно экрана.""" raise NotImplementedError( t('abstract_method', method='WindowManager.geometry()'))
def get_opened(self): """Get all the open windows.""" raise NotImplementedError( t('abstract_method', method='WindowManager.get_opened()'))
def __init__(self, layout): if not isinstance(layout, Layout): raise TypeError( t('incompatible_type_argument', name='layout', type='Layout')) self.__start = layout.first()
def is_exists(self, hwnd): """Возвращает True, если окно с указанным идентификатором существует.""" raise NotImplementedError( t('abstract_method', method='WindowManager.is_exists()'))
def move(self): raise NotImplementedError(t('abstract_method', method='Item.move()'))
def set_layout(self, layout): if not isinstance(layout, Layout): raise TypeError( t('incompatible_type_argument', name='layout', type='Layout')) self.__layout = layout
def move(self): if self.__hwnd is None: raise RuntimeError(t('window_not_set')) WindowManager.move(self.__hwnd, self.x(), self.y(), self.width(), self.height())