如何在窗口小部件中放置多个字体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在窗口小部件中放置多个字体相关的知识,希望对你有一定的参考价值。

如何将多种字体添加到窗口小部件中?

我发现这可行。

b=Button(frame, text="Big bold text\n" "Small text")

我尝试过很多东西但是我无法让代码工作。简单地说,我想要一个大的粗体文本和一个小文本在彼此之下。

感谢您的帮助和建议。

答案

Tk按钮小部件和ttk按钮小部件都不支持为文本元素使用多种字体。但是,您可以使用Canvas小部件构造一些内容,以在单个小部件中获取两个单独的文本元素。关于制作垂直文本按钮的This answer提供了一个类似的例子,这将是一个很好的起点。

另一答案

我知道这个帖子在写这篇文章的时候还很老但是想要这个确切的问题但是用Label代替。要解决此问题,请尝试以下代码(希望使用它是非常不言自明的):

from tkinter import *
from tkinter.font import *

def example_method (): print ("Click!")

class Button2:

    """
Allows multiple fonts in a very simple button.
Only supports 'master', 'text' and 'command' keywords
    ('master' is compulsory)
Fonts are delared in < > with the following options:
    BOLD = Make the text bold
    ITALIC = Make the text italic
    STRIKEOUT = Strike through the text
    UNDERLINE = Underlines the text
    an integer = the text size
    any other keyword is assumed to be the text family
    For the default text style, leave the < > empty
NOTE: Only supports the grid method due to internal handelling
    """

    def __init__ (self, master, text = "<>", command = None):

        self.f, self.command = Frame (root, relief = RAISED, borderwidth = 3), command
        self.f.bind ("<Button-1>", lambda event: self.__click ())
        self.f.bind ("<ButtonRelease-1>", lambda event: self.__release ())

        sections = [i.split (">") for i in text.split ("<") [1 : ]]

        row, column = 0, 0
        for section in sections:

            font_decomp, kw = section [0].split ("_"), {}
            for keyword in font_decomp:
                if keyword == "STRIKEOUT": kw ["overstrike"] = True
                elif keyword == "BOLD": kw ["weight"] = BOLD
                elif keyword == "ITALIC": kw ["slant"] = ITALIC
                elif keyword == "UNDERLINE": kw ["underline"] = True
                try: kw ["size"] = int (keyword)
                except: kw ["family"] = keyword

            temp_font = Font (**kw)
            l = Label (self.f, text = section [1].replace ("\n", ""), font = temp_font)
            l.grid (row = row, column = column)
            l.bind ("<Button-1>", lambda event: self.__click ())
            l.bind ("<ButtonRelease-1>", lambda event: self.__release ())

            if section [1].count ("\n") >= 1:
                column = -1
                for i in range (section [1].count ("\n") - 1):
                    l = Label (self.f, text = "", font = temp_font)
                    l.grid (row = row, column = column)
                    l.bind ("<Button-1>", lambda event: self.__click ())
                    l.bind ("<ButtonRelease-1>", lambda event: self.__release ())
                    row += 1
                row += 1
            column += 1

    def __click (self):
        self.f.config (relief = SUNKEN)
        if self.command: self.command ()

    def __release (self): self.f.config (relief = RAISED)

    def grid (self, **kw): self.f.grid (**kw)

root = Tk ()
root.title ("Multiple fonts")
Button2 (root, text = "<30_BOLD>Big bold text\n<10>Small text", command = example_method).grid ()
root.mainloop ()

以上是关于如何在窗口小部件中放置多个字体的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress:如何在菜单中放置小部件区域

网格中的网格可能吗?

在表单小部件中放置扩展的位置

如何在 tkinter ~ python 中放置在网格中的两个小部件之间添加空间?

如何在 ArcGIS esri 搜索中放置查询?

如何隐藏主窗口标题栏并在 kivy 框架中放置透明背景?