我是Tkinter和Python的新手,所以也许这对你们来说很容易,但我找不到办法解决这个问题......
我想创建这样的东西:
所以,我正在使用网格布局管理来创建每个单元格,并且我在每个单元格中都存储了一个标签。
我目前的代码是:
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()
,绘制了这个数字:
但我有两个问题需要解决:
我该怎么办?
提前致谢。
答案 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)
在这里,我们为每个网格column
和row
赋予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轴上展开窗口时,我们最终会遇到文本的垂直高度导致部分字母被切掉的情况。我目前没办法解决这个问题。如果我找到方法,我会更新我的答案。