Python 编写一个tkinter游戏

Python 编写一个tkinter游戏,python,compilation,compiler-errors,tkinter,pickle,Python,Compilation,Compiler Errors,Tkinter,Pickle,我了解如何使用py2exe、portable python和其他方法编译程序的一般过程,以及一些可能导致问题的问题,如matplotlib等。然而,我很好奇如果游戏使用pickle,编译器将如何工作。游戏是否仍然能够保存和加载状态,如果它被编译,或者它将不再能够有这个选项 另外,如果有人不介意的话,我对编译程序的实际工作原理有点困惑,因为在编译器使程序成为可执行程序的过程中,对这个过程的一般解释将是非常棒的。基本上,python用语言解析器解释代码行。。。然后将解析后的行编译为字节码。这个字节码

我了解如何使用py2exe、portable python和其他方法编译程序的一般过程,以及一些可能导致问题的问题,如matplotlib等。然而,我很好奇如果游戏使用pickle,编译器将如何工作。游戏是否仍然能够保存和加载状态,如果它被编译,或者它将不再能够有这个选项


另外,如果有人不介意的话,我对编译程序的实际工作原理有点困惑,因为在编译器使程序成为可执行程序的过程中,对这个过程的一般解释将是非常棒的。

基本上,python用语言解析器解释代码行。。。然后将解析后的行编译为字节码。这个字节码是“编译过的python”

让我们构建一段代码:

# file: foo.py 
class Bar(object):
  x = 1
  def __init__(self, y):
    self.y = y
现在我们进口它

>>> import foo
>>> foo
<module 'foo' from 'foo.py'>
>>> reload(foo)
<module 'foo' from 'foo.pyc'>
site packages
目录是安装已编译的第三方代码的默认位置。实际上,模块只是文件的python对象表示形式。也就是说,模块实例是一个编译文件。一旦将文件“编译”到模块中,它就不再关心文件中的内容了。。。python在此之后只需要编译的字节码

>>> import types
>>> types.ModuleType.mro()
[<type 'module'>, <type 'object'>]
>>> foo.__class__.mro()
[<type 'module'>, <type 'object'>]
>>> i = object()
>>> object
<type 'object'>
>>> i
<object object at 0x1056f60b0>
同样,文件
foo.py
将保持不变。。。但是,我将
wow
添加到类
Bar
,因此它的可用性就好像
wow
首先在代码中一样。因此,使用“编译的”python根本不是静态的。。。这只意味着您正在使用字节编译的代码,以便在第一次导入时节省一些时间。请注意,由于模块
foo
是一个实例,您还可以在内存中编辑它(而不仅仅是已经存在于其内容中的对象)

在这里,我将
squared
添加到
foo
——不是添加到
foo.py
,而是添加到内存中的
foo
的字节编译副本中

>>> zap = foo.Bar(2)
>>> zap.x, zap.y
(1, 2)
>>> foo.Bar 
<class 'foo.Bar'>
>>> foo.Bar.mro()
[<class 'foo.Bar'>, <type 'object'>]
>>>        
>>> def wow(self): 
...   return self.x + self.y
... 
>>> wow(zap)
3
>>> foo.Bar.wow = wow
>>> foo.Bar.wow(zap)
3
>>> zap.wow()
3
那么,您可以在编译代码中pickle和unpickle对象吗?绝对地如果您使用了
pickle
,那么您可能已经在这样做了

.s。如果您正在讨论构建Python的C++扩展,并将代码编译为共享库…从根本上说,这仍然没有什么不同


如果您想了解字节编译的一些基本细节,请查看我的问题和答案:

你用过其他语言吗?如果我相信正确(警告!我可能错了),Python在运行或初始化时编译代码,而其他语言,如java,在代码完成时必须经过整个编译过程。我没有学习C++的意思,但最近没有时间,Python是我所编写过的唯一语言。我隐约记得类似的事情。我知道python可以调用用C编写的代码,但不确定它是否可以编译C。对此我不太确定…:(
>>> zap = foo.Bar(2)
>>> zap.x, zap.y
(1, 2)
>>> foo.Bar 
<class 'foo.Bar'>
>>> foo.Bar.mro()
[<class 'foo.Bar'>, <type 'object'>]
>>>        
>>> def wow(self): 
...   return self.x + self.y
... 
>>> wow(zap)
3
>>> foo.Bar.wow = wow
>>> foo.Bar.wow(zap)
3
>>> zap.wow()
3
>>> foo.square = lambda x:x**2
>>>            
>>> from foo import square
>>> square(3)
9