自动调整网格布局中的Tkinter标签大小

时间:2018-01-17 17:07:30

标签: python tkinter

我是Tkinter和Python的新手,所以也许这对你们来说很容易,但我找不到办法解决这个问题......

我想创建这样的东西:

enter image description here

所以,我正在使用网格布局管理来创建每个单元格,并且我在每个单元格中都存储了一个标签。

我目前的代码是:

from tkinter import *

class RCP:

    frame = None
    commandsHandle = None

def __init__(self, targets):
    self.n_row = len(targets)
    self.n_col = len(targets[0])
    self.targets = targets
    self.canvasRoot = Tk()

def createGrid(self):
    # Create and configure the root
    Grid.rowconfigure(self.canvasRoot, 0, weight=1)
    Grid.columnconfigure(self.canvasRoot, 0, weight=1)

    # Create and configure the frame
    frame = Frame(self.canvasRoot)
    frame.grid(row=0, column=0, sticky="NESW")

    # Create the grid of commands
    commandsHandle = [[None for i in range(self.n_col)] for j in range(self.n_row)]
    for row_index in range(self.n_row):
        Grid.rowconfigure(frame, row_index, weight=1)
        for col_index in range(self.n_col):
            Grid.columnconfigure(frame, col_index, weight=1)
            commandsHandle[row_index][col_index] = Label(text=self.targets[row_index][col_index])
            commandsHandle[row_index][col_index].grid(row=row_index, column=col_index)

    self.canvasRoot.mainloop()


targets = [['A','B','C','D'],['E','F','G','H'],['I','J','K','L']]
myRCP = RCP(targets)
myRCP.createGrid()

,绘制了这个数字:

enter image description here

但我有两个问题需要解决:

  • 将标签文本置于每个网格单元格内
  • 自动调整标签文字大小以填充整个单元格

我该怎么办?

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以,这绝不是一个完美的解决方案(并且在我的机器上获得了糟糕的性能)但是你走了:

from tkinter import *

text = [['A','B','C','D'],['E','F','G','H'],['I','J','K','L'],['M', 'N', 'O', 'P'],['Q','R','S','T'],['U','V','W','X'],['Y','Z','1','2'],['3','4','5','6']]

root = Tk()

for c, i in enumerate(text):
    Grid.rowconfigure(root, c, weight=1)
    for a, b in enumerate(i):
        Label(root, text=b, font=('', 10)).grid(row=c, column=a)
        Grid.columnconfigure(root, a, weight=1)

class Resize:
    def __init__(self, root):
        self.root = root
        self.root.update()
        self.startsize = (root.winfo_width(),root.winfo_height())
        self.root.bind("<Configure>", self.on_resize)
    def on_resize(self, event):
        for i in self.root.winfo_children():
            i.config(font=('', int(10*((((self.root.winfo_width() * root.winfo_height()) - (self.startsize[0] * self.startsize[1]))/(self.startsize[0] * self.startsize[1]))+1))))

Resize(root)
root.mainloop()

回答您的疑问:

将标签文本置于每个网格单元格内

窗口小部件默认为网格中心&#34; cell&#34;,我假设你的意思是将它们均匀地分布在窗口上。这是使用命令完成的:

Grid.rowconfigure(root, c, weight=1)

Grid.columnconfigure(root, a, weight=1)

在这里,我们为每个网格columnrow赋予1相同的权重。这意味着每个column将共享窗口获得的任何额外的x轴空间,并且每个row将共享窗口获得的任何额外的y轴空间。这意味着每个&#34;细胞&#34;与窗户的其他孩子平等分享空间,这样他们就可以均匀分布。

自动调整标签文字大小以填充整个单元格

为了实现这一点,我们需要计算窗口与原始大小相比的大小增加。所以我们使用这个长的等式:

((((self.root.winfo_width() * root.winfo_height()) - (self.startsize[0] * self.startsize[1]))/(self.startsize[0] * self.startsize[1]))+1)

为了使其更具可读性,它与以下内容相同:

  

(((当前窗口x轴*当前窗口y轴) - (起始窗口x轴*起始窗口y轴))/(起始窗口x轴*起始窗口y轴))+ 1

或者

  

((当前窗口区域 - 原始窗口区域)/原始窗口区域)+ 1

这会导致窗口区域的百分比增加,同时考虑到窗口的原始大小。

意味着如果窗口的大小与原始大小相比增加了10%,那么我们最终得到1.1作为等式的结果。然后我们将原始字体大小(为方便起见10)乘以等式(1.1)的结果,得到我们新的字体大小11,比10大10%,这意味着我们的字体尺寸与窗户成比例。

不幸的是,当标签的字体增加太多时,我还没有找到让程序检测到的方法,它会强制文本超出网格范围&#34; cell&#34;。这意味着当在x轴上展开窗口时,我们最终会遇到文本的垂直高度导致部分字母被切掉的情况。我目前没办法解决这个问题。如果我找到方法,我会更新我的答案。