【发布时间】:2021-12-16 21:19:13
【问题描述】:
我正在使用以下代码,但我收到“NameError: name 'logarea' is not defined”
from tkinter import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
import multiprocessing
from multiprocessing import Queue
import os
from tkinter import ttk
import logging
import datetime
curr_dir = os.getcwd()
def browserRun():
global curr_dir
timenow = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
logname = rf'{curr_dir}\Logs\Log-{timenow}.txt'
logging.basicConfig(filename=logname,
filemode='a',
format='%(asctime)s: %(message)s',
datefmt='%d-%m-%Y %I:%M:%S %p',
level=logging.INFO,
force=True)
while True:
global driver
options = Options()
options.binary_location = r'D:\Downloads\Chromedriver\browser\chrome.exe'
driver = webdriver.Chrome(executable_path=r'D:\Downloads\Chromedriver\chromedriver.exe', options=options)
driver.get('http://google.com')
logging.info(f"Logging to gmail")
loggingtoUI(logname)
time.sleep(5)
driver.find_element(By.XPATH, '//input[@name="q"]').send_keys("Hello World")
time.sleep(5)
driver.close()
driver.quit()
def start():
global executor
pqueue = Queue()
executor = [multiprocessing.Process(target=browserRun) for _ in range(1)]
for p in executor:
p.daemon = True
p.start()
def loggingtoUI(logname):
global myfile
global logarea
with open(logname, "r") as myfile:
try:
MyText2 = myfile.read()
logarea.config(state='normal')
logarea.delete('1.0', END)
logarea.insert(INSERT, MyText2)
logarea.see("end")
logarea.config(state='disabled')
finally:
myfile.close()
def stop():
global executor
for p in executor:
p.terminate()
# os.system("taskkill /F /IM chromedriver.exe /T")
os.system("taskkill /F /IM CHROME.exe /T")
if __name__ == '__main__':
global logarea
root = Tk()
notebook = ttk.Notebook(root, style='lefttab.TNotebook')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text="Home")
notebook.add(tab2, text="Settings")
notebook.pack(fill=BOTH, expand=True)
button = Button(tab1, text="start", command=start)
button.place(x=20, y=20)
button1 = Button(tab1, text="stop", command=stop)
button1.place(x=70, y=20)
logarea = Text(tab1, height=25, width=40, wrap='word', state='disabled')
logarea.place(x=120, y=40)
root.geometry("500x500")
root.mainloop()
我将 logarea 设置为全局,但仍然出现 NameError,我尝试在启动和加载代码时将 logarea 设置为全局,但没有任何效果。
当我在另一个函数中调用 loggingtoUI 时会发生此问题。任何帮助将不胜感激。
【问题讨论】:
-
首先你不需要使用
global logarea,其次你不需要在with上下文管理器中使用try/finally,因为这正是它隐含的作用。并定义了logarea -
Matiiss,感谢您的帮助,但它不起作用,我关闭了
try/finally global logarea,但它仍然显示NameError: name 'logarea' is not defined,它发生在logarea.config(state='normal') -
数据不跨进程共享。
-
acw1668,感谢您的帮助,当我在
MyText2 = myfile.read()之后添加print时,我能够看到读取的数据 -
logarea不在进程之间共享,您甚至无法共享它,因为它不可腌制(tkinter的东西都不是),您需要的可能是使用multiprocessing.Queue或multiprocessing.Manager与主进程共享数据并使用.after“循环”更新文本小部件
标签: python tkinter multiprocessing