如何获取 PNG 文件作为窗口背景?回复:Python、tkinter、pillow、pil

问题描述 投票:0回答:4

目标:使“tomato.png”(左侧图像)成为右侧窗口的背景。

当我运行代码时,窗口甚至不会出现,我会收到以下消息:

_tkinter.TclError:无法识别图像文件“tomato.png”中的数据

在之前使用 tkinter 的工作中,我使用了 tkk。为了让我正在使用的按钮上显示文字,我在这里尝试了无济于事(这个方法是我的火力全开。我从12月31日才开始学习Python - 有很多我不知道。)

我用谷歌搜索了我的问题,并对 Pil/Pillow 有了粗略的了解...所以我通过 Pycharm 安装了 Pillow。

取得了一些进展。通过 Pycharm 安装 Pillow 后,窗口实际上出现了,错误消息没有出现,但是......图像没有生成。

另外,这是我正在使用的python的路径:/Users/my_name/.pyenv/versions/3.10.0/bin/python

我将感谢您提供并记住的所有帮助...我刚刚接触Python两周,具有金融背景-我根本不同意编程用语...。即使在研究这个问题时,也有人建议通过命令行安装 pip,坦率地说,我不知道发生了什么。

另外,这是我的第一篇文章,所以如果我没有遵循这篇文章中的 SOP,请不要钉死我。你们有些人回答问题的时候很无情。

非常感谢您的宝贵时间。

https://i.stack.imgur.com/BCehz.png 我的代码照片的链接应该在这里^^

但是我在这里手动输入的:

from tkinter import 

from tkinter import ttk

from PIL import Image

from PIL import ImageTk

# ---------------------------- CONSTANTS ------------------------------- #
PINK = "#e2979c"
RED = "#e7305b"
GREEN = "#9bdeac"
YELLOW = "#f7f5dd"
FONT_NAME = "Courier"
WORK_MIN = 25
SHORT_BREAK_MIN = 5
LONG_BREAK_MIN = 20

# ---------------------------- TIMER RESET ------------------------------- # 

# ---------------------------- TIMER MECHANISM ------------------------------- # 

# ---------------------------- COUNTDOWN MECHANISM ------------------------------- # 

# ---------------------------- UI SETUP ------------------------------- #

window = Tk()
window.title("Pomodoro")

canvas = Canvas(width=200, height=224)
tomato_pic = Image.PhotoImage(file="tomato.png")
canvas.create_image(100, 112, image=tomato_pic)
canvas.pack()

window.mainloop()
python tkinter python-imaging-library png
4个回答
1
投票

我在这里找到了替代方案:

https://stackoverflow.com/a/46624625/8146119


    import Tkinter as tk
    from PIL import ImageTk, Image
    window = tk.Tk()
    window.title("tkinter stuff")
    window.geometry("300x300")
    window.configure(background='grey')
    path = "hs.gif"
    img = ImageTk.PhotoImage(Image.open(path))
    panel = tk.Label(window, image = img)
    panel.pack(side = "bottom", fill = "both", expand = "yes")
    window.mainloop()

我必须找出是什么使该代码有效以及是什么使我的代码失败。 ## 更新 ## 问题是我没有使用合适的 tkinter,当我应该使用 8.6 时我却使用了 8.5。我还使用 python 3.10,并且根据我在网上的粗略搜索,tkinter 不适用于 3.9。我用的是3.8。我遇到的问题不再是了。 希望有人能从中受益。我很感谢大家的时间。


1
投票

我发现这篇文章是因为我遇到了同样的问题。我是 python 两个月的初学者。我已将照片格式更改为 jpeg,现在效果很好,但它失去了透明背景...... 我在与前一个类似的代码中使用了它:

from tkinter import *
from PIL import ImageTk

window = Tk()
window.title("Pomodoro")

canvas = Canvas(width=200, height=224)
tomato_pic = Image.PhotoImage(file="tomato.jpeg")# notice .jpeg instead of .png format
canvas.create_image(100, 112, image=tomato_pic)
canvas.pack()

window.mainloop()

我希望它有帮助。 我尝试过不同的 .png 文件,有时有效,有时无效...... 我真的很高兴找到这个网站,非常感谢大家!


0
投票

首先,使用较新版本的 Python 可能会更好。各种 stackoverflow 海报都指出了 tkinter 支持图像的问题。请参阅帖子这里

根据 this stackoverflow 的回答,

tkinter.Label
Label.place
是在 tkinter 窗口中放置背景图像的便捷技巧。以下是这如何适合您的代码。它适用于使用 Python 3.8 和 Windows 10 的我。

from tkinter import *
from PIL import Image
from PIL import ImageTk

# ---------------------------- CONSTANTS ------------------------------- #
PINK = "#e2979c"
RED = "#e7305b"
GREEN = "#9bdeac"
YELLOW = "#f7f5dd"
FONT_NAME = "Courier"
WORK_MIN = 25
SHORT_BREAK_MIN = 5
LONG_BREAK_MIN = 20

# ---------------------------- TIMER RESET ------------------------------- # 

# ---------------------------- TIMER MECHANISM ------------------------------- # 

# ---------------------------- COUNTDOWN MECHANISM ------------------------------- # 

# ---------------------------- UI SETUP ------------------------------- #

window = Tk()
window.title("Pomodoro")

canvas = Canvas(width=200, height=224)
tomato_pic = PhotoImage(file="tomato.png")
# note here use of Label
background_label = Label(window, image=tomato_pic)
# label.place is tk trick that is good for backgrounds
background_label.place(x=0, y=0, relwidth=1, relheight=1)
canvas.pack()

window.mainloop()

然后您可能需要使用 relwidth、relheight 参数,并可能缩小原始图像的大小,以使其正确适合。


0
投票

如果您使用 PyCharm,请确保将您的 python 解释器更改为最新安装的版本。 3.9及更低版本可能有这个问题。更新到3.11,问题应该得到解决

© www.soinside.com 2019 - 2024. All rights reserved.