4 Stimmen

pygtk: Wie kann man erzwingen, dass Meldungsdialoge in der Mitte des Bildschirms angezeigt werden?

Ich habe eine Glade-GUI und ich bin mit dome gtk.MessageDialog Widgets mit pygtk für Benutzerinteraktion erstellt. Mein Problem ist, dass jedes Mal, wenn ich eine Dialognachricht auf dem Bildschirm werfen, sie zeigen sich alle über den Ort. Eine könnte oben rechts in der Ecke, die nächste unten links, oben links, Mitte links usw...

Gibt es eine Möglichkeit, diese Dinge in der Mitte des Bildschirms anzuzeigen oder an der Position, an der sich das übergeordnete Fenster befindet?

5voto

M0E-lnx Punkte 707

Macht nichts. Ich habe die Lösung gefunden.

Für andere, die sich über das gleiche Gedanken machen, liegt die Lösung für dieses Problem in der Angabe eines übergeordneten Wertes für das gtk.MessageDialog-Konstrukt. Wenn Sie in Ihrer Klasse eine Glade-GUI verwenden und Ihre Glade-XML in eine Variable mit dem Namen "gui" geladen wird, würde es so aussehen:

#!/usr/bin/env/python
par = self.gui.get_widget('your_parent_window')

msg = gtk.MessageDialog(type=gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK, parent=par)
if msg.run():
    msg.destroy()
    return None

0voto

ilias iliadis Punkte 531

Keine der angebotenen Lösungen wird funktionieren, wenn Ihr übergeordnetes Fenster noch nicht angezeigt wird, d.h. wenn der Meldungsdialog während der Instanziierung einer Klasse (Ihrer Klasse, nicht der "übergeordneten" Fensterklasse) angezeigt werden soll. Während dieser Zeit hat Gtk das Fenster noch nicht platziert, auch wenn der Code für den Messagedialog nach dem Code kommt, der das Fenster zeigt. Das bedeutet, dass Ihr Dialogfenster irgendwie "elternlos" sein wird und der Nachrichtendialog erscheint, wo immer er will...

Meine naive Lösung für dieses Problem...

GObject.timeout_add(interval=50, function=self.stupid_dialog_1)

und

def stupid_dialog_1(self):
    par = self.gui.get_widget('your_parent_window')
    msg = gtk.MessageDialog(type=gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK, parent=par)
    # do anything here...
    return False #stop the timer...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X