Nano Hash - криптовалюты, майнинг, программирование

Как с помощью PyGTK/win32 разместить новое окно рядом с его родителем, но не за пределами экрана?

Когда PyGTK работает в Windows, я хочу, чтобы новое окно появлялось рядом с родительским окном, но не за пределами экрана.

Я наблюдал желаемое поведение в Microsoft Wordpad как в Windows 7, так и в Windows XP. Если сделать окно очень маленьким и переместить его в правый нижний угол рабочего стола, щелкнуть правой кнопкой мыши в текстовом поле и открыть меню Абзац, диалоговое окно станет полностью видимым. Это происходит, даже если окно Wordpad частично находится за пределами экрана. Дочернее диалоговое окно не появляется в фиксированном положении относительно главного окна. Он просто появляется близко и полностью виден.

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

Я пытался использовать gtk.WIN_POS_MOUSE, но когда главное меню находится у края экрана; возникающее дочернее окно часто оказывается частично за пределами экрана.

Я ожидаю, что вызов set_transient_for(main_menu) в дочернем окне должен сообщить Windows, что я хочу, чтобы мое окно было рядом с его родительским окном. Однако Windows просто помещает его в верхний левый угол рабочего стола — даже не обязательно на тот же экран, что и главное меню.

Следующий код продемонстрирует проблему, открыв всплывающее окно в левом нижнем углу экрана, содержащее кнопку, которая порождает подокно при нажатии:

import gtk

class MyWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect("delete-event",self.on_delete_event)
        button = gtk.Button("Open Subwindow")
        button.connect("clicked",self.open_sub_window)
        self.add(button)
        self.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST)
        self.show_all()
        width, height = self.get_size()
        self.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height)

    def on_delete_event(self, widget=None, data=None):
        gtk.main_quit()

    def open_sub_window(self, widget=None, data=None):
        w = gtk.Window()
        w.set_size_request(200,200)
        w.set_transient_for(self)
        w.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        w.show()

if __name__=="__main__":
    MyWindow()
    gtk.main()

Как видите, sub_window частично отображается за пределами экрана. Если вы закомментируете строку w.set_position(gtk.WIN_POS_CENTER_ON_PARENT), вы увидите, что оконный менеджер Windows просто помещает подокно в самый верхний левый угол рабочего стола. Не очень полезно!

Есть ли способ получить желаемое поведение, не прибегая к ручному управлению позиционированием окна, проверяя, в каком месте заканчивается окно, а затем перемещая окно в полностью заэкранное положение?

ОБНОВЛЕНИЕ: я подал отчет об ошибке для pyGTK 23 февраля 2011 г.: http://bugzilla.gnome.org/show_bug.cgi?id=643138

Ответов от разработчиков и других пользователей пока не поступало. Если у вас возникла эта проблема, сообщите об ошибке, чтобы она была исправлена ​​(или чтобы мы могли найти обходной путь).

27.08.2010

  • Примечание. Если я установлю гравитацию подокна на SOUTH_EAST с помощью w.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST) до w.set_position(...), проблема частично уменьшится; окно не будет располагаться за правым нижним углом текущего экрана. Однако он все еще может отображаться под панелью задач и, что еще хуже, с украшением окна за верхним или левым краем рабочего стола. 28.08.2010
  • Я предполагаю, что в большинстве систем linux/unix оконный менеджер справится с этим автоматически, и это не так хорошо проверено в Windows... Может быть, вам следует подать отчет об ошибке и/или исправить это в Gtk самостоятельно? 30.08.2010
  • Я не уверен, что это ошибка GTK+. Оконный менеджер (в моем случае Windows Explorer) отвечает за размещение окон. Gtk предоставляет только подсказки по позиционированию; он не знает размер декораций, применяемых Проводником, поэтому один только Gtk не может быть использован для правильного позиционирования окна. Это описано в документации к методу get_size() GtkWindow: [...] декорации оконного менеджера (также известные как оконная рамка или граница) [...] не отрисовываются GTK+, и GTK+ не имеет надежного метода определения их размера. Мой вопрос касается использования Gtk+ для влияния на поведение оконного менеджера для получения желаемого результата. 31.08.2010
  • Что ж, порт Windows GTK должен полезно влиять на поведение оконного менеджера, чтобы вам не приходилось этого делать. Я бы отправил отчет об ошибке, если бы я был вами. 19.10.2010
  • Я подал отчет об ошибке: bugzilla.gnome.org/show_bug.cgi?id=643138< /а> 24.02.2011

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..