Как определить физический размер экрана компьютера в GTK

8

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

В них нижние кнопки находятся за пределами экрана и не могут быть использованы. Я хотел бы принять это во внимание в пользовательском интерфейсе, но прежде всего я хотел бы выяснить, каков стандартный способ определения размера экрана в GTK, если он есть.

Так у кого-нибудь есть идеи, как это сделать?

Дэвид Планелла
источник
Просто мозговой штурм: как насчет нескольких мониторов с различными размерами?
Вилмантас Баранаускас
Кажется, что использование размера экрана здесь является неправильным решением. Есть хорошие скриншоты окон, где это проблема?
Добей
В отчетах об ошибках есть несколько: bugs.launchpad.net/qreator/+bug/1015138/+attachment/3196020/… и launchpadlibrarian.net/107989779/…
Дэвид Планелла,

Ответы:

11
from gi.repository import Gdk
s = Gdk.Screen.get_default()
print(s.get_width())
print(s.get_height())

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

силь
источник
Вам действительно нужно тыкать в Дисплей, а не в Экран, для получения отдельных размеров дисплея, IIRC.
Добей
Проверено 14.04, работает.
Сет
Если у вас более одного монитора, размер экрана больше. Приведенное выше решение не работает, если вы хотите размер монитора . Смотрите ответ @justin для этого.
Геттли
Я вижу, что DeprecationWarning: get_width устарела
NoBugs
6

Вот что я придумал:

from gi.repository import Gdk, Gtk

# Replace w with the GtkWindow of your application
w = Gtk.Window()
# Get the screen from the GtkWindow
s = w.get_screen()
# Using the screen of the Window, the monitor it's on can be identified
m = s.get_monitor_at_window(s.get_active_window())
# Then get the geometry of that monitor
monitor = s.get_monitor_geometry(m)
# This is an example output
print("Heigh: %s, Width: %s" % (monitor.height, monitor.width))

Я не уверен, что это будет называться «стандартным», но я надеюсь, что это поможет.

Джастин
источник
Большое спасибо. Ваше решение работает, даже если окно еще не реализовано.
Геттли
3

Я бы сказал, что вы хотите, это ответ на следующий вопрос:

Насколько большим будет окно, если оно будет развернуто?

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

Поэтому ответ на этот вопрос прост:

from gi.repository import Gtk, GObject
w = Gtk.Window()
w.maximize()
def p():
    print w.get_size()
GObject.timeout_add(1000, p)
w.show()
Gtk.main()

Таким образом, вы можете создать окно, развернуть его, а затем начать заполнять его виджетами разумного размера.

xubuntix
источник
2

Вы можете получить ширину и высоту в миллиметрах с помощью этого метода:

from gi.repository import Gdk
display = Gdk.Display.get_default()
monitor = display.get_monitor(0)
return monitor.get_width_mm(), monitor.get_height_mm()
Жюльен Дюбуа
источник