简单的应用程序

问题描述:

我创建了一个简单的Haskell程序显示一个窗口:简单的应用程序

module Main where 

import   Graphics.UI.Gtk 
import   Graphics.UI.Gtk.Glade 

data GUI = GUI { 
    mainWin :: Window, 
    clickMe :: Button, 
    display :: Label 
    } 

loadGlade :: IO GUI 
loadGlade = do 
    Just xml <- xmlNew "gladeFile.glade" 
    mw <- xmlGetWidget xml castToWindow "wdwFirst" 
    bc <- xmlGetWidget xml castToButton "btnClick" 
    ld <- xmlGetWidget xml castToLabel "lblDisplay" 

    return $ GUI mw bc ld 

connectGui :: GUI -> IO (ConnectId Button) 
connectGui gui = do 
    onDestroy (mainWin gui) mainQuit 
    onClicked (clickMe gui) (guiAnswer gui) 

guiAnswer :: GUI -> IO() 
guiAnswer gui = 
    labelSetText (display gui) "WELCOME!!" 


main :: IO() 
main = do 
    initGUI 
    gui <- loadGlade 
    connectGui gui 
    mainGUI 

与林间空地创造了这个GUI文件:

<?xml version="1.0" encoding="UTF-8"?> 
<glade-interface> 
    <!-- interface-requires gtk+ 2.24 --> 
    <!-- interface-naming-policy project-wide --> 
    <widget class="GtkWindow" id="wdwFirst"> 
    <property name="can_focus">True</property> 
    <property name="title" translatable="yes">DEBUT</property> 
    <property name="window_position">center</property> 
    <property name="default_width">400</property> 
    <property name="default_height">250</property> 
    <child> 
     <widget class="GtkLayout" id="layout1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <widget class="GtkButton" id="btnClick"> 
      <property name="label" translatable="yes">Click me!</property> 
      <property name="width_request">100</property> 
      <property name="height_request">23</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </widget> 
      <packing> 
      <property name="x">21</property> 
      <property name="y">20</property> 
      </packing> 
     </child> 
     <child> 
      <widget class="GtkLabel" id="lblDisplay"> 
      <property name="width_request">350</property> 
      <property name="height_request">136</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">gdghh 
</property> 
      </widget> 
      <packing> 
      <property name="x">43</property> 
      <property name="y">77</property> 
      </packing> 
     </child> 
     </widget> 
    </child> 
    </widget> 
</glade-interface> 

的程序编译,并没有运行错误但是......没有出现,没有窗口。

我用格莱德3.8.5用GTK + 2

感谢

你忘了实际显示窗口。函数调用如

widgetShowAll window 

似乎缺失。

编辑

这个主要功能应该工作:

main :: IO() 
    main = do 
    initGUI 
    gui <- loadGlade 
    connectGui gui 
    widgetShowAll (mainWin gui) 
    mainGUI   
+0

你是什么意思?有没有一个实际的函数'widgetShowAll',或者这只是一个建议? – AJFarmar

+0

有一个叫做[widgetShowAll]的函数(http://hackage.haskell.org/package/gtk-0.13.9/docs/Graphics-UI-Gtk-Abstract-Widget.html#v:widgetShowAll)。这个[最小示例](http://code.haskell.org/gtk2hs/docs/tutorial/Tutorial_Port/chap2.xhtml)显示了您需要的功能。 (可惜这个教程已经过时了。) – lambda