【发布时间】:2014-03-03 03:01:21
【问题描述】:
我正在 {ython.游戏逻辑和其他一切都很好,我只是停留在代码的最后一部分,即使在阅读了库之后我也无法弄清楚。
self.after(1000,self.draw(bigThing))
这里是完整的代码:
from Tkinter import *
from button import *
import numpy
import test1
import time
class AppFrame(Frame):
def __init__(self,root, buttonlist):
Frame.__init__(self, root, relief='sunken', width=600, height=600)
self.gameisrunning = False
self.buttonlist = buttonlist
self.root = root
self.w = Canvas(self,width = 505, height =505)
self.boulis = []
for k in range(1,101):
for i in range(1, 101):
button = Buttons(self.w, i * 5, k * 5, i * 5 + 5, k * 5 + 5,k ,i,buttonlist)
self.boulis.append(button)
self.whole = list(self.chunks(self.boulis, 100))
self.grid(column =0, columnspan = 4)
self.w.grid(column = 0)
clear = Button(self.root,text = "clear")
clear.grid(column = 0, row = 1)
self.run = Button(self.root,text = "run", command = self.runit)
self.run.grid(column = 3, row = 1)
self.root.mainloop()
def runit(self):
if self.gameisrunning == False:
self.gameisrunning = True
self.transformer = self.buttonlist
while self.gameisrunning == True:
bigThing = test1.theNextBigThing(self.transformer)
self.transformer = bigThing
self.root.after(1000,self.draw, bigThing)
elif self.gameisrunning == True:
self.gameisrunning = False
def draw (self, board):
for k in range (0, 100):
for i in range (0, 100):
if board[k + 1][i + 1] == 1:
self.whole[k][i].activate()
elif board[k + 1][i + 1] == 0:
self.whole[k][i].deactivate()
def chunks(self,l, n):
""" Yield successive n-sized chunks from l.
"""
for i in xrange(0, len(l), n):
yield l[i:i+n]
我稍微改变了结构。似乎我想在“runit”方法下绘制的任何东西都不起作用。我不知道为什么会这样。 'runit' 中的所有其他功能都可以正常工作。只是这不起作用:
self.root.after(1000,self.draw(bigThing))
这是我的按钮类:
##button.py
from Tkinter import *
class Buttons:
def __init__(self,canvas,bx,by,tx,ty, k, i,buttonlist):
self.buttonlist = buttonlist
self.canvas = canvas
self.rec = canvas.create_rectangle((bx,by,tx,ty),fill = "lightgray",
activefill= 'black', outline = 'lightgray')
self.canvas.tag_bind(self.rec, "<Button-1>", lambda event: self.callback())
self.active = False
self.k = k
self.i = i
self.xmin = bx
self.xmax = tx
self.ymin = by
self.ymax = ty
##print (bx, by, tx, ty)
def activate(self):
self.canvas.itemconfigure(self.rec, fill = 'black')
def deactivate(self):
self.canvas.itemconfig(self.rec, fill='lightgray')
def callback(self):
self.activate()
self.buttonlist[self.k][self.i] = 1
【问题讨论】:
-
f()立即调用f函数。如果您想在一秒钟内画出 bigThing,请更改.after调用:self.root.after(1000, self.draw, bigThing) -
但是动画还是没有显示,是不是主循环后不能做图形变化?还是 while 循环?
-
有几个错误。我已经指出了明显的一个。是的,您不应该在 GUI 线程中使用阻塞的 while 循环。另外,不要在
__init__()中调用mainloop() -
@J.F. Sebastian 我不明白如何与 GUI 对话。 while 循环以前在 GUI 之外,但它甚至没有在“mainloop”之后调用“while”循环。你能更具体地谈谈如何将它移到外面以及它是如何工作的吗?我真的很感激。
-
这取决于
test1.theNextBigThing()是否阻塞,如果阻塞,那么它是 I/O 还是 CPU 受限。如果它没有阻塞,那么只需使用self.after()运行循环体。如果它阻塞但它不使用可能持有 GIL 太长时间的 C 扩展,那么您可以使用后台线程来运行它并使用Queue()在线程之间交换项目,example
标签: python python-2.7 graphics tkinter conways-game-of-life