我在PyQt中开发一个软件来编辑游戏中的瓷砖地图 - 它支持我游戏专有的许多东西。
我的游戏主要是小地图,但我想尝试做一个更大的地图 - 但不幸的是,我的编辑似乎在较大的地图上(特别是在创作时)很迟钝。编辑器中的每个图块都是带有图像的标签。所以我在它上面做了一个90x90的地图,并使用python配置文件来理解是什么让它失效。
python -m cProfile Editor.py > profile.log
总时间超过一秒的行数如下:
ncalls tottime percall cumtime percall filename:lineno(function)
8205 22.397 0.003 22.397 0.003 {built-in method show}
1 5.09 5.09 37.913 37.913 {built-in method exec_}
1 1.824 1.824 1.824 1.824 {getExistingDirectory}
1 1.038 1.038 1.038 1.038 {question}
好的,所以getExistingDirectory需要花时间选择目录,所以我将其排除在外。
结果显示被称为8205次!因为地图上有8100个瓷砖,我认为这与它有关 - 我制作了一个90x90的地图,即8100个瓷砖。同时,屏幕上还有其他控件,甚至还有117个元素的调色板 - 所有其他控件至少可以总共200个小部件。
因此,单击新文件后,将创建中央窗口小部件中的切片。我的问题是,是否有一个消息,以便显示,而不是每个标签小部件被调用一次,只为他们在里面的更大的小部件调用一次?
更新
事实证明,我在创建每个人时都会给自己打电话。我删除了电话!不幸的是,时间过去了。
ncalls tottime percall cumtime percall filename:lineno(function)
1 43.588 43.588 53.901 53.901 {built-in method exec_}
1 2.325 2.325 2.325 2.325 {getExistingDirectory}
1 1.447 1.447 1.447 1.447 {question}
2 0.265 0.132 1.773 0.887 Editor.py:59(DrawMap)
8452 0.244 0 0.244 0 {built-in method scaled}
8442 0.227 0 1.233 0 TileXtra.py:319(initTile)
24852 0.221 0 0.221 0 {built-in method connect}
42260 0.128 0 0.128 0 {PIL._imaging.alpha_composite}
42260 0.077 0 0.115 0 Image.py:472(_new)
8452 0.077 0 0.24 0 ImageQt.py:44(__init__)
8452 0.074 0 0.074 0 {fromImage}
42260 0.072 0 0.403 0 Image.py:2033(alpha_composite)
1 0.064 0.064 54.158 54.158 Editor.py:3(<module>)
8452 0.042 0 0.042 0 {method 'encode' of 'ImagingEncoder' objects}
8452 0.038 0 0.132 0 Image.py:530(tobytes)
67740 0.036 0 0.05 0 Image.py:628(load)
24852 0.033 0 0.033 0 {PyQt4.QtCore.SIGNAL}
42664 0.03 0 0.03 0 Image.py:461(__init__)
答案 0 :(得分:1)
确定找到解决方案。
在具有多个小部件的窗口小部件的绘制方法中,将其隐藏,然后使用QWidget.setVisible (self, bool visible)
在pyqt中显示,如:
class BigWidget(QWidget):
def __init__(self, parent=None, **kwargs):
QWidget.__init__(self, parent, **kwargs)
...
def DrawManyWidgets(self, parent):
self.setVisible(False)
...
self.setVisible(True)