Tkinter поток изображений - PullRequest
       6

Tkinter поток изображений

0 голосов
/ 13 октября 2018

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

Это код, который у меня есть до сих пор

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

  while True:

    def stream():

      root = Tk()

      os.system("sudo idevicescreenshot test.jpg | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1")

      width = 500
      height = 700
      img = Image.open("/Desktop/test.jpg")
      img = img.resize((width,height), Image.ANTIALIAS)
      photoImg =  ImageTk.PhotoImage(img)
      b = Button(root,image=photoImg, width=500)
      b.pack()
      os.system("rm -rf /Desktop/test.jpg")
      root.mainloop()
    stream()

Но он перемещается к следующему изображению только после закрытия окна Tkinter.Программа в демоверсии циклически перебирает скриншоты, не закрывая окно Tkinter, поэтому закрытие и повторное открытие окна не вариант.Я не могу понять, как сделать снимки экрана, а затем прокрутить их один за другим в одном окне Tkinter, чтобы создать поток.Любые предложения о том, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 13 октября 2018

Привет, Soutcast и добро пожаловать в StackOverflow.

Используйте Widget.after -Метод (http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method) вместо while -петля. Если вы снова вызываете after внутри обратного вызова, выможет достичь чего-то похожего на while True.

И вот почему:

Приложение на основе графического интерфейса ведет себя иначе, чем консольное приложение, так как оно должно реагировать на ввод пользователя.для обработки пользовательского ввода tkinter блокирует поток, в котором вы вызываете Widget.mainloop, для обработки таких событий, как щелчки по кнопкам и т. д., пока окно не закроется.

Функция after может сообщить выполненному циклу событий выполнитьданная функция через заданный промежуток времени.


Редактировать в соответствии с запросом Soutcast:

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

root = Tk()
b = Button(root,image=photoImg, width=500)
b.pack()

def update_image():
  os.system("sudo idevicescreenshot test.jpg | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1")

  width = 500
  height = 700
  img = Image.open("/Desktop/test.jpg")
  img = img.resize((width,height), Image.ANTIALIAS)
  photoImg =  ImageTk.PhotoImage(img)

  os.system("rm -rf /Desktop/test.jpg")
  b['image'] = photoImg
  root.after(1000, update_image)

root.after(1, update_image)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...