Python Forum

Full Version: Expanding RPS to tkinter
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
First I apologize for pasting all the code.

So I'm trying to expand my rps game to tkinter but, I cant seem to figure out how to have one instance of the board and add in two instances for the players. One being the computer and the other being the user. Any guidance is much appreciated.

#! /usr/bin/env python3

# Do the imports
import tkinter as tk

class Player:
    name = 'Computer'
    wins = 0
    loss = 0
    row = 1

    def player_name(self):
        return name

    def player_wins(self):
        return wins


class Board(Player):
    def __init__(self):
        parent = None
        # player_name = Player().name
        # player_row = Player().row
        # player_wins = Player().wins
        # player_loss = Player().loss

        mainframe = tk.Frame(parent)
        mainframe.grid(column=0, row=0, sticky='new')

        headerframe = tk.Frame(mainframe)
        headerframe['padx'] = 8
        headerframe['pady'] = 5
        headerframe['relief'] = 'ridge'
        headerframe['borderwidth'] = 1
        headerframe.grid(column=0, row=0)

        header = tk.Label(headerframe)
        header['text'] = 'Rock Paper Scissors'
        header['font'] = 'serif 21 bold'
        header['fg'] = 'indianred'
        header['relief'] = 'ridge'
        header['padx'] = 2
        header['pady'] = 2
        header.grid(column=0, row=0, ipady=3, ipadx=8)

        dataframe = tk.Frame(mainframe)
        dataframe['padx'] = 8
        dataframe['pady'] = 5
        dataframe['relief'] = 'ridge'
        dataframe['borderwidth'] = 1
        dataframe.grid(column=0, row=1, sticky='new')

        data_header_player = tk.Label(dataframe, anchor='w')
        data_header_player['text'] = 'Player Name'
        data_header_player['font'] = 'serif 10 bold'
        data_header_player['fg'] = 'navy'
        data_header_player['relief'] = 'ridge'
        data_header_player['padx'] = 6
        data_header_player['pady'] = 2
        data_header_player['borderwidth'] = 1
        data_header_player.grid(column=0, row=0, ipady=3, ipadx=8)

        data_header_wins = tk.Label(dataframe, anchor='w')
        data_header_wins['text'] = 'Games Won'
        data_header_wins['font'] = 'serif 10 bold'
        data_header_wins['fg'] = 'navy'
        data_header_wins['relief'] = 'ridge'
        data_header_wins['padx'] = 5
        data_header_wins['pady'] = 2
        data_header_wins['borderwidth'] = 1
        data_header_wins.grid(column=1, row=0, ipady=3, ipadx=8, sticky='nw')

        data_header_loss = tk.Label(dataframe, anchor='w')
        data_header_loss['text'] = 'Games Lost'
        data_header_loss['font'] = 'serif 10 bold'
        data_header_loss['fg'] = 'navy'
        data_header_loss['relief'] = 'ridge'
        data_header_loss['padx'] = 6
        data_header_loss['pady'] = 2
        data_header_loss['borderwidth'] = 1
        data_header_loss.grid(column=2, row=0, ipady=3, ipadx=8, sticky='nw')

        players = tk.Label(dataframe, anchor='w')
        players['text'] = player_name
        players['font'] = 'serif 8 bold'
        players['fg'] = 'purple'
        players['relief'] = 'ridge'
        players['padx'] = 5
        players['pady'] = 2
        players['borderwidth'] = 1
        players['width'] = 14
        players.grid(column=0, row=player_row, ipady=3, ipadx=8, sticky='nw')

        players_wins = tk.Label(dataframe)
        players_wins['text'] = player_wins
        players_wins['font'] = 'sans 9 bold'
        players_wins['fg'] = 'navy'
        players_wins['relief'] = 'ridge'
        players_wins['padx'] = 2
        players_wins['pady'] = 2
        players_wins['width'] = 12
        players_wins['borderwidth'] = 1
        players_wins.grid(column=1, row=player_row, ipady=3, ipadx=8, sticky='nw')

        players_loss = tk.Label(dataframe)
        players_loss['text'] = player_loss
        players_loss['font'] = 'sans 9 bold'
        players_loss['fg'] = 'navy'
        players_loss['relief'] = 'ridge'
        players_loss['padx'] = 2
        players_loss['pady'] = 2
        players_loss['width'] = 12
        players_loss['borderwidth'] = 1
        players_loss.grid(column=2, row=player_row, ipady=3, ipadx=8, sticky='nw')




