尽管有一些编码经验,但那是像 Cobol 一样的“旧 scole 3GL”,但那是几十年前的事了。不久前,出于乐趣和好奇,我利用互联网上的大量信息研究了 Python (3.9.5) 的 4GL 面向对象方面。编写一些较小的代码后,开始编写更大的代码。作为这方面的新手,我很可能在 4GL / Python 知识方面存在严重差距,因为我遇到了一个在网络上找不到解决方案的问题。
目标:代码要求小部件和框架有条件地打开和关闭。 对于小部件部分,我找到了解决方法。
问题:对于框架部分,我不断收到 'AttributeError:'_tkinter.tkapp'对象没有属性'grid_remove'',无论我做什么。
方法:包含的片段我用来测试小部件和框架的删除/忘记, 前者工作正常,后者则不行(参见错误)。 我唯一想要它做的就是允许有条件地打开和关闭框架。
感谢任何建设性的反馈。 艾瑞克
PS 如果有任何关于如何更好地理解 Python 中 IMPORT 的实际内容的建议,我们将非常感激。目前对我来说是一个黑匣子,我只是从网上找到的代码复制/粘贴,通过反复试验找出它的作用。必须有一种更结构化的方法吗?
from tkinter import *
import tkinter as tk
root = Tk()
root.title('root frame')
root.geometry('400x150+100+25')
# creating win1 as child (but is it?) from root/master. Used to test (un)hiding of frames
win1 = tk.Toplevel(root)
win1.title('win1 - to be (un)hide')
win1.geometry('400x150+700+25')
def but2():
print('in BUT2 => Call REMOVE to kill Btn1')
Label(win1, text='within BUT 2').grid()
remove()
def but3():
print('in BUT3 => that is to be removed')
Label(win1, text='within BUT 3').grid()
btn3 = Button(root, text ="BUT 3: will destroy root frame", command = root.destroy)
btn3.grid()
def remove():
print('in REMOVE => to try do remove BUT 1')
btn1.grid_remove()
Label(win1, text='within remove BUT 1').grid()
#causes: AttributeError: 'Toplevel' object has no attribute 'grid_remove' => it exists as indicated with label?
win1.grid_remove()
def revive():
print('in REVIVE => to try revive BUT 1')
btn1.grid(row = 1, column = 2, padx = 10, pady = 10)
Label(win1, text='within revive BUT 1').grid()
win1.grid()
def kill_root():
print('in KILL_ROOT => destroy root frame')
root.destroy()
btn1 = Button(root, text ="BUT 1: this will destroy ROOT", command = kill_root)
btn1.grid(row = 1, column = 2, padx = 10, pady = 10)
# create and hide it directly (works fine)
btn1.grid_remove()
btn2 = Button(root, text ="BUT 2: will remove BUT 1 + frame Win1", command = but2)
btn2.grid(row = 3, column = 2, padx = 10, pady = 10)
btn3 = Button(root, text ="BUT 3: will revive BUT 1 + frame Win1", command = revive)
btn3.grid(row = 5, column = 2, padx = 10, pady = 10)
# use label to instantiate (if that is the right terminology) win1
Label(win1, text='a label in Win1').grid()
mainloop()
找到了一种方法来查看“从 tkinter 导入某些内容”的作用。 如果我理解正确的话:
框架: 添加:grid_forget、grid_remove 但没有:几何、标题 另外:无论孩子如何,任何输出都将显示在这一帧中
顶层: 添加:几何、标题 但没有:grid_forget、grid_remove 另外:允许多个框架但不支持忘记/删除
LabelFrame:不是真正的框架,更多的是围绕一些小部件绘制的框
引出一个问题,Python 中是否可以使用可以随意隐藏(取消)隐藏的多个框架?