首页 > 解决方案 > 如何通过 tkinter 中的按钮重新加载读数?

问题描述

我正在编写我的第一个可用程序。我想读出复印机制作的副本,并将它们与先前保存在外部 txt 文件中的条目进行比较。由于加载时间非常长,我想在不破坏整个 tkinter 构造的情况下重新加载条目并重新启动它。如何删除以前的条目并一次又一次地从后台隐藏的 chrome 实例中读出复印机“网站”中的条目?(使用 chrome 实例是因为在复印机网站逻辑中实现了一个非常令人不安的 cookie,如果有人有一个解决方案,让每个复印机不等待 10 秒,我很想听听更多!)

整个程序(counter.txt 文件只包含保存的复印机计数器读数,例如:813981):

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from tkinter import *

    with open('counter.txt', 'r') as file:
        data = file.readlines()
    data = [w.replace('\n', '') for w in data]


    copyshop_dict = {
        "3": {
            "url": "http://192.168.2.50/twelcome.cgi?CorePGTAG=0&Dummy=1558002411080",
            "save": data[2]
        },
        "4": {
            "url": "http://192.168.2.123/twelcome.cgi?CorePGTAG=0&Dummy=1562919772376",
            "save": data[3]
        }
    }


    def browser(url_input):
        global driver
        # create a new hidden Chrome session
        window_size = "1920,1080"
        chrome_options = Options()
        chrome_options.add_argument("--headless")
        chrome_options.add_argument("--window-size=%s" % window_size)
        driver = webdriver.Chrome(options=chrome_options)
        driver.get(url_input)
        python_button = driver.find_element_by_xpath('//a[@href="javascript:load_device()"]')
        python_button.click()
        python_button2 = driver.find_element_by_xpath(
            '//*[@id="navigation"]/table/tbody/tr/td/table[1]/tbody/tr[5]/td[2]/a/font/b')
        value = python_button2.click()
        return value


    class MyCopySopCounter:
        def __init__(self, parent):

            self.MyParent = parent
            self.MyCounterFrame = Frame(parent)
            self.MyCounterFrame.pack()

            self.backgroundgrid = Frame(self.MyCounterFrame)
            self.backgroundgrid.configure(background='white')
            self.backgroundgrid.grid(column=0, row=0)

            self.title = Frame(self.backgroundgrid)
            self.title.configure()
            self.title.grid(column=0, row=0)

            self.titlelbl = Label(self.title)
            self.titlelbl.configure(text="COPY-QUICK Kopien Zähler", font=("Square721 BdEx BT", 25),
                                    background='white', fg='darkblue')
            self.titlelbl.pack(fill=X)

            self.copierFrame = Frame(self.backgroundgrid)
            self.copierFrame.configure(padx=10, pady=10, background='white')
            self.copierFrame.grid(row=1)

            for key, value in copyshop_dict.items():

                browser(copyshop_dict[key]["url"])

                cofra = Frame(self.copierFrame)
                cofra.configure(width=100, height=100, bd=1, relief=GROOVE, padx=10, pady=10, background='white')
                cofra.grid(column=int(key) - 2, row=0)

                cotifra = Frame(cofra)
                cotifra.grid(column=0, row=0)

                coti = Label(cotifra)
                coti.configure(text="Kopierer %s" % int(key), background='white', fg='darkblue',
                               font=("Square721 BdEx BT", 10), height=2)
                coti.pack()

                html_number = driver.find_element_by_xpath(
                    '//*[@id="mainCounterInformationModule"]/div[2]/table/tbody/tr[5]/td[2]')
                counter = int(html_number.text)

                saved_file_num = int(copyshop_dict[key]['save'])

                if counter > saved_file_num:
                    diff = counter - saved_file_num
                    diff = str(diff)
                    v.set("%s neue Kopie(n)" % diff)

                    self.replace_line('counter.txt', (int(key) - 1), str(counter) + "\n")

                else:
                    v.set("Keine neuen Kopien")

                cocofra = Frame(cofra)
                cocofra.grid(column=0, row=2)

                coco = Label(cocofra)
                coco.configure(text="Kopien:\n%s" % v.get(), background="white")
                coco.pack()

                cobufra = Frame(cofra)
                cobufra.configure(width=200, height=200)
                cobufra.grid(column=0, row=3)

                cobu1 = Button(cobufra)
                cobu1.configure(text="reload", fg='green')
                cobu1.pack(side=LEFT)
                cobu1.bind("<Button-1>", self.refresh(counter, key, coco))

            cobufra = Frame(self.backgroundgrid)
            cobufra.configure(width=200, height=200)
            cobufra.grid(column=0, row=2)

            cobu2 = Button(cobufra)
            cobu2.configure(text="close", fg='red')
            cobu2.pack(side=RIGHT)
            cobu2.bind("<Button-1>", self.button2Click)

            cofrespa = Frame(self.backgroundgrid)
            cofrespa.configure(width=50, height=20, bg='white')
            cofrespa.grid(column=0, row=3)

        def refresh(self, event, key, coco):

            html_number = driver.find_element_by_xpath(
                '//*[@id="mainCounterInformationModule"]/div[2]/table/tbody/tr[5]/td[2]')
            counter = int(html_number.text)

            saved_file_num = int(copyshop_dict[key]['save'])

            if counter > saved_file_num:
                diff = counter - saved_file_num
                diff = str(diff)
                v.set("%s neue Kopie(n)" % diff)
                coco.configure(text="Kopien:\n%s" % v.get(), background="white")
                coco.pack()
                self.replace_line('counter.txt', (int(key) - 1), str(counter) + "\n")

            else:
                v.set("No new printouts")
                coco.configure(text=v.get(), background="white")

        def button2Click(self, event):
            root.destroy()

        def replace_line(self, file_name, line_num, text):
            lines = open(file_name, 'r').readlines()
            lines[line_num] = text
            out = open(file_name, 'w')
            out.writelines(lines)
            out.close()


    root = Tk()
    root.wm_title("Kopierer 3")
    v = StringVar()
    myapp = MyCopySopCounter(root)

    root.mainloop()

感谢 FrainBr33z3 我编辑了代码,所以刷新函数重做了整个逻辑。它仍然无法正常工作。我现在什至没有收到任何错误消息!可悲的是,我不明白,为什么。据我了解,当我按下cobu1- 按钮时,它会加载刷新功能,该功能首先读取 counter-xhtml 路径并将其存储在变量 counter 中,然后将其与保存的复印机中保存的数字进行比较嵌套字典。如果xhtml-path的读数更高,它应该用前面提到的2个变量的差异重做coco标签。如果没有,它应该写在标签“没有新的打印输出”中。我什么也得不到!

标签: pythonbuttontkinterrefreshreload

解决方案


推荐阅读