A Qt Widget for visualizing osu! beatmaps and replays.
项目描述
Circlevis
Circlevis是Circleguard中的回放查看器(也称为可视化器)。它被分离到一个独立的存储库中,以便其他项目可以选择使用它。
Circlevis是一个 pyqt 小部件。
安装
Circlevis可以通过pip安装
pip install circlevis
使用方法
Circlevis可以使用两种方式
VisualizerApp
最简单的方法是实例化一个 VisualizerApp
,它继承自 QApplication
,这样您就不必自己创建主应用程序。这对于快速可视化最佳,当您只想打开circlevis而不需要其他任何内容时。
from circleguard import *
from circlevis import VisualizerApp, BeatmapInfo
cg = Circleguard("key")
r = ReplayMap(509610, 6304246)
# replays must be loaded before passed to the visualizer
cg.load(r)
# BeatmapInfo tells circlevis how it should load the beatmap before it displays
# it. You can pass either a map id (in which case circlevis will download the map
# from osu!'s servers) or a path to a .osu file (in which case circlevis will
# load the beatmap from that file).
# If you don't want any beatmap to be displayed, instantiate an empty BeatmapInfo
# (bm = BeatmapInfo()) and pass that to the visualizer.
bm = BeatmapInfo(map_id=r.map_id)
app = VisualizerApp(bm, replays=[r])
# this calls qt's `exec` function, which shows the application and enters the
# gui run loop, blocking any code after this call.
app.exec()
您还可以仅对地图进行可视化,而不需要任何回放
from circlevis import VisualizerApp, BeatmapInfo
bm = BeatmapInfo(map_id=509610)
app = VisualizerApp(bm)
app.exec()
Visualizer
如果您想将可视化器集成到现有项目中(该项目已经有一个自己的 QApplication
),您应该实例化 Visualizer
类。 Visualizer
继承自 QMainWindow
而不是 QApplication
,可以像任何其他小部件一样使用。
from circleguard import *
from circlevis import Visualizer, BeatmapInfo
cg = Circleguard("key")
r = ReplayMap(509610, 6304246)
cg.load(r)
bm = BeatmapInfo(map_id=r.map_id)
visualizer_window = Visualizer(bm, replays=[r])
visualizer_window.show()
# or do something fancy with it instead of showing it immediately
其他参数
Both VisualizerApp
和 Visualizer
可以接受几个可选参数
events
- 一个时间戳列表(以毫秒为单位)。如果在回放中找到具有该时间戳的帧,则将其着色为金色library
- 一个 sliderLibrary
类,如果传递,将用于代替创建一个新的speeds
- 可视化器可以播放的可能速度列表。这些可以在可视化器上的加速或减速图标之间实时切换,或者通过按上或下键切换start_speed
- 要开始播放的速度。此值必须在speeds
中paint_info
- 是否在左上角绘制地图和回放的信息
分类器
Circlevis还提供了一个Classifier
类,它基于可视化器提供了一个简单的方式来逐个批量分类回放。例如,假设你想要查看一个地图的排行榜,并根据用户如何经常使用光标舞蹈为每个回放分配一个“光标舞蹈分数”。分类器会显示第一个回放,并等待你按下数字键为该回放分配光标舞蹈分数。当你这样做时,它会保存分数并显示下一个回放。重复此操作,直到所有回放都被分类。
要使用它,你需要一个用于控制回放分类的热键列表、一个circleguard实例和一个回放实例列表。以下是一个上述“光标舞蹈评分”用例的示例,其中你可以为回放分配1到10的分数
from collections import defaultdict
from circleguard import Circleguard
from circlevis import Classifier, ClassifierHotkey
cg = Circleguard("api_key")
class JudgeClassifier(Classifier):
def __init__(self, replays, cg):
self.scores = defaultdict(list)
hotkeys = [
ClassifierHotkey(Qt.Key.Key_1, lambda r: self.assign_score(1, r)),
ClassifierHotkey(Qt.Key.Key_2, lambda r: self.assign_score(2, r)),
ClassifierHotkey(Qt.Key.Key_3, lambda r: self.assign_score(3, r)),
ClassifierHotkey(Qt.Key.Key_4, lambda r: self.assign_score(4, r)),
ClassifierHotkey(Qt.Key.Key_5, lambda r: self.assign_score(5, r)),
ClassifierHotkey(Qt.Key.Key_6, lambda r: self.assign_score(6, r)),
ClassifierHotkey(Qt.Key.Key_7, lambda r: self.assign_score(7, r)),
ClassifierHotkey(Qt.Key.Key_8, lambda r: self.assign_score(8, r)),
ClassifierHotkey(Qt.Key.Key_9, lambda r: self.assign_score(9, r)),
ClassifierHotkey(Qt.Key.Key_0, lambda r: self.assign_score(10, r)),
]
super().__init__(replays, cg, hotkeys)
def assign_score(self, score, replay):
print(f"scoring {replay} as a {score}")
self.scores[score].append(replay)
# show the next replay now that we've scored this one
self.next_replay()
def done(self):
print(f"final scores: {self.scores}")
replays = cg.Map(221777, "1-10")
classifier = JudgeClassifier(replays, cg)
classifier.start()
程序化截图
一个菜谱,用于在地图中任意时间戳保存可视化器的当前状态
from circleguard import *
from circlevis import *
cg = Circleguard("api_key")
r = cg.Map(2102290, "1", mods=Mod.HD, load=True)[0]
bm = BeatmapInfo(map_id=r.map_id)
screenshot_times = [727, 8000, 15214]
class ScreenshotVisualizer(VisualizerApp):
def on_load(self):
self.pause()
for i, t in enumerate(screenshot_times):
self.seek_to(t)
image = self.save_as_image()
image.save(f"image-{i}.png")
self.exit()
vis = ScreenshotVisualizer(bm, [r])
vis.exec()
如果你想对多个地图中的多个回放进行截图,这会变得有点复杂,因为我们只能在程序的整个生命周期中实例化一个QApplication
,即使我们尝试按顺序实例化它们。但我们可以稍微滥用Classifier
来实现这一点
m = cg.Map(221777, "1-2", load=True)
# fill in with whatever screenshot times you want
screenshot_times = {
m[0]: [123, 234, 456],
m[1]: [10000, 20000, 30000]
}
class ScreenshotVisualizer(Visualizer):
def __init__(self, callback, screenshot_times, *args, **kwargs):
self.callback = callback
self.screenshot_times = screenshot_times
super().__init__(*args, **kwargs)
def on_load(self):
self.pause()
for t in self.screenshot_times:
self.seek_to(t)
image = self.save_as_image()
image.save(f"replay-{self.replays[0].username}-{t}.png")
self.callback()
class ScreenshotClassifier(Classifier):
def visualizer(self, bm, replay):
callback = lambda: self.next_replay()
times = screenshot_times[replay]
return ScreenshotVisualizer(callback, times, bm, [replay])
c = ScreenshotClassifier(m, cg, [])
c.start()
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
circlevis-1.4.7.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b3c7381543067746eff22040e8122eb5721a0f4f0da2cc5a338dc8d3653c25b2 |
|
MD5 | fb09f6c271c88da584f388f885548c84 |
|
BLAKE2b-256 | 71fc8ecf7b200b886f391404161f9baaa801a37c4600678fcb1ef9993ae490f1 |
circlevis-1.4.7-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b379c8f0992724000773efd2e3d893f8efc423f7bbbe0ea5305753570d8548e9 |
|
MD5 | 6f67a374c7eb121c69548ac9b582be1a |
|
BLAKE2b-256 | d0266c60416e09d7fcdfe73960c4a600145ddfbf419f841482d496e4253fe01e |