#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. Это странно, я думаю, что это просто заменит, я не уверен, почему? Возможно, включите скриншот или задайте новый вопрос