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
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.