- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的代码创建了一列三个标签。我想使用中间的标签,在初始创建 UI 之后使用标签中的文本将其替换为另一个小部件。
我的实际用例是采用 GTKBuilder 填充的 UI,并将任何特定的命名标签替换为 dynamically wrapped label在运行时。 (我在这里使用了一个按钮,因为它简单但与众不同。)然后我仍然可以使用 Glade 来设置 UI,包括标签,如果我以后想要制作标签包装,就不会在我的 Python 代码中添加错误的标签和字符串。
目前的代码不起作用 - 新按钮被添加到列的末尾,我希望它保留在中间,label2
开始的地方。我该怎么做,最好是在 wrap_in_button
中,以确保它最终出现在正确的位置?我宁愿保持它的通用性,因为父级可能是 Box
或 Table
或任何通用的 Container
。
import pygtk
import gtk
def destroy(widget, data=None):
gtk.main_quit()
def wrap_in_button(label):
text = label.get_text()
button = gtk.Button(text)
parent = label.get_parent()
if parent:
parent.remove(label)
parent.add(button)
def Main():
# Pretend that this chunk is actually replaced by GTKBuilder work
# From here...
window = gtk.Window()
window.connect('destroy', destroy)
box = gtk.VBox()
window.add(box)
label1 = gtk.Label("Label 1")
label2 = gtk.Label("Label 2")
label3 = gtk.Label("Label 3")
box.pack_start(label1)
box.pack_start(label2)
box.pack_start(label3)
# ...up to here
# Comment this to see the original layout
wrap_in_button(label2)
window.show_all()
gtk.main()
if __name__ == "__main__":
Main()
最佳答案
我在gazpacho界面设计器的代码中找到了解决方案。
你可以使用这个函数:
def replace_widget(current, new):
"""
Replace one widget with another.
'current' has to be inside a container (e.g. gtk.VBox).
"""
container = current.parent
assert container # is "current" inside a container widget?
# stolen from gazpacho code (widgets/base/base.py):
props = {}
for pspec in gtk.container_class_list_child_properties(container):
props[pspec.name] = container.child_get_property(current, pspec.name)
gtk.Container.remove(container, current)
container.add(new)
for name, value in props.items():
container.child_set_property(new, name, value)
关键似乎是在运行 gtk.Container.add()
之后将子属性从旧小部件转移到新小部件。
应用于您的示例,这将是:
import pygtk
import gtk
def replace_widget(current, new):
"""
Replace one widget with another.
'current' has to be inside a container (e.g. gtk.VBox).
"""
container = current.parent
assert container # is "current" inside a container widget?
# stolen from gazpacho code (widgets/base/base.py):
props = {}
for pspec in gtk.container_class_list_child_properties(container):
props[pspec.name] = container.child_get_property(current, pspec.name)
gtk.Container.remove(container, current)
container.add(new)
for name, value in props.items():
container.child_set_property(new, name, value)
def destroy(widget, data=None):
gtk.main_quit()
def wrap_in_button(label):
text = label.get_text()
button = gtk.Button(text)
replace_widget(label, button)
def Main():
# Pretend that this chunk is actually replaced by GTKBuilder work
# From here...
window = gtk.Window()
window.connect('destroy', destroy)
box = gtk.VBox()
window.add(box)
label1 = gtk.Label("Label 1")
label2 = gtk.Label("Label 2")
label3 = gtk.Label("Label 3")
box.pack_start(label1)
box.pack_start(label2)
box.pack_start(label3)
# ...up to here
wrap_in_button(label2)
window.show_all()
gtk.main()
if __name__ == "__main__":
Main()
这适用于使用 Python 2.6.6 和 PyGTK 2.17 的我。
作为您原来问题的解决方案,我使用了 label_set_autowrap()
from here它大部分时间都有效。但是,这不是一个完美的解决方案,因为我无法正确右对齐自动换行的文本。
关于python - PyGTK 小部件的就地替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3107290/
我正在尝试解决以下问题: We are given an array containing ‘n’ objects. Each object, when created, was assigned a
考虑以下代码: a=(1 2 3) a='seven' export a declare -p a 输出(来自declare)是: declare -ax a='([0]="seven" [1]="2
我正在尝试将 ['1','2','3','4'] 转换为 [1,2,3,4]我想就地进行此转换。有可能做到吗?如果不是,最佳解决方案是什么。 最佳答案 我觉得用map比较好对于这类任务。这会创建迭代器
好的,所以我之前发布了关于尝试(没有任何预建函数)删除额外空间的信息 "this is a test"会回来的 "this is a test" Remove spaces from a strin
我有一个名为Media的插件,该插件应负责图像大小调整等工作。 它具有以下依赖性: dependencies { compile group: 'org.ccil.cowan.tagsoup'
我需要将一个大字符串向左“移动”X 个空格。它太大了,无法放入内存,所以我需要就地做。我需要使用最少量的系统调用来完成此操作。 我知道我可以使用缓冲区并重用内存来最大限度地减少内存消耗,然后使用 fs
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
是否有任何用于 Javascript 的就地编辑插件..像 firebug 之类的东西,它对即时 CSS 编辑和预览非常有用,但不允许就地 JS 编辑..那么,有没有我们可以立即更新和更新的工具或插件
题目如下:给定一个 linked list,将备用 indices 移到 list 的后面 例如: input: : [0] -> [1] -> [2] -> [3] -> [4]
在我看来,std::copy_if 对于过滤容器非常有用: std::vector vec { 1, 2, 3, 4 }; auto itEnd = std::copy_if(vec.begin(),
在 C++ 中相交两个集合的标准方法是执行以下操作: std::set set_1; // With some elements std::set set_2; // With some othe
在 Python 中,字符串是不可变的。 逐个字符遍历字符串并对其进行修改的标准习语是什么? 我能想到的唯一方法是一些与加入结果字符串相关的真正臭名昭著的黑客攻击。 -- 在 C 中: for(i
我有一个 ListBuffer。我想删除满足特定条件的所有元素。 我可以迭代它并删除每个元素。但是 Scala 对改变你正在迭代的列表有什么看法呢?它会起作用,还是会删除错误的元素/不返回所有元素?
我需要重新绑定(bind)两个大数据帧。现在我用的是 df 根据 nikola 的评论,这里是 ?rbindlist 的描述(v1.8.2 中的新增功能): Same as do.call("rbi
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
我在带有 LVS_EDITLABELS 的无模式 Win32 对话框中有一个小图标模式的 ListView 放。无论编辑是通过单击鼠标还是通过调用 ListView_LabelEdit() 以编程方式
所以基本上不能/允许创建一个新数组。除了实际更改和操作当前数组外,无法返回任何内容。您如何获取字符数组并简单地翻转/反转它们。 Starting array: ['P','e','r','f','e'
我不明白为什么下面的代码没有对 vector 的前两个元素进行排序: int main() { std::vector v = {2,1,3,1,2}; std::sort(v.beg
我有以下(简化的)代码: a = a[::3] b = b[::3] c = c[::3] d = d[::3] a,b,c,d,其实都是很复杂的表达式,所以我想这样写: for l in [a, b
可以对数组进行不依赖于数组秩的操作。迭代器也不总是合适的解决方案。给定数组 double[,] myarray = new double[10,5]; 实现以下工作流程是可取的: 将 Rank>1 的
我是一名优秀的程序员,十分优秀!