Tkinter page 2 shows instead of page 1 and page 2 button shows on page1

59 Views Asked by At

Im trying to do app with gui using tkinter. It also uses tkinter designer and im trying to combine 2 pages.Im trying to show page 1 first but it shows page 2 first. And when i switch to page 1 button of page 2 shows instead of page 1

from pathlib import Path
from tkinter import Tk, Canvas, Entry, Button, PhotoImage

OUTPUT_PATH = Path(__file__).parent
ASSETS_PATH1 = OUTPUT_PATH / Path(r"C:\Users\user\Documents\interface-py\exp99\build\assets\frame0")
def relative_to_assets1(path: str) -> Path:
    return ASSETS_PATH1 / Path(path)
ASSETS_PATH2 = OUTPUT_PATH / Path(r"C:\Users\user\Documents\interface-py\exp99\build\assets\frame1")
def relative_to_assets2(path: str) -> Path:
    return ASSETS_PATH2 / Path(path)
def create_page_1(window):
    global image_image_1
    global entry_image_1 
    global entry_image_2 
    global button_image_1
    canvas = Canvas(
        window,
        bg="#FFFFFF",
        height=625,
        width=1000,
        bd=0,
        highlightthickness=0,
        relief="ridge"
    )
    canvas.place(x=0, y=0)
    image_image_1 = PhotoImage(
    file=relative_to_assets1("image_1.png"))
    image_1 = canvas.create_image(
        839.0,
        312.0,
        image=image_image_1
    )

    canvas.create_text(
        122.0,
        56.0,
        anchor="nw",
        text="Password Checker",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault ExtraBold", 45 * -1)
    )

    canvas.create_text(
        117.0,
        157.0,
        anchor="nw",
        text="Username",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault Bold", 18 * -1)
    )

    entry_image_1 = PhotoImage(
        file=relative_to_assets1("entry_1.png"))
    entry_bg_1 = canvas.create_image(
        329.0,
        242.0,
        image=entry_image_1
    )
    entry_1 = Entry(
        bd=0,
        bg="#FFFFFF",
        fg="#000716",
        highlightthickness=0,
        font=("RobotoFlex Regular", 18 * -1)  
    )
    entry_1.place(
        x=128.514874458313,
        y=213.0,
        width=400.970251083374,
        height=58.0
    )

    canvas.create_text(
        133.0,
        228.0,
        anchor="nw",
        text="Enter your  username",
        fill="#5F636D",
        font=("RobotoFlex Regular", 14 * -1)
    )

    #logical functions starts from here


    def getInput(): #input from button & calculations 
        username=entry_1.get()
        password=entry_2.get()
        print("Username: ",username)
        print("Password: ",password)
        print("Simple check :",passwordCheck(password))
        print("Davhtsal :",characterCheck(password))
        print("Daraalal :",positionCheck(password))
        print("percent :",percent)
        a = (percent*100)/10
        print("huvi :",a)
    percent = 0
    ##simple check starts from here
    #logical functions ends  here
    button_image_1 = PhotoImage(
        file=relative_to_assets1("button_1.png"))

    button_1 = Button(
        image=button_image_1,
        borderwidth=0,
        highlightthickness=0,
        command=getInput,
        relief="flat"
    )
    button_1.place(
        x=117.0,
        y=500.0,
        width=424.0,
        height=45.0
    )

    canvas.create_text(
        117.0,
        304.0,
        anchor="nw",
        text="Password\n",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault Bold", 18 * -1)
    )

    entry_image_2 = PhotoImage(
        file=relative_to_assets1("entry_2.png"))
    entry_bg_2 = canvas.create_image(
        329.0,
        389.0,
        image=entry_image_2
    )
    entry_2 = Entry( # entry added
        bd=0,
        bg="#FFFFFF", #bg changed 2 white
        fg="#000716",
        highlightthickness=0,
        font=("RobotoFlex Regular", 18 * -1) #font added 
    )
    entry_2.place(
        x=128.514874458313,
        y=360.0,
        width=400.970251083374,
        height=58.0,
    )

    canvas.create_text(
        133.0,
        375.0,
        anchor="nw",
        text="Enter your  password",
        fill="#5F636D",
        font=("RobotoFlex Regular", 14 * -1)
    )
    return canvas

