我正在画布上用以下函数绘制小圆圈:
这是将绘制圆圈的函数:
class Fourmis:
def __init__(self, can, posx, posy, name, radius):
self.can = can
self.largeur_can = int(self.can.cget("width"))
self.hauteur_can = int(self.can.cget("height"))
self.posx = posx
self.posy = posy
self.name = name
self.radius = radius
self.ball1 = self.can.create_oval(self.posy, self.posx, self.posy+radius, self.posx+radius, outline=self.name, fill=self.name, width=2)
self.nx = randrange(-10,10,1)
self.nx /= 2.0
self.ny = randrange(-10,10,1)
self.ny /= 2.0
#self.can.bind("<Motion>", self.destruction, add="+")
self.statut = True
self.move()
def move(self):
if self.statut == True :
self.pos_ball = self.can.coords(self.ball1)
self.posx_ball = self.pos_ball[0]
self.posy_ball = self.pos_ball[1]
if self.posx_ball < 0 or (self.posx_ball + self.radius) > self.largeur_can:
self.nx = -self.nx
if self.posy_ball < 0 or (self.posy_ball + self.radius) > self.hauteur_can:
self.ny = -self.ny
self.can.move(self.ball1, self.nx, self.ny)
self.can.after(10, self.move)
这个创造了画布和圆圈:
class App(Frame):
def __init__(self):
self.root=Tk()
self.can=Canvas(self.root,width=800,height=600,bg="black")
self.can.pack()
self.create(50, "green")
self.create(50, "purple")
def mainloop(self):
self.root.mainloop()
def create(self, i, name):
for x in range(i):
self.x=Fourmis(self.can,100,400, name,0)
我调用以下行来运行项目:
jeu = App()
jeu.mainloop()
在不同的线程中执行self.create(50,"绿色")
和self.create(50,"紫色")
的正确方法是什么?
我尝试了以下方法,但无法使其起作用:
class FuncThread(threading.Thread):
def __init__(self, i, name):
self.i = i
self.name = name
threading.Thread.__init__(self)
def run(self):
App.create(self, self.i, self.name)
有人能告诉我如何运行这些线程吗?
当需要此功能时,您要做的是通过将事件放入线程共享的队列中来计划要执行的事件。这样,在给定的线程中,您指定要运行“create(50,…)”通过将其排队,主线程将事件出列并执行它。
以下是在第二个线程中创建移动球的基本示例:
import threading
import Queue
import random
import math
import time
import Tkinter
random.seed(0)
class App:
def __init__(self, queue, width=400, height=300):
self.width, self.height = width, height
self.canvas = Tkinter.Canvas(width=width, height=height, bg='black')
self.canvas.pack(fill='none', expand=False)
self._oid = []
self.canvas.after(10, self.move)
self.queue = queue
self.canvas.after(50, self.check_queue)
def check_queue(self):
try:
x, y, rad, outline = self.queue.get(block=False)
except Queue.Empty:
pass
else:
self.create_moving_ball(x, y, rad, outline)
self.canvas.after(50, self.check_queue)
def move(self):
width, height = self.width, self.height
for i, (oid, r, angle, speed, (x, y)) in enumerate(self._oid):
sx, sy = speed
dx = sx * math.cos(angle)
dy = sy * math.sin(angle)
if y + dy + r> height or y + dy - r < 0:
sy = -sy
self._oid[i][3] = (sx, sy)
if x + dx + r > width or x + dx - r < 0:
sx = -sx
self._oid[i][3] = (sx, sy)
nx, ny = x + dx, y + dy
self._oid[i][-1] = (nx, ny)
self.canvas.move(oid, dx, dy)
self.canvas.update_idletasks()
self.canvas.after(10, self.move)
def create_moving_ball(self, x=100, y=100, rad=20, outline='white'):
oid = self.canvas.create_oval(x - rad, y - rad, x + rad, y + rad,
outline=outline)
oid_angle = math.radians(random.randint(1, 360))
oid_speed = random.randint(2, 5)
self._oid.append([oid, rad, oid_angle, (oid_speed, oid_speed), (x, y)])
def queue_create(queue, running):
while running:
if random.random() < 1e-6:
print "Create a new moving ball please"
x, y = random.randint(100, 150), random.randint(100, 150)
color = random.choice(['green', 'white', 'yellow', 'blue'])
queue.put((x, y, random.randint(10, 30), color))
time.sleep(0) # Effectively yield this thread.
root = Tkinter.Tk()
running = [True]
queue = Queue.Queue()
app = App(queue)
app.create_moving_ball()
app.canvas.bind('<Destroy>', lambda x: (running.pop(), x.widget.destroy()))
thread = threading.Thread(target=queue_create, args=(queue, running))
thread.start()
root.mainloop()
问题内容: 我正在使用这些功能在画布上绘制小圆圈: 这是绘制圆圈的功能: 这个创建画布和圆圈: 我称这些行来运行项目: 什么是执行正确的方法,并在不同的线程? 我已经尝试了以下方法,但无法使其正常工作。: 有人可以告诉我如何运行这些线程吗? 问题答案: 当需要此功能时,您要做的是通过将事件置于线程共享的队列中来安排要执行的事件。这样,在给定线程中,您可以通过排队指定要运行“ create(50,…
我正试图用tkinter编写一个Python GUI程序。 我想做两根线。一个使用main_form函数运行,以防止tkinter保持更新和循环(避免“无响应”)。 另一个,当按钮1(btn1)被单击时,使函数sci_thread()开始运行,并启动执行长时间代码main_scikit的thread2。 但是tkinter一直没有回应。 下面是我的代码:
我听说Python中的线程不容易处理,而且它们与tkinter的关系更加复杂。 我有以下问题。我有两个类,一个用于GUI,另一个用于无限进程。首先,我启动GUI类,然后启动无限进程类。我希望当您关闭GUI时,它也会完成无限过程,程序也会结束。 代码的简化版本如下: 单击关闭按钮(右上角)时,控制台中会出现以下错误: 我不知道为什么会这样,也不知道这意味着什么。
问题内容: 我想制作一个用Python编写并使用SQLAlchemy的数据库应用程序编程接口(或其他任何数据库连接器,如果被告知将SQLAlchemy用于此类任务不是好方法)。该设置是在Linux或BSD上运行的MySQL服务器,以及在Linux或BSD机器(外部或本地)上运行的Python软件。 基本上我想做的是为每个连接生成一个新线程,并且该协议将是自定义且非常简单的,尽管对于每个请求,我想打
我有一个Python 3。x报表创建者,其I/O绑定(由于SQL而非python),在创建报表时主窗口将“锁定”数分钟。 所需要的只是在锁定GUI时使用标准窗口操作(移动、调整大小/最小化、关闭等)(GUI上的所有其他内容都可以保持“冻结”,直到所有报告完成)。 添加20181129:换句话说,tkinter必须只控制应用程序窗口的内容,并将所有标准(外部)窗口控件的处理留给O/S。如果我能做到这
提前谢谢你