【问题标题】:How to set minimum/preferred size in custom Gtk widget如何在自定义 Gtk 小部件中设置最小/首选大小
【发布时间】: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.

标签: python widget gtk gtk3


【解决方案1】:

这里的问题(参见this comment by the OP)是do_get_preferred_height() 和do_get_preferred_width() 方法没有实现。以下是您需要添加到类中的代码:

def do_get_preferred_height(self):
    print('get_preffered_height') # So you can see when it's called
    return 300, 500

def do_get_preferred_width(self):
    print('get_preffered_width') # So you can see when it's called
    return 300, 500

这应该使窗口的初始大小为 500x500,最小大小为 300x300。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多