nanashi
nanashi

Reputation: 43

Tkinter and Python list

I am creating a program which generates a random list of songs, and has a function such that if a user wants to save a song from the random generated list, the user should click the button next to it. Then the user can print the songs he/she saved on a new window, but the function for that in my code seems to only print the saved songs in the terminal and I only get empty window. How can I implement this correctly?

This the code:

from tkinter import *
from PIL import ImageTk, Image
import random


root = Tk()
root.title('UMIND')
root.geometry('')

a = [
    'Bruised and Scarred - Mayday Parade',
    'All Too Well - Taylor Swift',
    'Gravity - Sara Bareilles',
    'Perfectly Perfect - Simple Plan',
    'Welcome To The Black Parade - My Chemical Romance',
    'Everything Has Changed - Taylor Swift',
    'Champagne - Taylor Swift',
    'Piece of Your Heart - Mayday Parade',
    'Blame It On The Rain - He Is We',
    'Sad Song - We The Kings',
    'Give It All - He Is We',
    'Heavy - Linkin Park',
    'Ride - Twenty One Pilot',
    'One more light - Linkin Park',
    'Ride Home - Ben and Ben',
    'Leaves - Ben and Ben',
    'Fall - Ben and Ben',
    'Maybe the night - Ben and Ben',
    'Sunrise - Ben and Ben'
]


def show():
    global alist
    alist = []
    if genre.get() == 'Favorite':
        # alist.clear()
        top = Toplevel()
        top.title('Your Playlist')
        for i, title in enumerate(random.sample(a, k=10)):
            myLabel = Label(top, text=title, font='times 12', anchor=W)
            myLabel.grid(column=2, columnspan=2, sticky=W + E, row=i)

            Button(top,
                   text=str(i + 1) + ".",
                   border=5,
                   padx=5,
                   pady=5,
                   command=lambda title=title: alist.append(title)
                   ).grid(column=0, row=i)
        btn2 = Button(top, text='close window', command=top.destroy).grid(row=12, column=1, columnspan=3, sticky=W + E)


def my_playlist():
    global alist
    blist = []
    global myLabel
    for song in alist:
        if song not in alist:
            blist.append(song)

    top = Toplevel()
    top.title('Your Playlist')
    for i, title in enumerate(blist):
        myLabel = Label(top, text=title, font='times 12', anchor=W)
        myLabel.grid(column=2, columnspan=2, sticky=W + E, row=i)

    print(alist)

options = [
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Favorite"
]
genre = StringVar()
genre.set('From what genre?')


drop = OptionMenu(root, genre, *options)
drop.grid(row=2, column=0, ipadx=20, ipady=10, padx=15, pady=15)
generate_btn = Button(root, text="Generate Playlist", command=show).grid(row=2, column=1, ipadx=30, ipady=10, padx=15,
                                                                         pady=15)

playlist_btn = Button(root, text="My Playlist", command=my_playlist).grid(row=3, column=0, ipadx=30, ipady=10,
                                                                         padx=15, pady=15)

Grid.columnconfigure(root, 0, weight=1)
row_con = [ drop, generate_btn, playlist_btn]
row_num = 0
for row in row_con:
    Grid.rowconfigure(root, row_num, weight=1)
    row_num += 1

root.mainloop()

Upvotes: 0

Views: 61

Answers (1)

furas
furas

Reputation: 142641

I thing all your problem is because you use silimar names of variables alist and blist and finally you used wrong list in code

for song in alist:
    if song not in alist:   # <-- should be `blist`
        blist.append(song)

Should be

for song in alist:
    if song not in blist:   # <-- should be `blist`
        blist.append(song)

In your version you get from alist and compare with the same alist so it always gives False and it never add to blist


Eventually you could use set() to recognize new titles.


But I think you have other problem - you try to add to blist only new items but before for-loop you use

blist = []

so your list empty and there is no need to check what to move to blist because you can move everthing

blist = alist

If you want to keep previous items then you shouldn't assing blist = [] and you should keep it as global list.


EDIT

My full version with other changes: better names for funtions and variables, all function before rest of code, etc.

PEP 8 -- Style Guid for Python Code

import tkinter as tk  # PEP8: `import *` is not preferred
import random

# --- functions ---

def show_generated_list():
    global generated_list
    
    generated_list = []
    
    if genre.get() == 'Favorite':
    
        # generated_list.clear()
        top = tk.Toplevel()
        top.title('Your Playlist')
        
        for i, title in enumerate(random.sample(a, k=10)):
        
            my_label = tk.Label(top, text=title, font='times 12', anchor='w')  # PEP8: `lower_case_names` for variales
            my_label.grid(column=2, columnspan=2, sticky='we', row=i)

            tk.Button(top,
                   text=str(i+1) + ".",
                   border=5,
                   padx=5,
                   pady=5,
                   command=lambda title=title: generated_list.append(title)
                   ).grid(column=0, row=i)
                   
        tk.Button(top, text='close window', command=top.destroy).grid(row=12, column=1, columnspan=3, sticky='we')


def show_my_playlist():  # verb for function name, noun for variable
    global generated_list    # PEP8: all `global` at the beginning
    #global my_label # PEP8: `lower_case_names` for variales  # you don't need it
    
    for song in generated_list:
        if song not in my_playlist:
            my_playlist.append(song)

    top = tk.Toplevel()
    top.title('Your Playlist')
    
    for i, title in enumerate(my_playlist):
        my_label = tk.Label(top, text=title, font='times 12', anchor='w')
        my_label.grid(column=2, columnspan=2, sticky='we', row=i)

    print(generated_list)

# --- main ---

# - data -

a = [
    'Bruised and Scarred - Mayday Parade',
    'All Too Well - Taylor Swift',
    'Gravity - Sara Bareilles',
    'Perfectly Perfect - Simple Plan',
    'Welcome To The Black Parade - My Chemical Romance',
    'Everything Has Changed - Taylor Swift',
    'Champagne - Taylor Swift',
    'Piece of Your Heart - Mayday Parade',
    'Blame It On The Rain - He Is We',
    'Sad Song - We The Kings',
    'Give It All - He Is We',
    'Heavy - Linkin Park',
    'Ride - Twenty One Pilot',
    'One more light - Linkin Park',
    'Ride Home - Ben and Ben',
    'Leaves - Ben and Ben',
    'Fall - Ben and Ben',
    'Maybe the night - Ben and Ben',
    'Sunrise - Ben and Ben'
]

options = [
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Favorite"
]

generated_list = []  # created at start to make sure it always exists
my_playlist = []     # created at start to make sure it always exists
    
- gui -

root = tk.Tk()
root.title('UMIND')
#root.geometry('')  # empty geometry is useless

genre = tk.StringVar()
genre.set('From what genre?')

drop = tk.OptionMenu(root, genre, *options)
drop.grid(row=2, column=0, ipadx=20, ipady=10, padx=15, pady=15)

generate_btn = tk.Button(root, text="Generate Playlist", command=show_generated_list)
generate_btn.grid(row=2, column=1, ipadx=30, ipady=10, padx=15, pady=15)

playlist_btn = tk.Button(root, text="My Playlist", command=show_my_playlist)
playlist_btn.grid(row=3, column=0, ipadx=30, ipady=10, padx=15, pady=15)

root.columnconfigure(0, weight=1)

row_con = [drop, generate_btn, playlist_btn]

for row_num in range(len(row_con)):
    root.rowconfigure(row_num, weight=1)

root.mainloop()

Upvotes: 1

Related Questions