Мне нужна помощь в отображении полноэкранных изображений с помощью tkinter - PullRequest
0 голосов
/ 19 июня 2020

Я делаю счетчик людей в raspberry pi. Я хочу отображать одно изображение, если кто-то входит, и другое, если кто-то выходит. Прямо сейчас я использую приведенный ниже код (который я взял из другого вопроса здесь xd), чтобы изменить изображение, которое отображает tkinter. Проблема в том, что изображение cat.jpg отображается только на секунду, а затем отображается черный экран, и ничего не происходит.

import sys
if sys.version_info[0] == 2:  # the tkinter library changed it's name from Python 2 to 3.
    import Tkinter
    tkinter = Tkinter #I decided to use a library reference to avoid potential naming conflicts with people's programs.
else:
    import tkinter
from PIL import Image, ImageTk
import time

def updateRoot(root,imagen):  
    pilImage = Image.open(imagen)
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    root.focus_set()    
    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))
    canvas = tkinter.Canvas(root,width=w,height=h)
    canvas.pack()
    canvas.configure(background='black')
    imgWidth, imgHeight = pilImage.size
    if imgWidth > w or imgHeight > h:
        ratio = min(w/imgWidth, h/imgHeight)
        imgWidth = int(imgWidth*ratio)
        imgHeight = int(imgHeight*ratio)
        pilImage = pilImage.resize((imgWidth,imgHeight), Image.ANTIALIAS)
    image = ImageTk.PhotoImage(pilImage)
    imagesprite = canvas.create_image(w/2,h/2,image=image)
    root.update()

root = tkinter.Tk()

updateRoot(root,"Cat.jpg")

time.timesleep(5)

updateRoot(root,"Dog.jpg")

До этого я использовал этот код

import tkinter
from PIL import Image, ImageTk

from tkinter import ttk

def updateRoot(root,imagen):

    image1 = Image.open(imagen)
    image2 =  ImageTk. PhotoImage(image1)
    image_label = ttk. Label(root , image =image2)
    image_label.place(x = 0 , y = 0)
    root.update()

Работает нормально, но не в полноэкранном режиме.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Сначала вы должны выполнить следующие действия вне updateRoot():

  • make root полноэкранное окно (вы можете просто использовать root.attributes('-fullscreen', 1))
  • привязать ключ <Escape>
  • создать холст и create_image() (вы можете использовать Label, чтобы сделать то же самое)

Затем просто обновите изображение внутри updateRoot().

Также вы должны использовать after() вместо time.sleep().

Ниже приведен пример:

try:
    import Tkinter as tkinter
except:
    import tkinter
from PIL import Image, ImageTk

def updateRoot(imagen):
    # resize the image to fill the whole screen
    pilImage = Image.open(imagen)
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    image = ImageTk.PhotoImage(pilImage.resize((w,h)))
    # update the image
    canvas.itemconfig(imgbox, image=image)
    # need to keep a reference of the image, otherwise it will be garbage collected
    canvas.image = image

root = tkinter.Tk()
root.attributes('-fullscreen', 1)
root.bind('<Escape>', lambda _: root.destroy())

canvas = tkinter.Canvas(root, highlightthickness=0)
canvas.pack(fill=tkinter.BOTH, expand=1)
imgbox = canvas.create_image(0, 0, image=None, anchor='nw')

# show the first image
updateRoot('Cat.jpg')
# change the image 5 seconds later
root.after(5000, updateRoot, 'Dog.jpg')

root.mainloop()
0 голосов
/ 19 июня 2020

Исправлена ​​проблема с черным цветом с использованием этикеток, попробуйте это. Я думаю, вам все равно нужно изменить размер изображения, чтобы оно соответствовало экрану

import sys
if sys.version_info[0] == 2:  # the tkinter library changed it's name from Python 2 to 3.
    import Tkinter
    tkinter = Tkinter #I decided to use a library reference to avoid potential naming conflicts with people's programs.
else:
    import tkinter

from PIL import Image, ImageTk
import time
from tkinter import *
import PIL.Image

def updateRoot(root,imagen):  
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    root.focus_set()    
    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))
    img = PIL.Image.open(imagen)
    root.tkimage = ImageTk.PhotoImage(img)
    Label(root,image = root.tkimage).place(x=0, y=0, relwidth=1, relheight=1)
    root.update()

root = tkinter.Tk()
updateRoot(root,"Cat.jpg")
time.sleep(3)
updateRoot(root,"Dog.jpg")
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...