|
本帖最后由 kkndbdra@tj 于 2019-9-2 22:58 编辑
融合zmud和mush风格制作的一个客户端,既可以写zmud风格机器人,也可以写mush 风格脚本,或者混合使用。请大家多多支持!
编程语言 python 3
游戏自带python 3.7.3解释器
版本更新:2.2
修正了一些底层触发器的相互覆盖的BUG.
新增了一个自建别名的函数 make_cmds(cmds)
改变了变量存储方式,长久变量需要保存在 self.lscope 里,取值 :/self.lscope["hero_id",存值:/self.lscope["hero_id"]=ABCDE
匹配的结果现在存在slef.OUTCOMES 变量里 例子:@x=self.OUTCOMES.group(1)
改进了# 悬浮选择框
slot_gbox_checks_create(group_number,title_str,boxs_list,)
现在可以绑定一组指令当zmud4.62的按钮用
版本更新:2.00
内建函数全部完工
自定义标签页以完成
自定义悬浮框以完成
以及其他自定义窗口
加入了判断 断线,发呆的函数。可以发呆,断线,重连
修复了一些引起占用CPU过高的BUG。减小了文件体积
LL版2.0内置浏览器,正式完工。可以保存网页中的图片,用鼠标右键。
[调用打开网址的函数:/WD.open_url_tab("http://www.163.com") 大家可以在登陆游戏后直接在命令行里试一试。(LL版本有效)
evermudLL版本文件超过了论坛限制, 请去百度盘下载地址:https://pan.baidu.com/s/1BYeYNcbNnrld_OTNby5bAw
关于 mush lua公版机器人的使用:
思路一:lua和python的语法非常接近,有些关键字都是一样的,书写缩进格式也差不多相同,简单替换一些语句应该就可以拿来用。但是修改工程量较大。
思路二:使用subprocess模块通过shell调用lua脚本的函数,这个应该可行。
思路三:大家合力重新编写一个python 版的自动寻路模块。其他的模块单独编写应该不难。
python 的第三方库比lua多很多,有很多功能用python很容易完成。
原来lua的脚本函数可以作为子程序调用。利用subprocess模块(已内置) 实用函数subprocess.Popen()
运行环境:
理论上windows 64位的版本都行(32位的版本暂时还没有编译)
点击evermud.exe进入程序
LL版本点击evermudll.exe 进入程序
角色设置里的几个英文按钮 暂时没有做好,需要捆绑数据库模型,比较麻烦暂时就不做了。
mush里面其实大家也没怎么用过,用内置函数是一样的,不影响使用和挂机。
保留了控制台用于观测错误信息,输出一些有用的信息。
大家多测试一下,看看在云主机上能不能挂机。
以及有什么死机报错的信息大家多多反馈,谢谢啦!
简要说明: 之前写的太复杂,现在一切从简。
你可以把evermud 看作 zmud4.62 可编程加强版 两者指令输入格式一摸一样的。
你唯一要做的就是用evermud内建函数代替 zmud的# 指令(内建函数在文章最后,随版本更新)
例如:
zmud 输入指令格式: buy doufu;#wait 5000;eat doufu
evermud 输入指令格式: buy doufu;/ti.sleep(5);eat doufu
zmud 输入指令格式: ABCDE;#wait 1000;A12345 --输入账号和密码
evermud 输入指令格式: ABCDE;/ti.sleep(1);A12345 --输入账号和密码
是不是很简单?
给变量赋值,变量解值,函数调用变量:
1 快捷写法:@给变量赋值,/为变量解值 作为字符串直接发送给服务器
@myid="ABCDE";@password="A12345";/myid;/ti.sleep(2);/password
2 函数式中级写法:
@myid="ABCDE";@password="A12345";/WD.send_str(myid);/ti.sleep(2);/WD.send_str(password)
3外部脚本式写法
如果你要编写异常复杂的脚本并导入,这个就没办法了,必须要懂一门任意编程语言编写自定义函数,并且阅读后面的详细说明。
例子:@area="大理";@person="朱丹臣";@target=(area,person);/go(target) -----其中go()是你自定义的函数,你需要自行定义或者从外部脚本导入它。
1 如何登陆?
方法一:点击坐上角的新建文档,填写一个文档名称和IP地址,端口,IP地址直接写数字,(不要填英文网址,网址解析器没有做好。)
快捷方法二:
游戏目录里有一个 account\\sample 文件夹,config.ini里面贮存的是一个模板账号信息和 triggers.text是一个简单的模板登录机器人。
直接在account 文件夹里复制 sample 文件夹然后重命名(例如aaaaaa)。(不要使用中文,用英文小写)
修改config,ini如下内容:
account= aaaaaa(与文件夹同名)
hero_id= 你的登录ID
password= 你的登录密码
然后 点载入文档 就会自动连接了。
如何使用机器人?
和ZMUD4.62 类似的,原理都差不多。想偷懒的话可以去抄zmud4.62的机器人。
然后用/函数 代替 #指令 ,例如/ti.sleep(5);buy doufu 等价于#wait 5000;buy doufu.你只需要到最后的托管函数列表里面找相同或者类似函数代替zmud的指令就行。
点击 脚本/扩展 菜单里的 python扩展 按钮 选择 account\\sample 文件夹中的triggers.txt 导入,成功后会在控制台中看见导入结果。
如果你想像mush一样用脚本编写复杂程序 请阅读详细说明里的内容。
几个触发器的标准写法:其实就是一个简单的自动登录机器人
注意单引号和双引号配合使用,你外层使用的单,内层就要用双,反之亦然。要不然就要使用转义字符\.例如\n,\",\'
{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'} --reply 里存的是触发器反馈的指令,n 是字符串,没有使用解析符直接发送给服务器。
{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'} --/hero_id 作为变量解析,/是解析符号,调用hero_id这个变量的值。 /ti.sleep(5) 执行 ti.sleep(5)并返回其结果发送,这里结果是None(空),只是等待时间5秒。
{'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'请您输入这个人物的识别密码\(passwd\):', 'reply': '/password;jump'}--/password 同上,jump 没有解析符,作为字符串发送。 如果你想在游戏中给password 变量赋值111222可以在reply的指令集 最前面前面加一句@password=111222;
@是赋值解析符。
'pattern': r'您的英文名字\(ID\)是:' 匹配模板 后面的r 不要忘记写了,代表原生字符串,避免python二次转义。
经典问题:
找顾炎武学习x次 怎么写reply?
'reply':'@x=10;/WD.send_str("xue gu {}".format(x))' 用python格式化字符串可以在字符串中调用变量.也可以使用python 占位符写法(老式风格),请百度 python格式化字符串。实际上@后面允许写paython的正是语句,例如@if gold<100:return x=0;多长都可以,如果你不嫌麻烦。
如果你先导入机器人后读取ini文件,而且config.ini里面预存了你的账号信息,就会完成自动登录。
遇到疑难难题请发送回复,我会在后面跟帖。
***************************************************************************************************************************************************************************************************************************************************
ini的内容
[default] # 存的一些基本设置
account = sample
font_family = Arial
font_size = 10
foregcolor = #005500
bkcolor = #000000
host = 43.243.129.43
port = 5555
maxblocks = 5000
[variables] # 存的初始变量值 可以自行添加一些初始变量 例如 xue=50 (******变量名全部小写,python 的 config模块自身有点问题,ini存的都是小写,在游戏内你可以使用大写变量名)
hero_id = abcd
password = A12345
注意:命名的变量不要和游戏内置变量或者python内置的关键字重合
如何创建触发器?
直接用文本编辑器写成 txt文件。(其实就是python的字典格式)
或者在脚本里用户函数动态生成,导入。
一般都是写几个初始触发器,然后后期用脚本动态生成。
如果你不会写脚本,可以跟zmud一样,全部前期写好,然后开关某一类,进行调配。
如何导入触发器文件?
account\\sample 文件夹里面还有一个triggers.txt 存的是初始触发器列表样板,和原来的mush格式差不多。
导入初始触发器:点击 脚本/扩展里的 pythonextened 按钮 选择 sample 中的triggers.txt 导入成功后会在命令行中看见导入结果。
可以先读取触发器再读取ini文件,完成自动登录
用内置函数也可以导入。
触发器参数说明:
正则表达式用的是python的 re模块
例子:{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'}
'root': 'unknown' 就是原来ZMUD和mush里面的group 用来给触发器分组
'flags':0 就是re.searh(),re.findall()等函数里面的flag参数 作为表达式修饰符
注意 flags 的值是整数 而不是字符串,是0而不是”0“ 别搞错了
正则表达式—修饰符
正则表达式可以包含一些标志修饰符来控制匹配模式,用在正则表达式处理函数中的flag参数中,为可选参数。
(1) re.I 全写(re.IGNORECASE)
表示使匹配时,忽略大小
(2) re.M 全写(re.MULTILINE)
多行匹配,影响 ^ 和 $的行为
(3) re.S 全写(re.DOTALL)
使点(.)匹配包括换行在内的所有字符
(4) re.X 全写(re.VERBOSE)
这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
(5) 除以上标志外还有re.L和re.U,但不常用
(6) 可以通过使用运算符“|“来指定多个标志,表示同时生效。
如: re.I | re.M被设置成I和M标志,
content = 'My username is zeke999!'
re.search(r'zeke\d{3}', content, re.I | re.M)
常用的参数是re.M 多行匹配 这个影响正则表式的写法。(更多了解请百度 多行匹配)其实服务器发来的消息都可以看作一个带换行符的长句,可以视作单行处理。
需要使用^顶格匹配,排除其他人说同样语句的时候经常用.建议把默认值设为re.M(是一个变量,不是字符串,不用加引号),这样可以照搬mush的正则表达式写法,符合大家原有习惯。mush的多行匹配好像默认是打开的。
open=‘0’或者‘1’ 触发器分组开关,这个好理解吧和mush一样。
times='0' or '1' 匹配一次 和匹配多次 这个有必要强调一下。 有的时候你不确定一个字符模板会在 一段话里出现多少次,例如 查看你学了多少技能,(xxxx=yyyyy级)这个模板出现的次数不固定,也许有5个技能,也许有10个技能,这个时候你可以设置为‘1’。
times=‘0’使用的是re.search() 只匹配第一次出现的位置。
times='1' 使用的是re.finditer() 匹配多次,注意是匹配多次得到多个结果的列表,不是多行匹配,别搞混了。
'exe_as': '0' reply的内容混合模式发送,基本上用这个就够了.
解析符@代表字符串作为python语句执行。 一般用来给变量赋值,写单行的if,for in 语句也没问题. 很实用。 友情提示:不要在触发器里再去定义使用全局变量的函数,也许会有一些作用域的问题。尽量在自定义函数模块中定义好。
解析符/代表字符串作为python表达式(必须有返回值)执行,一般用作执行函数,变量直接取值。如果你什么都不加就作为mud指令直接发送。
'exe_as': '1' 作为纯python语句执行,如果你对python 很熟悉 可以使用这个模式,不提倡。判断变量的访问域有难度。
'pattern': r'您的英文名字\(ID\)是:' 这个不用说了吧,匹配模板。 注意在所有的匹配字符串开头要加r作为原生字符串执行 ,如果你不加会出现python解释器会出现二次转义,例如 \\d 等价于 r'\d'.请务必加上r,不要自寻烦恼。
几个触发器的标准写法:其实就是一个简单的自动登录机器人
注意单引号和双引号配合使用,你外层使用的单,内层就要用双,反之亦然。要不然就要使用转义字符\.例如\n,\",\'
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'Are you using BIG5 font(y/N)?', 'reply': 'n'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'请您输入这个人物的识别密码\(passwd\):', 'reply': '/password;@welcome= "欢迎进入";/ti.sleep(5);/WD.send_str("say {}{}".format(hero_id,welcome));jump'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'>*\s*你高兴地跳了起来。', 'reply': '@cmd_list=["1","2","3","4","5","上山打老虎!"];@for item in cmd_list:WD.show_note(item);/ti.sleep(5);say 测试成功!'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '1', 'pattern': r'>*\s*你说道:「测试成功!」', 'reply': 'way="n"\nWD.send_str("say 向北走一步")\nWD.send_str(way)\nWD.send_str("say 下面开始抓取子串!")'}
{'root': 'unknown', 'flags': 0, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'>*\s*你说道:「(下面开始)抓取子串!」', 'reply': '@x1=matchs.group(1);@WD.send_str("say 抓取的子串为:{}".format(x1))'}
正则表达式抓取子串
import re
#系统把所有抓取的字符串结果都在 matchs(小写)这个隐藏局部变量里 请注意避开给matchs命名重名变量,只读不写!!!
matchs=re.search("([0-9]*)([a-z]*)([0-9]*)",a)
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
x1=matchs.gruop(0)
x2=matchs.gruop(1)
x3=matchs.gruop(2)
x4=matchs.gruop(3)
关于内置函数:
绝大部分全部托管在WD实例中(大小写敏感) 相当于mush中的 world.xxxx
python time模块的方法托管在ti实例中(大小写敏感)
怎么样使用?
例子:
/WD.send_str("say 下面开始抓取子串!")
#结果 你说道:「下面开始抓取子串!」
从ZMUD中消失多年的#wait 又回来了 /ti.sleep(5)=#wa 5000
大家可以在指令输入框中试一试:(必须进入游戏后)
/ti.sleep(5);n; say 大家好!;jump;/WD.send_str("buy doufu")/ti.sleep(1);eat doufu;
弹出一些窗口
/WD.get_item_dialog("测试列表框",("1","2","3"),"x"); # 非阻塞输入模式
输入完成后输入
/WD.show_note(x)
/WD.get_text_dialog("测试文本框",“请输入您的ID:”,"myid"); # 非阻塞输入模式
完成后输入
/WD.show_note(myid)
对于触发器,变量的动态增删查改,内置函数具体定义,请查阅最后的内置函数列表:
大型机器人需要大量的自定义函数怎么办?。这个也没有问题.
关于导入外部自定义py模块:
请使用 WD.imp_mode(self,obj_str, name_str, package_str=None):
参数说明: obj_str = 动态生成的变量 用来贮存导入的模块对象
name_str= 模块名称
package =包名称(只有你的模块具有包结构的时候才填写)
例子:
params = importlib.import_module('b.c.c') #绝对导入
params_ = importlib.import_module('.c.c',package='b') #相对导入
导入外部模块的中的函数定义后 就可以在游戏中当作本地函数使用了
例如:
/WD.imp_mode('test','test4')
内部过程:test= importlib.import_module('test4')
自定义的test4模块导入完成后内部便多了test模块,可以直接使用内部托管的函数 speak()
/test.speak(WD)
自定义函数需要注意的地方:
和mush中的自定义函数需要预留(n,l,w)三个参数一样以便接收游戏内的变量
如果你的自定义函数里需要调用WD或者其他实例内的函数,请预留一个实例形参,如果你需要处理抓取的字符串请预留matchs的形参位置。
例子:自定函数speak()需要调用WD中的方法:
def speak(wd):
wd = wd # 接收主程序中的WD实例传参以便调用
wd.send_str('say 测试外部模块')
如果你不会python,?只会lua,js,c++其他语言?还想借用shell 执行外部exe程序,全自动搜索路径?
请使用游戏内置的subprocess模块调用外部子进程。进程间的通信,传值较复杂,具体教程请自行百度。
子进程常用方法 subprocess.Popen()
子线程:threading 模块(游戏内部内置)
***************************************************************************************************************************************************************************************************************************************************
/ 解析符 解析有返回值的表达式(主要用于函数),并将返回值直接作为字符串指令发送给服务器,不能解析无返回值的语句 ,例如/if x>0:x=x+1 没有返回值 不能解析。
假如: x=5 那么 /x就是合法的写法 ,返回x的值5。自动向服务器发送str(5),return none 视为 发送 “None"
@ 解析符 既可以解析语句,也可以解析表达式,但是不会向服务器自动发送返回值作为指令。你需要调用函数来发送。 推荐使用短语句,长语句干脆直接自定义一个函数。
@if gold>500:xue_guyanwu(50) (推荐单句写法,合法但是python不提倡)
@if gold>500\n xue_guyanwu(50) (正常的python语句写法,但是很繁琐,还要4个空格的缩进,咱不提倡,还不如自定义一个函数)
如果你还是不了解,请百度 表达式与语句的区别
# 查看当前模块导入路径
check_mode_imp_path()
# 添加模块导入路径函数
append_mode_path(path)
参数说明:path 你要添加的模块导入路径 例如: c:\\windows\\system
# print()没有返回值不能作为/函数解析,做一个有返回值的替代品函数
p_print(c_vars)
参数说明:c_vars 需要打印的变量
# 发送类指令
# 发送单条字符串
send_str(anystring)
参数说明:这是最常用的函数。向服务器发送一个字符串
例子:/WD.send_str("buy doufu")
ti.sleep()
函数说明:#wait 的替代品,等待若干秒,/ti.sleep(5) == #wait 5000
/WD.send_str("buy doufu");/ti.sleep(5);//WD.send_str("eat doufu");
# 发送字符串列表,元组,可迭代对象
send_strs(string_list):
函数说明:
硬写: /WD.send_strs(("w","n","s","e"))
写法二: @str_list=("w","n","s","e");/WD.send_strs(str_list)
# 发送提示信息到主窗口
show_note(self, note_string)
函数说明:
/WD.show_note("护镖任务顺利完成!用时1分钟!")
注意:提示消息不参与触发器的匹配。
函数式写法:@note="护镖任务顺利完成!用时1分钟!";/WD.show_note(note)
# 创建一条新触发器条目
函数说明: 直接定义一个python 字典 非常简单
@newrigger1={'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'}
如果你熟悉json格式使用json格式的字典用json模块转换成python 字典也行
# 添加一条触发器条目
append_trigger(self, new_trigger):
函数说明:往触发器列表末尾里添加一条条目
指令式写法:/WD.append_trigger({'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'})
函数式写法:@newtrigger={'root': 'unknown', 'flags': re.M, 'open': '1', 'times': '0', 'exe_as': '0', 'pattern': r'您的英文名字\(ID\)是:', 'reply': '/ti.sleep(1);/hero_id'};
/WD.append_trigger(newtrigger)
# 添加一组触发器列表
extend_triggers(new_trigger_list):
函数说明:同上,可以直接添加一整个list,一般用于添加某一组tiggers
@newtrigger_list=[trigger1,trigger2,tigger3];/WD.append_trigger(newtrigger_list)
clear_all_triggers():
函数说明: 清空所有触发器
# 移除某一组触发器
remove_triggers( str_root):
函数说明:
/remove_triggers("wudangjob")
或者
@root1="wudangjob";/remove_triggers(root1)
# 关闭某一组触发器
close_triggers(str_root):
函数说明: 同上
@root1="wudangjob";/close_triggers(root1)
# 开启某一组触发器
open_triggers(str_root):
函数说明: 同上
read_triggers(path):
函数说明:直接从外界读取触发器文件(未完工)
可以直接用python 的with open代替
仔细想了一下,大部分触发器都是动态生成的,也没有必要限制读取格式,可以直接用python 的with open()或者自定义函数代替。
@with open('E:\python\python\gbk.txt', 'r', encoding='gbk', errors='ignore') as file; @file.read()
(我不确定file.read()有没有返回值,如果有返回值的话,也许用/file.read()也行,但是没有必要,你并没有想向服务发送函数返回的结果)
这样就把txt文件里所有类容都读取了,存在file变量里。(with open的更多用法请百度)
# 设置一个局部变量值
# 将抓取的子串值赋值给一个变量
setlocale_var(key_str, index, matchs):
函数说明:/setlocale_var("exp", 1, matchs)
触发器匹配的结果都贮存在maths对象里。
内部过程: exp=matchs.group(1)
如果你抓取到的子串 1为: "经验值:xxxx"
那么 exp="经验值:xxxx"
快捷写法: @exp=matchs.group(1)
# 设置多个局部变量
setlocale_vars(self, key_tuple, index_tuple, matchs)
函数说明: 同上
setlocale_vars(("exp","gold"), (1,2), matchs)
等价于@exp=matchs.group(1);@gold=matchs.group(2)
# 移除一个局部变量并返回其值
pop_var(key):
函数说明:
/pop_var("name")
其中name="abc"
你删除了name变量,并将其值"abc"直接发送给了服务器
# 移除一个局部变量
remove_var(key):
函数说明: 同上,但是不会返回所删除的值
# 列表选择框
get_item_dialog(title_str, items_tuple, var_str):
函数说明:
/WD.get_item_dialog("测试列表框",("1111","2222","3333"),"x");/WD.show_note(x)
自行在游戏里测试
# 文本选择框
get_text_dialog(title_str, label_str, var_str):
函数说明:
/WD.get_text_dialog("测试文本框","请输入您的ID:","myid");/WD.show_note("myid")
# 数字选择框
get_int_dialog(title_str, label_str, var_str):
同上
# 开启一个多选框
get_list_dialog(add_list, var_name_str,title):
参数说明 add_list 你所需要添加的选择项目列表,
var_name 选择的结果贮存的变量名称
title 列表框 名称
/WD.get_list_dialog(("a","b","c"),"choose","测试多选框")
# 测试触发器的简单函数
op1(self):
print("全局触发器1")
op2(self):
print("全局触发器2")
# 建立全局循环计时器
m_timerx(self,x,seconds, fuc_arg):
x= 定时器序号
seconds =间隔时间
fuc_arg= 时间到点时你要执行的函数
/WD.m_timer(1,2,WD.op1)
/TTmer1.cancel() # 销毁1号计时器
请管理好计时器序号。销毁以后只能重建。
# 一次性触发器,用完自动销毁
同上
s_timer(seconds, fuc_arg):
op_func = fuc_arg # 被执行的函数
timer1 = Timer(seconds, op_func)
timer1.start()
# 全局循环触发器 测试观察函数 销毁计时器 :TTimer1.cancel()?
m_timer1(self, seconds, fuc_arg):
global TTimer1
fuc_arg()
print(threading.current_thread())
print(threading.active_count())
TTimer1 = Timer(seconds, self.m_timer1, [seconds, fuc_arg])
TTimer1.start()
m_timer2(self, seconds, fuc_arg):
global TTimer2
fuc_arg()
print(threading.current_thread())
print(threading.active_count())
TTimer2 = Timer(seconds, self.m_timer2, [seconds, fuc_arg])
TTimer2.start()
# 重连
cc_conect():
/WD.cc_conect
# 强制客户端断线 可能导致死机,慎用。
cut_connect():
同上
# 返回当前文本块接收总数量 ,可利用某一段时间的数量差值大小,用来判断断线,发呆
get_blocknumber():
# 在内置浏览器中打开网站 sig
open_url_tab(url_str):
/WD.open_url_tab("http:\\www.sohu.com")
# 打开x号标签 sig 只能从左往右按顺序创建 1,2,3,4 否则执行顺序会错。
slot_tabwinx_create(x_index,title_str):
# 向x号标签写入数据 sig
slot_tabwinx_insert(x_index,content, color='[0;32m'):
# 移除x号标签 只能从右往左关 4,3,2 ,1
def slot_tabwinx_remove(x_index):
例子:/WD.slot_tabwinx_create(1,"测试1");/WD.slot_tabwinx_create(2,"测试2");
/WD.slot_tabwinx_insert(1,"测试输入1");/WD.slot_tabwinx_insert(2,"测试输入2");
/WD.slot_tabwinx_remove(2);/WD.slot_tabwinx_remove(1);
# 悬浮选择框
slot_gbox_checks_create(group_number,title_str,boxs_list,)
例子:
group_number:你的悬浮框组的数字编号,例如1,2,3,4
title_str: 悬浮组的名称 例如 "任务开关组"
boxs_list列表的内部构成 =[(按钮的数字编号,"按钮名称",按钮初始值=Flase,"指令1","指令2")]
按钮初始值=Flase 代表按钮被创建之初没有被勾选。True是被勾选。
" 指令1"代表勾选时执行的指令。
"指令2"代表取消勾选执行的指令。
@cmd1=WD.make_cmds("say 向右走一步,e");@cmd2=WD.make_cmds('say 向左走一步,w')
@boxs_list1=[(1,"开关1",False,cmd1,cmd2),(2,"开关2",False,cmd1,cmd2)];/WD.slot_gbox_checks_create(1,"悬浮组1",boxs_list1)
# 在指令中定义指令的函数
make_cmds(cmds)
说明 : 解决了直接在指令中定义带";" 字符串的问题。
直接使用@cmd='w;n;e'会报错。(指令解析器会将;作为分割符将字符串分解掉)
解决方案:使用,代替; 并使用函数。
@cmd=WD.make_cmds('w;n;e')
# 导入外部模块函数
imp_mode(obj_str, name_str, package_str=None):
函数说明:/WD.imp_mode("mymode", "b.c.c", package_str=None):
这样 mymode=b.c.c b.c.c内的定义全部被mymode接收
假如 b.c.c下定义了一个函数speak 你就可以直接使用/mymode.speak()
importlib.import_module() 函数 学习网址: https://blog.csdn.net/edward_zcl/article/details/88809212
a #文件夹
│a.py
│__init__.py
b #文件夹
│b.py
│__init__.py
├─c#文件夹
│c.py
│__init__.py
# c.py 中内容
args = {'a':1}
class C:
c(self):
pass
————————————————
params = importlib.import_module('b.c.c') #绝对导入
params_ = importlib.import_module('.c.c',package='b') #相对导入
# 对象中取出需要的对象
params.args #取出变量
params.C #取出class C
params.C.c #取出class C 中的c 方法
————————————————
版权声明:本文为CSDN博主「edward_zcl」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/edward_zcl/article/details/88809212
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
1
查看全部评分
-
|