使用 Tkinter,如何在启动时定位对话框或如何在设置几何图形后自动调整窗口大小?

免责声明:这很可能是 XY 问题,如果您能指出我正确的方向,我将不胜感激。


目标:我有一个文件,我希望 tkinter 读取该文件,然后根据文件内容动态创建小部件。 我希望窗口始终以我的光标为中心打开。


为了 MCVE,让我们考虑一个纯文本文件,内容如下:


Madness?

This

IS

T K I N T E R

并且 tkinter 应该创建 4 个标签小部件,并调整主窗口的大小以适应。这很简单……直到文件被加密。 在我可以读取加密文件之前,我需要先askstring()输入密码(MCVE:我们还假设我们只在key这里要求)。


我的问题:


该askstring对话框始终处于默认位置。我知道它应该是相对于父(根)...


但是我无法geometry()在创建小部件之前进行设置,否则它不会调整到小部件的大小...


而且我无法预先确定所需的大小,geometry()因为没有密码(密钥)我无法打开文件......


这是我最成功的尝试的 MCVE 示例:


import tkinter as tk

from tkinter.simpledialog import askstring

from cryptography.fernet import Fernet


class GUI(tk.Tk):

    def __init__(self):

        super().__init__()


        # side note: If I don't withdraw() the root first, the dialog ends up behind the root

        # and I couldn't find a way to get around this.

        self.withdraw()

        self.create_widgets()


        # Attempt: I tried doing this instead of self.create_widgets():

            # self.reposition()

            # self.after(ms=1,func=self.create_widgets)

        # The dialog is positioned correctly, but the window size doesn't resize


        self.deiconify()


这实现了(我可以忍受):


✓ 根据文件内容修正大小

✓ 根定位在光标中心

⨯ 在光标中心提示输入键

我的问题是:


是否可以基于类似于pack_propagate()aftergeometry()设置的小部件功能再次对根执行自动调整大小?似乎一旦geometry()设置根就不会再传播了。


如果没有,我如何在代码中手动调整它的大小?我尝试检索小部件的总高度,height = sum([i.winfo_reqheight() for i in self.lbls])但height只是变为0. 但是当我print(self.lbls[-1].winfo_reqheight())在self.create_widgets()它返回26每个时,它们实际上在我self.reposition()调用后打印,这很奇怪。


否则,是否可以askstring()在创建小部件之前定位对话框?


我难住了。我觉得我正在以错误的方式解决这个问题,但我不确定处理这种情况以打破依赖循环的正确方法是什么。


为了帮助复制这里的加密字符串以及密钥:


数据:


gAAAAABb2z3y-Kva7bdgMEbvnqGGRRJc9ZMrt8oc092_fuxSK1x4qlP72aVy13xR-jQV1vLD7NQdOTT6YBI17pGYpUZiFpIOQGih9jYsd-u1EPUeV2iqPLG7wYcNxYq-u4Z4phkHllvP

钥匙:


SecretKeyAnyhowGoWatchDareDevilS3ItsAmazing=

编辑:基于@BryanOakley 的回答,我可以调用self.geometry("")重置,但它会返回到原始200x200大小,并且仍然不会传播小部件。


撒科打诨
浏览 223回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python