2016-11-21 62 views
0

當我運行此腳本:試圖消除python3 Gtk3錯誤信息

#!/usr/bin/env python3 

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GObject 

def display_message_dialog(button, message_type, window): 
    messagedialog = Gtk.MessageDialog(message_format="MessageDialog") 
    messagedialog.set_property("message-type", message_type) 
# messagedialog.set_parent(window) 
    messagedialog.run() 
    messagedialog.destroy() 

window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 

grid = Gtk.Grid() 
grid.set_column_spacing(5) 
window.add(grid) 

buttonInfo = Gtk.Button(label="Information") 
buttonInfo.connect("clicked", display_message_dialog, Gtk.MessageType.INFO, window) 
grid.attach(buttonInfo, 0, 0, 1, 1) 
buttonError = Gtk.Button(label="Error") 
buttonError.connect("clicked", display_message_dialog, Gtk.MessageType.ERROR, window) 
grid.attach(buttonError, 3, 0, 1, 1) 

window.show_all() 
Gtk.main() 

單擊該窗口中的一個按鈕,當我收到此錯誤信息:

GTK的消息:GtkDialog映射沒有一個短暫的父母。這是 氣餒。

取消對messagedialog.set_parent(窗口)聲明將此消息:

GTK的WARNING **:無法設置父在頂層窗口小部件

什麼我需要做些什麼來消除這些信息?

我正在使用Linux Mint 18 Mate。

回答

1

什麼工作是增加parent=window到MessageDialog聲明:

messagedialog = Gtk.MessageDialog(message_format="MessageDialog", parent=window) 

我仍然不知道爲什麼set_parent聲明是無效的。

+0

令人困惑的是,由「set_parent」設置的「parent(widget)」與作爲「MessageDialog」構造函數的參數給出的「transient parent」不同。 – ptomato

0

這裏是一個與任何parent =工作作爲一個屬性(因爲它顯示)的一個例子,也可以消除財產,並取消dlg.set_transient_for(self)(我相信set_parent是不正確的功能,這裏所需要的關係是如果父窗口關閉,則獲得事件)

from gi.repository import Gtk 

VERSION = "0.1" 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.connect("destroy", lambda x: Gtk.main_quit()) 

     btn = Gtk.Button("Call about dialog") 
     btn.connect("clicked", self.btn_clicked) 

     self.add(btn) 
     self.show_all() 

    def btn_clicked(self, btn): 
     dlg = Gtk.AboutDialog(version = VERSION, 
           program_name = "SomeTest", 
           parent = self, 
           license_type = Gtk.License.GPL_3_0) 
     #dlg.set_transient_for(self) 
     dlg.run() 
     dlg.destroy() 

    def run(self): 
     Gtk.main() 

def main(args): 
    mainwdw = MainWindow() 
    mainwdw.run() 

    return 0 

if __name__ == '__main__': 
    import sys 
    sys.exit(main(sys.argv)) 

無論如何,這兩種形式的工作無誤!