【问题标题】:How to display HTML Table data cell elements in Tkinter GUI using Selenium?如何使用 Selenium 在 Tkinter GUI 中显示 HTML 表格数据单元格元素?
【发布时间】:2021-07-14 13:50:11
【问题描述】:

我想制作一个程序,从批发网站获取表格的表格数据单元格元素(表格显示一次性电子烟的库存),然后在 Tkinter GUI 上显示哪些商品库存不足。到目前为止,我正在使用 selenium 访问各种 vape 的不同 URL,并根据它们是否低于特定数量打印出这些 vape 某些口味的库存。我添加了一个 Tkinter GUI,当您按下“Vapes”按钮时,它会询问您要检查的股票并启动 selenium。是否可以在 Tkinter GUI 本身上显示 HTML 数据,而不仅仅是将其打印到终端?到目前为止,这是我的代码,我计划添加更多的电子烟和其他物品,但这里只做了两个,所以看起来不那么凌乱:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from tkinter import *
import time
PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
def search_result():
    # fume infinity
    driver.get("https://safagoods.com/vape-shop/disposable-vape-devices/fume-infinity-disposable-device")
    wait = WebDriverWait(driver, 15)
    table = wait.until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".table.table-bordered tr[style='background: #eeeeee;']")))
    data = []
    rows = driver.find_elements_by_css_selector(".table.table-bordered tr[style='background: #eeeeee;']")
    for row in rows:
        qty = row.find_element_by_xpath("./td[1]").text
        stock = row.find_element_by_xpath("./td[2]").text
        name = row.find_element_by_xpath("./td[3]").text
        if int(stock) <= 50:
            data.append([stock, name])
    print("Number left/Flavor/Fume Infinity Disposables 5PC")
    print(*data, sep='\n')
    # Fume Extra
    driver.get("https://safagoods.com/vape-shop/disposable-vape-devices/fume-extra-10pc")
    wait = WebDriverWait(driver, 15)
    table = wait.until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".table.table-bordered tr[style='background: #eeeeee;']")))
    data = []
    rows = driver.find_elements_by_css_selector(".table.table-bordered tr[style='background: #eeeeee;']")
    for row in rows:
        qty = row.find_element_by_xpath("./td[1]").text
        stock = row.find_element_by_xpath("./td[2]").text
        name = row.find_element_by_xpath("./td[3]").text
        if int(stock) <= 50:
            data.append([stock, name])
    print("Number left/Flavor/Fume Extra Disposables 10PC")
    print(*data, sep='\n')

    driver.close()

#tkinter gui window and displayed options
window = Tk()
window.geometry("450x200")
search = Label(window,text= "Which stock would you like to check?",font='times 15')
search.place(x=20,y=20)

#buttons
b1 = Button(window,text="vapes",command=search_result,width = 12, bg= 'gray')
b1.place(x=150,y=50)
#b2 = Button(window,text="vape juices",command=search_result,width = 12, bg= 'gray')
#b2.place(x=150,y=90)

#b2 = Button(window,text="Juices",command=vape_juices,width = 12, bg= 'gray')
#b2.place(x=300,y=50)

window.mainloop()

对不起,如果这个问题令人困惑,我对编程还很陌生。谢谢大家。

