【问题标题】:Tkinter Multiprocessing Namerror: name 'logarea' is not definedTkinter 多处理名称错误:未定义名称“记录器”
【发布时间】: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.Queuemultiprocessing.Manager 与主进程共享数据并使用.after“循环”更新文本小部件

标签: python tkinter multiprocessing


【解决方案1】:

终于找到答案了,谢谢大佬们的帮助

from queue import Empty, Full
import tkinter as Tk
import multiprocessing
from tkinter import ttk
from tkinter import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import logging
import datetime
import time
import os
import undetected_chromedriver.v2 as uc
import random
import tempfile



logname = ''
curr_dir = os.getcwd()

class GuiApp(object):
   def __init__(self, q):
      self.root = Tk()
      self.notebook = ttk.Notebook(self.root, style='lefttab.TNotebook')
      self.tab1 = ttk.Frame(self.notebook)
      self.tab2 = ttk.Frame(self.notebook)
      self.notebook.add(self.tab1, text="Home")
      self.notebook.add(self.tab2, text="Settings")
      self.notebook.pack(fill=BOTH, expand=True)
      self.button = Button(self.tab1, text="start", command=self.start)
      self.button.place(x=20, y=20)
      self.button1 = Button(self.tab1, text="stop", command=self.stop)
      self.button1.place(x=70, y=20)
      self.logarea = Text(self.tab1, height=25, width=40, wrap='word', state='disabled')
      self.logarea.place(x=120, y=40)
      self.root.geometry("500x500")
      self.root.after(100, self.CheckQueuePoll, q)

   def CheckQueuePoll(self, c_queue):
      global logname
      try:
         MyText2 = c_queue.get(0)
         self.logarea.config(state='normal')
         self.logarea.delete('1.0', END)
         self.logarea.insert('end', MyText2)
         self.logarea.config(state='disabled')
      except Empty:
         pass
      finally:
         self.root.after(100, self.CheckQueuePoll, c_queue)

   def start(self):
      global executor
      executor = [multiprocessing.Process(target=GenerateData,args=(q,)) for _ in range(2)]
      for p in executor:
         p.start()
      # t1 = multiprocessing.Process(target=GenerateData,args=(q,))
      # t1.start()

   def stop(self):
      # t1.terminate()
      for p in executor:
         p.terminate()
      os.system("taskkill /F /IM chromedriver.exe /T")
      # os.system("taskkill /F /IM CHROME.exe /T")


def GenerateData(q):
   global logname
   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:
      options = uc.ChromeOptions()
      rand_num = random.randint(0000, 9999)
      temp = tempfile.gettempdir()
      temp_dir = rf'{temp}/temp{rand_num}'
      options.add_argument(f'--user-data-dir={temp_dir}')
      options.add_argument('--no-first-run --no-service-autorun --password-store=basic --disable-notifications')
      options.binary_location = rf'{curr_dir}\drivers\Browser\chrome.exe'
      driver = uc.Chrome(executable_path=rf'{curr_dir}\drivers\chromedriver.exe', options=options)
      driver.get('http://google.com')
      logging.info(f"Logging to gmail")
      f = open(logname, "r")
      q.put(f.read())
      time.sleep(5)
      driver.find_element(By.XPATH, '//input[@name="q"]').send_keys("Hello World")
      time.sleep(5)
      driver.close()
      driver.quit()

if __name__ == '__main__':
   q = multiprocessing.Queue()
   q.cancel_join_thread()  # or else thread that puts data will not term
   gui = GuiApp(q)
   gui.root.mainloop()

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2020-04-20
    • 2021-04-02
    • 2015-01-28
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2019-09-09
    • 2017-12-13
    相关资源
    最近更新 更多