Miki Ameryk
Miki Ameryk

Reputation: 21

root = Tk(), are there any alternatives?

does anyone know any alternatives for: root = tk()

when i run my program, multiple windows run at the same time, just wondering whether there is an alternative so that they both dont open at the same time. The second window that opens as soon as the program is run should be launched when a button on the initial window is pressed. I also tried using: root = Toplevel() but the results are the same. any ideas? thanks

def Search_Inventory():
#---First Window----
root = Toplevel()
root.title("Warehouse Inventory Control System")
root.configure(bg = "black")

#----Title displayed under the company logo on the first window----
Title_Screen = Label(root,
                     text="Warehouse Inventory Control System",
                     fg="grey",
                     bg="black",
                     font="Helevetica 25 bold",
                     pady = "50",
                     padx = "50",
                     ).grid(row=3, column=4)

#----Interactive Input Boxes for the User----

#----Label to Notify what is needed in the entry box----

PN_Info_Label = Label(root,
                    text = "Part Number:",
                    fg="white",
                    bg="black",
                    font="Helevetica 15 bold",
                    padx = 50,
                    ).grid(row=14, column=3, rowspan = 2)

#----Input Box for Part Number

PN_Display = StringVar()
Input_PartNumber = Entry(root,
                         textvariable=PN_Display,
                         fg = "blue",
                         font = "Helevtica 25 bold",
                         ).grid(row=14, column=4)

#----A button that will proceed to the next part of the program----

Search_Button = Button(root,
                       text = "Search Inventory",
                       fg = "Blue",
                       bg = "Grey",
                       bd = 2,
                       font="Helevetica 15 bold",
                       command=lambda:Search_Prod(PN_Display.get()),
                       height = 1,
                       width = 15,
                       ).grid(row=16, column=4,pady = 25,padx = 25,)

#----Information regarding how to enter the part number---
Info = Label(root,
             text="Please Use Capitals to Enter Part Number",
             fg= "red",
             bg = "black",
             font = "helevetica 12 bold",
             ).grid(row = 15, column = 4)
#----Adding the company logo to the first window----

photo = PhotoImage(file="image.gif")
photoLabel = Label(image=photo)
photoLabel.image = photo
photoLabel.grid(row=1, column=4, pady = 10)

#----Linking the Help Document----

Help_Button = Button(root,
                     text = "Help",
                     command=Help_PDF,
                     fg = "Red",
                     bg = "Black",
                     height = "1",
                     bd = "2",
                     font = "Helevetica 20 bold",
                     width = "4",
                     ).grid(row=0, column=5, pady= 10,padx = 50, sticky = E)

#----Saying who the program was made by----

Credits = Label(root,
                text = "Created By: Me",
                fg = "White",
                bg = "Black",
                font = "Helevetica 10 underline",
                ).grid(row = 19, column = 5)
#To Make Sure that the window doesn't close
root.mainloop()

thats the subroutine that meant to run later but runs straight away.

root_menu = frame()
root_menu.title("Warehouse Inventory Control System")
root_menu.configure(bg = "black")


photo = PhotoImage(file="logo.gif")
photoLabel = Label(image=photo)
photoLabel.image = photo
photoLabel.grid(row=1, column=3,columnspan = 4, sticky = N)

Title_Screen = Label(root_menu,
                 text="Welcome to the SsangYong\n Warehouse Inventory                                      Control System",
                 fg="grey",
                 bg="black",
                 font="Helevetica 25 bold",
                 pady = "50",
                 padx = "50",
                 ).grid(row=2, column=3)


Search_Inventory = Button(root_menu,
                      command = Search_Inventory(),
                      text = "Search Inventory",
                      fg = "Blue",
                      bg = "Grey",
                      bd = 2,
                      font="Helevetica 12 bold",
                      height = 1,
                      width = 50,
                      ).grid(row=16, column=3,pady = 25,padx = 25,)

Add_Stock = Button(root_menu,
            text = "Add New Items",
            fg = "Blue",
            bg = "Grey",
            bd = 2,
            font="Helevetica 12 bold",
            height = 1,
            width = 60,
            ).grid(row=15, column=3,pady = 25,padx = 25,)

Print_Report =  Button(root_menu,
            text = "Print Stock Report",
            fg = "Blue",
            bg = "Grey",
            bd = 2,
            font="Helevetica 12 bold",
            height = 1,
            width = 70,
            ).grid(row=17, column=3,pady = 25,padx = 25,)


