Несколько кадров, несколько кнопок и меток с изменяющимся изображением, Tkinter - PullRequest
0 голосов
/ 02 августа 2020

Я разрабатываю GUI с Tkinter. В нем много фреймов (страниц), которые при нажатии кнопки в одном фрейме уничтожаются и отображается следующий фрейм. Каждая из кнопок имеет переменные изображения, поэтому мне нужна функция, которая поворачивает изображение кнопки на каждой отображаемой странице.

Я написал следующий код, адрес фотографий изменится (self.Address в (def counter) класса Pagestart) но я думаю, что button.config не может обновлять изображения кнопки !!! Почему ???

(Для объяснения: функция countercounter в showframe отвечает за функцию основного класса для обновления функции счетчика в pagestart.)

на выходе этого кода отображается рамка с одной кнопкой, изображение которой является постоянным и не может обновляться.

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import time
import os
import subprocess as sp
import signal

global counter0, counter1
counter0=0
counter1=0


class Project(tk.Tk):

    def __init__(self, *args, **kwargs):
        
        tk.Tk.__init__(self, *args, **kwargs)      
        
        container = tk.Frame(self)
        container.configure(background="#000000")
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.container=container
        self.frames = {}
        for F in ( Pagestart, PageOne):   
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")             
        self.show_frame(Pagestart)
       

    def show_frame(self, cont):
        self.sw = 1000
        self.sh = 1800
        self.cont=cont

        for frame in self.frames.values():
          frame.grid_remove()
        frame = self.frames[cont]
        frame.configure(background="#000000")      
        frame.grid()
        frame.winfo_toplevel().geometry('%dx%d+%d+%d' % (self.sw,self.sh,0,0))

            
        A=Pagestart(parent=self.container, controller=self)
        self.Pagestart=Pagestart
        B=A.button
        
        def countercounter(B):        
            def count1():
              global counter0, counter1
              A.counter()
              if (self.cont==Pagestart):
                  B.after(100,count1)
            count1()
        countercounter(B)
                  
        
    def twoside(self, inputaddress, startframe, stopframe):
        self.input = inputaddress
        self.startframe = startframe
        self.stopframe = stopframe       
        global counter0, counter1
        def count():  
            global counter0, counter1
            if (counter1==1):
                counter0 -=1
            if (counter1==0):
                counter0 += 1
            self.Address=('%s%s' % (str(self.input),str(counter0))+".jpg")
            if (counter0==self.stopframe):
                counter1=1
            if (counter0==self.startframe):
                counter1=0
        count()
           
    def sendAddress(self):
        return self.Address  
           
           
class Pagestart(tk.Frame):
        
    def __init__(self, parent, controller):
        
        tk.Frame.__init__(self, parent)
        self.controller = controller   
        self.ButtonStyle = ttk.Style()
        self.ButtonStyle.configure("Tabedstart.TButton", background="#000000", borderwidth=0)
        self.ButtonStyle.map("Tabedstart.TButton", background=[('selected', "#000000")])
        self.button = ttk.Button(self, style="Tabedstart.TButton", command=lambda: controller.show_frame(PageOne))
        self.button.pack(pady=320)     
        self.counter()      
        
    def counter(self):
      
        self.inputaddress = "/home/pi/Documents/Reference0/"
        self.controller.twoside(self.inputaddress, 0, 138)
        self.Address = self.controller.sendAddress()
        self.photo = Image.open(self.Address)
        self.photo = ImageTk.PhotoImage(self.photo)       
        self.button.image=self.photo
        self.button.config(image=self.photo)
        
class PageOne(tk.Frame):
        
    def __init__(self, parent, controller):
        
        tk.Frame.__init__(self, parent)
        self.controller = controller   
        self.ButtonStyle = ttk.Style()
        self.ButtonStyle.configure("Tabedstart.TButton", background="#000000", borderwidth=0)
        self.ButtonStyle.map("Tabedstart.TButton", background=[('selected', "#000000")])
        self.button = ttk.Button(self, style="Tabedstart.TButton", command=lambda: controller.show_frame(Pagestart))
        self.button.pack(pady=320)     
        self.counter()      
        
    def counter(self):
      
        self.inputaddress = "/home/pi/Documents/Reference1/"
        self.controller.twoside(self.inputaddress, 0, 138)
        self.Address = self.controller.sendAddress()
        self.photo = Image.open(self.Address)
        self.photo = ImageTk.PhotoImage(self.photo)       
        self.button.image=self.photo
        self.button.config(image=self.photo)
        

