【问题标题】:Tkinter grid_forget is clearing the frameTkinter grid_forget 正在清除框架
【发布时间】:2020-07-24 18:38:08
【问题描述】:
    from tkinter import *
from PIL import ImageTk,Image
root=Tk()
root.title("Image Viewer")

def buttonforward(image_number):
    global myLabel
    myLabel.grid_forget()

    myLabel = Label(image=imagelist[image_number-1])
    myLabel.grid(row=0, column=0, columnspan=3)
    return
my_img1 = ImageTk.PhotoImage(Image.open('mountain1.jpg'))
my_img2 = ImageTk.PhotoImage(Image.open('mountain2.jpg'))
my_img3 = ImageTk.PhotoImage(Image.open('mountain3.jpg'))
my_img4 = ImageTk.PhotoImage(Image.open('mountain4.jpg'))
my_img5 = ImageTk.PhotoImage(Image.open('mountain5.jpg'))

myLabel = Label(image=my_img1, ).grid(row=0, column=0, columnspan=3)
imagelist = [my_img1, my_img2, my_img3, my_img4, my_img5]
button_back = Button(root, text='<<').grid(row=1,column=0)
button_exit = Button(root, text='Exit', padx=60, command=root.quit).grid(padx=60, row=1,column=1)
button_forward = Button(root, text='>>',command = lambda: buttonforward(2) ).grid(row=1,column=2)
root.mainloop()

myLabel.grid_forget() 不起作用,我在按下前进“>>”按钮后遇到以下错误: myLabel.grid_forget() AttributeError: 'NoneType' 对象没有属性 'grid_forget'

【问题讨论】:

标签: python python-3.x tkinter


【解决方案1】:

分离网格方法,它会工作。 Every function in Python needs to return something 如果没有返回任何内容,则默认设置为“无”。所以你的变量会变成myLabel = None。

既然您知道为什么这是不好的行为,那么您也应该对代码中的每个其他小部件都这样做。

.

说明

为了向您展示您的代码出了什么问题,请查看此处的这段代码:

import tkinter as tk

root = tk.Tk()
x1 = tk.Label(text='x1')
x1.pack()
print(x1)
root.mainloop()

输出应该是:

.!label

这告诉我 x1 已分配给标签。

现在看看这个:

import tkinter as tk

root = tk.Tk()

x1 = tk.Label(text='x1')
returned_by_layoutmanager = x1.pack()
print(x1)
print(returned_by_layoutmanager)
root.mainloop()

您的输出将是:

.!label
None

如果您可能注意到,None 已被布局管理器返回。 这就是 python 的工作方式,只要方法/函数返回了某个东西,解释器返回到他开始读取函数/方法的点。这就像函数告诉我完成了继续。

如果你这样做:

import tkinter as tk

root = tk.Tk()
x2 = tk.Label(text='x2').pack()
print(x2)
root.mainloop()

您的输出将是:

None

要理解为什么 None 被分配给 x2 而不是 .!label 通过这里的这一行:

x2 = tk.Label(text='x2').pack()

试试这个:

import tkinter as tk

root = tk.Tk()

x1 = tk.Label(text='x1')
x1 = x1.pack()
print(x1)

root.mainloop()

您的输出将是:

None

这和你在 oneliner 中做的一样。首先将 x1 分配给 Label 类的实例,然后将 x1 分配给 None.

【讨论】:

  • 对不起,我没有听懂你在这里想说什么。您可以通过更改我的代码来展示它吗?
  • 更新了我的答案以便更好地理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多