Python Forum
[Tkinter] Multiple frames with tkinter - How to make them run on fullscreen mode - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] Multiple frames with tkinter - How to make them run on fullscreen mode (/thread-12898.html)



Multiple frames with tkinter - How to make them run on fullscreen mode - eabs86 - Sep-18-2018

Hello guys!

I wrote a code using tkinter to switch between frames after a few seconds. The problem is: All the application must run in fullscreen.

Here is the code.

from tkinter import *


N_TRIALS = 3
COUNT=-2
N_INTERVALS = 2*N_TRIALS + 1
RELAXING_TIME = 2000
RESTING_TIME = 2000
TASKING_TIME = 2000
start_btn_state = False

def raise_frame(frame):
    frame.tkraise()
    global COUNT
    COUNT+=1
    print(COUNT)

    if (frame == f3 and COUNT==N_INTERVALS):
        frame.after(RESTING_TIME,lambda:raise_frame(f5)) 

    elif(frame == f5):

        frame.after(RELAXING_TIME,lambda:raise_frame(f6)) 

    elif frame == f2: 
                frame.after(RELAXING_TIME, lambda:raise_frame(f3)) 
    elif frame == f3: 
                frame.after(RESTING_TIME, lambda:raise_frame(f4))

    elif frame == f4: 
                 frame.after(TASKING_TIME, lambda:raise_frame(f3))

    elif frame==f6:
        root.destroy()           


def finish():
    root.destroy()

def start():
    start_btn_state=True
    raise_frame(f2)


root = Tk()

f1 = Frame(root)
f2 = Frame(root)
f3 = Frame(root)
f4 = Frame(root)
f5 = Frame(root)
f6 = Frame(root)



for frame in (f1, f2, f3, f4, f5,f6):
   frame.grid(row = 0, column = 0, sticky='nsew')




lb0=Label(f1, text="blablabla",font=("Arial Bold",10))
lb0.pack(padx = 10, pady=10)
lb1=Label(f1, text="blablabla",font = ("Arial Bold",10),fg = "black")
lb1.pack(padx = 10, pady=10)
lb2 = Label(f1, text="blablabla",font = ("Arial Bold",10),fg = "green")
lb2.pack(padx = 10, pady=10)
lb3 = Label(f1, text="blablabla",font = ("Arial Bold",10),fg = "blue") 
lb3.pack(padx = 10, pady=10)
lb4 = Label(f1, text="blablabla",font = ("Arial Bold",10),fg = "red")
lb4.pack(padx = 10, pady=10)
# =============================================================================
# Start Button
# =============================================================================
start_value=BooleanVar()
btn_start=Button(f1, text="Start",font = ("Arial Bold",20), command = start)
btn_start.pack(padx=10,pady=30)
###############################################################################
# =============================================================================
# Close Button
# =============================================================================
close_value=BooleanVar()
btn_close=Button(f1, text="CLOSE",font = ("Arial Bold",20), command=finish)
btn_close.pack(padx=10,pady=30)
###############################################################################


# =============================================================================
# Frame 2
# =============================================================================
Label(f2, text='ACTION 1').pack()
#Button(f2, text='Go to frame 3', command=lambda:raise_frame(f1)).pack()
f2.config(bg='red')

###############################################################################

# =============================================================================
# Frame 3
# =============================================================================
Label(f3, text='ACTION2').pack(side='left')
f3.config(bg='green')
###############################################################################

# =============================================================================
# Frame 4
# =============================================================================
Label(f4, text='ACTION3').pack()
f4.config(bg='blue')

###############################################################################

# =============================================================================
# Frame 5
# =============================================================================
Label(f5, text='RELAXING FINAL').pack()
f5.config(bg='black')
###############################################################################


raise_frame(f1)
root.mainloop()
I don't know how to expand the frames to fill all the window. I tried everything: geometry, width and height, etc. It seems probably (100% sure) that I am doing something wrong to put those frames on fullscreen.

could anyone help me?

Sorry about the code that is not in OOP. I am learning about it.

I appreciate the help!

Best Regards


RE: Multiple frames with tkinter - How to make them run on fullscreen mode - Larz60+ - Sep-18-2018

