【发布时间】:2022-01-19 06:56:01
【问题描述】:
我正在尝试实现一个自定义 Gtk 小部件,但我不知道如何请求特定的最小尺寸和首选尺寸。
在这里您可以看到我(尝试)请求最小尺寸为 300x300 和首选尺寸为 500x500,但 Gtk 甚至从未调用任何这些函数并创建一个 200x200 的窗口:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyWidget(Gtk.DrawingArea):
# None of these are ever called
def do_get_preferred_width_for_height(self, height):
print('do_get_preferred_width_for_height')
return 300, 500
def do_get_preferred_height_for_width(self, width):
print('do_get_preferred_height_for_width')
return 300, 500
def do_get_preferred_size(self):
print('do_get_preferred_size')
min_size = Gtk.Requisition()
min_size.width = min_size.height = 300
pref_size = Gtk.Requisition()
pref_size.width = pref_size.height = 500
return min_size, pref_size
def do_size_request(self, requisition):
print('do_size_request')
requisition.width = 500
requisition.height = 500
# Except for these two
def do_get_request_mode(self):
print('do_get_request_mode')
return Gtk.SizeRequestMode.CONSTANT_SIZE
def do_draw(self, context):
print('Window size:', window.get_allocated_width(), window.get_allocated_height())
width = self.get_allocated_width()
height = self.get_allocated_height()
context.set_source_rgb(0, 1, 0)
context.rectangle(0, 0, width, height)
context.fill()
window = Gtk.Window()
window.add(MyWidget())
window.show_all()
window.connect('destroy', Gtk.main_quit)
Gtk.main()
# Output:
# do_get_request_mode
# do_get_request_mode
# Window size: 200 200
我做错了什么?
【问题讨论】:
-
我一整天都在研究这个问题,我找到了部分解决方案。如果您在
do_get_request_mode()中使用return Gtk.SizeRequestMode.WIDTH_FOR_HEIGHT,则窗口的宽度将按照您想要的方式工作。如果你return Gtk.SizeRequestMode.HEIGHT_FOR_WIDTH,高度会按照你想要的方式工作。但我无法为自己的生活弄清楚如何让两者同时工作!我尝试了许多不同的方法,包括使用元组、使用|以及使用CONSTANT_SIZE以及它们,但都无济于事。也许您对如何让它们都起作用有一些想法? -
@SylvesterKruin 这是一个有趣的观察!我几乎去说我仍然不知道如何使它工作,但是当重新检查文档时,我注意到我忘记实现
do_get_preferred_width和do_get_preferred_height方法,并添加它们使它工作!我不知道为什么 Gtk 不会调用我的do_get_preferred_size方法,但是,嘿,我会接受的。如果你愿意,我会让你把它写成答案,因为无论如何我已经有足够多的代表了。 -
我无法让它工作,即使在 MRE 中也是如此。我写了你上面提到的两种方法,它们都是
return 500,它们都被调用了,但我仍然遇到了问题。难道我做错了什么?我尝试返回Gtk.Requisition,但收到一条错误消息。您是如何在 MRE 中修复它的? -
@SylvesterKruin 他们必须返回两个整数,最小大小和首选大小。所以
return 300, 500.