python怎么做界面自动化_[Python] 【Python3】教你写页游自动化Python脚本 1.界面篇(模仿某键精灵)

本文来源吾爱破解论坛

本帖最后由 DDFer 于 2019-12-20 16:42 编辑

自学py写的第一个脚本

本教程为新手向

废话少说,下面开始教程

我们先用tkinter搭建好脚本的基本界面

[Python] 纯文本查看 复制代码import tkinter as tk#[size=3]首先导入tkinter,需要事先用pip安装进python里(方法自行百度)[/size]

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')

pic = tk.PhotoImage(file="pic.png")#设置背景图片,最好是800*500和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("初始化。。。")

#入口,这行代码需要一直都待在脚本的最底下

#设置字典

hwnd_title = dict()

init_window()

(不过在图片上叠加控件其实有更好的方案,使控件的背景为透明的,但是那篇文章的代码运行不来)

运行效果

1.png (247.09 KB, 下载次数: 1)

下载附件

保存到相册

2019-12-18 23:27 上传

现在我们为点击 初始化 按钮添加一些事项

让他在被点击的时候识别当前的游戏窗口

(因为我用的是36jb大厅登录的游戏,抓取句柄的时候可以根据他的title来区别游戏窗口)

这里我偷了个懒,利用该登录器游戏窗口的title来获取

2.jpg (122.71 KB, 下载次数: 0)

下载附件

保存到相册

2019-12-18 23:27 上传

更改上面的导入库和 BT_onCreat()方法

[Python] 纯文本查看 复制代码import win32com.client as wc,win32gui as wg,threading as xc,time,tkinter as tk,win32api as wa,win32con as wn#需要事先用pip安装pywin32插件进python里(方法自行百度)

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')

pic = tk.PhotoImage(file="pic.png")#设置背景图片,最好是800*500和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():

global is_run,Znum,t1,t2,t3

Znum = 0#当前已经登陆的游戏账号数量

wg.EnumWindows(get_all_hwnd, 0)

for h,t in hwnd_title.items():

if "4399" in t:#根据title里包含的 4399 来提取游戏窗口

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('未运行')

#入口,这行代码需要一直都待在脚本的最底下

#设置字典

hwnd_title = dict()

init_window()

运行后,点击初始化的效果

3.png (248.86 KB, 下载次数: 1)

下载附件

保存到相册

2019-12-18 23:27 上传

可以看到,当只有一个游戏窗口的时候,脚本就自动识别出了该游戏窗口。(目前最多识别3个,且不能二次点击初始化,否则会报错。听说用exce动态封装线程时可以用dict来接收,而目前二次识别也有了大致方案)

并在勾选 未运行 旁边的 框框 时,运行对应的线程。

接下来就要到脚本的线程模块了,而有过py基础的人都知道,py的线程是没有stopThread的

但我们将要实现如何控制脚本执行游戏操作的线程,让它收放自如

下篇见

第一次写52的 帖子,排版可能不怎么好请见谅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值