2013-10-06 19 views
1

我最近開始使用Vala編程語言開發Gtk + 3.x。我曾經使用C#和Visual Studio來完成相同的任務,但後來遷移到Linux。如何在Gtk對話框中詢問用戶的某些內容?

如何在對話框中詢問簡單的確定/取消問題?在C#中,使用MessageBox.Show()非常簡單。然而,Gtk似乎煩人複雜,我所做的每個Google搜索都讓我對技術上的對話和事件處理程序產生了懷疑。

有隻是一個簡單的功能,所以我可以做這樣的事情:

bool result = MessageBox.AskQuestion("Do you want to save?"); 

感謝,

巴里·史密斯

+0

'Gtk.Dialog'可能有幫助:http://valadoc.org/#!api=gtk+-3.0/Gtk.Dialog –

+0

這裏是一個相關的問題在Python中:http://stackoverflow.com/questions/13970445/python-gtk3-how-to-add-a-gtk-entry-to-a-gtk-messagedialog –

回答

3

事實上,發現它通過試錯...

public bool show_question(string message, Gtk.Window window, MessageType mt) 
{ 
    Gtk.MessageDialog m = new Gtk.MessageDialog(window, DialogFlags.MODAL, mt, ButtonsType.OK_CANCEL, message); 
    Gtk.ResponseType result = (ResponseType)m.run(); 
    m.close(); 
    if (result == Gtk.ResponseType.OK) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
+1

你可以通過寫'return result == Gtk.ResponseType.OK;'來保存一些行, –

2

略有改進版本:

public bool show_question(string primary_markup, 
          string? secondary_markup = null, 
          Gtk.Window? parent = null, 
          Gtk.MessageType message_type = Gtk.MessageType.QUESTION) 
{ 
    var m = new Gtk.MessageDialog.with_markup(parent, 
               Gtk.DialogFlags.MODAL, 
               message_type, 
               Gtk.ButtonsType.OK_CANCEL, 
               primary_markup); 
    m.format_secondary_markup(secondary_markup); 
    var result = (Gtk.ResponseType) m.run(); 
    m.destroy(); 
    return (result == Gtk.ResponseType.OK); 
} 

這個新版本利用了Vala的默認參數,所以在最簡單的情況下,您可以撥打show_question("Is this OK?");。此外,您也可以現在使用Pango Markup帶來太多的更好看的對話框,例如:

show_question("<b><big>Overwrite File?</big></b>", 
       "<small>The file <i>\"%s\"</i> will be overwritten if you proceed</small>".printf(my_filename), 
       parent_window, 
       Gtk.MessageType.WARNING); 

值得注意然而,在GTK,使用像這樣的簡單的「確定/取消」的反應通常是令人難以接受的。相反,建議使用包含與所涉及的動作有關的動詞的按鈕標籤;所以在上面的例子中,「取消」和「覆蓋」將是更好的選擇(當然,默認爲取消)。這對程序員來說需要一點點但是更多的工作,但是提供了更好的用戶體驗。

相關問題