| 
 | 
 
 本帖最后由 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
查看全部评分 
 
- 
 
 
 
 
 |