【发布时间】:2017-02-18 08:10:30
【问题描述】:
一段时间以来,我一直在尝试调整标签的宽度,但这似乎是不可能的,或者至少对我来说是不可理解的......
为了清楚起见,我将用图像解释我的情况。
这是带有“正常”标签的窗口的外观...
这就是窗口看起来非常大的文本......
现在,这就是我希望它在文本大得离谱时的样子
看到了吗?
示例代码如下:
# -*- coding: utf-8 -*-
import gi
import signal
import hashlib
import random
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Pango
class Test(Gtk.Window):
def __init__(self):
def center(a):
a.props.valign = Gtk.Align.CENTER
a.props.halign = Gtk.Align.CENTER
Gtk.Window.__init__(self, title="Test")
self.set_position(Gtk.WindowPosition.CENTER)
self.set_border_width(10)
self.set_resizable(False)
self.connect("delete-event", Gtk.main_quit)
Box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
Button = Gtk.Button("Change Label")
Label = Gtk.Label()
Test = "I'm a Label, Yay!"
center(Box)
center(Label)
center(Button)
Label.set_markup('<span><big>%s</big></span>' % Test)
Label.set_ellipsize(Pango.EllipsizeMode.END)
Label.set_justify(Gtk.Justification.LEFT)
self.add(Box)
Box.add(Label)
Box.add(Button)
#UNKNOWN/FORBIDDEN/DEPRECIATED/INCOMPREHENSIBLE MAGIC!
#Uncomment only one or both, and watch it's magic!
#self.set_resizable(True)
#Box.set_resize_mode(Gtk.ResizeMode.QUEUE)
def change_label(self):
Label.set_markup('<span><big>%s</big></span>' % str(hashlib.sha384(str(random.random())).hexdigest()))
Button.connect("clicked", change_label)
if __name__ == '__main__':
MainWindow = Test()
MainWindow.show_all()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
请注意,窗口不可调整大小。
如果您取消注释“魔术”部分中的一个或两个,您将看到窗口如何改变它的行为!
但是
使用这两种方法都有两个缺点:
如果您取消注释
#self.set_resizable(True)WINDOW 将再次变得可调整大小,我不希望这种情况发生#Box.set_resize_mode(Gtk.ResizeMode.QUEUE)似乎是“完美”的解决方案,但尽管它可以满足我的要求,但在最近的 Gtk 版本中它似乎已被“弃用”。
此外,在其他一些窗口管理器和主题中,当您多次更改标签的字符串时,它会导致窗口的尺寸出现一些中断。
您对此有什么建议吗?
我完全受够了这个。我已经尝试了几个星期,但没有结果:c
也许有一种方法可以模拟 Window 可调整大小时的行为,而不显示 Resize Grips & Maximize Button?
或者set_resize_mode(Gtk.ResizeMode.QUEUE) 的更新方法是什么?
PD:Label.set_max_width_chars() 不是我要搜索的内容
【问题讨论】:
-
你能解释一下为什么
set_max_width_chars()不是一个选项吗? -
因为这会将单词限制为您请求的指定长度。这在某些情况下会起作用,但是让我们假设您可能想要添加德语翻译。例如,在英语中,您可以将 Label 的 Text 设置为“awesome”和 `Label.set_max_width_chars(7)。在德语中,Label 的文本是“Ehrfurcht gebietend”(至少谷歌翻译这么说)。
-
我明白了。您能否使用字符串长度来设置宽度值,使其与初始文本匹配,然后如果标签更改,宽度保持不变。
-
我想要做的是告诉标签、标签的父级或窗口本身在实际宽度内显示尽可能多的文本。我不想使用
Label.set_max_width_chars()手动“限制”标签的宽度。我需要它是这样的:“嘿,对不起,我显示了我能显示的所有文本,这不是我的错”我不希望它依赖于手动声明的值,只依赖于实际窗口的宽度,这可能会有所不同.你为什么不试试我的示例代码或多或少地了解我想要实现的目标? -
我发现了一些有趣的东西:developer.gnome.org/pygtk/stable/… 如果我理解正确,它说 Gtk.Label 自动调用
queue_resize()每当它检测到它自己的标签发生变化时,我正在考虑: * 有没有办法“停用”这种行为,所以 Gtk.Label 不会自动调整大小。也许抑制对queue.resize的调用也许我们应该创建一个不调用queue.resize的自定义Gtk.Label?
标签: label size width gtk3 pygobject