epass 发表于 2020-6-4 15:33:45

tkinter中用grid_forget()清除控件失败

tkinter中用grid_forget()清除控件失败

设置了两个label,分别是C和lab1,
其中lab1的text是用了stringvar()变量设置的,而lC的text是直接赋值的常量,

后面用grid_forget()清除,lab1的控件清除成功,但C的失败了,是因为text的常/变量属性吗?因为我自己只发现这两个lab的设置区别

报错信息如下:

Traceback (most recent call last):
...
c.grid_forget()
AttributeError: 'NoneType' object has no attribute 'grid_forget'

说C标签没有grid_forget属性,但同样的写法lab1却可以?


---------代码-----------------------------
c=tk.Label(root,text="中文语义").grid(row=0,sticky=tk.E+tk.S)
ch = tk.StringVar()

lab1=tk.Label(root, textvariable=ch,),
lab1.grid(row=0,column=1,sticky=tk.E+tk.W+tk.S)

.
.
.

lab1.grid_forget()#删除题目控件,成功
c.grid_forget()#删除题目控件,失败

Twilight6 发表于 2020-6-4 15:36:09

发个完整代码~

epass 发表于 2020-6-4 16:11:29

Twilight6 发表于 2020-6-4 15:36
发个完整代码~

啊,因为代码处于草稿阶段写 的很乱,中间def的function也多,不太容易读,除了我自己,所以没贴完整的上来。还有是读取了csv文件,不把这些打包,也不能顺利调试,不好找问题原因。

先谢谢愿意回答的朋友了。

然后,我持续百度时,终于找到原因了,是别人讲bind的写法注意事项得到的启发。
不是stringVar的关系,是控件后直接加grid()的原因,拆开分行写就OK了。
测试已经成功了。
为了帮助其他人,我把别人的经验也贴上来吧。
作为新手,这些书写格式的讲究地方感觉最难,到处都是坑。{:10_266:}
-------------正解------------------------------
其中bind函数是定义在Misc类里面的,也就是说,这个bind可以被绝大多数组件类所使用

注意:若使用bind,则布局必须写在bind后无法会报AttributeError错

b = Button(root, text='确定').grid(row=2, column=1, stick=E)
b.bind('<Button-1>', reg)

此写法是错误的,执行结果会报AttributeError: 'NoneType' object has no attribute 'bind'

正确写法:

b = Button(root, text='确定')
b.bind('<Button-1>', reg)
b.grid(row=2, column=1, stick=E)

Twilight6 发表于 2020-6-4 16:13:06

epass 发表于 2020-6-4 16:11
啊,因为代码处于草稿阶段写 的很乱,中间def的function也多,不太容易读,除了我自己,所以没贴完整的上 ...

嗯嗯很强

jia159753 发表于 2020-6-4 20:52:30

c=tk.Label(root,text="中文语义").grid(row=0,sticky=tk.E+tk.S)
c=tk.Label(root,text="中文语义")
c.grid(row=0,sticky=tk.E+tk.S)
这样写可不可以

epass 发表于 2020-6-4 22:09:02

jia159753 发表于 2020-6-4 20:52
c=tk.Label(root,text="中文语义").grid(row=0,sticky=tk.E+tk.S)
c=tk.Label(root,text="中文语义")
c.g ...

对,就是这样,把第一行放一起的grid()拆开成第2、3行的样式,这样控件后面要再加别的 操作都可以,否则很容易报错。
页: [1]
查看完整版本: tkinter中用grid_forget()清除控件失败