def main():
    root = tk.Tk()
    root.resizable(width=False, height=False)
    root.title('Rock Paper Scissors')
    board = Board()
    board.parent = 'root'
    root.mainloop()

if __name__ == '__main__':
    main()
I found a solution. Having to do the repeat myself thing though. A problem for another day.
Codes not complete but, here's what I have

#! /usr/bin/env python3

# Do the imports
import os
import tkinter as tk
from functools import partial

class Player:
    player_name = 'Computer'
    player_wins = 0
    player_loss = 0


class Game:
    def __init__(self, parent):
        self.parent = parent
        playername = ''
        while True:

            try:
                if not playername:
                    self.register()

                player = Player()
                player.player_name = playername
                computer = Player()

                mainframe = tk.Frame(self.parent)
                mainframe.grid(column=0, row=0, sticky='new')

                headerframe = tk.Frame(mainframe)
                headerframe['padx'] = 8
                headerframe['pady'] = 5
                headerframe['relief'] = 'ridge'
                headerframe['borderwidth'] = 1
                headerframe.grid(column=0, row=0)

                header = tk.Label(headerframe)
                header['text'] = 'Rock Paper Scissors'
                header['font'] = 'serif 21 bold'
                header['fg'] = 'indianred'
                header['relief'] = 'ridge'
                header['padx'] = 2
                header['pady'] = 2
                header.grid(column=0, row=0, ipady=3, ipadx=8)

                dataframe = tk.Frame(mainframe)
                dataframe['padx'] = 8
                dataframe['pady'] = 5
                dataframe['relief'] = 'ridge'
                dataframe['borderwidth'] = 1
                dataframe.grid(column=0, row=1, sticky='new')

                data_header_player = tk.Label(dataframe, anchor='w')
                data_header_player['text'] = 'Player Name'
                data_header_player['font'] = 'serif 10 bold'
                data_header_player['fg'] = 'navy'
                data_header_player['relief'] = 'ridge'
                data_header_player['padx'] = 6
                data_header_player['pady'] = 2
                data_header_player['borderwidth'] = 1
                data_header_player.grid(column=0, row=0, ipady=3, ipadx=8)

                data_header_wins = tk.Label(dataframe, anchor='w')
                data_header_wins['text'] = 'Games Won'
                data_header_wins['font'] = 'serif 10 bold'
                data_header_wins['fg'] = 'navy'
                data_header_wins['relief'] = 'ridge'
                data_header_wins['padx'] = 5
                data_header_wins['pady'] = 2
                data_header_wins['borderwidth'] = 1
                data_header_wins.grid(column=1, row=0, ipady=3, ipadx=8, sticky='nw')

                data_header_loss = tk.Label(dataframe, anchor='w')
                data_header_loss['text'] = 'Games Lost'
                data_header_loss['font'] = 'serif 10 bold'
                data_header_loss['fg'] = 'navy'
                data_header_loss['relief'] = 'ridge'
                data_header_loss['padx'] = 6
                data_header_loss['pady'] = 2
                data_header_loss['borderwidth'] = 1
                data_header_loss.grid(column=2, row=0, ipady=3, ipadx=8, sticky='nw')

                players = tk.Label(dataframe, anchor='w')
                players['text'] = computer.player_name
                players['font'] = 'serif 8 bold'
                players['fg'] = 'purple'
                players['relief'] = 'ridge'
                players['padx'] = 5
                players['pady'] = 2
                players['borderwidth'] = 1
                players['width'] = 14
                players.grid(column=0, row=1, ipady=3, ipadx=8, sticky='nw')

                players_wins = tk.Label(dataframe)
                players_wins['text'] = computer.player_wins
                players_wins['font'] = 'sans 9 bold'
                players_wins['fg'] = 'navy'
                players_wins['relief'] = 'ridge'
                players_wins['padx'] = 2
                players_wins['pady'] = 2
                players_wins['width'] = 12
                players_wins['borderwidth'] = 1
                players_wins.grid(column=1, row=1, ipady=3, ipadx=8, sticky='nw')

                players_loss = tk.Label(dataframe)
                players_loss['text'] = computer.player_loss
                players_loss['font'] = 'sans 9 bold'
                players_loss['fg'] = 'navy'
                players_loss['relief'] = 'ridge'
                players_loss['padx'] = 2
                players_loss['pady'] = 2
                players_loss['width'] = 12
                players_loss['borderwidth'] = 1
                players_loss.grid(column=2, row=1, ipady=3, ipadx=8, sticky='nw')


                players = tk.Label(dataframe, anchor='w')
                players['text'] = player.player_name
                players['font'] = 'serif 8 bold'
                players['fg'] = 'purple'
                players['relief'] = 'ridge'
                players['padx'] = 5
                players['pady'] = 2
                players['borderwidth'] = 1
                players['width'] = 14
                players.grid(column=0, row=2, ipady=3, ipadx=8, sticky='nw')

                players_wins = tk.Label(dataframe)
                players_wins['text'] = player.player_wins
                players_wins['font'] = 'sans 9 bold'
                players_wins['fg'] = 'navy'
                players_wins['relief'] = 'ridge'
                players_wins['padx'] = 2
                players_wins['pady'] = 2
                players_wins['width'] = 12
                players_wins['borderwidth'] = 1
                players_wins.grid(column=1, row=2, ipady=3, ipadx=8, sticky='nw')

                players_loss = tk.Label(dataframe)
                players_loss['text'] = player.player_loss
                players_loss['font'] = 'sans 9 bold'
                players_loss['fg'] = 'navy'
                players_loss['relief'] = 'ridge'
                players_loss['padx'] = 2
                players_loss['pady'] = 2
                players_loss['width'] = 12
                players_loss['borderwidth'] = 1
                players_loss.grid(column=2, row=2, ipady=3, ipadx=8, sticky='nw')

            except ValueError as error:
                print(f'Error!: {error}')
                os.sys.exit()

    def register(self):
        self.form = tk.Toplevel(None)
        self.form.title('Player Name')
        self.form.configure(padx=10, pady=10)
        name_label = tk.Label(self.form, text='Player Name')
        name_label.grid(column=0, row=0)
        name_entry = tk.Entry(self.form, width=25)
        name_entry.grid(column=0, row=1)
        name_entry.focus()
        self.form.bind('<Return>', self.getname)
        btn = tk.Button(self.form, text='Submit', command=partial(self.getname, name_entry))
        btn.grid(column=0, row=2, pady=10, sticky='e')
        self.parent.withdraw()
        self.form.mainloop()

    def getname(self, event):
        self.parent.deiconify()
        self.form.destroy()


