Tkinter和Python列表

Tkinter和Python列表,python,list,tkinter,Python,List,Tkinter,我正在创建一个程序,该程序生成一个随机歌曲列表,并具有这样一个功能:如果用户希望从随机生成的列表中保存一首歌曲,则用户应单击旁边的按钮。然后用户可以打印他/她保存在新窗口上的歌曲,但我的代码中的功能似乎只打印终端中保存的歌曲,而我只得到空窗口。我如何才能正确地实现这一点 这是代码: from tkinter import * from PIL import ImageTk, Image import random root = Tk() root.title('UMIND') root.ge

我正在创建一个程序,该程序生成一个随机歌曲列表,并具有这样一个功能:如果用户希望从随机生成的列表中保存一首歌曲,则用户应单击旁边的按钮。然后用户可以打印他/她保存在新窗口上的歌曲,但我的代码中的功能似乎只打印终端中保存的歌曲,而我只得到空窗口。我如何才能正确地实现这一点

这是代码:

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()

我想你所有的问题都是因为你使用了变量的silimar名称
alist
blist
,最后你在代码中使用了错误的列表

for song in alist:
    if song not in alist:   # <-- should be `blist`
        blist.append(song)
因此,您的列表为空,无需检查移动到
blist
的内容,因为您可以移动所有内容

blist = alist
如果您想保留以前的项目,那么您不应该assing
blist=[]
,而应该将其保留为全局列表


编辑

我的完整版本还有其他改动:函数和变量的更好名称,所有函数都在代码的其余部分之前,等等


您的代码很长-您尝试在其他窗口中的何处显示它?我如何保留我的\u播放列表的内容或项目,因为当我重新运行程序时,我的\u播放列表会重置并丢失以前添加的内容或项目?我的版本保留以前的内容。我只在开始时创建
my_playlist=[]
,以后我不会在函数
show_my_playlist
中使用
my_playlist=[]
关闭程序后再次打开并运行它,然后单击my playlist按钮,它只会返回一个空窗口现在我知道你的问题了。Python不会为您保留它-就像在任何其他程序(如Word、Excel)中一样,您必须将它保存在磁盘上,并在重新启动程序时再次读取它。您可以使用普通的
txt
文件或更有用的东西,如
csv
文件或
json
文件或模块
pickle
我将尝试其中一种,因为我刚刚尝试使用sqlite,但我还不能理解它
blist = []
blist = alist
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()