Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell gtk:树视图中的图片组合_Haskell_Combobox_Treeview_Gtk_Gtk2hs - Fatal编程技术网

Haskell gtk:树视图中的图片组合

Haskell gtk:树视图中的图片组合,haskell,combobox,treeview,gtk,gtk2hs,Haskell,Combobox,Treeview,Gtk,Gtk2hs,我试图在treeview单元格内制作一个图片组合框(如下图所示)以进行选择 我尝试使用CellRenderComboNew来呈现组合,但填充组合框的选项cellComboTextModel:=仅适用于字符串,我无法呈现图片 我尝试使用CellRenderPixBufNew。它可以渲染图像,但我无法对其执行选择 正确的方法是什么 一个Haskell、Python或任何语言的例子都会非常有用 致以最诚挚的问候。在PyGobject中,我提出了这个解决方案。该示例功能齐全,但需要在同一目录中包含2个

我试图在treeview单元格内制作一个图片组合框(如下图所示)以进行选择

我尝试使用
CellRenderComboNew
来呈现组合,但填充组合框的选项
cellComboTextModel:=
仅适用于
字符串,我无法呈现图片

我尝试使用
CellRenderPixBufNew
。它可以渲染图像,但我无法对其执行选择

正确的方法是什么

一个Haskell、Python或任何语言的例子都会非常有用


致以最诚挚的问候。

在PyGobject中,我提出了这个解决方案。该示例功能齐全,但需要在同一目录中包含2个png文件。我使用了两个100 x 20像素格式的PNG

上一个示例使用了Gtk.ComboBox.new_和_model_和_entry(),我缺少了set_entry_text_colum()函数,该函数必须与此类组合框一起使用

#!/usr/bin/python3

from gi.repository import Gtk, Gdk, GdkPixbuf

class ComboBoxWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ComboBox Pixbuf Example")

        self.set_border_width(10)

        store = Gtk.ListStore(str, GdkPixbuf.Pixbuf)
        solid_line = GdkPixbuf.Pixbuf.new_from_file("solid_line.png")
        store.append(["1", solid_line])
        dashed_line = GdkPixbuf.Pixbuf.new_from_file("dashed_line.png")
        store.append(["2", dashed_line])

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        combo = Gtk.ComboBox.new_with_model(store)
        rend_int = Gtk.CellRendererText()
        rend_pixbuf = Gtk.CellRendererPixbuf()
        combo.pack_start(rend_int, False)
        combo.add_attribute(rend_int, "text", 0)
        combo.pack_start(rend_pixbuf, True)
        combo.add_attribute(rend_pixbuf, "pixbuf", 1)
        combo.connect("changed", self.on_combo_changed)

        vbox.pack_start(combo, False, False, 0)

        self.add(vbox)

    def on_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter != None:
            model = combo.get_model()
            row = model[tree_iter][0]
            print("Selected row {0}".format(row))

win = ComboBoxWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

类似问题:

