0

私はチュートリアルから適応した以下のコードを使用します。ドロップダウンに2つのオプションが表示されますが、1つを選択すると、コンソールでエラーが発生します。

(combo:12158):Gtk-CRITICAL **:IA__gtk_entry_set_text:アサーション `text!=NULL'が失敗しました

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  store <- listStoreNew ["one", "two"]
  combo <- comboBoxEntryNewWithModel store
  ren <- cellRendererTextNew
  cellLayoutPackEnd combo ren False
  cellLayoutSetAttributes combo ren store
    (\txt -> [cellText := txt])
  containerAdd window combo

  widgetShowAll window
  mainGUI
4

3 に答える 3

2

レンダラーを追加し、その属性を設定しようとしていますが、これはすべて問題ありません。ただし、最終的に編集する必要のあるテキストがどこにあるかをComboBoxEntryに通知しているわけではありません。Gtk +開発者は、Gtk2Hs(そしてあなたの例ではあなた)が行うコールバック関数を使用してこのテキストを抽出するためのプロビジョニングを行っていません。コールバックの代わりに、Gtk+は列番号を使用してデータ行の特定のデータを参照します。モデルのほとんどの特殊関数は列番号を使用します。これは、コールバック関数よりもCで列番号を操作する方がはるかに簡単だからです。Gtk2Hsでは、他の属性マッピングの上に列番号を追加できます。ColumnId定数を宣言するように例を変更しました(モデルにまだ使用していない任意の整数を使用できます)。Gtk2Hsは常にコールバック関数を使用するため、抽出関数を関連付ける必要がありますidこの列番号で。3番目の変更は、この列番号をテキストソースとして使用するようにComboBoxEntryに指示することです。コードの一部にテキストレンダラーを挿入したままにしましたが、その属性を定数に設定しました。したがって、テキストがストアを形成し、定数「<-yourchoice」が各行に表示されます。

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC

textColumn :: ColumnId String String
textColumn = makeColumnIdString 0

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  store <- listStoreNew ["one", "two"]
  customStoreSetColumn store textColumn id -- set the extraction function
  combo <- comboBoxEntryNewWithModel store
  comboBoxEntrySetTextColumn combo textColumn -- set which column should be used
  ren <- cellRendererTextNew
  cellLayoutPackEnd combo ren False
  cellLayoutSetAttributes combo ren store
    (\txt -> [cellText := "<-- your choice"])
  containerAdd window combo

  widgetShowAll window
  mainGUI
于 2011-02-27T15:57:00.710 に答える
1

を使用する場合ComboBoxEntry、テキスト列を明示的に設定する必要があります。理論的には を呼び出すことができるはずですがcomboBoxEntrySetTextColumn、私はこれを機能させることができませんでした。ただし、次のことができました。

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC
import Control.Monad

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  combo <- comboBoxEntryNewText
  store <- comboBoxEntrySetModelText combo
  mapM_ (listStoreAppend store) ["one", "two"]

  containerAdd window combo
  widgetShowAll window
  mainGUI

違いは、ComboBoxEntry が から作成されたときに、適切なテキスト列でcomboBoxEntryNewTextを使用するようにすでに設定されていることです。ListStore Stringレンダラーもあるので、設定する必要もありません。1 つの大きな欠点は、モデル ストアも設定することです。そのため、別のウィジェットと共有されているストアを使用する場合は、ここで作成する必要があります。

名前が間違っていると思われcomboBoxEntrySetModelTextます。「getModelText」のようです。

于 2011-02-27T14:58:08.100 に答える
0

@Axelに感謝します!

以下、新しい gtk3 ライブラリで更新中

import           Control.Monad.IO.Class     (liftIO)
import qualified Data.Text                  as T
import           Graphics.UI.Gtk
import           Graphics.UI.Gtk.Gdk.EventM

textColumn :: ColumnId String T.Text
textColumn = makeColumnIdString 0

main = do
  initGUI
  window <- windowNew
  window `on` deleteEvent $ liftIO mainQuit >> return False
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  store <- listStoreNew ["one", "two"]
  customStoreSetColumn store textColumn (\x -> T.pack $ "1") -- set the extraction function
  combo <- comboBoxNewWithModelAndEntry store
  comboBoxSetEntryTextColumn combo textColumn -- set which column should be used
  ren <- cellRendererTextNew
  cellLayoutPackEnd combo ren False
  cellLayoutSetAttributes combo ren store
    (\txt -> [cellText := "<-- your choice"])
  containerAdd window combo

  widgetShowAll window
  mainGUI
于 2019-07-18T09:13:08.247 に答える