if __name__ == "__main__":
    app = Project()
    app.mainloop()

1 Ответ

0 голосов
/ 03 августа 2020

Вы не уничтожаете фрейм, а только скрываете его, используя grid_forget() / grid_remove().

Не создавайте новый экземпляр Pagestart, потому что у вас уже есть старый экземпляр Pagestart, который отображается как

frame = self.frames[cont]
frame.grid()

, и вы должны изменить изображение в этом случае, используя ie.

frame.counter()

Рабочий код:

Я использую self.counter и self.animation_direction вместо глобальных переменных counter0, counter1.

Я не использую вложенные функции, потому что они меньше читается.

Я использую change_image() для смены изображения каждые 100 мс

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk


class Project(tk.Tk):

    def __init__(self, *args, **kwargs):
        
        tk.Tk.__init__(self, *args, **kwargs)      
        
        self.counter = 1
        self.animation_direction = 1  # it will add `+1` to self.counter

        self.sw = 1000
        self.sh = 1800
        
        container = tk.Frame(self)
        container.configure(background="#000000")
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.container = container
        
        self.frames = {}
        
        for F in ( PageStart, PageOne):   
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
            
        self.show_frame(PageStart)

    def show_frame(self, cont):
        self.cont = cont

        for frame in self.frames.values():
            frame.grid_remove()
          
        frame = self.frames[cont]
        frame.configure(background="#000000")      
        frame.grid()
        frame.winfo_toplevel().geometry('%dx%d+%d+%d' % (self.sw,self.sh,0,0))
        
        #frame.counter()

        self.change_image()
        
    def twoside(self, inputaddress, startframe, stopframe):
        self.input = inputaddress
        self.startframe = startframe
        self.stopframe = stopframe       
        
        self.counter += self.animation_direction

        self.address = '%s%s.jpg' % (self.input, self.counter)
        
        if self.counter == self.stopframe:
            self.animation_direction = -self.animation_direction
        if self.counter == self.startframe:
            self.animation_direction = -self.animation_direction
           
    def get_address(self):
        return self.address  
           
    def change_image(self):
        if self.cont == PageStart:
            self.frames[self.cont].counter()
            self.after(100, self.change_image)
        
           
class PageStart(tk.Frame):  # PEP8: UpperCaseNames for classes
        
    def __init__(self, parent, controller):
        
        tk.Frame.__init__(self, parent)
        self.controller = controller
        
        self.ButtonStyle = ttk.Style()
        self.ButtonStyle.configure("Tabedstart.TButton", background="#000000", borderwidth=0)
        self.ButtonStyle.map("Tabedstart.TButton", background=[('selected', "#000000")])
        
        self.button = ttk.Button(self, style="Tabedstart.TButton", command=lambda: controller.show_frame(PageOne))
        self.button.pack(pady=320)     
        
        self.counter()      
        
    def counter(self):
      
        self.inputaddress = "/home/pi/Documents/Reference0/"
        self.controller.twoside(self.inputaddress, 0, 138)
        
        self.address = self.controller.get_address()  # PEP8: lower_case_names for functions/methods and variables
        self.photo = Image.open(self.address)
        self.photo = ImageTk.PhotoImage(self.photo)
        
        self.button.image = self.photo
        self.button.config(image=self.photo)
        

class PageOne(tk.Frame):
        
    def __init__(self, parent, controller):
        
        tk.Frame.__init__(self, parent)
        self.controller = controller
        
        self.ButtonStyle = ttk.Style()
        self.ButtonStyle.configure("Tabedstart.TButton", background="#000000", borderwidth=0)
        self.ButtonStyle.map("Tabedstart.TButton", background=[('selected', "#000000")])
        
        self.button = ttk.Button(self, style="Tabedstart.TButton", command=lambda: controller.show_frame(PageStart))
        self.button.pack(pady=320)
        
        self.counter()      
        
    def counter(self):
      
        self.inputaddress = "/home/pi/Documents/Reference1/"
        self.controller.twoside(self.inputaddress, 0, 138)
        
        self.address = self.controller.get_address()
        self.photo = Image.open(self.address)
        self.photo = ImageTk.PhotoImage(self.photo)
        
        self.button.image = self.photo
        self.button.config(image=self.photo)
        

if __name__ == "__main__":
    app = Project()
    app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...