Jak wykryć fizyczny rozmiar ekranu komputera w GTK

8

Napotkałem ten błąd podczas pisania mojej aplikacji. Krótko mówiąc, rozmiar okna aplikacji jest stały, co nie działa dobrze na mniejszych ekranach, takich jak netbooki.

W nich dolne przyciski są poza granicami ekranu i nie można ich używać. Chciałbym wziąć to pod uwagę w interfejsie użytkownika, ale przede wszystkim chciałbym dowiedzieć się, jaki jest standardowy sposób wykrywania rozmiaru ekranu w GTK, jeśli taki istnieje.

Czy ktoś ma jakieś pomysły, jak to zrobić?

David Planella
źródło
Tylko burza mózgów: co z konfiguracjami wielu monitorów o różnych rozmiarach?
Vilmantas Baranauskas
Wygląda na to, że użycie tutaj rozmiaru ekranu jest złym rozwiązaniem. Czy istnieją dobre zrzuty ekranu z okien, w których jest to problem?
dobey,

Odpowiedzi:

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

Oczywiście, jeśli masz wiele ekranów, daje to rozmiar prostokąta obejmującego oba ekrany. Te rzeczy są trudniejsze niż się wydaje, w świecie z wieloma ekranami ...

sil
źródło
Aby uzyskać indywidualne rozmiary ekranu, IIRC, musisz w rzeczywistości naciskać na wyświetlacz zamiast na ekran.
dobey,
Testowany 14.04, działa.
Seth
Jeśli masz więcej niż jeden monitor, rozmiar ekranu jest większy. Powyższe rozwiązanie nie działa, jeśli chcesz mieć rozmiar monitora . Zobacz na to odpowiedź @justin.
guettli
Widzę DeprecationWarning: get_width jest przestarzałe
NoBugs
6

Oto, co wymyśliłem:

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))

Nie jestem pewien, czy byłoby to nazywane „standardem”, ale mam nadzieję, że to pomoże.

Justin
źródło
Dziękuję Ci bardzo. Twoje rozwiązanie działa, nawet jeśli okno nie jest jeszcze zrealizowane.
guettli
3

Powiedziałbym, że chcesz odpowiedzieć na następujące pytanie:

Jak duże byłoby okno, gdyby było zmaksymalizowane?

Ponieważ oprócz konfiguracji wielu ekranów istnieją również inne problemy, takie jak rozmiar górnego panelu, dolne panele (już nie w Ubuntu, ale może inne dystrybucje), dekoratory okien, ... To nie jest właściwie obsługiwane przez Gtk, ale przez okno menedżer. Więc nie widzę żadnego sposobu na uzyskanie tej liczby, chyba że pozwolisz menadżerowi okien wykonać faktycznie maksymalizację.

Dlatego odpowiedź na to pytanie jest łatwa:

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()

Możesz więc stworzyć okno, zmaksymalizować je, a następnie zacząć wypełniać je widżetami o rozsądnych rozmiarach.

xubuntix
źródło
2

Dzięki tej metodzie możesz uzyskać szerokość i wysokość w milimetrach:

from gi.repository import Gdk
display = Gdk.Display.get_default()
monitor = display.get_monitor(0)
return monitor.get_width_mm(), monitor.get_height_mm()
Julien Dubois
źródło