模板溢出的内容与林间空地和pygtk?

时间:2013-12-08 23:58:26

标签: python pygtk glade

我正在尝试开发一个“多轨”GUI(类似于多轨音频编辑器);但是,我想首先在glade中开发它,并检查溢出的内容(在这种情况下,多个“轨道”)将如何与scollbars一起表现。然后,在Python中实例化时,我首先想把这些“多个轨道”中的第一个作为“模板”,然后删除所有这些多个“轨道” - 然后允许用户根据“模板”添加新的“比方说,点击”添加“按钮。

从Gtk调色板中,我觉得handlebox是用作“轨道”基础的正确对象(我想最终在这些轨道中绘制)。到目前为止,我唯一能够完成的事情(假设在glade UI使用中找到的教程很少),就是让滚动条在GUI中运行 - 这里只是滚动窗口部分的屏幕截图(对应的)文件在下面):

multitrack.glade.png

正确的结构似乎是:

scrolled window
  viewport
    vbox
      handlebox 
        drawingarea
      handlebox ...

...而我所要做的就是将(全部)handlebox的“高度请求”设置为150px(我想要一个恒定的高度,并根据窗口进行宽度缩放);并将其包装/展开设置为“否”。此外,将scrolledwindow水平和垂直滚动条策略设置为“始终” - 否则不会显示滚动条(我错误地尝试放置一个额外的滚动条来查看它)。最后,要使滚动条工作,请完全单击其箭头 - 拖动滚动条在Glade中不起作用(至少在我使用的Ubuntu 11.04上没有使用glade3 3.8.0)。

到目前为止一直很好 - 至少我可以看到溢出的内容在glade中按照我的意愿行事,但是:

  • 这是正确的glade UI结构吗?我看到一个Layout对象和一个Frame对象 - 这些可能更合适吗? (尝试过它们,无法真正解决它们)
  • 在Python中读取.glade文件后,如何继续从handlebox1“提取”模板,并根据需要复制它?
  • 我是否还需要在添加/删除曲目时更改vbox的分区?如果是这样,有没有办法在不使用vb​​ox的情况下实现与上面相同的布局来添加/删除曲目?
  • 目前我很满意轨道宽度与窗口宽度的缩放比例;但是我应该确定我希望它们的固定宽度大于窗口宽度,我尝试将句柄框的宽度请求设置为1000,水平滚动条似乎在Glade中正常工作;宽度要求会是它的全部吗?
  • 如果我想让用户通过拖动重新排列垂直轨道顺序,是否需要特殊处理程序?

还有一个侧面问题 - 是否有一种方法可以直接从Glade(仅在“空窗口”)中快速“预览”Glade对象,而无需编写实例化脚本 - 可能通过使用某种快捷方式?

以下是multitrack.glade的代码(在GtkBuilder中):

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkScrolledWindow" id="scrolledwindow1">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <child>
          <object class="GtkViewport" id="viewport1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkVBox" id="vbox1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <object class="GtkHandleBox" id="handlebox1">
                    <property name="height_request">150</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkDrawingArea" id="drawingarea1">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkHandleBox" id="handlebox2">
                    <property name="height_request">150</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <placeholder/>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkHandleBox" id="handlebox3">
                    <property name="height_request">150</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <placeholder/>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">2</property>
                  </packing>
                </child>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>

1 个答案:

答案 0 :(得分:1)

男孩,这就是......好吧,为了做一个正确的模板编程,你需要递归复制Gtk对象,这些对象不易受深度复制的影响...所以我写了一个这样的函数,{{ 1}},包含在下面的来源中;供参考:

当然,没有经过广泛测试,但似乎对我有用。有意义的是,直到一个完整的深度克隆&#34;对于手柄箱和绘图区域,手柄箱不会伸展以适应窗户的宽度!

好事是 - 只需添加到Vbox,无需管理;但似乎拖拽行为将是一个挑战...但我仍然想知道这是否是正确使用的Gtk / Glade UI层次结构(如果有从Glade预览的快捷方式)

下面的代码也将输出起始层次结构:

deep_clone_widget

...和结束层次结构:

window1 :: GtkWindow
-scrolledwindow1 :: GtkScrolledWindow
--viewport1 :: GtkViewport
---vbox1 :: GtkVBox
----handlebox1 :: GtkHandleBox
-----drawingarea1 :: GtkDrawingArea
----handlebox2 :: GtkHandleBox
----handlebox3 :: GtkHandleBox

...希望确认深度克隆代码没问题。

以下是使用上述window1 :: GtkWindow -scrolledwindow1 :: GtkScrolledWindow --viewport1 :: GtkViewport ---vbox1 :: GtkVBox ----hb1_template :: GtkHandleBox -----drawingarea1 :: GtkDrawingArea ----hb1_template :: GtkHandleBox -----drawingarea1 :: GtkDrawingArea ----hb1_template :: GtkHandleBox -----drawingarea1 :: GtkDrawingArea ----hb1_template :: GtkHandleBox -----drawingarea1 :: GtkDrawingArea 的代码multitrack.py

multitrack.glade