【发布时间】:2019-11-28 03:23:53
【问题描述】:
我试图为我的 Tkinter 应用程序提供背景图像,但没有错误并且也无法看到图像。我正在尝试制作我尝试在其中放置不同图像背景的导航屏幕。
我在实际代码中使用下面提到的行将图像放入框架中
Frame2 = tk.Frame(self.master)
Frame2.pack(side="left", fill="both", pady=10, anchor='w', expand=True )
photo = tk.PhotoImage(file="images/BG.jpg")
label = tk.Label(Frame2, image=photo)
label.image = photo
label.place(x=0, y=0)
实际代码:
import tkinter as tk
from tkinter.filedialog import asksaveasfile
from tkinter import messagebox
from PIL import ImageTk, Image
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.ard_stat = read_json(JSON_PATH)
self.switch_frame(StartPage)
def switch_frame(self, frame_class):
"""Destroys current frame and replaces it with a new one."""
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
class StartPage(tk.Frame):
def loopCap(self):
with open(JSON_PATH) as json_file1:
self.data = json.load(json_file1)
#print(self.data)
if self.data['status'] == 'ACTIVE': #and (self.data['RH_img']!= 'null' or self.data['LH_img']!= 'null')
a = self.text.set(self.data['status'])
b = self.text1.set(self.data['RH_cnt'])
c = self.text2.set(self.data['LH_cnt'])
d = self.text3.set(self.data['barcode'])
return self.text, self.text1, self.text2, self.text3, self.data
def next_save(self):
new_string = self.data['barcode']
new_folder = os.path.join(DATA_PATH,new_string)
if os.path.exists(new_folder):
#print("Folder Already Exists If Condition")
tk.messagebox.showinfo("Info", "Folder Already Exists")
else:
#os.isfile(new_string)
#print("Folder Already Exists")
#tkMessageBox.showinfo("Info", "Folder Already Exists")
#print("Make Directory Else Condition")
json_dict = read_json(JSON_PATH)
json_dict.update({"frontend_status": "True"})
dump_to_json(json_dict, JSON_PATH)
os.mkdir(new_folder)
for i in range(0,len(data)):
folder_name = os.path.join(DATA_PATH, new_string, data[i])
os.mkdir(folder_name)
files = [('All Files', '*.*'),
('Python Files', '*.py'),
('Text Document', '*.txt')]
file = asksaveasfile(initialdir=folder_name, filetypes=files, defaultextension=files)
json_dict = read_json(JSON_PATH)
json_dict.update({"frontend_status": "False"})
dump_to_json(json_dict, JSON_PATH)
self.master.after(500, self.loopCap)
def __init__(self, master):
super().__init__(master)
self.master.geometry("1000x700+%d+%d" % (((self.master.winfo_screenwidth() / 2.) - (1280 / 2.)), ((self.master.winfo_screenheight() / 2.) - (720 / 2.))))
#self.master.state('zoomed')
self.master.config(bg='powder blue')
#myvar = self.master
Frame1 = tk.Frame(self.master)
Frame1.pack(side="bottom", fill="x", pady=10, anchor='w')
Frame2 = tk.Frame(self.master)
Frame2.pack(side="left", fill="both", pady=10, anchor='w', expand=True )
photo = tk.PhotoImage(file="images/BG.jpg")
label = tk.Label(Frame2, image=photo)
label.image = photo
label.place(x=0, y=0)
tk.Label(Frame2, text=' Decal Check ', font=('arial', 25, 'bold'), bg='powder blue',
fg='black', anchor='w').grid(column=0,pady=2)
b = tk.Button(Frame2, text="Add New Files", command= self.next_save)
b.grid(row=11, column=1, pady=5, sticky='w')
self.master.after(500, self.loopCap)
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
这方面的建议会很有帮助
编辑
根据建议的答案,我将photo = tk.PhotoImage(file="images/BG.jpg") 用于png 和ImageTk.PhotoImage(file="images/BG.jpg"),但每次我的屏幕显示如下图所示:
注意:我正在使用 Pycharm 检查我的窗口背景
【问题讨论】:
-
您导入了
ImageTk,但您不使用它来加载.jpg图像。较旧的tkinter仅与.gif一起使用。新的tkinter也可以与.png一起使用,但它仍然不能与.jpg一起使用,您必须使用PIL中的Image、ImageTk- 请参阅答案中的链接。 -
我也使用
photo = ImageTk.PhotoImage(im),但仍然面临同样的问题 -
我在 Linux Mint 19.2、Python 3.7 上测试了您的代码。如果我在
tk.PhotoImage(file="image.png")中使用.png,那么我会看到图像 - 但是使用.jpg我会收到错误消息(当我在控制台/终端中运行时)。如果我在photo = ImageTk.PhotoImage(Image.open("image.jpg"))中使用.jpg,那么我会看到图像。 -
我用你的代码测试过,我看到了图像。但我没有你的 JSON 数据,所以它不会添加其他元素。所以也许问题是所有小部件都有灰色背景(在某些系统上您无法更改)并且图像隐藏在其他小部件后面。使用图像创建最少的工作代码,而无需其他小部件来测试它。
-
BTW: 并使用普通终端/控制台/cmd.exe 而不是 PyCharm 来查看错误消息。
标签: python python-3.x xcode tkinter