2010-08-27 5 views
2

Avec PyGTK s'exécutant sur Windows, je veux faire apparaître une nouvelle fenêtre près d'une fenêtre parent, mais jamais hors écran.Avec PyGTK/win32, comment placer une nouvelle fenêtre près de son parent mais pas hors écran?

J'observé le comportement que je veux dans Microsoft Wordpad dans les deux Windows 7 et Windows XP. Si vous faites la fenêtre très petite et déplacez-la en bas à droite du bureau, faites un clic droit dans le champ de texte et ouvrez le menu Paragraphe, la boîte de dialogue apparaît complètement visible. Cela se produit même si la fenêtre Wordpad est partiellement hors de l'écran. La boîte de dialogue enfant n'apparaît pas dans une position fixe par rapport à la fenêtre principale. Il apparaît juste de près, et entièrement visible.

Mon application se compose d'un écran principal qui fraye fenêtres enfants qui bloquent le reste de l'application jusqu'à ce que l'utilisateur a fini de les utiliser. Il se peut que l'utilisateur doive ouvrir et fermer de nombreuses fenêtres enfant en séquence, je veux donc qu'elles apparaissent près de l'endroit où elles cliquent sur le bouton, afin que l'utilisateur n'ait pas à déplacer la souris sur l'écran.

J'ai essayé d'utiliser gtk.WIN_POS_MOUSE, mais lorsque le menu principal est proche d'un bord de l'écran; la fenêtre de l'enfant qui apparaît engendre souvent une partie de l'écran.

je me attends qu'un appel à set_transient_for (main_menu) sur une fenêtre enfant doit informer de Windows que je veux que ma fenêtre pour être près de son parent. Cependant, Windows le place juste en haut à gauche du bureau - même pas nécessairement sur le même écran que le menu principal.

Le code suivant démontrera le problème en faisant éclater une fenêtre en bas à gauche de votre écran qui contient un bouton qui génère un subwindow lorsque vous cliquez dessus:

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

Comme vous pouvez le voir, le sub_window apparaît partiellement hors écran. Si vous commentez la ligne w.set_position (gtk.WIN_POS_CENTER_ON_PARENT), vous verrez que le gestionnaire de fenêtres Windows place simplement le sous-fenêtre en haut à gauche du bureau. Pas très utile!

Existe-t-il un moyen d'obtenir le comportement souhaité sans recourir à la gestion manuelle du positionnement de la fenêtre en vérifiant l'emplacement de la fenêtre et en déplaçant la fenêtre à une position complètement hors écran?

MISE À JOUR: j'ai déposé un rapport de bogue pour pygtk le 23 février 2011: http://bugzilla.gnome.org/show_bug.cgi?id=643138

Il n'a pas encore eu de réponses des développeurs ou d'autres utilisateurs. Si vous avez ce problème s'il vous plaît entrer dans le bug afin qu'il soit corrigé (ou que nous ayons une solution de contournement).

+0

Note: Si je mets la gravité subwindow à SOUTH_EAST avec w.set_gravity (gtk.gdk.GRAVITY_SOUTH_EAST) avant w.set_position (...), le problème est partiellement atténué; la fenêtre ne sera pas positionnée au-delà du coin inférieur droit de l'écran actuel. Cependant, il peut toujours apparaître sous la barre des tâches, et pire, avec la décoration de la fenêtre au-delà des bords supérieur ou gauche du bureau. –

+0

Je suppose que sur la plupart des systèmes linux/unix, le gestionnaire de fenêtres gérerait cela automatiquement, et il n'est pas aussi bien testé sous Windows ... Peut-être devriez-vous déposer un rapport de bogue et/ou le corriger vous-même? – JanC

+0

Je ne suis pas sûr que ce soit un bug GTK +. Le gestionnaire de fenêtres (Windows Explorer dans mon cas) est responsable du placement de la fenêtre. Gtk fournit seulement des conseils de positionnement; il ne connaît pas la taille des décorations appliquées par Explorer, donc Gtk seul ne peut pas être utilisé pour positionner correctement une fenêtre. Ceci est dans la documentation de la méthode get_size() de GtkWindow: "[...] les décorations du gestionnaire de fenêtres (alias le cadre de fenêtre ou la bordure) [...] ne sont pas dessinées par GTK + et GTK + n'a pas de méthode fiable pour déterminer leur taille " Ma question concerne l'utilisation de Gtk + pour influencer le comportement du gestionnaire de fenêtres pour obtenir le résultat souhaité. –

Répondre

0

Sur mon système Windows 7, la fenêtre contextuelle apparaît au centre de la fenêtre principale. J'ai une question: pourquoi utilisez-vous une fenêtre au lieu d'un dialogue?

+0

Le fait de placer la fenêtre contextuelle au centre de la fenêtre principale signifie qu'elle est partiellement hors écran. C'est ce que j'essaie d'éviter. Le changer pour un dialogue ne fait aucune différence. –

Questions connexes