Como detectar o tamanho da tela física de um computador no GTK

8

Eu me deparei com esse bug enquanto escrevia meu aplicativo. Em resumo, o tamanho da janela do aplicativo é fixo, o que não funciona bem com telas menores, como nos netbooks.

Nesses, os botões inferiores estão fora dos limites da tela e não podem ser usados. Eu gostaria de levar isso em consideração na interface do usuário, mas antes de tudo, gostaria de descobrir qual é a maneira padrão de detectar o tamanho da tela no GTK, se houver uma.

Então, alguém tem alguma idéia de como fazer isso?

David Planella
fonte
Apenas brainstorming: E ​​as configurações de vários monitores com tamanhos diferentes?
Vilmantas Baranauskas
Parece que usar o tamanho da tela aqui é a solução errada. Existem boas capturas de tela das janelas em que isso é um problema?
Dobey

Respostas:

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

Obviamente, se você tiver várias telas, isso dará o tamanho de um retângulo envolvendo as duas. Esse material é mais difícil do que parece, em um mundo com várias telas ...

sil
fonte
Você realmente precisa cutucar a tela em vez da tela, para obter tamanhos de tela individuais, IIRC.
Dobey
Testado em 14.04, funciona.
Seth
Se você tiver mais de um monitor, o tamanho da tela é maior. A solução acima não funciona se você deseja o tamanho de um monitor . Veja a resposta de @justin para isso.
guettli
Vejo DeprecationWarning: get_width está obsoleto
NoBugs
6

Aqui está o que eu vim com:

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

Não tenho certeza se isso seria chamado de 'padrão', mas espero que ajude.

Justin
fonte
Muito obrigado. Sua solução funciona mesmo que a janela ainda não esteja concluída.
guettli
3

Eu diria que o que você quer é a resposta para a seguinte pergunta:

Qual seria o tamanho de uma janela se fosse maximizada?

Porque, além da configuração de várias telas, também existem outros problemas, como o tamanho do painel superior, os painéis inferiores (não mais no Ubuntu, mas talvez outras distros), os decoradores de janelas, ... Isso na verdade não é feito pelo Gtk, mas pela janela Gerente. Portanto, não vejo nenhuma maneira de obter esse número, a menos que você permita que o gerenciador de janelas realmente faça a maximização.

Portanto, a resposta a esta pergunta é fácil:

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

Assim, você pode criar uma janela, maximizá-la e começar a preenchê-la com widgets de tamanho razoável.

xubuntix
fonte
2

Você pode obter largura e altura em milímetros com este método:

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
fonte