my suggestion (you won't like it) is to use Qt or wxpython (pheonix)
The difficulty I always ran into with tkinter geometry is the reason why I stopped using it.
It's a snap with wxpython, including docking, resizing, everything!

see (for example): https://python-forum.io/Thread-Perfectly-proportioned-3-frame-wxpython-application-template


RE: Multiple frames with tkinter - How to make them run on fullscreen mode - wuf - Sep-18-2018

Hi eabs86
Here one possible solution. Just experimental not optimised:
import tkinter as tk

'''
My script is programmed in OOP. I replaced the frames as follows:
frame1 = self.pages[0].frame
frame2 = self.pages[1].frame
frame3 = self.pages[2].frame
frame4 = self.pages[3].frame
frame5 = self.pages[4].frame
frame6 = self.pages[5].frame
'''

APP_TITLE = "Frame Stack"
MIN_APP_WIDTH = 400
MIN_APP_HEIGHT = 400


class AppPage(tk.Frame):
    
    def __init__(self, app, page_nr, **kwargs):
        self.app = app
        self.page_nr = page_nr
        
        tk.Frame.__init__(self, app, **kwargs)
        self.frame = tk.Frame(self)
        self.frame.pack(fill='both', expand=True, padx=0, pady=0)        

            
class Application(tk.Frame):
    NUM_OF_PAGES = 6
    N_TRIALS = 3
    COUNT=-2
    N_INTERVALS = 2 * N_TRIALS + 1
    RELAXING_TIME = 2000
    RESTING_TIME = 2000
    TASKING_TIME = 2000
    LABEL_FONT = ("Arial Bold",10)
    
    def __init__(self, app_win):
        self.app_win = app_win
        tk.Frame.__init__(self, app_win)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.pages = list()
                  
        for page_ptr in range(self.NUM_OF_PAGES):
            page = self.create_page_frame(page_ptr)
            if page_ptr == 1:
                page.frame.config(bg='red')
                tk.Label(page.frame, text='ACTION-1').pack()
            elif page_ptr == 2:
                page.frame.config(bg='green')
                tk.Label(page.frame, text='ACTION-2').pack(side='left')
            elif page_ptr == 3:
                page.frame.config(bg='blue')
                tk.Label(page.frame, text='ACTION-3').pack()
            elif page_ptr == 4:
                page.frame.config(bg='black')
                tk.Label(page.frame, text='RELAXING FINAL').pack()
                
        self.build_start_page()
        self.show_page(0)
    
    def build_start_page(self):
        container = self.pages[0].frame

        tk.Label(container, text="blablabla",font=("Arial Bold",10)
            ).pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "black").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "green").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "blue").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "red").pack(padx = 10, pady=10)

        tk.Button(container, text="Start",font=("Arial Bold",20),
            command=self.start).pack(padx=10,pady=30)

        tk.Button(container, text="CLOSE",font=("Arial Bold",20),
            command=self.finish).pack(padx=10,pady=30)
            
        container.pack_configure(fill='none', expand=True)
        
    def start(self):
        self.raise_page(1)
        
    def finish(self):
        self.app_win.withdraw()
        self.app_win.destroy()
    
    def raise_page(self, page_ptr):
        print(page_ptr)
        self.show_page(page_ptr)
        if page_ptr == 2 and self.COUNT == self.N_INTERVALS:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 4)
        elif page_ptr == 4:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 5)
        elif page_ptr == 1:
            self.app_win.after(self.RELAXING_TIME, self.raise_page, 2)
        elif page_ptr == 2:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 3)
        elif page_ptr == 3:
            self.app_win.after(self.TASKING_TIME, self.raise_page, 4) 
        elif page_ptr == 5:
            self.show_page(0) 
        
    def show_page(self, page_ptr=0):
        self.pages[page_ptr].lift()
               
    def create_page_frame(self, page_ptr):
        page = AppPage(self, page_ptr)
        page.grid(row=0, column=0, sticky='wens')
        self.pages.append(page)
        return page

           
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.minsize(MIN_APP_WIDTH, MIN_APP_HEIGHT)
    
    # With title bar
    #app_win.attributes('-zoomed', True)
    
    # Without title bar
    app_win.attributes('-fullscreen', True)
    
    app = Application(app_win)
    app.pack(fill='both', expand=True)
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
Greetings wuf Smile


RE: Multiple frames with tkinter - How to make them run on fullscreen mode - eabs86 - Sep-20-2018