资料来源:


    • 这是我在Haskell中的解决方案:

      {-# LANGUAGE ScopedTypeVariables #-}
      {-# LANGUAGE OverloadedStrings #-}
      
      import Data.String
      import Graphics.UI.Gtk
      import qualified Data.Map as Map
      import qualified Data.Text as T
      import Data.Maybe
      import qualified Graphics.UI.Gtk.Gdk.Pixbuf as Pixbuf
      import Control.Monad
      
      colorsRawL = [(0,0,0),(254,26,89),(255,0,0),(0,255,0),(0,0,255),(255,255,0),(0,255,255),(255,0,255),(192,192,192),(128,128,128),(128,0,0),(128,128,0),(0,128,0),(128,0,128),(0,128,128),(0,0,128)]
      manufacturers = [("Sony"::String), ("LG"::String), ("Panasonic"::String), ("Toshiba"::String), ("Nokia"::String), ("Samsung"::String)]
      
      data ListElement = ListElement { name :: String   ,   selected::Pixbuf  }
      
      getManufacturers::IO[ListElement]
      getManufacturers = mapM (\x -> do 
                                   pbn <- Pixbuf.pixbufNew ColorspaceRgb False 8 16 16
                                   Pixbuf.pixbufFill pbn 255 255 255 1 
                                   let el = ListElement x pbn
                                   return el                            
                                 ) manufacturers
           
      pixBufListS::IO [(String,Pixbuf)]
      pixBufListS =   mapM (\(r,g,b)-> do 
                                   pbn <- Pixbuf.pixbufNew ColorspaceRgb False 8 16 16
                                   Pixbuf.pixbufFill pbn r g b 1 
                                   let name::String = ("Color ("++(show r)++" "++(show g)++" "++(show b)++  ")")                             
                                   return (name,pbn)                            
                                 ) colorsRawL
      
      getMap::IO (Map.Map String Pixbuf)
      getMap = do
          list <- pixBufListS
          let mp = Map.fromList list
          return mp
      
      main :: IO ()   
      main = do    
          initGUI
          window  <- windowNew
          fixed <- fixedNew
          
          pixList <-pixBufListS
      
          manus <- getManufacturers
          lststoreManus::(ListStore ListElement) <- listStoreNew manus
      
          treeview <- treeViewNew
          treeViewSetModel treeview lststoreManus
          treeViewSetHeadersVisible treeview True
      
          colName <- treeViewColumnNew
          imgCol <- treeViewColumnNew
          colCombo <- treeViewColumnNew
          treeViewColumnSetTitle imgCol ("Image column"::T.Text  )
          treeViewColumnSetTitle colName ("String column"::T.Text  )
          treeViewColumnSetTitle colCombo ("Combo"::T.Text  )
      
          iconRenderer <- cellRendererPixbufNew
          renderer1 <- cellRendererTextNew
          comboRenderer <- cellRendererComboNew
      
          cellLayoutPackStart imgCol iconRenderer True
          cellLayoutPackStart colName renderer1 True
          cellLayoutPackStart colCombo comboRenderer True
          
          cellLayoutSetAttributes imgCol iconRenderer lststoreManus $  (\ListElement { selected = t } -> [cellPixbuf := t])
          cellLayoutSetAttributes colName renderer1 lststoreManus $ \row -> [ cellText := name row ]
      
          cellLayoutSetAttributeFunc colCombo comboRenderer lststoreManus $ 
              (\iter -> do (tmodel, colid) <- comboTextModel 
                           (ListElement a b) <- treeModelGetRow lststoreManus iter
                           set comboRenderer [ cellVisible        := True
                                             , cellComboTextModel := (tmodel, colid)
                                             , cellTextEditable   := True
                                             , cellComboHasEntry  := False
                                             , cellText           := ("Choose pixbuf"::String)])  
      
          treeViewAppendColumn treeview colName
          treeViewAppendColumn treeview imgCol
          treeViewAppendColumn treeview colCombo
      
          _ <- on comboRenderer editingStarted $ \widget treepath -> do
           case treepath of
            [k] -> do       
              let comboPix::ComboBox = castToComboBox widget
              
              lststorerep::(ListStore (String,Pixbuf)) <- listStoreNew pixList
              customStoreSetColumn lststorerep (makeColumnIdString 0) fst
              customStoreSetColumn lststorerep (makeColumnIdPixbuf 1) snd
            
              comboBoxSetModel comboPix (Just lststorerep)
              rendertxt <- cellRendererTextNew
              renderpic <- cellRendererPixbufNew
           
              cellLayoutPackStart  comboPix rendertxt False
              cellLayoutPackStart  comboPix renderpic True
              cellLayoutAddColumnAttribute comboPix renderpic cellPixbuf $ makeColumnIdPixbuf 1
             
          _ <- on comboRenderer edited $ \_treePath newStringValue -> do
              case _treePath of
                [k] -> do
                 (ListElement a b) <- listStoreGetValue lststoreManus k
                 myMap <- getMap
                 let finded = fromJust ( Map.lookup newStringValue myMap  )
                 let toStore = ListElement a finded
                 listStoreSetValue lststoreManus k toStore
                 putStrLn $ "new value: " ++ newStringValue  
         
          fixedPut fixed treeview (10,10)
          widgetSetSizeRequest  treeview 500 100
      
          containerAdd window fixed
          onDestroy window mainQuit
          windowSetDefaultSize window 600 500
          windowSetPosition window WinPosCenter
          widgetShowAll window
          mainGUI
      
      comboTextModel = do store <- listStoreNew []
                          let column = makeColumnIdString 0 :: ColumnId String String
                          return (store, column)
      
      {-
      dependencies :
      - base >= 4.7 && < 5
      - gtk
      - text
      - containers
      -}
      
      {-#语言范围的TypeVariables}
      {-#语言重载字符串}
      导入数据.String
      导入Graphics.UI.Gtk
      导入符合条件的数据。映射为映射
      导入符合条件的数据。文本为T
      导入数据,也许吧
      将合格的Graphics.UI.Gtk.Gdk.Pixbuf导入为Pixbuf
      进口管制
      颜色锥度=[(0,0,0),(254,26,89),(255,0,0),(0255,0),(0,0255,0),(0255255,0),(025255),(255,0255),(192192192),(128128128128),(128,0),(0128,0),(1280128),(0128128),(0,0128)]
      制造商=[(“索尼”::字符串),(“LG”::字符串),(“松下”::字符串),(“东芝”::字符串),(“诺基亚”::字符串),(“三星”::字符串)]
      数据ListElement=ListElement{name::String,selected::Pixbuf}
      getManufacturers::IO[ListElement]
      getManufacturers=mapM(\x->do)
      pbn do
      pbn它适用于单个ComboBox,但不适用于树视图中的ComboBox。