python tkinter 将 csv 数据导入 OptionMenu
python tkinter import csv data to OptionMenu
我想用我之前从 url.
中抓取的数据填充一些 OptionMenu
例如:
with open('clubs.csv', newline ='') as club:
reader=csv.reader(club)
dummy_club = []
dummy_club.extend(reader)
稍后我想在我的 OptionMenu
之一中使用它
例如:
sv_club = StringVar()
d_club = OptionMenu(app,variable=sv_club,value=dummy_club)
不幸的是,大约 700 项的列表全部放在一个 row/line 中,就像我在这个屏幕截图上单击我的 d_club OptionMenu
时一样:
知道我如何需要在每个项目之后有一个新行的代码吗?
当我将抓取的数据作为列表直接导入 OptionMenu
时,它看起来很完美。
但是当我在启动 GUI 时尝试导入 .csv 中保存的数据时(所以当我调用 app.mainloop()
时)它被搞砸了。
编辑:
添加了我在我的抓取工具中使用的代码,以获取 .csv 文件:
def scrape():
li_clubs = []
print('getting clubs...\n')
#click the dropdown menue to open the folder
club_dropdown_menu = driver.find_element_by_xpath('/html/body/main/section/section/div[2]/div/div[2]/div/div[1]/div[1]/div[8]/div')
club_dropdown_menu.click()
time.sleep(1)
# scrape all text
scrape_clubs = driver.find_elements_by_xpath("//li[@class='with-icon' and contains(text(), '')]")
for club in scrape_clubs:
export_clubs = club.text
export_clubs = str(export_clubs)
export_clubs = export_clubs.replace(',', '')
li_clubs.append(export_clubs)
m_club = d_club.children['menu']
for val in li_clubs:
m_club.add_command(label=val,command=lambda v=sv_club,l=val:v.set(l))
with open('clubs.csv', 'w', newline='') as club:
writer = csv.writer(club, quotechar=None)
for i in li_clubs:
writer.writerow(i.split(','))
代码就是这样构建的,因此我可以在需要时更新 OptionMenu。
函数 def scrape():
绑定到一个按钮。这样当我按下按钮时,我会刮擦并更新我的选项菜单。
之后,我将列表 li_clubs
写入 clubs.csv
文件。
因为我需要的数据不经常变化,所以我将 scrape 绑定到一个按钮,这样我就可以在需要时按下它。
但我想在每次启动后将 .csv 文件中的数据加载到我的 OptionMenu 中。这样我就可以直接使用抓取的数据了。
您需要使用 expansion/unpack/splat 运算符 *
。但是,由于数据是列表列表(或元组的元组),您需要先将内部列表转换为字符串,因为选项菜单需要字符串列表。
它可能看起来像这样:
dummy_club = [" ".join(row) for row in dummy_club]
d_club = OptionMenu(app, sv_club, *dummy_club)
不过,具有 700 个值的 OptionMenu 将非常难以使用。您可能应该考虑使用 ttk Combobox 小部件。
我想用我之前从 url.
中抓取的数据填充一些OptionMenu
例如:
with open('clubs.csv', newline ='') as club:
reader=csv.reader(club)
dummy_club = []
dummy_club.extend(reader)
稍后我想在我的 OptionMenu
例如:
sv_club = StringVar()
d_club = OptionMenu(app,variable=sv_club,value=dummy_club)
不幸的是,大约 700 项的列表全部放在一个 row/line 中,就像我在这个屏幕截图上单击我的 d_club OptionMenu
时一样:
知道我如何需要在每个项目之后有一个新行的代码吗?
当我将抓取的数据作为列表直接导入 OptionMenu
时,它看起来很完美。
但是当我在启动 GUI 时尝试导入 .csv 中保存的数据时(所以当我调用 app.mainloop()
时)它被搞砸了。
编辑:
添加了我在我的抓取工具中使用的代码,以获取 .csv 文件:
def scrape():
li_clubs = []
print('getting clubs...\n')
#click the dropdown menue to open the folder
club_dropdown_menu = driver.find_element_by_xpath('/html/body/main/section/section/div[2]/div/div[2]/div/div[1]/div[1]/div[8]/div')
club_dropdown_menu.click()
time.sleep(1)
# scrape all text
scrape_clubs = driver.find_elements_by_xpath("//li[@class='with-icon' and contains(text(), '')]")
for club in scrape_clubs:
export_clubs = club.text
export_clubs = str(export_clubs)
export_clubs = export_clubs.replace(',', '')
li_clubs.append(export_clubs)
m_club = d_club.children['menu']
for val in li_clubs:
m_club.add_command(label=val,command=lambda v=sv_club,l=val:v.set(l))
with open('clubs.csv', 'w', newline='') as club:
writer = csv.writer(club, quotechar=None)
for i in li_clubs:
writer.writerow(i.split(','))
代码就是这样构建的,因此我可以在需要时更新 OptionMenu。
函数 def scrape():
绑定到一个按钮。这样当我按下按钮时,我会刮擦并更新我的选项菜单。
之后,我将列表 li_clubs
写入 clubs.csv
文件。
因为我需要的数据不经常变化,所以我将 scrape 绑定到一个按钮,这样我就可以在需要时按下它。
但我想在每次启动后将 .csv 文件中的数据加载到我的 OptionMenu 中。这样我就可以直接使用抓取的数据了。
您需要使用 expansion/unpack/splat 运算符 *
。但是,由于数据是列表列表(或元组的元组),您需要先将内部列表转换为字符串,因为选项菜单需要字符串列表。
它可能看起来像这样:
dummy_club = [" ".join(row) for row in dummy_club]
d_club = OptionMenu(app, sv_club, *dummy_club)
不过,具有 700 个值的 OptionMenu 将非常难以使用。您可能应该考虑使用 ttk Combobox 小部件。