Способ обновления изображения в программе на python при выполнении определенного условия (используются Tkinter и PIL)

#python #tkinter #python-imaging-library

#python #tkinter #python-imaging-library

Вопрос:

Я не очень хорошо разбираюсь в Tkinter и использую несколько сайтов для создания этой программы для проекта. Это программа-викторина, которая использует графический интерфейс для отображения баннера над вопросами. Мне нужен метод обновления баннера в зависимости от того, когда кто-то набирает полный / низкий балл. Также я хотел бы знать, нужно ли мне удалять PIL для метки для размещения изображения. Все предложения будут с благодарностью приняты.

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


class Question:
    def __init__(self, question, answers, correctLetter):
        self.question = question
        self.answers = answers
        self.correctLetter = correctLetter

    def check(self, letter, view):
        global right
        if(letter == self.correctLetter):
            label2= Label(view, text="Right!")
            right  = 1
        else:
            label2= Label(view, text="Wrong!")
        label2.pack()
        view.after(1000, lambda *args: self.unpackView(view))


    def getView(self, window):
        view = Frame(window)
        label1 = Label(view, text=self.question)
        button_a = Button(view, text=self.answers[0], command=lambda *args: self.check("A", view))
        button_b = Button(view, text=self.answers[1], command=lambda *args: self.check("B", view))
        button_c = Button(view, text=self.answers[2], command=lambda *args: self.check("C", view))
        button_d = Button(view, text=self.answers[3], command=lambda *args: self.check("D", view))
        label1.pack()
        button_a.pack()
        button_b.pack()
        button_c.pack()
        button_d.pack()
        return view
    
    def unpackView(self, view):
        view.pack_forget()
        askQuestion()

def askQuestion():
    global questions, window, index, button, right, number_of_questions 
    if(len(questions) == index   1):
        Label(window, text="Thank you for answering the questions. "   str(right)   " of "   str(number_of_questions)   " questions answered right").pack()
        return
    button.pack_forget()
    index  = 1
    questions[index].getView(window).pack()

questions = []
file = open('C:\Users\tjohn\Desktop\Art Intergration\Comp\questions.txt', "r")
line = file.readline()
while(line != ""):
    questionString = line
    answers = []
    for i in range (4):
        answers.append(file.readline())

    correctLetter = file.readline()
    correctLetter = correctLetter[:-1]
    questions.append(Question(questionString, answers, correctLetter))
    line = file.readline()
file.close()
index = -1
right = 0
number_of_questions = len(questions)

window = Tk()
C = Canvas(window, bg="blue", height=350, width=800)
C.pack()
img = ImageTk.PhotoImage(Image.open("C:\Users\tjohn\Desktop\quiz.png"))  
C.create_image(800/2, 350/2, anchor=CENTER, image=img)

button = Button(window, text="Start", command=askQuestion)
button.pack(anchor=CENTER)
window.mainloop()
  

Комментарии:

1. Какую функцию или где вы хотите обновить?

2. Я хочу обновить изображение, используемое в холсте, в конце программы…. Я предполагаю, что это будет сделано в определении функции askQuestion(), когда функция печатает сообщение с благодарностью….

3. Попробуйте изменить исходное изображение холста, когда C.create_image(800/2, 350/2, anchor=CENTER, image=img,tag='pic') и когда вы хотите его обновить, скажем c.itemconfigure('pic',image=newpic)

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

5. Возможно, я неправильно выполнил код, но я получаю длинный список ошибок… Вот где я это поместил def askQuestion(): global questions, window, index, button, right, number_of_questions if(len(questions) == index 1): Label(window, text="Thank you for answering the questions. " str(right) " of " str(number_of_questions) " questions answered right").pack() if right==number_of_questions: C.itemconfigure('pic',image="C:\Users\tjohn\Desktop\Congrats.png") return button.pack_forget() index = 1

Ответ №1:

Добавление в качестве ответа, потому что слишком долго для комментариев:

Добавьте тег к изображению на холсте, например:

 window = Tk()
C = Canvas(window, bg="blue", height=350, width=800)
C.pack()
img = ImageTk.PhotoImage(Image.open("C:\Users\tjohn\Desktop\quiz.png"))  
C.create_image(800/2, 350/2, anchor=CENTER, image=img,tags='pic')
  

Позже внутри функции скажем:

 def askQuestion():
    global questions, window, index, button, right, number_of_questions 
    if(len(questions) == index   1):
        Label(window, text="Thank you for answering the questions. "   str(right)   " of "   str(number_of_questions)   " questions answered right").pack()
        new_img = ImageTk.PhotoImage(Image.open('New path'))
        c.itemconfigure('pic',image=new_img)
        return
    button.pack_forget()
    index  = 1
    questions[index].getView(window).pack()
  

itemconfigure() это метод tkinter.Canvas , при котором нет необходимости в дальнейшем импорте чего-либо.

Не уверен, что это сработает, не могу запустить ваш код, посмотрите и дайте мне знать.

Комментарии:

1. Он, безусловно, обновляется … однако новое изображение не соответствует тому, как это делает предыдущее изображение…. Оба имеют одинаковый размер…. Есть ли место, которое снова требует привязки?

2. Это странно, я думаю, что это просто заменит, я не уверен, почему? Возможно, включите скриншот или задайте новый вопрос