Help_Button = Button(root_menu,
                 text = "Help",
                 command=Help_PDF,
                 fg = "Red",
                 bg = "Black",
                 height = "1",
                 bd = "2",
                 font = "Helevetica 20 bold",
                 width = "4",
                 ).grid(row=1, column=3,rowspan = 2, sticky= NE)

Credits = Label(root,
                text = "Created By:mk",
                fg = "White",
                bg = "Black",
                font = "Helevetica 10 underline",
                ).grid(row = 19, column = 5)

root_menu.mainloop() 

this is what is meant to pop up initially but comes completely mixed up with the other one.

Upvotes: 0

Views: 1278

Answers (2)

Bryan Oakley
Bryan Oakley

Reputation: 385980

does anyone know any alternatives for: root = tk() [sic]

There is no alternative. A tkinter application absolutely must have a single root window. If you do not explicitly create one (and you should), one will be created for you the first time you create any other widget.

The second window that opens as soon as the program is run should be launched when a button on the initial window is pressed.

The reason for this is that you are telling it to open immediately. Take a look at this code:

Search_Inventory = Button(root_menu,
                  command = Search_Inventory(),

The above code is identical to this:

result = Search_Inventory()
Search_Inventory = Button(root_menu, command=result)

Notice the lack of () on the command. The command attribute requires a reference to a function.

Upvotes: 1

furas
furas

Reputation: 142651

command= needs function name - callback - it means without ()

But you have () in

  command = Search_Inventory()

and this is why this is executed at start, not when you click button


BTW: tkinter need only one mainloop() - if you use two mainloop() then it works incorrectly.


EDIT: Problem with image is because you didn't set parent for Label in second window

photoLabel = Label(image=photo)

so it used main window as default

You need

photoLabel = Label(root, image=photo)

EDIT: minimal working code

from tkinter import *

def Help_PDF():
    pass

def Search_Inventory():

    #--- Second Window ----
    root = Toplevel()

    Title_Screen = Label(root, text="Warehouse Inventory Control System")
    Title_Screen.grid(row=3, column=4)

    PN_Info_Label = Label(root, text="Part Number:")
    PN_Info_Label.grid(row=14, column=3, rowspan=2)

    PN_Display = StringVar()

    Input_PartNumber = Entry(root, textvariable=PN_Display)
    Input_PartNumber.grid(row=14, column=4)

    Search_Button = Button(root, text="Search Inventory",
                           command=lambda:Search_Prod(PN_Display.get()))
    Search_Button.grid(row=16, column=4, pady=25, padx=25)

    Info = Label(root, text="Please Use Capitals to Enter Part Number")
    Info.grid(row=15, column=4)

    photo = PhotoImage(file="image.gif")

    photoLabel = Label(root, image=photo)
    photoLabel.image = photo
    photoLabel.grid(row=1, column=4, pady=10)

    Help_Button = Button(root, text="Help",
                         command=Help_PDF)
    Help_Button.grid(row=0, column=5, pady=10, padx=50, sticky=E)

    Credits = Label(root, text="Created By: Me")
    Credits.grid(row=19, column=5)


# --- First Window ---

root_menu = Tk()

photo = PhotoImage(file="logo.gif")
photoLabel = Label(root_menu, image=photo)
photoLabel.image = photo
photoLabel.grid(row=1, column=3, columnspan=4, sticky=N)

Title_Screen = Label(root_menu, text="Welcome to the SsangYong\n Warehouse Inventory                                      Control System",)
Title_Screen.grid(row=2, column=3)

Search_Inventory = Button(root_menu, text="Search Inventory",
                      command=Search_Inventory)
Search_Inventory.grid(row=16, column=3, pady=25, padx=25)

Add_Stock = Button(root_menu, text="Add New Items")
Add_Stock.grid(row=15, column=3, pady=25, padx=25)

Print_Report =  Button(root_menu, text="Print Stock Report")
Print_Report.grid(row=17, column=3, pady=25, padx=25)

Help_Button = Button(root_menu, text="Help",
                 command=Help_PDF)
Help_Button.grid(row=1, column=3, rowspan=2, sticky=NE)

Credits = Label(root_menu, text="Created By:mk")
Credits.grid(row=19, column=5)

root_menu.mainloop()

Upvotes: 0

Related Questions