我正在尝试开发一个“多轨”GUI(类似于多轨音频编辑器);但是,我想首先在glade
中开发它,并检查溢出的内容(在这种情况下,多个“轨道”)将如何与scollbars一起表现。然后,在Python中实例化时,我首先想把这些“多个轨道”中的第一个作为“模板”,然后删除所有这些多个“轨道” - 然后允许用户根据“模板”添加新的“比方说,点击”添加“按钮。
从Gtk调色板中,我觉得handlebox
是用作“轨道”基础的正确对象(我想最终在这些轨道中绘制)。到目前为止,我唯一能够完成的事情(假设在glade
UI使用中找到的教程很少),就是让滚动条在GUI中运行 - 这里只是滚动窗口部分的屏幕截图(对应的)文件在下面):
正确的结构似乎是:
scrolled window
viewport
vbox
handlebox
drawingarea
handlebox ...
...而我所要做的就是将(全部)handlebox
的“高度请求”设置为150px(我想要一个恒定的高度,并根据窗口进行宽度缩放);并将其包装/展开设置为“否”。此外,将scrolledwindow
水平和垂直滚动条策略设置为“始终” - 否则不会显示滚动条(我错误地尝试放置一个额外的滚动条来查看它)。最后,要使滚动条工作,请完全单击其箭头 - 拖动滚动条在Glade中不起作用(至少在我使用的Ubuntu 11.04上没有使用glade3 3.8.0)。
到目前为止一直很好 - 至少我可以看到溢出的内容在glade
中按照我的意愿行事,但是:
glade
UI结构吗?我看到一个Layout对象和一个Frame对象 - 这些可能更合适吗? (尝试过它们,无法真正解决它们).glade
文件后,如何继续从handlebox1
“提取”模板,并根据需要复制它? 还有一个侧面问题 - 是否有一种方法可以直接从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>
答案 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