Canopy与命令行中的差异运行脚本

时间:2018-03-22 22:55:01

标签: python python-3.x tkinter canopy

我有一个脚本可以将一系列图像输出到Notebook,我在下面对其进行了简化:

import os
import sys
import tkinter as tk
from tkinter import ttk

path = sys.path[0]
os.chdir(path)

def on_close():
    root.quit()
    root.destroy()

root = tk.Tk()
root.geometry('1250x550')

n = ttk.Notebook(root)
n.grid()

imgs = [img for img in os.listdir(path) if img.endswith('.png')]

for img in imgs:
    f = ttk.Frame(n)
    n.add(f, text=img)
    photo = tk.PhotoImage(file=img)
    label = ttk.Label(f, image=photo)
    label.image = photo
    label.grid(row=1, column=1, padx=(300,0))

root.wm_protocol('WM_DELETE_WINDOW', on_close)
root.mainloop()

当我从Windows的命令行运行脚本时,脚本按原样运行。如果我将代码更改为root = tk.Toplevel(),则会出现一个额外的窗口(即隐式tk.Tk()窗口),这正是我所期望的。

然而,当我从Canopy中运行上面的脚本时,我收到错误说" pyimage不存在"。我可以通过将我的代码更改为root = tk.Toplevel()来解决这个问题,并且一切都正常运行而没有额外的窗口。

当我从Canopy跑步时,为什么会出现差异?我已经阅读了人们在显示图片时需要更改root = tk.Toplevel()的问题,因为他们以某种方式在他们的脚本中创建了两个根窗口。但是,我不相信这描述了我的情况,也无法解释为什么我的脚本可以从命令行运行,而不是Canopy。

1 个答案:

答案 0 :(得分:1)

默认情况下,Canopy的(IPython)内核是在PyLab模式下使用默认的Qt后端创建的。有关切换/禁用此功能的信息,请参阅https://support.enthought.com/hc/en-us/articles/204469880-Using-Tkinter-Turtle-or-Pyglet-in-Canopy-s-IPython-panel