多次添加而不是单个[gtk2hs]

时间:2012-02-23 12:38:16

标签: user-interface haskell dialog widget gtk2hs

我还有另一个无法解决的问题

我有一个以下代码,可以将用户(名字,姓氏和年龄)添加到树视图中。除了一件小事之外,它一切运行良好:只有在第一次添加用户时它才能正常工作。当你点击添加然后尝试添加另一个用户时,它将尝试添加2个用户,然后是3,4,依此类推,随着每次添加而增加。这是捕获click事件的代码:

onClicked (dodajUczBt gui) (dodajUcz gui dbh stores)

这是处理点击的函数dodajUcz

dodajUcz gui dbh stores =
    do  entrySetText (nImie gui) ""
        entrySetText (nNazwisko gui) ""
        entrySetText (nWiek gui) ""
        onClicked (cancelAddUczBt gui) (widgetHide (dodajUzDialog gui))
        onClicked (zapiszUczBtn gui) procADD
        windowPresent (dodajUzDialog gui)
    where procADD = do
            ucz <- getUczestnik
            let store = uczestnicy stores
            New.listStoreAppend store ucz
            dlugosc <- New.listStoreGetSize store
            labelSetText (lblLiczbaUcz gui) $ "Liczba uczestników: "++ show dlugosc 
            widgetHide (dodajUzDialog gui)
            addUser ucz dbh
          getUczestnik = do
                                imie <- entryGetText (nImie gui)
                                nazwisko <- entryGetText (nNazwisko gui)
                                wiek <- entryGetText (nWiek gui)
                                let wiek' = read wiek :: Integer
                                return $ Uczestnik 0 imie nazwisko wiek' False

Uczestnik是一种代数数据类型,addUser是一个将Uczestnik添加到数据库中的函数。 gui也是一个代数数据类型GUI,它包含castToXml

创建的所有gui元素

在我看来,widgetHide是主要问题,因为即使您不做任何事情(只需打开对话框然后关闭它),它会在下次打开时尝试添加2个用户它

任何想法如何解决这个问题?任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

嗯,我的理解是:

  1. 要再次显示该对话框,请从代码中的其他位置调用dodajUcz
  2. 每次添加用户时,都会隐藏对话框(并请求它再次显示)
  3. 最重要:每次评估(即执行)dodajUcz时,都会在zapiszUczBtn <上为“Clicked”事件安装事件处理程序strong> AGAIN (使用onClicked)。当您为事件安装事件处理程序时,它将永远保留在那里并且每次触发事件时都会执行。如果你安装两次,它将被执行两次。在这种特殊情况下,在调用dodajUcz两次后,当在zapiszUczBtn上触发事件Clicked时,事件处理程序将执行两次。

    使用onClicked或任何其他事件处理程序安装程序不会删除以前的处理程序,它们会被添加到该窗口小部件和事件的处理程序堆栈中。

    初始化gui时(首次创建时),在代码中仅将事件处理程序设置一次并且不再执行该代码。您可以将gui和商店作为args传递给procADD然后。

    例如:

    startGUI :: DBH -> IO (GUI, Stores)
    startGUI dbh = do
      gui <- giveMeGUI -- or some other function that returns a gui
      stores <- giveMeStores -- or some other function that returns the stores
      onClicked (cancelAddUczBT gui) (widgetHide (dodaUzDialog gui))
      onClicked (zapiszUczBtn gui) (procADD gui dbh stores)
      return (gui, stores)
    
    dodajUcz gui dbh stores = do
       entrySetText (nImie gui) ""
       entrySetText (nNazwisko gui) ""
       entrySetText (nWiek gui) ""
       windowPresent (dodajUzDialog gui)
    
    procADD gui dbh stores = do
       ...