Python: 尝试访问线程拥有的变量时出现属性错误
Python: Attribute error when trying to access thread owned variable
我用 tkinter
创建了一个简单的 window 并将其作为线程启动,以保持主程序 运行ning 在 window 旁边。这是它的简化版本:
import tkinter as tk
import threading
class mainWindow(threading.Thread):
def __init__(self, winWidth=500, winHeight=300):
threading.Thread.__init__(self)
self.winWidth = winWidth
self.winHeight = winHeight
# Save all drawn objects, to move or delete them later
self.bricks = []
self.start() #start thread
def run(self):
# parent object for all windows
self.master = tk.Tk()
self.master.protocol("WM_DELETE_WINDOW", self.callback)
self.show()
def callback(self):
self.master.quit()
# Initialize everything important
def show(self, tileSize=10):
# create main window
self.w = tk.Canvas(
self.master,
width=self.winWidth,
height=self.winHeight,
background="white")
self.w.pack()
# draw brick
color = "gray49"
posX = 200
posY = 100
self.bricks.append(self.w.create_rectangle(posX, posY, posX+20, posY+20, fill=color))
tk.mainloop()
def move_brick(self, x,y):
self.w.move(self.brick, x, y)
mainWindow = mainWindow()
mainWindow.move_brick(100,100)
当我 运行 显示的代码 window 正确打开时,但是当我尝试使用 move_brick(...)
移动矩形时,出现此错误:
AttributeError: 'mainWindow' object has no attribute 'w'
为什么对象找不到我的Canvas w
?
您可能存在竞争条件,这在线程应用程序中很常见。在工作线程有机会创建小部件之前,主线程可能会调用 move_brick
。
如果您在创建小部件之前和之后以及在您的 move_brick
函数中添加打印语句,您可能会看到这种情况。
即使您修复了此问题,此代码也可能无法正常工作,因为所有 tkinter 代码都需要 运行 在单个线程中。在一个线程中创建 GUI 并在另一个线程中调用 move_brick
不是使用 tkinter 的正确方法。
我用 tkinter
创建了一个简单的 window 并将其作为线程启动,以保持主程序 运行ning 在 window 旁边。这是它的简化版本:
import tkinter as tk
import threading
class mainWindow(threading.Thread):
def __init__(self, winWidth=500, winHeight=300):
threading.Thread.__init__(self)
self.winWidth = winWidth
self.winHeight = winHeight
# Save all drawn objects, to move or delete them later
self.bricks = []
self.start() #start thread
def run(self):
# parent object for all windows
self.master = tk.Tk()
self.master.protocol("WM_DELETE_WINDOW", self.callback)
self.show()
def callback(self):
self.master.quit()
# Initialize everything important
def show(self, tileSize=10):
# create main window
self.w = tk.Canvas(
self.master,
width=self.winWidth,
height=self.winHeight,
background="white")
self.w.pack()
# draw brick
color = "gray49"
posX = 200
posY = 100
self.bricks.append(self.w.create_rectangle(posX, posY, posX+20, posY+20, fill=color))
tk.mainloop()
def move_brick(self, x,y):
self.w.move(self.brick, x, y)
mainWindow = mainWindow()
mainWindow.move_brick(100,100)
当我 运行 显示的代码 window 正确打开时,但是当我尝试使用 move_brick(...)
移动矩形时,出现此错误:
AttributeError: 'mainWindow' object has no attribute 'w'
为什么对象找不到我的Canvas w
?
您可能存在竞争条件,这在线程应用程序中很常见。在工作线程有机会创建小部件之前,主线程可能会调用 move_brick
。
如果您在创建小部件之前和之后以及在您的 move_brick
函数中添加打印语句,您可能会看到这种情况。
即使您修复了此问题,此代码也可能无法正常工作,因为所有 tkinter 代码都需要 运行 在单个线程中。在一个线程中创建 GUI 并在另一个线程中调用 move_brick
不是使用 tkinter 的正确方法。