今天无聊在玩一个老游戏《铁血联盟2》1.13版,然后突然想起多年前自己因为不懂 Windows 软件开发,于是用 PHP 做成一个 xml 文件自动替换内容的工具网页,虽然完美实现了功能,但是要运行网站环境,不方便啊,于是突发奇想为何不让 AI 用 Python 做一个这样的工具软件呢?
我完全不懂 Python,连 Hello world 我都没尝试过,所以直接靠嘴了,一开始用 Claude 3.5,虽然一下子就生成可简单使用的,但随着不断地调试,越调越多问题,搞得我放弃,为了省钱,然后尝试 DeepSeek,结果它胸有成竹地实现了初步代码,竟然连文件读取都没过关,放弃,然后就又转到 GPT 4o,也是一开始不错,后面就越菜越乱,导致我发狂:
使用 Python 3.8.10 + Tkinter 实现下面的功能的完整代码,系统是 Windows 10:
功能说明:
读取 2 个 xml 文件,例如 ItemsA.xml 和 ItemsB.xml,里面的内容结构是这样……为了实现这个功能,我们需要使用 Python 的 tkinter 库来创建 GUI,使用 xml.etree.ElementTree 库来处理 XML 数据,并且使用 os 和 shutil 等库来处理文件和目录操作。以下是实现这个功能的完整代码。
问题:
没有展开所选目录的文件夹和文件列表供我选择
设置中“匹配键”默认是uiIndex,而修改键不是固定5个的,但默认是'szItemName,szLongItemName,szItemDesc,szBRName,szBRDesc',完全可以通过这种逗号分隔来实现设置。而且我要每次设置可以保存为单独的配置记忆,然后可以下拉选择哪个配置并读取,默认读取最后的配置。为了满足您的新需求,我们需要对程序做一些调整。
两个列表没有分配好,导致目标目录我无法很好地选择文件导致我无法测试,两个列表应该是同宽度,其实可以生成比较好看的界面,我描述下:
上面分栏,左边是源目录,选择框下面就是列表框,右边是目标目录,也是选择框下面就显示列表框
然后单独一栏执行替换按钮
接着是设置区:输出目录、匹配键、替换字段、配置管理为了满足您对于用户界面的要求,我们可以使用 tkinter 的 Frame 组件来组织界面布局,使其更美观和易于操作。我们将使用 grid 布局管理器来安排各个组件的位置,从而实现您描述的布局。以下是更新后的代码。
执行后没生成替换好的新文件,处理这个以前,先把下面这几个要求搞好:
源文件选择后高亮,目标文件选择后也要高亮,现在是选了源文件再选目标文件源文件就不高亮了
配置文件能自定义名称,而且可以在保存了后更名保存新的,这样方便
前面2个搞好了你再检查下为何执行后没有生成新文件保存到指定目录好的,我们将逐步实现这几个要求。
现在很搞笑:
执行替换后,弹出保存配置,然后又提示我选择一个源文件
选择源文件后那个文件就高亮,然后选择目标文件也同样高亮,要同时高亮我才知道选择了,现在根本没办法知道是否选择了,然后我两边都选择后点执行替换,还是提示我要选择源文件……为了修正这些问题,我们需要对代码的逻辑进行一些调整。以下是改善的计划。
现在正常工作了,需要优化:
点选两边文件应该都高亮,或者其他方式提示已选择哪个文件,而不是点了左边源文件高亮,点右边目标文件后源文件就不高梁了
能有个默认窗口大小,就 1024x768吧,然后能记住窗体大小,下次就用上次的感谢您的耐心和反馈,我理解您的需求,并且很抱歉之前给您带来的不便。我们将确保以下几点优化。
2个问题:
1)你还是没有实现我说的选择了源文件、目标文件都要高亮的需求
2)配置管理,有多个配置管理应该是下次启动后要继续读取上次的那个配置抱歉之前的理解和实现没有完全满足您的需求。对于第一个问题,选择了源文件和目标文件都要保持高亮显示是可以实现的。我们可以通过在两个
Listbox
中分别保持选中状态来实现这一点。既然可以实现,那么你把 1)和 2)都解决好后给我代码
好的,我们将解决以下两个问题。
点了源文件再点目标文件,卡死了,你先自己分析一下问题,但不要立即贴代码解决,我给你上一个版本代码后,你继续在那个版本的代码上修改我要的需求,我怕你越犯越多错误,因为我就是遇到过了。
好的,我来分析一下之前代码中可能导致卡死的问题。
你在下面这个版本代码上改:
1)源文件列表点选后文件高亮,在保持高亮的同时点右边目标文件列表的文件后也高亮
2)配置文件:如果有多个配置,要记住上次的配置,启动时调用上次的那个配置好的,我将在您提供的代码基础上进行修改,以实现以下两个需求:
源文件和目标文件同时保持高亮:在选择源文件和目标文件时,确保两者都保持高亮。
记住并加载上次使用的配置:在程序启动时,默认加载上次使用的配置。你看,点了源文件列表文件就无法点击右边的目标文件,还卡死了,变成“未响应”了
抱歉给您带来不便。根据您的描述,可能的原因是事件处理逻辑中存在循环或者阻塞。我们需要确保在处理一个列表的选择事件时,不要直接或间接触发另一个选择事件。
一开始你就要解决啊,前面我都跟你说过了有这样的错误,又浪费了我的钱,Orz
抱歉给您带来了困扰,我会尽快解决这个问题。
看来你是实现不了了
抱歉给您带来了困扰。让我重新分析一下,确保问题得到解决。
现在还是选择无法同是高亮,很难么?我怎么觉得这个应该很容易的啊
抱歉给您带来了困扰。为了解决源文件和目标文件同时高亮的问题,我们需要确保在选择一个列表中的文件时,不会影响到另一个列表的选择状态。
哈哈,还是一样只能单独高亮,看来你实现不了,你先不要输出代码,你说你有把握吗?跟你聊天太贵
非常抱歉之前的尝试没有解决问题。这次我会详细解释解决方案,而不是直接提供代码。
算了,不试了,如果我会就不用问你了。换个方式:
在两个列表下面分别加一行,用来显示当前选择的文件路径好的,您可以在每个列表的下方添加一个
Label
来显示当前选定的文件路径。这将帮助用户明确知道他们在源列表和目标列表中选择了哪些文件。把设置那些都搞没了……真的是越改越不靠谱。我吐槽而已,你不要急着改。
感谢您的反馈,我明白了您的期望。为了确保我们在添加功能的同时不丢失原有的配置和功能,我将详细说明如何在现有框架中增加显示当前选择文件路径的功能,同时保留所有设置和配置功能。
算是实现了,但下面的label会影响窗口大小,估计是长度影响了
为了避免标签文本过长影响窗口大小,我们可以通过以下方法来处理这个问题。
这样感觉不够明确,因为有些目录有同名文件,label无法自动换行?或者用其他组件
为了更明确地显示完整路径而不影响窗口大小,可以使用以下几种方法。
接下来把:输出目录、匹配键、替换字段、配置管理input框加长,现在太窄了,而且输出目录需要有个按钮打开选择目录
当然,我们可以通过调整这些输入框的宽度以及为输出目录添加一个目录选择按钮来改善用户界面。
继续增加功能:
选择源目录的列表里面我点选了某个文件,例如T:/dev_cn_xml_change[6088175]\Data-1.13\TableData\Items\Chinese.Items.xml,说明选择的文件是 Chinese.Items.xml,那么如果有 Chinese. 的去掉这个前缀,即文件名就是Items.xml,那么去配置管理那里查找匹配的名称,例如配置里面有个 Items\Items.xml,那么就算配置对了,然后自动加载这个配置,如果匹配到多个同名文件,那么匹配第一个即可。要实现这个功能,我们需要在选择源文件时,通过其文件名来自动匹配并加载配置。
ok,继续加功能:
如果我源目录点选了文件,那么能否实现右边目标目录匹配相同目录的文件?但是注意源文件的 Chinese. 开头的要去掉来匹配。例如源文件目录是……要实现这个功能,我们需要在选择源文件时,通过去掉文件名前缀
Chinese.
来构建对应的目标文件路径,然后在目标目录中查找并选择该文件。继续增加功能:
在执行替换旁边增加一个按钮“全部替换”,这个按钮的功能是:自动把源目录列表里面的文件逐个选择,右边匹配同目录同名文件,然后匹配配置管理同名配置,然后就执行替换。如果源目录文件没匹配到目标目录文件,又或者没匹配到配置管理的配置,那么只记录不执行替换操作,最后全部执行完后弹出提示未执行的文件列表。为了实现“全部替换”的功能,我们可以按照以下步骤来设计和实现。
1)批量处理就不要弹出保存确定提示了,或者弹出提示一次批量保存的目录即可,后续的处理不用弹出保存确定。
2)如果“源目录文件没匹配到目标目录文件”,或者“根据源目录文件没匹配到配置管理相对应的配置”,那么就不要执行替换和保存,只记录什么原因没执行,直接跳过执行下一个文件,最后批量处理完弹出提示:没有任何错误就提示“全部替换完毕”,有没有匹配情况就显示出所有没有匹配成功的文件和原因。要实现这些功能,我们需要对代码进行如下调整。
测试结果是:没有对应配置的文件你也执行了保存操作
感谢你的反馈。为了确保在批量处理时,对于没有匹配到配置的文件不会执行替换和保存操作,我们需要在
execute_all_replacements
方法中进行更严格的检查。还是全部都执行替换和保存。你是不是没理解对?
你只要把“执行替换”的操作按批量处理,不知道是不是中文表达问题,简单来说:
1)按顺序先检查源文件跟目标文件是否相同目录和文件名(注意别忘了处理Chinese.头),没匹配到就只记录不再继续执行替换和保存,处理下一个文件
2)如果 1)中匹配到,那么就继续匹配是否有对应同名配置,没有也只记录不再继续执行替换和保存,处理下一个文件感谢你的耐心解释,我理解了你的需求。下面是我们要实现的功能。
还是全部执行了,估计你搞不了了,都那么多次了,无法实现你就明确说,我又不懂。
很抱歉之前的实现没有达到预期效果。让我们逐步检查问题并确保代码按要求工作。
source_items = {item.find(match_key).text: item for item in source_root.findall('ITEM')}
File "ja2_113_xml_merge_tool.py", line 284, in <dictcomp>
source_items = {item.find(match_key).text: item for item in source_root.findall('ITEM')}
AttributeError: 'NoneType' object has no attribute 'text'这个错误表明在某些情况下,
item.find(match_key)
返回了None
,导致None.text
引发了AttributeError
。这可能是因为源 XML 文件中,有某些ITEM
元素缺少match_key
指定的子元素。请把修正的代码贴出来,我不懂的
当然可以,请参考以下修正后的完整代码。
现在没匹配成功的终于没执行替换和保存操作了,但是从保存的文件来看,匹配到的文件没真正执行替换
如果匹配到的文件没有执行替换操作,我们需要检查以下几个方面……
匹配到的3个文件:
Source Items Keys: dict_keys([])
Source Items Keys: dict_keys([])
Source Items Keys: dict_keys([])如果
Source Items Keys
打印为空,这意味着在源文件中没有找到任何ITEM
元素包含匹配键match_key
。这可能是由于以下原因。一样,输出空,调试还是输出这个
如果
Source Items Keys
仍然为空,并且打印的ITEM
元素输出为空或不包含预期内容,可能意味着……你把整个函数贴出来,我怕改错了
当然可以,我会把整个
replace_content
函数贴出来,并添加命名空间处理的相关代码。从debug输出来看,有内容,我贴一部分给你看,但是生成的新文件没有进行替换
根据您提供的信息,似乎
Source Items Keys
仍然是空的,即使ITEM
元素被正确打印出来。这表明可能存在以下几个问题。还是一样,我让你解决问题,而且整个问题是因为增加功能而出现的新问题,还没增加批处理时的前几个版本都是正常工作的。不要依赖我来检查,我懂就不需要你来帮忙。xml结构每个文件不同,不然要通过匹配键和替换字段干嘛?有些是这样的……
感谢您提供的详细信息。在处理多种结构的 XML 文件时,我们需要确保代码能够适应不同的 XML 结构。
你不要给我示例,我要你帮我完成,而且你一旦犯错,就一直让我“确保”这“确保”那,这是很不负责任的保险,既然你有丰富的知识体系,在处理代码时要非常严谨,不能用“确保”这种让容易犯错的人类来帮你确定。
我理解您的期望,下面是一个经过详细考虑和调整的完整代码示例,旨在正确处理不同的 XML 结构并执行批处理替换操作。
刚才给你xml样例结构,有一个执行了替换,另外一个没有,是不是这部分替换的处理不够好?难道要每种xml结构都要给你样例?非常没有效率,不能通过匹配键匹配,然后在同级以及子级查找匹配的字段进行替换?我用php自己都能实现。
理解您的需求后,我们可以调整代码,以便在 XML 文件中匹配键后,能在同级和子级结构中查找并替换字段,而不需要手动指定元素标签。
果然ai都是越改越犯容易犯错误,现在竟然单个文件执行都不能替换了
抱歉给您带来了困扰。我们来一步步确认问题并修正代码,以确保它能够正确替换内容。
我发现你修改后的错误了,是因为切换配置时,没有读取配置的值,还是原来的
谢谢您指出这个问题。为了确保在切换配置时能正确读取新的配置值,您需要确保在每次执行替换操作时都从配置中获取最新的值。
还是不会保存,你还是读取全部代码来处理,免得你在钻牛角尖,浪费我的时间
感谢您提供完整的代码。我已仔细查看并找到了您遇到的问题。
根本就没效果,选择切换也不会读取,麻烦你认真检查全部细节,这里面有很多功能是相关的,感觉你改到现在你都忘了你改了啥。我让你记起来:
1)建议先检查配置文件的保存、选择后读取功能是否正常,配置管理是可以手动选择:是有下拉选择的,当我选择配置时就切换配置的值,这里搞定了才去处理 2)
2)当通过源目录列表点选文件后,根据整个文件目录和名称(注意xml文件名要去掉 Chinese. 头),自动匹配有没有一样名称的配置并读取配置,然后还要自动匹配目标目录同目录同名文件:这里自动匹配目标文件功能没有问题,问题就是匹配到的配置文件没有读取配置感谢您的详细反馈。让我来一步步检查并修正代码,以确保配置文件的保存和读取功能正常工作。
我不跟你确保什么东东,我让你完全解决问题,你不用再跟我说“让我去确保”什么,我说过了,我不懂python,是让你帮我完成全部工作
抱歉给您带来了不便。我会重新检查并修正代码,以确保配置文件的保存、选择后读取,以及自动匹配配置和目标文件的功能都能正常工作。
现在单一方式正常工作了,那么接下来要解决全部替换的批量方式,目前批量方式是:能正常根据“源文件匹配目标文件 + 源文件是否有匹配的配置”来判断是否执行替换和保存,但匹配好的文件没有真正进行替换工作,估计是批处理处理时,匹配到配置时没读取配置就进行替换处理,请认真检查,不要再让我“确保”,你就用你最厉害最严谨的方式实现我要的功能
了解您的需求。我们需要确保在批量替换时,正确加载匹配的配置,然后执行替换操作并保存文件。
好像搞定了,撒花,奖个鸡腿给你
谢谢您的认可!很高兴能帮到您。如果您还有其他问题或者需要进一步的帮助,随时可以告诉我。祝您工作顺利,项目成功!🍗🌸
虽然我这种依赖 AI 开发的交流方式应该是不对的,但我也不懂具体怎样才是姿势正确。发现 AI 总是会断层,例如前面自己搞好的,改到后面好像忘记了改错都不知道……
我发现我太把 AI 当人看了,哈哈哈
转载请注明转自: 《完全不懂让 AI 帮忙制作工具软件,体验了最搞笑的方式》