python - 带文本的 Tkinter 基本布局

标签 python tkinter

我正在努力为基于文本的游戏设计一个非常基本的布局。为什么第一列中的文本在字符串末尾之前停止,为什么窗口这么高?下面的代码,任何帮助表示赞赏。

from Tkinter import *
import tkFont

class TreasureHunt:

    def __init__(self, master):
        app = Frame(master)
        app.grid()

        self.mono_font = tkFont.Font(family="monospace",size=24,weight="bold")
        self.instructions = "Find the hidden treasure!\n\nUse the arrow keys to select where to look, then press Enter to check. \
        There is a 50/50 chance you will be told the distance from the treasure. Keep hunting until you find it. Good luck!"

        self.info = Text(app, wrap=WORD, padx=10, pady=10, bd=0,width=10)
        self.info.insert(1.0,self.instructions)
        self.info.grid(row=0,column=0,sticky=N)

        self.island = Text(app, bg="cyan",bd=0, padx=20, pady=20, font=self.mono_font,width=20)
        self.island.insert(1.0, "ready")
        self.island.grid(row=0,column=1)

        self.display_grid()

    def display_grid(self):
        self.matrix = [["# " for col in range(8)] for row in range(8)]
        for row in range(len(self.matrix)):
            row_str = "".join(self.matrix[row]) +"\n"
            self.island.insert(1.0,row_str)


root = Tk()
game = TreasureHunt(root)
root.mainloop()

最佳答案

窗口这么高的原因是因为你没有给任何东西一个明确的高度,所以 Tkinter 不得不依赖它的默认值。默认情况下,文本小部件的高度为 24 行。

右侧的小部件使用最高的字体,使其成为窗口中最高的小部件。该窗口将尝试适应所有内容,因此如果您将该文本小部件缩小,则整个窗口将变小。

self.island = Text(app, ..., height=9)

我不太清楚您所说的“第一列中的文本 [在字符串末尾之前] 停止”是什么意思。我没有看到它停止,我看到它像我期望的那样包装,就像你指示的那样。您将宽度设置为 10 个字符,并告诉它在单词边界处换行。

此外,当您使用 grid 时,根据经验,您必须至少为一行和一列赋予权重。权重是 Tkinter 知道如何分配任何额外空间的方式。请注意,如果您调整窗口大小,其中的小部件不会增大或缩小。这是因为它们所在的行和列的默认权重为 0(零)。

要更改它,请使用 row_configurecolumn_configure。例如,如果您希望蓝色区域扩展以占用所有额外空间,请为其行和列赋予权重 1(一):

app.grid_rowconfigure(0, weight=1)
app.grid_columnconfigure(1, weight=1)

如果你这样做,你会发现......没有任何改变。 Tkinter 确实会为第 0 行和第 1 列提供额外的空间。但是,您还必须做更多的事情。您需要在调用 grid 时使用 sticky 属性来请求小部件“粘附”到给定空间的边缘。

self.info.grid(row=0,column=0,sticky=N+S+E+W)
...
self.island.grid(row=0,column=1,sticky=N+S+E+W)

当您这样做时,您会看到......没有任何变化。那是因为 app 是一个框架,并且该框架位于根窗口内。但是,您没有为 app 所在的行和列指定权重,也没有为其指定 sticky 值。

但是,如果您的根窗口只有一个小部件,则使用 pack 而不是 grid 会更容易一些。我这样说的原因是您不必担心设置行和列的权重。

尝试改变这一行:

app.grid()

...为此:

app.pack(fill="both", expand=True)

有了它,您会看到小部件现在填满了窗口,如果您调整窗口大小,它也会相应地调整大小。

作为一个有趣的练习,尝试在设置应用权重的地方添加这一行。将其他行留在那里,你想给两列一个权重。尝试一下,注意手动调整窗口大小时会发生什么。

app.grid_columnconfigure(0, weight=1)

请注意,两个内部小部件都展开了。这些列具有相同的权重,因此它们会同等扩展。要让右边比左边膨胀两倍,将其权重设置为 2。

关于python - 带文本的 Tkinter 基本布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271280/

相关文章:

python - 他们是 grid_remember() 吗?可逆grid_forget()?

opencv - 如何在不终止子进程的情况下在被调用进程中使用子进程的输出?

python - 使 tkinter Scale 跨越它的完整网格单元格

python - 如何使用 file.upload 和 requests 将文件上传到 slack

python - 从二值图像中获取 n 个最大区域

python - Catboost 预测返回错误特征在数据集中标记为不同

python - 构建多维微分矩阵

python - Tkinter - 输入框 - 日期格式

python - 迭代 pandas 时间戳时获取 for 循环的索引

python - 如何使用 tkinter python 创建迷宫类型界面?