You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按钮异常:无法显示且无法执行Stepmania .sm文件箭头统计功能

Stepmania .sm文件箭头统计按钮修复方案

问题分析与修复步骤

  • 语法错误导致函数无法识别

    1. openSmFile()函数定义结束后未换行,直接拼接def checkDirections():,Python解析会报错,需在两个函数定义之间换行。
    2. def CheckDirections()缺少冒号:,且函数名大小写不一致:按钮绑定的是checkDirections(小写开头),但定义的是CheckDirections(大写开头),导致点击按钮时找不到对应函数,需统一函数名为checkDirections并补上冒号。
  • 按钮未添加到界面布局
    创建按钮后必须调用pack()/grid()/place()等布局方法,才能让按钮显示在窗口中,比如添加runThrough.pack()。

  • 文件资源未正确释放
    直接用open()打开文件后未关闭,建议使用with语句自动管理文件上下文,避免资源泄漏。

  • 箭头统计逻辑优化
    原代码中判断有效行的条件过于严苛,可能误过滤合法节拍行,调整为仅处理4位数字组成的节拍行(符合Stepmania标准节拍行格式)。

修正后的完整代码

import tkinter as tk
from tkinter import filedialog
import glob

root = tk.Tk()
root.title("Stepmania Arrow Counter")

def openSmFile():
    folPath = filedialog.askdirectory()
    return folPath

def checkDirections():
    folPath = openSmFile()
    if not folPath:  # 处理用户取消选择目录的情况
        return
    for fpath in glob.iglob(f'{folPath}/*'):
        if fpath.endswith('.sm'):
            left = 0
            down = 0
            up = 0
            right = 0
            beats = 0

            with open(fpath, "r", encoding='utf-8') as file:  # 自动关闭文件
                lines = file.readlines()

            for line in lines:
                line = line.strip()
                # 仅处理4位数字的节拍行
                if len(line) == 4 and line.isdigit():
                    beats += 1
                    for i, alpha in enumerate(line):
                        if alpha != "0":
                            if i == 0:
                                left += 1
                            elif i == 1:
                                down += 1
                            elif i == 2:
                                up += 1
                            elif i == 3:
                                right += 1

            print(f"歌曲文件:{fpath}")
            print(f"左箭头数量:{left}")
            print(f"下箭头数量:{down}")
            print(f"上箭头数量:{up}")
            print(f"右箭头数量:{right}")
            print(f"总节拍数:{beats}\n")

# 创建按钮并添加布局
runThrough = tk.Button(root, padx=50, pady=50, text="点击统计各类箭头数量", command=checkDirections)
runThrough.pack()

root.mainloop()

额外说明

  • 补充了root = tk.Tk()和root.mainloop(),确保Tkinter窗口正常启动(原代码缺失核心窗口逻辑)。
  • 新增用户取消选择目录的判断,避免后续代码报错。
  • 使用enumerate()简化索引遍历,代码更简洁。
  • 指定utf-8编码读取文件,避免不同编码的.sm文件出现乱码。

内容的提问来源于stack exchange,提问作者user19642567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:03:22