gpt4 book ai didi

python - 在父小部件内居中固定大小的 GtkDrawingArea 小部件

转载 作者:行者123 更新时间:2023-11-28 22:05:05 24 4
gpt4 key购买 nike

我有一个林间空地布局,其中有一个固定大小的 GtkDrawingArea。层次结构的当前相关部分是:

GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea

目前,GtkFixed 小部件在 GtkViewport 的左上角绘制。

但是,如果 GtkFixed(以及它唯一的子 GtkDrawingArea)在 GtkViewport 中居中(当然,当小部件被压缩到不适合其内容的程度时除外)并出现滚动条)。

实现此目标的最佳方法是什么?(我正在使用 pygtk 来做实际的应用程序逻辑,但这应该是一个一般的 gtk 问题)

这是一个代表性的代码示例:

import gtk

class Controller:

def on_window1_destroy(self, widget, data=None):
gtk.main_quit()

def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file("sample.glade")
self.window = self.builder.get_object("window1")
self.builder.connect_signals(self)

def on_drawingarea1_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0,0,0)
cr.paint()
return True

if __name__ == "__main__":
client = Controller()
client.window.show()
gtk.main()

还有一个具有相同问题的示例 glade 文件:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<signal name="destroy" handler="on_window1_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<object class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<child>
<object class="GtkFixed" id="fixed1">
<property name="width_request">300</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<child>
<object class="GtkDrawingArea" id="drawingarea1">
<property name="width_request">300</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<signal name="expose_event" handler="on_drawingarea1_expose_event"/>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

最后...问题的示例图片... Screeshot @ imgur

最佳答案

在 GTK 2.x 中,添加一个 GtkAlignment 作为您想要居中和对齐 0.5(禁用填充)的任何对象的父对象。

在 3.x 中,所有小部件上都有 xalign 和 yalign 属性,设置为 CENTER。

更新:从示例 glade 文件中,问题是填充没有被禁用;我懒得去查之前调用的属性是什么,在 GtkAlignment 中这是 xscale=0.0 yscale=0.0,这意味着不要扩展子级来填充可用空间。默认的 xscale=1.0 yscale=1.0 意味着 child 将填充可用空间,因此居中不会做任何事情。

在示例 Glade 文件中,我还必须执行“添加父级 -> 视口(viewport)”以在滚动窗口和对齐之间添加一个视口(viewport)。您应该在控制台上收到有关此的警告。

关于python - 在父小部件内居中固定大小的 GtkDrawingArea 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com