8
社区成员




源代码传奇开心果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()
这段代码实现了一个简单的成语接龙游戏,其中包括以下主要功能: