【问题标题】:Using ToggleToolButton to toggle between ListView and IconView使用 ToggleToolButton 在 ListView 和 IconView 之间切换
【发布时间】:2018-04-15 18:20:47
【问题描述】:

我目前正在开发一个文件管理器,并且我已经成功地分别实现了 ListView 和 IconView。现在我想创建一个切换按钮,以便用户可以在这些视图之间切换。我想通过根据切换按钮的状态更改主视图来实现这一点:

if toggletoolbutton.get_active():
            main_view = create_icon_view()
        else:
            main_view = create_list_view()

为此,我为切换按钮创建了事件:toggletoolbutton.connect("toggled", click_toggle_button)

def click_toggle_button(widget):
    global main_view
    print(toggletoolbutton.get_active())
    print(main_view)
    if(toggletoolbutton.get_active()):
        populate_icon_store()
    else:
        populate_list_store()
    if toggletoolbutton.get_active():
        main_view = create_icon_view()
    else:
        main_view = create_list_view()

这是我的两家商店:

  1. icon_store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, bool, float, float)
  2. list_store = Gtk.ListStore(str, str, bool, float, float)

我正在使用以下方法填充它们:

def get_icon(name):
        theme = Gtk.IconTheme.get_default()
        return theme.load_icon(name, 60, 0)


def populate_icon_store():

    global icon_store
    icon_store.clear()

    file_icon = get_icon(Gtk.STOCK_FILE)
    folder_icon = get_icon(Gtk.STOCK_DIRECTORY)

    for file_name in os.listdir(CURRENT_DIRECTORY):        
        modified_time = 0#os.path.getmtime(CURRENT_DIRECTORY+file_name)
        size = 0#os.path.getsize(CURRENT_DIRECTORY+file_name)
        if not file_name[0] == '.':
            if os.path.isdir(os.path.join(CURRENT_DIRECTORY, file_name)):
                icon_store.append([
                folder_icon, 
                file_name, 
                True,
                modified_time,
                size
                ])
            else:
                icon_store.append([
                file_icon, 
                file_name, 
                False,
                modified_time,
                size
                ])


def populate_list_store():

    global list_store
    list_store.clear()

    file_icon = Gtk.STOCK_FILE
    folder_icon = Gtk.STOCK_DIRECTORY

    for file_name in os.listdir(CURRENT_DIRECTORY):        
        modified_time = 0#os.path.getmtime(CURRENT_DIRECTORY+file_name)
        size = 0#os.path.getsize(CURRENT_DIRECTORY+file_name)
        if not file_name[0] == '.':
            if os.path.isdir(os.path.join(CURRENT_DIRECTORY, file_name)):
                list_store.append([
                folder_icon, 
                file_name, 
                True,
                modified_time,
                size
                ])
            else:
                list_store.append([
                file_icon, 
                file_name, 
                False,
                modified_time,
                size
                ])

整个代码库很大,所以你可以在这里找到它:https://github.com/hell-abhi/File-Manager

视图单独工作正常,但切换后它们不起作用。我该如何解决?

我阅读了这里提出的解决方案:Gtk3 replace child widget with another widget

但在我的情况下,main_view 正在调用两个单独的函数,它们会退出 listviewiconview

【问题讨论】:

  • 填充列表存储的代码是否与问题相关?你只是想用另一个小部件替换一个小部件,不是吗?
  • 它在click_toggle_button中使用,所以如果有人需要,我提供了参考。
  • @Aran-Fey 感谢您的链接,如果需要,我会检查并更新问题,否则将删除它。
  • @Aran-Fey 如何在click_toggle_button 期间使用此功能将视图分配给 main_view?

标签: python user-interface gtk gtk3


【解决方案1】:

你必须做两件事:

  1. 替换 GUI 中的小部件
  2. 更新main_view变量的值

由于您没有显示将main_view 添加到小部件层次结构的代码部分,因此我使用了here 中的replace_widget 函数:

def click_toggle_button(widget):
    global main_view
    if(toggletoolbutton.get_active()):
        populate_icon_store()
    else:
        populate_list_store()

    if toggletoolbutton.get_active():
        new_main_view = create_icon_view()
    else:
        new_main_view = create_list_view()
    replace_widget(main_view, new_main_view)
    main_view = new_main_view

【讨论】:

  • 它给出以下错误:TypeError: Unable to retrieve a GObject type class from "type"
  • @AbhishekKeshri 不幸的是,我没有耐心下载、阅读和更新您的 6 个 python 文件,以便重现此错误,所以我将等待您使用 @ 更新问题987654322@.
  • 是的,没问题。我会自己解决。干杯
猜你喜欢
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2015-01-19
  • 2015-05-21
相关资源
最近更新 更多