如何实现一种功能

功能#

  • 使用 SimpleGUI 制作图形界面
  • 读取两个 txt 文件 A,B(两个文件内的数据内容格式为 “1234567##1##1#”)PS:# 号固定
  • 将一个文件作为被比对文件 A,另一个为比对文件 B
  • 点击 “匹配” 按钮将两个文件对比,得到相同的数据并且记录该数据所在的行数点击 “导出按钮” 导出为 csr 或者 excel 表格格式
  • 需要用到多线程
  • 一个正在匹配的进度条

导出文件格式 eg:

行数 数据
52 1234567##1##1#
721 1234567##1##1#

目前想法#

------File
|------ Window.py(GUI文件)
|------ washdata.py (对比程序文件)
|------ export.py (对比过后导出数据文件)

请求指教#

Jason990420
最佳答案

PySimpleGUI

Python

你在 layout 中用错了所谓的元素 Element, sg.popup_get_file 是一个跳出的窗口,不是一个单一的元素.

范例如下:

import threading
from pathlib import Path
import PySimpleGUI as sg

def compare_files(window, file1, file2):

    global running

    # Compare both files here
    # If you need to update GUI
    # 1. Call following method to generate an event, then
    # 2. Processing that event in your event loop !!!
    # window.write_event_value(event, value)
    pass
    running = False

sg.theme("black")

layout = [
    [sg.Text('选择源A'), sg.Input(key="A"), sg.FileBrowse()],
    [sg.Text('选择源B'), sg.Input(key="B"), sg.FileBrowse()],
    [sg.Button("Compare"), sg.Button("Quit")],
]

window = sg.Window('Title', layout, finalize=True)

running = False
while True:

    event, values = window.read()
    if event in (sg.WINDOW_CLOSED, "Quit"):
        break
    elif event == "Compare" and not running:
        running = True
        file1, file2 = values["A"], values["B"]
        if Path(file1).is_file() and Path(file2).is_file():
            threading.Thread(target=compare_files, args=(window, file1, file2), daemon=True).start()

threading.Event().set()
window.close()
3年前 评论
Scrooge (楼主) 3年前
Jason990420 (作者) 3年前
讨论数量: 2
Jason990420

PySimpleGUI

Python

你在 layout 中用错了所谓的元素 Element, sg.popup_get_file 是一个跳出的窗口,不是一个单一的元素.

范例如下:

import threading
from pathlib import Path
import PySimpleGUI as sg

def compare_files(window, file1, file2):

    global running

    # Compare both files here
    # If you need to update GUI
    # 1. Call following method to generate an event, then
    # 2. Processing that event in your event loop !!!
    # window.write_event_value(event, value)
    pass
    running = False

sg.theme("black")

layout = [
    [sg.Text('选择源A'), sg.Input(key="A"), sg.FileBrowse()],
    [sg.Text('选择源B'), sg.Input(key="B"), sg.FileBrowse()],
    [sg.Button("Compare"), sg.Button("Quit")],
]

window = sg.Window('Title', layout, finalize=True)

running = False
while True:

    event, values = window.read()
    if event in (sg.WINDOW_CLOSED, "Quit"):
        break
    elif event == "Compare" and not running:
        running = True
        file1, file2 = values["A"], values["B"]
        if Path(file1).is_file() and Path(file2).is_file():
            threading.Thread(target=compare_files, args=(window, file1, file2), daemon=True).start()

threading.Event().set()
window.close()
3年前 评论
Scrooge (楼主) 3年前
Jason990420 (作者) 3年前
Jason990420

以下代码,可以作为进度条的参考,代码中是以 TIMEOUT 的 KEY 作为事件,你可以在线程函数中,调用 window.write_event_value(event, value) 来产生事件,event 自订,如 "ProgressBar", value 比如进度条的进度,. 当然你也可以使用元素 sg.ProgressBar

from random import randint
import PySimpleGUI as sg

sg.theme('DarkBlue')

layout = [[sg.Text('', size=(50, 1), relief='sunken', font=('Courier', 11),
    text_color='yellow', background_color='black',key='TEXT')]]
window = sg.Window('Title', layout, finalize=True)
text = window['TEXT']
state = 0
while True:

    event, values = window.read(timeout=100)

    if event == sg.WINDOW_CLOSED:
        break
    elif event == sg.TIMEOUT_KEY:
        state = (state+1)%51
        text.update('█'*state)

window.close()

file

3年前 评论