You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Colab调用plt.show()后input()输入框不显示的解决方法

解决Colab中plt.show()后无法显示input输入框的问题

你的代码在本地Jupyter Notebook能正常运行,但Colab里调用plt.show()后看不到评分输入框,核心原因是Colab的输出渲染逻辑和本地Jupyter存在差异:plt.show()会生成独立的图片输出块,后续的input()提示会被隐藏在输出区域底部,或被图片输出遮挡,导致无法直观触发交互。

以下是两种可行的解决方法:


方法一:调整输出控制逻辑(适配原生input交互)

通过IPython.display模块的工具统一输出上下文,确保图片和输入提示在同一区域显示,同时清理上一轮输出避免混乱:

import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output, display

imgs_list = ['img1.jpg', 'img2.jpg']
scores = []  # 存储所有图片的评分

for idx, img_name in enumerate(imgs_list):
    # 清理上一轮输出,wait=True确保新内容加载后再清理,避免闪烁
    clear_output(wait=True)
    
    img_path = os.path.join(os.getcwd(), img_name)
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

    height, width, _ = img.shape
    fig_size = (12,10) if height >= width else (10,12)
    
    plt.figure(figsize=fig_size)
    plt.imshow(img)
    plt.axis('off')
    # 直接显示画布对象,替代plt.show(),确保和输入提示在同一输出上下文
    display(plt.gcf())
    plt.close()  # 关闭画布释放内存

    vote = 0
    while vote < 1 or vote > 10:
        try:
            vote = int(input(f"为第{idx+1}张图片打分(1-10): "))
        except ValueError:
            vote = 0
        if vote not in range(1,11):
            print('请输入1-10之间的有效分数')
    scores.append(vote)

# 最后展示所有评分结果
clear_output(wait=True)
print("所有图片评分完成:")
for name, score in zip(imgs_list, scores):
    print(f"{name}: {score}分")

关键改动说明:

  • clear_output(wait=True):控制输出清理时机,避免频繁刷新导致的视觉闪烁
  • display(plt.gcf()):直接将Matplotlib画布对象传递给Colab的显示系统,和输入提示处于同一输出层级,不会被分隔
  • plt.close():及时关闭已显示的画布,避免内存占用过高

方法二:使用UI组件实现更友好的交互(可选)

如果想要更直观的评分体验,可以用ipywidgets组件替代原生input(),彻底规避输入框隐藏问题:

import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output, display
import ipywidgets as widgets

imgs_list = ['img1.jpg', 'img2.jpg']
scores = []

for idx, img_name in enumerate(imgs_list):
    clear_output(wait=True)
    
    img_path = os.path.join(os.getcwd(), img_name)
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

    height, width, _ = img.shape
    fig_size = (12,10) if height >= width else (10,12)
    
    plt.figure(figsize=fig_size)
    plt.imshow(img)
    plt.axis('off')
    display(plt.gcf())
    plt.close()

    # 创建评分滑块和确认按钮
    score_slider = widgets.IntSlider(min=1, max=10, value=5, description='评分:')
    confirm_btn = widgets.Button(description='确认评分')
    
    display(score_slider)
    display(confirm_btn)
    
    # 等待用户点击确认按钮
    btn_clicked = False
    def on_click(b):
        nonlocal btn_clicked
        btn_clicked = True
    confirm_btn.on_click(on_click)
    
    while not btn_clicked:
        pass
    
    scores.append(score_slider.value)

clear_output(wait=True)
print("所有图片评分完成:")
for name, score in zip(imgs_list, scores):
    print(f"{name}: {score}分")

优势:

  • 用滑块选择分数,避免手动输入的格式错误
  • 交互元素和图片在同一区域显示,完全不会出现隐藏问题

内容的提问来源于stack exchange,提问作者Andrea Marino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:43