自学py写的第一个脚本
本教程为新手向废话少说,下面开始教程
我们先用tkinter搭建好脚本的基本界面
首先导入tkinter,需要事先用pip安装进python里(方法自行百度)
本教程为新手向废话少说,下面开始教程
我们先用tkinter搭建好脚本的基本界面
首先导入tkinter,需要事先用pip安装进python里(方法自行百度)
- import tkinter as tk
- #入口,这行代码需要一直都待在脚本的最底下
- #设置字典
- hwnd_title = dict()
- init_window()
- def init_window():
- global cs,wd
- wd = tk.Tk()
- cs = tk.Canvas(wd,
- width = 800,
- height = 500,
- bg = 'white')
- wd.minsize(800, 500) # 最小尺寸
- wd.maxsize(800, 500)#最大尺寸,使最大化失效
- wd.title('DDTHelper')
- #设置背景图片,最好是800*500和png格式的
- pic = tk.PhotoImage(file="pic.png")
- cs.create_image(400,250,image = pic)
- cs.pack()
- bt = tk.Button(wd,
- text='初始化',
- bg=('white'),
- font=('微软雅黑',20),
- width=155,
- height=48,
- command=BT_onCreat)
- bt.pack()
- cs.create_window(530,70,
- width=155,
- height=48,
- window=bt)
- wd.mainloop()
- def BT_onCreat():
- print("初始化。。。")
(不过在图片上叠加控件其实有更好的方案,使控件的背景为透明的,但是那篇文章的代码运行不来)
运行效果
现在我们为点击 初始化 按钮添加一些事项
让他在被点击的时候识别当前的游戏窗口
(因为我用的是36jb大厅登录的游戏,抓取句柄的时候可以根据他的title来区别游戏窗口)
这里我偷了个懒,利用该登录器游戏窗口的title来获取
更改上面的导入库
- import win32com.client as wc,win32gui as wg,threading as xc,time,tkinter as tk,win32api as wa,win32con as wn
更改上面的 BT_onCreat()方法
- def BT_onCreat():
- global is_run,Znum,t1,t2,t3
- Znum = 0#当前已经登陆的游戏账号数量
- wg.EnumWindows(get_all_hwnd, 0)
- #根据title里包含的 4399 来提取游戏窗口
- for h,t in hwnd_title.items():
- if "4399" in t:
- hwnd = t.split("|")[3]
- name = t.split("|")[2]
- print("账号:" + name + "句柄:" + hwnd)
- Znum = Znum + 1
- hwnd = int(hwnd)#将句柄转化为int,因为句柄是从标题获取的string,导致了类型错误,我就是被这个坑了好久。。
- if Znum==1:#为每一个游戏界面创建一个单独的操作线程,为了方便用global传递,没有用exec。
- t1 = xc.Thread(target=Con,args=(hwnd,name,Znum))
- elif Znum==2:
- t2 = xc.Thread(target=Con,args=(hwnd,name,Znum))
- elif Znum==3:
- t3 = xc.Thread(target=Con,args=(hwnd,name,Znum))
- init_control(Znum,name)
再添加几个方法进去
获取句柄用的
获取句柄用的
- def get_all_hwnd(hwnd,mouse):
- if wg.IsWindow(hwnd) and wg.IsWindowEnabled(hwnd) and wg.IsWindowVisible(hwnd):
- hwnd_title.update({hwnd:wg.GetWindowText(hwnd)})
为每一个线程创建一个对应的控件来控制线程的运行
- def init_control(Znum,name):
- global cs,wd,v1,v2,v3,tx1,t2,tx2,t3,tx3,txn1,txn2,txn3
- if Znum==1:
- v1=tk.IntVar()
- tx1=tk.StringVar()
- txn1=tk.StringVar()
- elif Znum==2:
- v2=tk.IntVar()
- tx2=tk.StringVar()
- txn2=tk.StringVar()
- elif Znum==3:
- v3=tk.IntVar()
- tx3=tk.StringVar()
- txn3=tk.StringVar()
- exec('tx{}.set("未运行")'.format(Znum))
- exec('lb{} = tk.Label(wd,text="{}',bg=("#ffffff"),font=("微软雅黑",20))'.format(Znum,name))
- exec('lbn{} = tk.Label(wd,textvariable=txn{},bg=("#ffffff"),font=("微软雅黑",10))'.format(Znum,Znum))
- exec('cb{} = tk.Checkbutton(wd,textvariable=tx{},bg=("#ffffff"),font=("微软雅黑",10),variable = v{}, height=5,width = 0,command=BT_onRun{})'.format(Znum,Znum,Znum,Znum))
- exec('cb{}.pack()'.format(Znum))
- exec('lb{}.pack()'.format(Znum))
- exec('lbn{}.pack()'.format(Znum))
- Ytmp=Znum*100
- Ytmp=Ytmp+70
- exec('cs.create_window(630,{},width=0,height=0,window=lb{})'.format(Ytmp,Znum))
- Ytmp=Ytmp+40
- exec('cs.create_window(630,{},width=35,height=25,window=lbn{})'.format(Ytmp,Znum))
- exec('cs.create_window(710,{},width=70,height=25,window=cb{})'.format(Ytmp,Znum))
线程方法
- def Con(hwnd,name,xc):
- print("启动成功")
- 多选框点击事件
- def BT_onRun1():
- global v1,tx1,t1,ct1
- if v1.get()==1:#判断是否被选中
- ct1=0
- tx1.set('正运行')
- t1.start()
- else:
- ct1=1#用来控制线程终止
- tx1.set('未运行')
- def BT_onRun2():
- global v2,tx2,ct2
- if v2.get()==1:#判断是否被选中
- ct2=0
- tx2.set('正运行')
- t2.start()
- else:
- ct2 = 1
- tx2.set('未运行')
- def BT_onRun3():
- global v3,tx3,ct3
- if v3.get()==1:#判断是否被选中
- ct3=0
- tx3.set('正运行')
- t3.start()
- else:
- ct3=1
- tx3.set('未运行')
运行后,点击初始化的效果
可以看到,当只有一个游戏窗口的时候,脚本就自动识别出了该游戏窗口。(目前最多识别3个,且不能二次点击初始化,否则会报错。听说用exce动态封装线程时可以用dict来接收,而目前二次识别也有了大致方案)并在勾选 未运行 旁边的 框框 时,运行对应的线程。接下来就要到脚本的线程模块了,而有过py基础的人都知道,py的线程是没有stopThread的
但我们将要实现如何控制脚本执行游戏操作的线程,让它收放自如
下篇见
感谢您的投稿,我对标题进行了编辑。分类放到了标题后方,并把【】换成了[]
还有您设置的阅读权限是评论可见。这里我要明确一下。阅读权限仅对文章中隐藏的内容有效果。并不是对全篇文章的作用。
好的 没注意