【问题标题】:python tkinter import csv data to OptionMenupython tkinter 将 csv 数据导入到 OptionMenu
【发布时间】:2020-12-28 00:34:15
【问题描述】:

我想用我之前从 url 中抓取的数据填充一些 OptionMenu

例如:

    with open('clubs.csv', newline ='') as club:
    reader=csv.reader(club)
    dummy_club = []
    dummy_club.extend(reader)

稍后我想在我的OptionMenus 之一中使用它

例如:

sv_club = StringVar()    
d_club = OptionMenu(app,variable=sv_club,value=dummy_club)

不幸的是,大约 700 个项目的列表全部放在一行/一行中,就像我在此屏幕截图上单击我的 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(): 绑定到一个按钮。因此,当我按下按钮时,我会刮擦并更新我的 optionMenu。

之后,我将列表li_clubs 写入clubs.csv文件。

因为我需要的数据不会经常变化,所以我将 scrape 绑定到一个按钮上,这样我可以在需要时按下它。

但我想在每次启动后将 .csv 文件中的数据加载到我的 OptionMenu 中。这样我就可以直接使用抓取的数据了。

【问题讨论】:

  • 可以包含一些相关的代码吗?
  • 不确定你的意思是什么代码?我添加了我的爬虫代码和我的代码的更多解释。
  • 试试dummy_club = [x[0] for x in reader],然后是d_club = tk.OptionMenu(app, sv_club, *dummy_club)

标签: python list csv tkinter optionmenu


【解决方案1】:

您需要使用扩展/解包/splat 运算符*。但是,由于数据是列表列表(或元组的元组),您需要先将内部列表转换为字符串,因为选项菜单需要字符串列表。

它可能看起来像这样:

dummy_club = [" ".join(row) for row in dummy_club]
d_club = OptionMenu(app, sv_club, *dummy_club)

尽管如此,具有 700 个值的 OptionMenu 将很难使用。您可能应该考虑一个 ttk Combobox 小部件。

【讨论】:

  • *dummy_club 的建议很有帮助。现在全部显示在一列和 700 行中。但是它们仍然在括号中 {} 是否需要在 reader 块中添加其他内容才能摆脱它们?
  • @exec85 也许尝试索引?
  • @CoolCloud 也许我应该补充一点,我是编码的初学者。你能帮我弄清楚在我的情况下“索引”是什么意思吗?
  • 如果你 print(*dummy_club) 会发生什么?有大括号吗?可能只是您的数据随它们一起提供。在这种情况下,您需要先将它们剥离。
  • @exec85 试试*dummy_club[0]?不确定,它可能只取第一个元素,甚至抛出 IndexError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-10-28
  • 2020-05-06
  • 2022-01-21
  • 2017-03-11
相关资源
最近更新 更多