4

我即将为 Windows 用户调整 ANKI SRS 的音乐提琴手插件。Anki 只运行以 .py 结尾的附加组件,而不是 pyw。有什么办法可以隐藏我运行代码时自动弹出的控制台。

如果没有,有没有办法取消选择控制台窗口(我基本上必须每五秒钟点击一次主 anki 窗口,因为已经再次关闭的控制台正在选择中)。

到目前为止,我用来打开窗口的命令是:os.system('"nircmd.exe changesysvolume"'+ change)

完整代码如下 控制台运行 nircmd.exe 和系统声音应更改的音量单位数。是否有可能调整代码?

# -*- coding: utf-8 -*-
# Music-Fiddler (a plugin for Anki)
# coded by D_Malik, malik6174@gmail.com
# Version 1
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html

"""
A simple plugin that fiddles with music volume to reinforce quick reviewing.

Before using:
- This plugin was made for Linux. It will require modification to work on another OS.
- Ensure that the "amixer" command works on your computer. If it doesn't, you're going to need     to modify the code somehow. Don't ask me how.//Amixer has been replaced by nircmd.exe for windows
- Change all lines (in the plugin source) marked with "CHANGEME" according to your preferences.
"""

    import os
from aqt import mw
from aqt.utils import showInfo
from os import system
from aqt.qt import *
from anki.hooks import addHook

    def resetMusicTimer():
    "Boosts volume back up and starts the music timer."
    #CHANGEME: The next lines are a python dictionary associating deck names with times (in         milliseconds) between volume-decrements.
    #Eg, when using the deck "brainscience", volume will decrement every 5 seconds. When using     a deck without a listed name, "other" is used.
    #Change this according to your decks. Decks with shorter, easier cards need less time.
    deckMusicTimes = {
                 "rocketsurgery"    :   3000,
                 "brainscience"     :   5000,
                     "other"            :   5000,
             }
    if mw.col.decks.current()['name'] in deckMusicTimes:
            mw.musicTimeToDecrement = deckMusicTimes[mw.col.decks.current()['name']]
    else:
        mw.musicTimeToDecrement = deckMusicTimes["other"]
    boostMusicVolume()
    mw.musicTimer = QTimer(mw)
    mw.musicTimer.setSingleShot(True)
    mw.musicTimer.start(mw.musicTimeToDecrement)
    mw.connect(mw.musicTimer, SIGNAL("timeout()"), decrementMusicVolume)
    #showInfo(mw.state)

def changeMusicVolume(change):
    "Changes volume according to string; can be either absolute ('40') or change ('2%-')."
    os.system('"nircmd.exe changesysvolume"'+ change) #CHANGEME somehow, if amixer doesn't work 

def boostMusicVolume():
    #showInfo("boosted") #To test changes, you can uncomment this line.
    os.system('"nircmd.exe changesysvolume 50000"') #CHANGEME somehow, if amixer doesn't work 
    #CHANGEME: Set to however high you want your volume to go each time it's boosted back.
    #Protip: your music-playing program might have its own "volume multiplier" that you can adjust easily.

def killMusicVolume():
    #showInfo("killed") #To test changes, you can uncomment this line.
    os.system('"nircmd.exe mutesysvolume 1"') #CHANGEME somehow, if amixer doesn't work 
    #CHANGEME: Set to how low volume should go when it dies, eg due to undoing a card.

def decrementMusicVolume():
    "When reviewing, decrements volume, then sets a timer to call itself. When not reviewing, kills volume and stops timer."
    if mw.state == "review":
        #showInfo("music volume goes down") #To test changes, you can uncomment this line.
        os.system('"nircmd.exe changesysvolume -5000"') #CHANGEME somehow, if amixer doesn't work 
        mw.musicTimer.start(mw.musicTimeToDecrement) #(start the timer again)
    else:
        killMusicVolume()
        mw.musicTimer = None #(kill the timer if you're not reviewing)

addHook("showQuestion", resetMusicTimer)
4

1 回答 1

0

似乎使用subprocess 模块而不是os.system可以解决您的问题。请参阅如何使用包含 os.system 调用的 .pyw 文件避免控制台窗口?以及当我使用 os.system() 或 subprocess.call() 时如何隐藏控制台?.

于 2014-09-03T20:59:37.533 回答