def main():
    root = tk.Tk()
    game = Game(root)
    root.mainloop()

if __name__ == '__main__':
    main()
You only need one mainloop
The while True loop is not applicable to your GUI

These blocks of code
data_header_player = tk.Label(dataframe, anchor='w')
data_header_player['text'] = 'Player Name'
data_header_player['font'] = 'serif 10 bold'
data_header_player['fg'] = 'navy'
data_header_player['relief'] = 'ridge'
data_header_player['padx'] = 6
data_header_player['pady'] = 2
data_header_player['borderwidth'] = 1
data_header_player.grid(column=0, row=0, ipady=3, ipadx=8))
can be replaced with shorter versions
data_header_player = tk.Label(
    dataframe, anchor='w'), text= 'Player Name', font= 'serif 10 bold',
    fg= 'navy', relief= 'ridge', padx= 6, pady= 2, borderwidth= 1)
data_header_player.grid(column=0, row=0, ipady=3, ipadx=8))
I know it could be shorter. Was doing it for easy reading.
I've took out the while loop. Now I'm trying to figure out how to update a player name from a entry field. I can hard code and it does what I'm expecting. just can't figure out how to updated the attribute from a toplevel window.
Got it to working like I wanted. I still have not done the game logic yet. Just wanted to share my progress.
I will post the full code when done.