免责声明:这很可能是 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大小,并且仍然不会传播小部件。
相关分类