【问题讨论】:

    标签: python html tkinter


    【解决方案1】:

    您可以尝试使用Treeview

    我在下面的代码中添加了一个,虽然有点粗糙。:)

    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.keys import Keys
    from tkinter import *
    from tkinter import ttk
    
    import time
    PATH = "chromedriver.exe"
    driver = webdriver.Chrome(PATH)
    def search_result():
        # fume infinity
        driver.get("https://safagoods.com/vape-shop/disposable-vape-devices/fume-infinity-disposable-device")
        wait = WebDriverWait(driver, 15)
        table = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, ".table.table-bordered tr[style='background: #eeeeee;']")))
        data = []
        rows = driver.find_elements_by_css_selector(".table.table-bordered tr[style='background: #eeeeee;']")
        for row in rows:
            qty = row.find_element_by_xpath("./td[1]").text
            stock = row.find_element_by_xpath("./td[2]").text
            name = row.find_element_by_xpath("./td[3]").text
            if int(stock) <= 50:
                data.append([stock, name])
    
        #populate treeview
        for idx, vals in enumerate(data):
          print(idx)
          tree.insert(parent='', index=idx, values=vals)
          
        print("Number left/Flavor/Fume Infinity Disposables 5PC")
        print(*data, sep='\n')
        # Fume Extra
        driver.get("https://safagoods.com/vape-shop/disposable-vape-devices/fume-extra-10pc")
        wait = WebDriverWait(driver, 15)
        table = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, ".table.table-bordered tr[style='background: #eeeeee;']")))
        data = []
        rows = driver.find_elements_by_css_selector(".table.table-bordered tr[style='background: #eeeeee;']")
        for row in rows:
            qty = row.find_element_by_xpath("./td[1]").text
            stock = row.find_element_by_xpath("./td[2]").text
            name = row.find_element_by_xpath("./td[3]").text
            if int(stock) <= 50:
                data.append([stock, name])
        print("Number left/Flavor/Fume Extra Disposables 10PC")
        print(*data, sep='\n')
    
        driver.close()
    
    #tkinter gui window and displayed options
    window = Tk()
    window.geometry("450x500")
    search = Label(window,text= "Which stock would you like to check?",font='times 15')
    search.place(x=20,y=20)
    
    #buttons
    b1 = Button(window,text="vapes",command=search_result,width = 12, bg= 'gray')
    b1.place(x=150,y=50)
    
    # add treeview
    tree = ttk.Treeview(window, )
    tree['columns'] = ['Quantity', 'Name']
    tree.column('#0', width=0, stretch=NO)
    tree.column('Quantity', anchor=CENTER, width=100)
    tree.column('Name', anchor=CENTER, width=200)
    
    tree.heading('#0', text='', anchor=CENTER)
    tree.heading('Quantity', text='Quantity', anchor=CENTER)
    tree.heading('Name', text='Name', anchor=CENTER)
    
    tree.place(x=0, y=200)
    
    
    
    #b2 = Button(window,text="vape juices",command=search_result,width = 12, bg= 'gray')
    #b2.place(x=150,y=90)
    
    #b2 = Button(window,text="Juices",command=vape_juices,width = 12, bg= 'gray')
    #b2.place(x=300,y=50)
    
    window.mainloop()
    
    

    【讨论】:

    • 哇。我会更多地研究树视图,但这绝对是我想要的。它显示了我所有的数据,我也可以很容易地添加滚动条。谢谢你。如果你有时间,你能解释一下“for idx, vals in enumerate(data): print(idx) tree.insert(parent='', index=idx, values=vals”是什么意思吗?我确定我可以在我继续编码时弄清楚,但如果可能的话,我想从你那里理解它。
    【解决方案2】:

    我找到了一些与你的问题相匹配的答案/文章:

    1. Is it possible to render html in tkinter
    2. How to use Html in tkinter program
    3. Create table in tkinter.

    第一个链接建议您使用cefpython

    是的,您可以在 tkinter 中嵌入 HTML 并打开完整的网页(甚至使用 CSS 和 javascript)。使用 cefpython 模块,您可以在 tk 窗口中嵌入成熟的 Chromium 浏览器。

    第二个建议你使用tkhtmlview

    tkhtmlview 模块是 Tkinter 小部件的集合,其文本可以设置为 HTML 格式。 HTML 小部件不是 Web 浏览器框架,它只是一个简单且轻量级的 HTML 解析器,用于格式化 Tkinter Text 基类使用的标签。

    我没有在这两篇文章中找到确切的table 代码。经过进一步研究,我发现第三篇文章为您提供table,但我认为它不能解决您的问题。

    所以,这是我的建议您已经抓取了页面并从那里获得了所需的数据,现在您想在表格中显示它。你可以这样做:

    首先尝试制作表格并将数据手动插入表格中,您已经手动完成并获得了某种表格,对吗?现在尝试更改代码,通过循环遍历数据将数据插入表中,就像您手动完成的那样。

    这是上述想法的示例代码

    ## Like you have this kind of list
    lst = [(1,'Raj','Mumbai',19),
           (2,'Aaryan','Pune',18),
           (3,'Vaishnavi','Mumbai',20),
           (4,'Rachna','Mumbai',21),
           (5,'Shubham','Delhi',21)]
    ## Now we have to insert this list into table then, we can loop through the list and insert it one by one.
    for i in range(len(lst)): #For rows
        for j in range(len(lst[0])): #For column
            e = Entry(root, width=20, fg='blue',font=('Arial',16,'bold'))
            e.grid(row=i, column=j)
            e.insert(END, lst[i][j])
    

    访问Create table using tkinter了解更多关于上述脚本的信息。

    如果您有任何其他想法或不了解任何内容,请尝试通过评论与我联系!

    【讨论】:

    • 谢谢!!!我现在了解如何更好地在 tkinter 中使用 HTML :) 非常有用的信息。
    猜你喜欢
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2012-09-29
    • 2019-04-10
    • 2012-04-12
    • 2013-12-07
    相关资源
    最近更新 更多