# Page 2
def create_page_2(window):
    global image_image_2
    global button_image_2
    canvas = Canvas(
        window,
        bg="#FFFFFF",
        height=625,
        width=1000,
        bd=0,
        highlightthickness=0,
        relief="ridge"
    )
    canvas.place(x=0, y=0)
    image_image_2 = PhotoImage(
    file=relative_to_assets2("image_1.png"))
    image_2 = canvas.create_image(
        839.0,
        312.0,
        image=image_image_2
    )
    
    canvas.create_text(
        122.0,
        56.0,
        anchor="nw",
        text="Password Checker",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault ExtraBold", 45 * -1)
    )
    canvas.create_text(
        117.0,
        157.0,
        anchor="nw",
        text="Simple checking\n",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault Black", 18 * -1)
    )
    
    button_image_2 = PhotoImage(file=relative_to_assets2("button_2.png"))
    button_2 = Button(
        image=button_image_2,
        borderwidth=0,
        highlightthickness=0,
        command=lambda: print("button_2 clicked"),
        relief="flat"
    )
    button_2.place(
        x=117.0,
        y=500.0,
        width=424.0,
        height=45.0
    )
    
    canvas.create_text(
        117.0,
        190.0,
        anchor="nw",
        text="Simple check",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        222.0,
        anchor="nw",
        text="Dawhtsal\n",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        253.0,
        anchor="nw",
        text="Daraalal",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        285.0,
        anchor="nw",
        text="Percent\n",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        329.0,
        anchor="nw",
        text="Advanced checking",
        fill="#000000",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault Black", 18 * -1)
    )
    
    canvas.create_text(
        117.0,
        362.0,
        anchor="nw",
        text="Brute force",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        394.0,
        anchor="nw",
        text="Rockyou\n",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    canvas.create_text(
        117.0,
        424.0,
        anchor="nw",
        text="Dictionary",
        fill="#5F636D",
        font=("RobotoFlexNormalNormalNormalNormalNormalNormalNormalNormalNormalDefault SemiBold", 16 * -1)
    )
    
    return canvas

# Controller function to switch between pages
def show_page(page_num):
    if page_num == 1:
        canvas_1.pack()
        canvas_2.pack_forget()
    elif page_num == 2:
        canvas_2.pack()
        canvas_1.pack_forget()
        # canvas_2.pack()

# Main application
window = Tk()
window.geometry("1000x625")
window.configure(bg="#FFFFFF")

canvas_1 = create_page_1(window)
canvas_2 = create_page_2(window)

# Add buttons or other elements to switch between pages
button_to_page_1 = Button(window, text="Go to Page 1", command=lambda: show_page(1))
button_to_page_1.pack()

button_to_page_2 = Button(window, text="Go to Page 2", command=lambda: show_page(2))
button_to_page_2.pack()

# Initially show Page 1
show_page(1)

window.resizable(False, False)
window.mainloop()


In create page1,2 functions i created buttons . But when i run it page 1 shows button of page2. Also i want show page 1 first instead of page2

1

There are 1 best solutions below

0
On

I've not tried to run the program but a few things jumped out:

It looks like you are creating the Entry and Button widgets (Entry_1, Button_1, etc) in the window, not in one of the two canvasses, so those widgets are probably unaffected by your show() method. Make sure you define the master window/frame with each widget.

It also looks like you are placing the canvases with .place() and then using .pack() on the same canvas in show... I would have expected that to throw an exception.

I'd suggest two changes that would make the code easier to debug (and write):

First, I suggest making each of the two "pages" a subclass of tk.Frame. That way, you can add the widgets belonging to the page to the pages Frame rather than the root window or a canvas. Then you an manipulate the frames.

Second, I suggest you look at the ttk.Notebook - it's designed to give a tabbed interface that can easily switch between frames.