跳转到主要内容

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 VisualizerAppVisualizer 可以接受几个可选参数

  • events - 一个时间戳列表(以毫秒为单位)。如果在回放中找到具有该时间戳的帧,则将其着色为金色
  • library - 一个 slider Library 类,如果传递,将用于代替创建一个新的
  • 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 (139.5 kB 查看散列值)

上传时间

构建分布

circlevis-1.4.7-py3-none-any.whl (144.4 kB 查看散列值)

上传时间 Python 3

由以下机构支持