Как обновить изображение в классе tkinter по привязке события ключа? - PullRequest
0 голосов
/ 17 декабря 2018

Как отобразить следующее изображение и предыдущее изображение при нажатии клавиши со стрелкой вправо или влево?Я сделал это в простом примере, когда я не определяю класс Example, но потерпел неудачу, когда я хочу сделать это в приведенном ниже примере кода.Я определил два статических метода внутри класса Example, чтобы связать левую и правую стрелки с графическим интерфейсом.Это хорошо работает при печати события, но я не знаю, как обновить параметр image метки на configure(image = next_photo) и configure(image = previous_photo).Вот часть моего кода:

current = 0
class Example(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master.bind('<Left>', self.left_key)
        self.master.bind('<Right>', self.right_key)
        image = Image.open(image_list[0])
        image = image.resize((800, 600),Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)
        self.logo = tk.Label(self, text="Logo", background="orange")
        self.logo2 = tk.Label(self, image = photo)
        ############################################# ScrolledText ##########################################
        self.edit_space = tkst.ScrolledText(
                master = self,
                wrap   = 'word',  # wrap text at full words only
                width  = 50,      # characters
                height = 10,      # text lines
                bg='beige'        # background color of edit area
        )
        self.other1 = tk.Label(self, background="purple")
        self.other2 = tk.Label(self, background="yellow")
        self.other3 = tk.Label(self, background="pink")
        self.other4 = tk.Label(self, background="gray")
        self.main = tk.Frame(self, background="blue")
        self.logo.grid(row=0, column=0, rowspan=1, sticky="nsew")
        self.logo2.grid(row=1, column=0, rowspan=1, sticky="nsew")
        self.other1.grid(row=0, column=1, sticky="nsew")
        self.other2.grid(row=0, column=2, sticky="nsew")
        self.other3.grid(row=1, column=1, sticky="nsew")
        self.other4.grid(row=1, column=2, sticky="nsew")
        self.edit_space.grid(row=2, column=0, sticky="nsew")
        self.main.grid(row=2, column=2, columnspan=2, rowspan=6)
        for row in range(8):
            self.grid_rowconfigure(row, weight=1)
        for col in range(3):
            self.grid_columnconfigure(col, weight=1)
    @staticmethod
    def left_key(event):
        print(str(event) + " key pressed")
        global current, image_list
        if not (0 <= current + 1 < len(image_list)):
            print("This is the first image")
            return
        current += 1
        image = Image.open(image_list[current])
        image = image.resize((800, 600),Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)
        # self.logo2 = tk.Label(self, image = photo)
        #self.logo2.configure(image = photo)
    @staticmethod
    def right_key(event):
        print(str(event) + " key pressed")
        global current, image_list
        if not (0 <= current - 1 < len(image_list)):
            print("This is the last image")
            return
        current -= 1
        image = Image.open(image_list[current])
        image = image.resize((800, 600),Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)
        # self.logo2 = tk.Label(self, image = photo)
        #self.logo2.configure(image = photo)
if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.geometry("800x400")
    root.mainloop()

1 Ответ

0 голосов
/ 17 декабря 2018

Основная проблема заключается в том, что вы создаете локальную переменную photo внутри __init__() и используете ее в качестве образа logo2.Однако photo будет уничтожено после выполнения __init__(), в результате чего изображение не будет отображаться.

Для решения проблемы:

  • используйте self.photo вместо photo
  • изменить 2 статических метода, left_key() и right_key(), на методы экземпляра
  • установить изображение logo2 внутри left_key() и right_key(): self.logo2.configure(image=self.photo)

Кроме того, проверка значения current внутри left_key() и right_key() может вызвать проблемы:

  • в left_key(), current > 0 следуетпроверяться
  • в right_key(), проверять current < len(image_list)-1

и регулировка current в этих 2 методах идет в неправильном направлении:

  • left_key() должно уменьшиться current
  • right_key() должно увеличиться current
...