使用wxpython的子模块wx.lib.agw.aui实现的语音播报成语接龙小程序,IDE运行和调试通过

传奇开心果编程
Python领域优质创作者
2024-09-13 10:57:08

img

img

img

源代码传奇开心果IDE运行和调试通过


import wx
import wx.lib.agw.aui as aui
import pyttsx3
import random
import csv

# CSV文件路径
CSV_FILE = "idioms.csv"

# 读取成语列表
def load_idioms():
    idioms = []
    try:
        with open(CSV_FILE, mode='r', encoding='utf-8') as file:
            reader = csv.reader(file)
            for row in reader:
                idioms.append(row[0])
    except FileNotFoundError:
        idioms = []
    return idioms

# 保存成语列表
def save_idioms(idioms):
    with open(CSV_FILE, mode='w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        for idiom in idioms:
            writer.writerow([idiom])

class IdiomJielongApp(wx.App):
    def OnInit(self):
        self.frame = IdiomJielongFrame(None, title="成语接龙")
        self.frame.Show()
        return True

class IdiomJielongFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(IdiomJielongFrame, self).__init__(*args, **kw)

        self.InitUI()
        self.InitSpeech()
        self.InitIdiom()

    def InitUI(self):
        p = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)

        # 输入框
        self.input_ctrl = wx.TextCtrl(p, style=wx.TE_PROCESS_ENTER)
        self.input_ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnEnter)
        vbox.Add(self.input_ctrl, flag=wx.EXPAND | wx.ALL, border=10)

        # 输出框
        self.output_ctrl = wx.TextCtrl(p, style=wx.TE_MULTILINE | wx.TE_READONLY)
        vbox.Add(self.output_ctrl, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)

        p.SetSizer(vbox)

        self.mgr = aui.AuiManager()
        self.mgr.SetManagedWindow(self)
        self.mgr.AddPane(p, aui.AuiPaneInfo().CenterPane())

        # 添加 AUI 工具栏
        self.InitToolBar()

        self.mgr.Update()

        self.Centre()

        # 菜单栏
        self.CreateMenuBar()

    def InitToolBar(self):
        toolbar = self.CreateToolBar(style=aui.AUI_TB_DEFAULT_STYLE | aui.AUI_TB_OVERFLOW)
        
        # 添加重置按钮
        reset_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_TOOLBAR, (16, 16))
        reset_tool = toolbar.AddTool(wx.ID_ANY, "重置", reset_bmp, shortHelp="重置成语接龙")
        self.Bind(wx.EVT_TOOL, self.OnReset, reset_tool)

        # 添加关于按钮
        about_bmp = wx.ArtProvider.GetBitmap(wx.ART_HELP, wx.ART_TOOLBAR, (16, 16))
        about_tool = toolbar.AddTool(wx.ID_ANY, "关于", about_bmp, shortHelp="关于成语接龙")
        self.Bind(wx.EVT_TOOL, self.OnAbout, about_tool)

        # 添加退出按钮
        exit_bmp = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_TOOLBAR, (16, 16))
        exit_tool = toolbar.AddTool(wx.ID_ANY, "退出", exit_bmp, shortHelp="退出程序")
        self.Bind(wx.EVT_TOOL, self.OnExit, exit_tool)

        toolbar.Realize()

    def CreateMenuBar(self):
        menu_bar = wx.MenuBar()

        file_menu = wx.Menu()
        reset_item = file_menu.Append(wx.ID_ANY, "重置", "重置成语接龙")
        self.Bind(wx.EVT_MENU, self.OnReset, reset_item)
        exit_item = file_menu.Append(wx.ID_EXIT, "退出", "退出程序")
        self.Bind(wx.EVT_MENU, self.OnExit, exit_item)
        menu_bar.Append(file_menu, "文件")

        help_menu = wx.Menu()
        about_item = help_menu.Append(wx.ID_ABOUT, "关于", "关于成语接龙")
        self.Bind(wx.EVT_MENU, self.OnAbout, about_item)
        menu_bar.Append(help_menu, "帮助")

        self.SetMenuBar(menu_bar)

    def InitSpeech(self):
        self.engine = pyttsx3.init()

    def InitIdiom(self):
        self.idioms = load_idioms()
        self.current_idiom = ""
        if not self.idioms:
            self.output_ctrl.AppendText("成语列表为空,请输入第一个成语。\n")
        else:
            self.current_idiom = self.get_random_idiom()
            self.output_ctrl.AppendText(f"随机成语: {self.current_idiom}\n")
            self.speak(self.current_idiom)

    def OnEnter(self, event):
        input_idiom = self.input_ctrl.GetValue().strip()
        if input_idiom:
            self.output_ctrl.AppendText(f"输入成语: {input_idiom}\n")
            self.speak(input_idiom)  # 播报用户输入的成语
            if input_idiom not in self.idioms:
                self.idioms.append(input_idiom)
                save_idioms(self.idioms)  # 保存成语列表
                self.output_ctrl.AppendText(f"成语 '{input_idiom}' 已添加到列表中。\n")
            next_idiom = self.find_next_idiom(input_idiom)
            if next_idiom:
                self.output_ctrl.AppendText(f"接龙成语: {next_idiom}\n")
                self.current_idiom = next_idiom
                self.speak(next_idiom)
            else:
                self.output_ctrl.AppendText("没有找到合适的成语接龙。\n")
        self.input_ctrl.Clear()

    def OnReset(self, event):
        self.InitIdiom()

    def OnAbout(self, event):
        wx.MessageBox("这是一个成语接龙游戏。\n\n版本: 1.0\n作者: 传奇开心果", "语音播报成语接龙小程序", wx.OK | wx.ICON_INFORMATION)

    def OnExit(self, event):
        self.Close(True)

    def find_next_idiom(self, idiom):
        last_char = idiom[-1]
        for i in self.idioms:
            if i.startswith(last_char):
                return i
        return None

    def get_random_idiom(self):
        return random.choice(self.idioms)

    def speak(self, text):
        self.engine.say(text)
        self.engine.runAndWait()

if __name__ == "__main__":
    app = IdiomJielongApp()
    app.MainLoop()

这段代码实现了一个简单的成语接龙游戏,其中包括以下主要功能:

  1. 初始化与设置
    • CSV 文件读写:从 idioms.csv 文件中读取成语列表,并可以保存新的成语到该文件。
    • 初始化界面:使用 wxPython 库创建主窗口、输入框、输出框以及工具栏和菜单栏。
  2. 功能实现
    • 初始化成语:从 CSV 文件中加载成语列表,并随机选择一个成语作为初始成语。
    • 输入成语:用户可以在输入框中输入成语,程序会检查并处理输入。
    • 播报成语:使用 pyttsx3 库进行语音播报。
    • 重置功能:重新初始化成语列表和当前成语。
    • 关于信息:显示关于信息的对话框。 详细解释
...全文
121 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

8

社区成员

发帖
与我相关
我的任务
社区描述
软件开发那些事
软件工程需求分析团队开发 个人社区 甘肃省·酒泉市
社区管理员
  • 传奇开心果编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