如何刷新/替换 gtk.ToolItemGroup

发布于 2024-10-03 02:17:01 字数 2638 浏览 3 评论 0原文

我写了这段代码,它应该是一个剪贴画浏览器(锁定到当前目录下的“klip”文件夹)。

当我开始在文件夹按钮(dbutton)上添加信号时,我搞砸了:我不知道如何刷新工具组内容,并且图标保持附加,我无法手动删除,因为按钮是在循环中生成的。

另外,如何“自动调整/修剪”按钮标签?因为如果文件名很长,它会变得疯狂。

import gtk
from os.path import join,normpath,splitext, isdir
from os import getcwd, walk, mkdir

klip="klip"
klipdir=join(getcwd(),klip)
#init dir
if not isdir(klipdir):
    mkdir(klipdir)

class kaosmu:
    def icon_builder_cb(self, widget, data=klip):
        if data != klip:
            homebutton = gtk.ToolButton(gtk.STOCK_HOME)
            browser.add(homebutton)
            upbutton = gtk.ToolButton(gtk.STOCK_GO_UP)
            browser.add(upbutton)

        #folder
        idx=dirs.index(data)
        print idx
        for i in dirs[idx+1]:
            dbutton = gtk.ToolButton(gtk.STOCK_OPEN)
            dbutton.set_label(i)
            dbutton.connect("clicked", self.icon_builder_cb, join(data,i))
            browser.add(dbutton)

        #files
        for i in dirs[idx+2]:
            pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(data,i),32,32)
            img=gtk.Image()
            img.set_from_pixbuf(pixbuf)
            svg = gtk.ToolButton(img,splitext(i)[0])
            browser.add(svg)

        browser.show_all()

    def im_browser_cb(self, widget, data=klipdir):
        global dirs
        dirs = []
        for (p, d, f) in walk(data):
            key=p[len(data)-len(klip):]
            dirs.append(key)
            dirs.append(d)
            dirs.append(f)

    def __init__(self):
        self.im_browser_cb(None)
        window = gtk.Window()
        window.set_default_size(1024, 800)
        window.set_border_width(2)
        window.connect("destroy", lambda w: gtk.main_quit())

        drawingarea = gtk.DrawingArea()
        drawingarea.set_size_request(600, 700)

        hpane = gtk.HPaned()
        menuscroll = gtk.ScrolledWindow()
        canvasscroll = gtk.ScrolledWindow()

        toolpalette = gtk.ToolPalette()
        toolpalette.set_style(gtk.TOOLBAR_BOTH)
        toolpalette.set_icon_size(gtk.ICON_SIZE_DND)

        hpane.set_position(250)
        window.add(hpane)
        hpane.add1(menuscroll)
        hpane.add2(canvasscroll)
        menuscroll.add_with_viewport(toolpalette)
        canvasscroll.add_with_viewport(drawingarea)

        global browser
        browser = gtk.ToolItemGroup("          Browser          ")

        toolpalette.add(browser)
        toolpalette.set_expand(browser, True)
        self.icon_builder_cb(None)

        window.show_all()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    kaos = kaosmu()
    kaos.main()

I wrote this code, it's supposed to be a clipart browser (locked to "klip" folder under current directory).

When I start add signal at folder button (dbutton) I screw up: I don't know how to refresh the toolitemgroup content and icons keep appended, I can't remove manually since the button generated in loop.

And one more, how can I "auto-fit/trim" the button label? Cause it grows insane if the filename is lengthy.

import gtk
from os.path import join,normpath,splitext, isdir
from os import getcwd, walk, mkdir

klip="klip"
klipdir=join(getcwd(),klip)
#init dir
if not isdir(klipdir):
    mkdir(klipdir)

class kaosmu:
    def icon_builder_cb(self, widget, data=klip):
        if data != klip:
            homebutton = gtk.ToolButton(gtk.STOCK_HOME)
            browser.add(homebutton)
            upbutton = gtk.ToolButton(gtk.STOCK_GO_UP)
            browser.add(upbutton)

        #folder
        idx=dirs.index(data)
        print idx
        for i in dirs[idx+1]:
            dbutton = gtk.ToolButton(gtk.STOCK_OPEN)
            dbutton.set_label(i)
            dbutton.connect("clicked", self.icon_builder_cb, join(data,i))
            browser.add(dbutton)

        #files
        for i in dirs[idx+2]:
            pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(data,i),32,32)
            img=gtk.Image()
            img.set_from_pixbuf(pixbuf)
            svg = gtk.ToolButton(img,splitext(i)[0])
            browser.add(svg)

        browser.show_all()

    def im_browser_cb(self, widget, data=klipdir):
        global dirs
        dirs = []
        for (p, d, f) in walk(data):
            key=p[len(data)-len(klip):]
            dirs.append(key)
            dirs.append(d)
            dirs.append(f)

    def __init__(self):
        self.im_browser_cb(None)
        window = gtk.Window()
        window.set_default_size(1024, 800)
        window.set_border_width(2)
        window.connect("destroy", lambda w: gtk.main_quit())

        drawingarea = gtk.DrawingArea()
        drawingarea.set_size_request(600, 700)

        hpane = gtk.HPaned()
        menuscroll = gtk.ScrolledWindow()
        canvasscroll = gtk.ScrolledWindow()

        toolpalette = gtk.ToolPalette()
        toolpalette.set_style(gtk.TOOLBAR_BOTH)
        toolpalette.set_icon_size(gtk.ICON_SIZE_DND)

        hpane.set_position(250)
        window.add(hpane)
        hpane.add1(menuscroll)
        hpane.add2(canvasscroll)
        menuscroll.add_with_viewport(toolpalette)
        canvasscroll.add_with_viewport(drawingarea)

        global browser
        browser = gtk.ToolItemGroup("          Browser          ")

        toolpalette.add(browser)
        toolpalette.set_expand(browser, True)
        self.icon_builder_cb(None)

        window.show_all()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    kaos = kaosmu()
    kaos.main()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哆兒滾 2024-10-10 02:17:01

我用以下方法解决了这个问题:

while browser.get_nth_item(0):
   browser.remove(browser.get_nth_item(0))

I solved this with:

while browser.get_nth_item(0):
   browser.remove(browser.get_nth_item(0))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文