Tkinter 2 button placed in same place

43 Views Asked by At

I'm trying to program with gui . Also i used tkinter designer and trying to make gui with 2 page.When i run program it shows page 1 but button of first page and button of second page appear in same coordinate, and second page 2 is placed right on it . How do i fix this

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=215.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)
        show_page(2)
    percent = 0
    ##simple check starts from here

    def passwordCheck(password): #check simple password func
        global percent
        special = "!@#$%^&*()_+"  #tusgai temdegtuud aguulsn string
        up = 0 #tom usgiin too
        low = 0 #jijig usgiin too
        spcl = 0 #tusgai temdegtiin too
        count = 0 #too
        for i in password :
            if i.isupper() : #herev tom useg bol
                up += 1
            elif i.islower() : #jijg usg bol
                low += 1
            elif i in special : #temdegt bol
                spcl += 1
            else: #ugui bol too baina
                count += 1
        percent = percent + (len(password) - 12)   # 10 oos desh orh burt 1 eer nemegdene
        # print(percent)
        if up>=2 :
                percent +=2     #2
        if low>=2 :
                percent +=2     #2
        if spcl>=1 :
                percent +=2     #2
        if count >=2 :
                percent +=2     #2

        if up>=2 and low>=2 and spcl>=1 and count>=2 and len(password)>=12:
            return 'Passed' #engiin nuhtsuliig davsan msm ugnu

        #herev nuhtsul hangaagui uyd haygdsn nuhtsuliig butsaana
        else :
            if len(password)<=12:
                return 'Urt 12 oos ih baih ystoi.'
            elif up<=1:
                return 'Tom temdegt dor 2 hayj baina'
            elif low<=1: 
                return 'Jijig temdegt dor hayj 2 baina'
            elif spcl<1:
                return 'Tusgai temdegt dor hayj 1 baina'
            else :
                return 'Too dor hayj 2 baina'

    def characterCheck(password): # usgiin davhtsal 
        global percent
        character  = {}  #davhtsliig uusgeh dic
        for char in password:   #dic uusgne
            if char in character:
                character[char] += 1
            else:
                character[char] = 1
        count = 0 #toolur
        for i in character.values() : 
            if i>=2 : #hervee temdegt 2 oos deesh davhatssan bol
                count += i
              # davhtsagui bol 1 eer nemegdn
        #hamgiin bagdaa 3 demtegt 2 oos deehs oroh bolojmtoi
        if count >= len(character.values()):
            return 'Adilhan temdegtiin too ih baina'
        else :
            return 'Passed'

    def check(a,b): #2 temdegtiig daraallsn esehiig shalgana
        count = 0
        characters = "!@#$%^&*()_+|\:;'<>?/~"
        a_asc = ord(a)
        b_asc = ord(b)
        if a_asc == b_asc or abs(a_asc - b_asc) == 1 or abs(a_asc-b_asc) == 32 or abs(a_asc-b_asc)==33:
            count += 1
        elif (a in characters) and (b in characters) and abs(characters.index(a)-characters.index(b))==1:
            count += 1
        return count

    def positionCheck(password): #daraallig shalgana
        global percent
        ll = len(password)
        count = 0
        for i in range(ll-1):
            count += check(password[i],password[i+1])
            # print("{}, {} : {}".format(password[i],password[i+1],count))
        count += 1
        pp = (count/len(password))*100
        # percent += ((100-pp)//10)
        if pp<=40 :
            return 'Passed'
        else :
            return 'Usguud daraallsn bn'

    #Simple check ends 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"))
    def button_cmd2():
        print("button2 clicked")
        show_page(1)
    button_2 = Button(
        image=button_image_2,
        borderwidth=0,
        highlightthickness=0,
        command=button_cmd2,
        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()

I just want to make gui that switch between 2 pages but buttons are placed in same coordinate and just last button appears . When i change coordinate of button2 button1 isjust on that coordinate

1

There are 1 best solutions below

0
On

You create the two buttons as children of the root window because you do not specify the master of them, so the last created one will be shown since both are put in the same position and have same size.

I think you want to create them inside their corresponding canvas and put them into the canvas using canvas.create_window(...) instead:

def create_page_1(window):
    ...
    button_1 = Button(
        canvas,  # master is the canvas
        image=button_image_1,
        borderwidth=0,
        highlightthickness=0,
        command=getInput,
        relief="flat"
    )
    canvas.create_window(117, 500, window=button_1, anchor="nw", width=424, height=45)
    ...

def create_page_2(window):
    ...
    button_2 = Button(
        canvas,
        image=button_image_2,
        borderwidth=0,
        highlightthickness=0,
        command=button_cmd2,
        relief="flat"
    )
    canvas.create_window(117, 500, window=button_2, anchor="nw", width=424, height=45)
    ...