Skip to content Skip to sidebar Skip to footer

Swap Interface On Button Press

I am new to Tkinter and I want to create a button which when pressed displays a 2nd interface. I have written the following program: import Tkinter root = Tkinter.Tk( ) root.titl

Solution 1:

You are mixing grid and pack (this is a bad idea, see e.g. https://stackoverflow.com/a/3968033/3001761); change the assignment of B to:

B = Tkinter.Button(text = "Run", command = mainprg)
B.grid(row=4, column=1)

Also, your for loops do the same thing 9 times for no apparent reason; you should probably re-think the logic.


Solution 2:

Here is an example that make a part of what you are trying to do. Note the use a a list of reference to label that have to be replaced. If no use of clean method is done, then you just "overwrite" the previous screen appearance and it can lead to broken interface where part of button are visible partially recovered by other objects.

import Tkinter as Tki

#constants - using this you can eventually change the interface's language by importing a different file containning these values.
__title__ = "my first program"
__run__ = "run!"

#widgets contain all the currently created widgets, this will alow to destroy and replace them.
global widgets
widgets = []

#---------------------------------------------------------------------------------------------------
def clean():
    for widget in widgets:
        widget.grid_remove()
        widget.destroy()
#---------------------------------------------------------------------------------------------------
def createMainButton(master):
    clean()
    #it is required to specify the master, i.e. the container of each new widget as first parameter
    button = Tki.Button(root, text = __run__, command = lambda : mainProg(root))
    button.grid(row=0, column=0)
    #have to provide a reference to the widget to allow clean destroy of it.
    widgets.append(button)
#---------------------------------------------------------------------------------------------------
def mainProg(master):
    clean()
    #define a subclass
    def create (content, row, column):
        createLabel(master, content , 20, row , column)
    #create widgets
    create('3', 1, 1)
    create('6', 1, 2)
    create('4', 1, 3)
    create('2', 2, 1)
    create('7', 2, 2)
    create(' ', 2, 3)
    create('5', 3, 1)
    create('1', 3, 2)
    create('8', 3, 3)
#---------------------------------------------------------------------------------------------------

def createLabel(master, content, borderSize, row, column):
    label = Tki.Label(master, text= content, borderwidth=borderSize )
    label.grid(row=row,column=column)
    widgets.append(label)

if __name__ == "__main__":

    root = Tki.Tk()
    root.title(__title__)

    createMainButton(root)  

    root.mainloop()

I don't know what are your knowledge about Object Programming, but consider an other way to achieve your goal : extend the Tk class in order to provide access to required data inside a particular scope without defining global variables ( that is, in general, BAD! ). I personally would code it like this :

import Tkinter as Tki

#constants - using this you can eventually change the interface's language by importing a different file containning these values.
__title__ = "my first program"
__run__ = "run!"

class MyProgram(Tki.Tk):
    def __init__(self):
        Tki.Tk.__init__(self)

        self.widgets = []
        self.CONSTANT_BORDERWIDTH = 20

        self.title(__title__)       
        self.createMainButton()

    def clean(self):
        for widget in self.widgets:
            widget.grid_remove()
            widget.destroy()    

    def createMainButton(self):
        self.clean()
        #it is required to specify the master, i.e. the container of each new widget as first parameter
        button = Tki.Button(self, text = __run__, command = self.mainProg)
        button.grid(row=0, column=0)
        #have to provide a reference to the widget to allow clean destroy of it.
        self.widgets.append(button)

    def mainProg(self):
        self.clean()
        #create widgets
        self.createLabel('3', 1, 1)
        self.createLabel('6', 1, 2)
        self.createLabel('4', 1, 3)
        self.createLabel('2', 2, 1)
        self.createLabel('7', 2, 2)
        self.createLabel(' ', 2, 3)
        self.createLabel('5', 3, 1)
        self.createLabel('1', 3, 2)
        self.createLabel('8', 3, 3)

    def createLabel(self,content, row, column):
        label = Tki.Label(self, text= content, borderwidth=self.CONSTANT_BORDERWIDTH )
        label.grid(row=row,column=column)
        self.widgets.append(label)

if __name__ == "__main__":
    root = MyProgram()
    root.mainloop()

Anyway, if this code is too difficult to understand, forget object programming for now.

Good luck! Arthur.


Post a Comment for "Swap Interface On Button Press"