【记录】python3 tkinterUI编辑器应用之使用windnd将文件拖拽到tkinter控件中

tkinterUI编辑器应用(一)


前言

上周末我们游戏外网一个活动出现了问题,有部分玩家参加了活动但是没有获得奖励的邮件,于是开始通过日志进行统计,统计哪些玩家发生了问题,统计时需要用grep先导出进入过活动地图的玩家id,再导出发送过奖励邮件的玩家id,然后拷贝到excel里用公式查找一下这两个id列表的差集,虽然excel就能处理,但是感觉还是不太方便,于是决定加一个小工具,工具可以把文件拖入到ui中,然后求差集或者交集啥的,ui如下:
在这里插入图片描述
将两个文件分别拖入左边和右边,然后点击按钮生成新的文件。
ui的读取创建是通过我之前写的编辑器处理的,可从这里查看编辑器的代码与使用方法
这个工具的所有代码可以从这里下载


一、windnd

  1. pip install windnd 安装
  2. 使用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()


  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

archmage199

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值