python - 如何通过 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标签。如果没有,它应该写在标签“没有新的打印输出”中。我什么也得不到!
解决方案
推荐阅读
- linux - 用于从文本日志文件中提取/检索值的 Shell 脚本(sqlcode 字段值)
- sqlite - PHP7.2 Sqlite3 扩展未加载 - Debian 9
- wordpress - ACF acf_add_local_field_group 无法识别 php 中字段属性值的数组变量
- python - 我的数据中有对象。我如何查看 Python 中的内容?
- android - 活动的向上按钮导航到不同的活动
- r - 使用 R 计算每月抵押贷款的利率
- haskell - 堆栈:'hdevtools 是一个库依赖项,但由于 my-app 是构建目标,因此该包不提供所需的库。
- python - 为什么我的代码不能使日期时间对象识别时区?
- windows - 查找当前 CMD 窗口的 conhost.exe 进程的 PID
- php - 如何将函数移动到另一个文件