# -*- coding: utf8 -*- import sys try: import tkinter as tk from tkinter import filedialog, messagebox from queue import Queue, Empty except ImportError as e: import Tkinter as tk import tkFileDialog as filedialog import tkMessageBox as messagebox from Queue import Queue, Empty from threading import Thread import os from subfinder.subfinder_thread import SubFinderThread as SubFinder from subfinder.subsearcher import get_subsearcher from subfinder.run_thread import run class OutputStream(): def __init__(self, text_widget): self.text = text_widget self.msg_queue = Queue(100) def display(self): while True: try: msg = self.msg_queue.get(block=False) except Empty as e: break else: self.text.configure(state='normal') self.text.insert(tk.END, msg) self.text.configure(state='disabled') self.text.yview(tk.END) def write(self, text): self.msg_queue.put(text) def writeline(self, line): self.write(line + '\n') def writelines(self, lines): for line in lines: self.writeline(line) def close(self): pass def flush(self): pass class Application(tk.Frame, object): def __init__(self, master=None, cnf={}, **kw): super(Application, self).__init__(master, cnf, **kw) self.title = 'SubFinder' self.videofile = '' self._output = None # self.master.geometry('300x100') self.master.title(self.title) self.pack(fill=tk.BOTH, expand=tk.YES, padx=10, pady=10) self._create_widgets() def _start(self): if not self.videofile: messagebox.showwarning('提示', '请先选择视频文件或目录') return def start(*args, **kwargs): subfinder = SubFinder(*args, **kwargs) subfinder.start() subfinder.done() subsearchers = [ get_subsearcher('shooter'), get_subsearcher('zimuku'), get_subsearcher('zimuzu') ] t = Thread(target=start, args=[self.videofile, ], kwargs=dict( logger_output=self._output, subsearcher_class=subsearchers)) t.start() def _open_file(self): self._open('file') def _open_directory(self): self._open('dir') def _open(self, file_or_directory='file'): if file_or_directory == 'file': self.videofile = filedialog.askopenfilename(initialdir='~/Downloads/test', filetypes=( ('Video files', '*.mkv *.avi *.mp4 *'), ), title="选择一个视频文件") elif file_or_directory == 'dir': self.videofile = filedialog.askdirectory(initialdir='~/Downloads/test', title="选择一个目录") self.label_selected['text'] = self.videofile def _display_msg(self): self._output.display() self.after(100, self._display_msg) def _create_widgets(self): self.button_open_file = tk.Button( self, text='选择文件', command=self._open_file) self.button_open_file.grid(row=0, column=0, sticky='nswe') self.button_open_directory = tk.Button( self, text='选择目录', command=self._open_directory) self.button_open_directory.grid(row=0, column=1, sticky='nswe') frame = tk.Frame(self) self.label = tk.Label(frame, text='选中的文件或目录:') self.label.pack(side=tk.LEFT) self.label_selected = tk.Label(frame, text=self.videofile) self.label_selected.pack(side=tk.LEFT) frame.grid(row=1, column=0, columnspan=2, sticky='nswe') self.button_start = tk.Button(self, text='开始', command=self._start) self.button_start.grid( row=2, column=0, columnspan=2, pady=20, sticky='nswe') frame = tk.Frame(self) self.text_logger = tk.Text(frame) self.scrollbar = tk.Scrollbar(frame, command=self.text_logger.yview) self.text_logger.configure(yscrollcommand=self.scrollbar.set) self.text_logger.grid(row=0, column=0, sticky='nswe') self.scrollbar.grid(row=0, column=1, sticky='ns') tk.Grid.rowconfigure(self, 0, weight=1) tk.Grid.columnconfigure(frame, 0, weight=1) # tk.Grid.columnconfigure(frame, 1, weight=1) frame.grid(row=3, column=0, columnspan=2, pady=20, sticky='nswe') self._output = OutputStream(self.text_logger) self.after(100, self._display_msg) tk.Grid.rowconfigure(self, 3, weight=1) tk.Grid.columnconfigure(self, 0, weight=1) tk.Grid.columnconfigure(self, 1, weight=1) if __name__ == '__main__': if len(sys.argv) > 1: run() else: app = Application() app.mainloop()