(Sep-18-2018, 03:45 PM)Larz60+ Wrote: my suggestion (you won't like it) is to use Qt or wxpython (pheonix)
The difficulty I always ran into with tkinter geometry is the reason why I stopped using it.
It's a snap with wxpython, including docking, resizing, everything!

see (for example): https://python-forum.io/Thread-Perfectly-proportioned-3-frame-wxpython-application-template

Humm. I will try later.
Since I don't have much time to implement with another lib, I will still try to implement my application using tkinter.
Thank you for your sugestion!

(Sep-18-2018, 04:28 PM)wuf Wrote: Hi eabs86
Here one possible solution. Just experimental not optimised:
import tkinter as tk

'''
My script is programmed in OOP. I replaced the frames as follows:
frame1 = self.pages[0].frame
frame2 = self.pages[1].frame
frame3 = self.pages[2].frame
frame4 = self.pages[3].frame
frame5 = self.pages[4].frame
frame6 = self.pages[5].frame
'''

APP_TITLE = "Frame Stack"
MIN_APP_WIDTH = 400
MIN_APP_HEIGHT = 400


class AppPage(tk.Frame):
    
    def __init__(self, app, page_nr, **kwargs):
        self.app = app
        self.page_nr = page_nr
        
        tk.Frame.__init__(self, app, **kwargs)
        self.frame = tk.Frame(self)
        self.frame.pack(fill='both', expand=True, padx=0, pady=0)        

            
class Application(tk.Frame):
    NUM_OF_PAGES = 6
    N_TRIALS = 3
    COUNT=-2
    N_INTERVALS = 2 * N_TRIALS + 1
    RELAXING_TIME = 2000
    RESTING_TIME = 2000
    TASKING_TIME = 2000
    LABEL_FONT = ("Arial Bold",10)
    
    def __init__(self, app_win):
        self.app_win = app_win
        tk.Frame.__init__(self, app_win)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.pages = list()
                  
        for page_ptr in range(self.NUM_OF_PAGES):
            page = self.create_page_frame(page_ptr)
            if page_ptr == 1:
                page.frame.config(bg='red')
                tk.Label(page.frame, text='ACTION-1').pack()
            elif page_ptr == 2:
                page.frame.config(bg='green')
                tk.Label(page.frame, text='ACTION-2').pack(side='left')
            elif page_ptr == 3:
                page.frame.config(bg='blue')
                tk.Label(page.frame, text='ACTION-3').pack()
            elif page_ptr == 4:
                page.frame.config(bg='black')
                tk.Label(page.frame, text='RELAXING FINAL').pack()
                
        self.build_start_page()
        self.show_page(0)
    
    def build_start_page(self):
        container = self.pages[0].frame

        tk.Label(container, text="blablabla",font=("Arial Bold",10)
            ).pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "black").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "green").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "blue").pack(padx = 10, pady=10)
        tk.Label(container, text="blablabla",font = ("Arial Bold",10),
            fg = "red").pack(padx = 10, pady=10)

        tk.Button(container, text="Start",font=("Arial Bold",20),
            command=self.start).pack(padx=10,pady=30)

        tk.Button(container, text="CLOSE",font=("Arial Bold",20),
            command=self.finish).pack(padx=10,pady=30)
            
        container.pack_configure(fill='none', expand=True)
        
    def start(self):
        self.raise_page(1)
        
    def finish(self):
        self.app_win.withdraw()
        self.app_win.destroy()
    
    def raise_page(self, page_ptr):
        print(page_ptr)
        self.show_page(page_ptr)
        if page_ptr == 2 and self.COUNT == self.N_INTERVALS:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 4)
        elif page_ptr == 4:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 5)
        elif page_ptr == 1:
            self.app_win.after(self.RELAXING_TIME, self.raise_page, 2)
        elif page_ptr == 2:
            self.app_win.after(self.RESTING_TIME, self.raise_page, 3)
        elif page_ptr == 3:
            self.app_win.after(self.TASKING_TIME, self.raise_page, 4) 
        elif page_ptr == 5:
            self.show_page(0) 
        
    def show_page(self, page_ptr=0):
        self.pages[page_ptr].lift()
               
    def create_page_frame(self, page_ptr):
        page = AppPage(self, page_ptr)
        page.grid(row=0, column=0, sticky='wens')
        self.pages.append(page)
        return page

           
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.minsize(MIN_APP_WIDTH, MIN_APP_HEIGHT)
    
    # With title bar
    #app_win.attributes('-zoomed', True)
    
    # Without title bar
    app_win.attributes('-fullscreen', True)
    
    app = Application(app_win)
    app.pack(fill='both', expand=True)
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
Greetings wuf Smile


Woow! Very Good! In OOP it really gets much better and more organized. It's a shame that he is not yet able to codify so hehehe.
I'm learning yet! One day I'll get there!

Thanks for the reply!