前言
上周末我们游戏外网一个活动出现了问题,有部分玩家参加了活动但是没有获得奖励的邮件,于是开始通过日志进行统计,统计哪些玩家发生了问题,统计时需要用grep先导出进入过活动地图的玩家id,再导出发送过奖励邮件的玩家id,然后拷贝到excel里用公式查找一下这两个id列表的差集,虽然excel就能处理,但是感觉还是不太方便,于是决定加一个小工具,工具可以把文件拖入到ui中,然后求差集或者交集啥的,ui如下:
将两个文件分别拖入左边和右边,然后点击按钮生成新的文件。
ui的读取创建是通过我之前写的编辑器处理的,可从这里查看编辑器的代码与使用方法
这个工具的所有代码可以从这里下载
一、windnd
- pip install windnd 安装
- 使用windnd.hook_dropfiles(self.labelframe_left.winfo_id(), partial(self.handle_drop_files, “left”))函数绑定要拽入的控件以及回调函数,回调函数的参数就是拖入的文件列表
二、主要代码
# -*- coding: UTF-8 -*-
import os
import windnd
from tkinter import *
from componentMgr import componentMgr
from functools import partial
class intersection(componentMgr):
def __init__(self, master, gui_path):
componentMgr.__init__(self, master)
self.load_from_xml(master, gui_path, True)
self.init_frame()
self.left_set = set()
self.right_set = set()
@property
def main_frame(self):
return self.master.children.get("frame_intersection", None)
@property
def labelframe_left(self):
return self.main_frame.children.get("labelframe_left", None)
@property
def label_left(self):
return self.labelframe_left.children.get("label_left", None)
@property
def labelframe_right(self):
return self.main_frame.children.get("labelframe_right", None)
@property
def label_right(self):
return self.labelframe_right.children.get("label_right", None)
@property
def button_union(self):
return self.main_frame.children.get("button_union", None)
@property
def button_intersection(self):
return self.main_frame.children.get("button_intersection", None)
@property
def button_difference(self):
return self.main_frame.children.get("button_difference", None)
def init_frame(self):
"""
初始化界面
:return: None
"""
windnd.hook_dropfiles(self.labelframe_left.winfo_id(), partial(self.handle_drop_files, "left"))
windnd.hook_dropfiles(self.labelframe_right.winfo_id(), partial(self.handle_drop_files, "right"))
self.button_union.bind("<ButtonRelease-1>", self.calc_union)
self.button_intersection.bind("<ButtonRelease-1>", self.calc_intersection)
self.button_difference.bind("<ButtonRelease-1>", self.calc_difference)
def handle_drop_files(self, side, files):
"""
监听文件被拖拽进来
:param side: 左或者右
:param files: 文件列表
:return: None
"""
if len(files) != 1:
print("只能拖拽进来一个文件")
return
self.read_file(side, files[0])
def read_file(self, side, file_path):
"""
读取文件
:param side: 左或者右
:param file_path: 文件路径
:return: None
"""
label = self.label_left
side_set = self.left_set
if side == "right":
label = self.label_right
side_set = self.right_set
side_set.clear()
label.configure(text=os.path.basename(file_path))
with open(file_path, "r") as f:
while True:
line = f.readline()
if not line:
break
side_set.add(line)
def write_file(self, s, out_path):
"""
写文件
:param s: 要写入的set
:return: None
"""
with open(out_path, "w") as f:
for v in s:
f.write(v)
def calc_union(self, event):
"""
计算并集
:param event:
:return: None
"""
s = self.left_set | self.right_set
self.write_file(s, "union.txt")
def calc_intersection(self, event):
"""
计算交集
:param event:
:return: None
"""
s = self.left_set & self.right_set
self.write_file(s, "intersection.txt")
def calc_difference(self, event):
"""
计算差集
:param event:
:return: None
"""
s = self.left_set - self.right_set
self.write_file(s, "difference.txt")
def main():
root = Tk()
path = os.path.join(os.getcwd(), 'setCalc.xml')
intersection(root, path)
root.mainloop()
if __name__ == "__main__":
main()
转载:https://blog.csdn.net/m0_51849494/article/details/109997520
查看评论