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
如果您想保留以前的项目,那么您不应该assingblist=[]
,而应该将其保留为全局列表
编辑 我的完整版本还有其他改动:函数和变量的更好名称,所有函数都在代码的其余部分之前,等等
您的代码很长-您尝试在其他窗口中的何处显示它?我如何保留我的\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()