如何实现一种功能

功能

  • 使用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()
2年前 评论
Scrooge (楼主) 2年前
Jason990420 (作者) 2年前
讨论数量: 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()
2年前 评论
Scrooge (楼主) 2年前
Jason990420 (作者) 2年前
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

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!