У меня есть переменные с путями для файлов GIF на моем компьютере и в цикле main () - класс для запуска GIF в цикле и класс Worker.
Также выполняется из командной строки cmd.
Выполнение этой программы должно просто напечатать 8 раз, что тип фруктов, который вы выбрали, хороший и показать GIF его в Tkinter, когда вы вводите 'ok', GIF должен выйти, и программа ожидает следующий ввод (другой фрукт), чтобы сделать то же самое.
Все хорошо, пока вторая попытка ... то есть, он печатает 8 раз, что фрукты хороши, НО ГИФ, чтобы показать. Если вы введете "хорошо", он сообщает
«Исключение в потоке»
и
'RuntimeError: основной поток не находится в главном цикле' ошибки.
Код класса AnimatedGIF, который я скачал с http://code.activestate.com/recipes/580708-tkinter-animated-gif/, но я обнаружил, что только половина его работает нормально для цикла GIF, поэтому я выделил его.
Думаю, мне нужен модуль Queue или метод threading after (), но я не знаю, как их реализовать.
#! python3
fruit = [ 'apple', 'peach', 'orange', 'grape', 'lemon', 'banana',
'strawberry', 'coconut' ]
app = r"C:\Users\User\Desktop\folder za python fajlove\Apple.gif"
pea = r"C:\Users\User\Desktop\folder za python fajlove\Peach.gif"
ora = r"C:\Users\User\Desktop\folder za python fajlove\Orange.gif"
gra = r"C:\Users\User\Desktop\folder za python fajlove\Grape.gif"
lem = r"C:\Users\User\Desktop\folder za python fajlove\Lemon.gif"
ban = r"C:\Users\User\Desktop\folder za python fajlove\Banana.gif"
stw = r"C:\Users\User\Desktop\folder za python fajlove\Strawberry.gif"
coc = r"C:\Users\User\Desktop\folder za python fajlove\Coconut.gif"
GIF = [ app, pea, ora, gra, lem, ban, stw, coc ]
def main():
print('Enter the type of fruit you like to see')
inpuT = input()
while inpuT not in fruit:
print('Enter the type of fruit you like to see')
inpuT = input()
a = fruit.index(inpuT)
for x in fruit:
print( fruit[a] + ' is nice!!!')
import tkinter as tk
from tkinter import PhotoImage
from tkinter import Label
import threading
from PIL import Image, ImageTk
#-----------------------------------------------------------
class AnimatedGIF(Label, object):
def __init__(self, master, path, forever=True):
self._master = master
self._loc = 0
self._forever = forever
self._is_running = False
im = Image.open(path)
self._frames = []
i = 0
try:
while True:
photoframe =
ImageTk.PhotoImage(im.copy().convert('RGBA'))
self._frames.append(photoframe)
i += 1
im.seek(i)
except EOFError: pass
self._last_index = len(self._frames) - 1
try:
self._delay = im.info['duration']
except:
self._delay = 100
super(AnimatedGIF, self).__init__(master,
image=self._frames[0])
def start_animation(self, frame=None):
if self._is_running: return
if frame is not None:
self._loc = 0
self.configure(image=self._frames[frame])
self._master.after(self._delay, self._animate_GIF)
def _animate_GIF(self):
self._loc += 1
self.configure(image=self._frames[self._loc])
if self._loc == self._last_index:
if self._forever:
self._loc = 0
self._callback_id =
self._master.after(self._delay, self._animate_GIF)
else:
self._callback_id = self._master.after(100,
self._animate_GIF)
def pack(self, start_animation=True, **kwargs):
if start_animation:
self.start_animation()
super(AnimatedGIF, self).pack(**kwargs)
class Worker(threading.Thread):
def run(self):
global root
root = tk.Tk()
win = AnimatedGIF(root, GIF[a])
win.pack()
root.mainloop()
w = Worker()
w.start()
novo = input()
if novo == 'ok':
root.quit()
while True:
main()