def test_variable(self): self.assertRaises(RuntimeError, Variable) root = tkinter.Tk() v = Variable() v.set("value") self.assertEqual(v.get(), "value") root.destroy() tkinter.NoDefaultRoot() self.assertRaises(RuntimeError, Variable)
class OptionMenuComponent(MediatorComponent): """WidgetMediator component that contains an OptionMenu """ # Private Attributes: # - _var: the external mutatable variable for the menu widget # - _om: the OptionMenu shown to the user that displays the selection # - _mediator: the mediator to notify a selection has been made to update other colleages _var: Variable _om: OptionMenu _mediator: MenuMediator def __init__(self, parent: Widget, mediator: MenuMediator) -> None: self._var = Variable() self._mediator = mediator self._om = OptionMenu(parent, self._var, "") def reset_selection(self) -> None: """Sets the option menu variable to an empty string""" self._var.set("") def set_selection(self, data: list) -> None: """Sets the OptionMenu options to data""" menu = self._om["menu"] _delete_menu_options(menu) def click_command(variable: Variable, opt: Any) -> Callable: """Return the command to be called when clicking an option item""" def wrapper() -> None: """Function called when clicking an option item""" variable.set(opt) self._mediator.update_selection(()) return wrapper data = sorted(set(data)) menu.add_command(label="", command=click_command(self._var, "")) for option in data: menu.add_command(label=option, command=click_command(self._var, option)) def get_widget(self) -> Widget: """Return a list containing this OptionMenu""" return self._om def configure_menu(self, config: str, value: str) -> None: """Configures the setting of the composed dOptionMenu""" self._om[config] = value def get_selected(self) -> Any: """Return the current variable's value""" return self._var.get()
def test_trace_old(self): # Old interface v = Variable(self.root) vname = str(v) trace = [] def read_tracer(*args): trace.append(('read', ) + args) def write_tracer(*args): trace.append(('write', ) + args) cb1 = v.trace_variable('r', read_tracer) cb2 = v.trace_variable('wu', write_tracer) self.assertEqual(sorted(v.trace_vinfo()), [('r', cb1), ('wu', cb2)]) self.assertEqual(trace, []) v.set('spam') self.assertEqual(trace, [('write', vname, '', 'w')]) trace = [] v.get() self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] info = sorted(v.trace_vinfo()) v.trace_vdelete('w', cb1) # Wrong mode self.assertEqual(sorted(v.trace_vinfo()), info) with self.assertRaises(TclError): v.trace_vdelete('r', 'spam') # Wrong command name self.assertEqual(sorted(v.trace_vinfo()), info) v.trace_vdelete('r', (cb1, 43)) # Wrong arguments self.assertEqual(sorted(v.trace_vinfo()), info) v.get() self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] v.trace_vdelete('r', cb1) self.assertEqual(v.trace_vinfo(), [('wu', cb2)]) v.get() self.assertEqual(trace, []) trace = [] del write_tracer gc.collect() v.set('eggs') self.assertEqual(trace, [('write', vname, '', 'w')]) trace = [] del v gc.collect() self.assertEqual(trace, [('write', vname, '', 'u')])
def test_trace(self): v = Variable(self.root) vname = str(v) trace = [] def read_tracer(*args): trace.append(('read', ) + args) def write_tracer(*args): trace.append(('write', ) + args) tr1 = v.trace_add('read', read_tracer) tr2 = v.trace_add(['write', 'unset'], write_tracer) self.assertEqual(sorted(v.trace_info()), [(('read', ), tr1), (('write', 'unset'), tr2)]) self.assertEqual(trace, []) v.set('spam') self.assertEqual(trace, [('write', vname, '', 'write')]) trace = [] v.get() self.assertEqual(trace, [('read', vname, '', 'read')]) trace = [] info = sorted(v.trace_info()) v.trace_remove('write', tr1) # Wrong mode self.assertEqual(sorted(v.trace_info()), info) with self.assertRaises(TclError): v.trace_remove('read', 'spam') # Wrong command name self.assertEqual(sorted(v.trace_info()), info) v.get() self.assertEqual(trace, [('read', vname, '', 'read')]) trace = [] v.trace_remove('read', tr1) self.assertEqual(v.trace_info(), [(('write', 'unset'), tr2)]) v.get() self.assertEqual(trace, []) trace = [] del write_tracer gc.collect() v.set('eggs') self.assertEqual(trace, [('write', vname, '', 'write')]) trace = [] del v gc.collect() self.assertEqual(trace, [('write', vname, '', 'unset')])
def test_trace_old(self): # Old interface v = Variable(self.root) vname = str(v) trace = [] def read_tracer(*args): trace.append(('read',) + args) def write_tracer(*args): trace.append(('write',) + args) cb1 = v.trace_variable('r', read_tracer) cb2 = v.trace_variable('wu', write_tracer) self.assertEqual(sorted(v.trace_vinfo()), [('r', cb1), ('wu', cb2)]) self.assertEqual(trace, []) v.set('spam') self.assertEqual(trace, [('write', vname, '', 'w')]) trace = [] v.get() self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] info = sorted(v.trace_vinfo()) v.trace_vdelete('w', cb1) # Wrong mode self.assertEqual(sorted(v.trace_vinfo()), info) with self.assertRaises(TclError): v.trace_vdelete('r', 'spam') # Wrong command name self.assertEqual(sorted(v.trace_vinfo()), info) v.trace_vdelete('r', (cb1, 43)) # Wrong arguments self.assertEqual(sorted(v.trace_vinfo()), info) v.get() self.assertEqual(trace, [('read', vname, '', 'r')]) trace = [] v.trace_vdelete('r', cb1) self.assertEqual(v.trace_vinfo(), [('wu', cb2)]) v.get() self.assertEqual(trace, []) trace = [] del write_tracer gc.collect() v.set('eggs') self.assertEqual(trace, [('write', vname, '', 'w')]) trace = [] del v gc.collect() self.assertEqual(trace, [('write', vname, '', 'u')])
def tkVariable(var: Variable, key: str, default=None): """ 将tkinter的var绑定到缓存 :param var: :param key: :param default: :return: """ _cache = cache.get(key, default=None) if _cache is None: if default is not None: var.set(default) else: var.set(_cache) var.trace('w', lambda a, b, c: cache.set(key, var.get()))
def test_trace(self): v = Variable(self.root) vname = str(v) trace = [] def read_tracer(*args): trace.append(('read',) + args) def write_tracer(*args): trace.append(('write',) + args) tr1 = v.trace_add('read', read_tracer) tr2 = v.trace_add(['write', 'unset'], write_tracer) self.assertEqual(sorted(v.trace_info()), [ (('read',), tr1), (('write', 'unset'), tr2)]) self.assertEqual(trace, []) v.set('spam') self.assertEqual(trace, [('write', vname, '', 'write')]) trace = [] v.get() self.assertEqual(trace, [('read', vname, '', 'read')]) trace = [] info = sorted(v.trace_info()) v.trace_remove('write', tr1) # Wrong mode self.assertEqual(sorted(v.trace_info()), info) with self.assertRaises(TclError): v.trace_remove('read', 'spam') # Wrong command name self.assertEqual(sorted(v.trace_info()), info) v.get() self.assertEqual(trace, [('read', vname, '', 'read')]) trace = [] v.trace_remove('read', tr1) self.assertEqual(v.trace_info(), [(('write', 'unset'), tr2)]) v.get() self.assertEqual(trace, []) trace = [] del write_tracer gc.collect() v.set('eggs') self.assertEqual(trace, [('write', vname, '', 'write')]) trace = [] del v gc.collect() self.assertEqual(trace, [('write', vname, '', 'unset')])
class Prop: def __init__(self, initialValue=None, callback=None): self._var = Variable(value=initialValue) if callback is not None: self._var.trace(mode='w', callback=callback) def get(self): return self._var.get() def set(self, value): self._var.set(value) def on_change(self, listener): def update(*dummy): listener(self._var.get()) self._var.trace('w', update)
class ConfigUIModel: def __init__(self): self.var_dest = StringVar() self.var_dest.set("") self.var_wrap = BooleanVar() self.var_wrap.set(True) self.lstvar_src = Variable() self.lstvar_src.set([]) self.lstvar_exc = Variable() self.lstvar_exc.set([]) self.var_managed = BooleanVar() self.var_managed.set(False)
def set(self, value): """Set the variable to value, converting iterable to Loc.""" if not isinstance(value, Loc): try: value = Loc(*value) except TypeError: pass return Variable.set(self, repr(value))
def __init__(self): self.xmly = ximalaya() self.window = Tk() self.window.title("下载") self.window.geometry("670x600+700+300") # width x height + left + top var = Variable() var.set("http://www.ximalaya.com/67241256/album/10352095/") # 设置文本框中的值 self.entry = Entry(self.window, textvariable=var) self.entry.place(x=10, y=10, width=600, height=25) # self.entry.pack() self.submit_btn = Button(self.window, text="下载", command=self.submit) self.submit_btn.place(x=610, y=10, width=50, height=25) self.title_label = Label(self.window, text="结果:") self.title_label.place(x=10, y=55) self.result_text = Text(self.window, background="#ccc") self.result_text.place(x=10, y=75, width=650, height=500)
#-*- coding: UTF-8 -*- __author__ = '007' __date__ = '2016/4/7' from tkinter import Tk, Button, Entry, Label, Text, END, Variable root = Tk() # 初始化Tk() root.title("entry-test") # 设置窗口标题 root.geometry("300x200") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=False) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True var = Variable() # e = Entry(root, "sss") var.set("entry") # 设置文本框中的值 # print(type(var)) e = Entry(root, textvariable=var) e.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM root.mainloop() # 进入消息循环
def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress_var: tk.Variable, **kwargs: dict): def load_models(): text_widget.write('Loading models...\n') # nopep8 Write Command Text models = defaultdict(lambda: None) devices = defaultdict(lambda: None) # -Instrumental- if os.path.isfile(data['instrumentalModel']): device = torch.device('cpu') model = nets.CascadedASPPNet() model.load_state_dict( torch.load(data['instrumentalModel'], map_location=device)) if torch.cuda.is_available() and data['gpu'] >= 0: device = torch.device('cuda:{}'.format(data['gpu'])) model.to(device) models['instrumental'] = model devices['instrumental'] = device # -Vocal- elif os.path.isfile(data['vocalModel']): device = torch.device('cpu') model = nets.CascadedASPPNet() model.load_state_dict( torch.load(data['vocalModel'], map_location=device)) if torch.cuda.is_available() and data['gpu'] >= 0: device = torch.device('cuda:{}'.format(data['gpu'])) model.to(device) models['vocal'] = model devices['vocal'] = device # -Stack- if os.path.isfile(data['stackModel']): device = torch.device('cpu') model = nets.CascadedASPPNet() model.load_state_dict( torch.load(data['stackModel'], map_location=device)) if torch.cuda.is_available() and data['gpu'] >= 0: device = torch.device('cuda:{}'.format(data['gpu'])) model.to(device) models['stack'] = model devices['stack'] = device text_widget.write('Done!\n') return models, devices def load_wave_source(): X, sr = librosa.load(music_file, data['sr'], False, dtype=np.float32, res_type='kaiser_fast') return X, sr def stft_wave_source(X, model, device): X = spec_utils.calc_spec(X, data['hop_length']) X, phase = np.abs(X), np.exp(1.j * np.angle(X)) coeff = X.max() X /= coeff offset = model.offset l, r, roi_size = dataset.make_padding(X.shape[2], data['window_size'], offset) X_pad = np.pad(X, ((0, 0), (0, 0), (l, r)), mode='constant') X_roll = np.roll(X_pad, roi_size // 2, axis=2) model.eval() with torch.no_grad(): masks = [] masks_roll = [] length = int(np.ceil(X.shape[2] / roi_size)) for i in tqdm(range(length)): update_progress(**progress_kwargs, step=0.1 + 0.5 * (i / (length - 1))) start = i * roi_size X_window = torch.from_numpy( np.asarray([ X_pad[:, :, start:start + data['window_size']], X_roll[:, :, start:start + data['window_size']] ])).to(device) pred = model.predict(X_window) pred = pred.detach().cpu().numpy() masks.append(pred[0]) masks_roll.append(pred[1]) mask = np.concatenate(masks, axis=2)[:, :, :X.shape[2]] mask_roll = np.concatenate(masks_roll, axis=2)[:, :, :X.shape[2]] mask = (mask + np.roll(mask_roll, -roi_size // 2, axis=2)) / 2 if data['postprocess']: vocal = X * (1 - mask) * coeff mask = spec_utils.mask_uninformative(mask, vocal) inst = X * mask * coeff vocal = X * (1 - mask) * coeff return inst, vocal, phase, mask def invert_instrum_vocal(inst, vocal, phase): wav_instrument = spec_utils.spec_to_wav(inst, phase, data['hop_length']) # nopep8 wav_vocals = spec_utils.spec_to_wav(vocal, phase, data['hop_length']) # nopep8 return wav_instrument, wav_vocals def save_files(wav_instrument, wav_vocals): """Save output music files""" vocal_name = None instrumental_name = None save_path = os.path.dirname(base_name) # Get the Suffix Name if (not loop_num or loop_num == (total_loops - 1)): # First or Last Loop if data['stackOnly']: if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop vocal_name = '(Vocals)' instrumental_name = '(Instrumental)' else: vocal_name = '(Vocal_Final_Stacked_Output)' instrumental_name = '(Instrumental_Final_Stacked_Output)' elif data['useModel'] == 'instrumental': if not loop_num: # First Loop vocal_name = '(Vocals)' if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop instrumental_name = '(Instrumental)' else: instrumental_name = '(Instrumental_Final_Stacked_Output)' elif data['useModel'] == 'vocal': if not loop_num: # First Loop instrumental_name = '(Instrumental)' if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop vocal_name = '(Vocals)' else: vocal_name = '(Vocals_Final_Stacked_Output)' if data['useModel'] == 'vocal': # Reverse names vocal_name, instrumental_name = instrumental_name, vocal_name elif data['saveAllStacked']: folder_name = os.path.basename( base_name) + ' Stacked Outputs' # nopep8 save_path = os.path.join(save_path, folder_name) if not os.path.isdir(save_path): os.mkdir(save_path) if data['stackOnly']: vocal_name = f'(Vocal_{loop_num}_Stacked_Output)' instrumental_name = f'(Instrumental_{loop_num}_Stacked_Output)' elif (data['useModel'] == 'vocal' or data['useModel'] == 'instrumental'): vocal_name = f'(Vocals_{loop_num}_Stacked_Output)' instrumental_name = f'(Instrumental_{loop_num}_Stacked_Output)' if data['useModel'] == 'vocal': # Reverse names vocal_name, instrumental_name = instrumental_name, vocal_name # Save Temp File # For instrumental the instrumental is the temp file # and for vocal the instrumental is the temp file due # to reversement sf.write(f'temp.wav', wav_instrument.T, sr) appendModelFolderName = modelFolderName.replace('/', '_') # -Save files- # Instrumental if instrumental_name is not None: instrumental_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, file_name= f'{os.path.basename(base_name)}_{instrumental_name}{appendModelFolderName}', ) sf.write(instrumental_path, wav_instrument.T, sr) # Vocal if vocal_name is not None: vocal_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, file_name= f'{os.path.basename(base_name)}_{vocal_name}{appendModelFolderName}', ) sf.write(vocal_path, wav_vocals.T, sr) def output_image(): norm_mask = np.uint8((1 - mask) * 255).transpose(1, 2, 0) norm_mask = np.concatenate( [np.max(norm_mask, axis=2, keepdims=True), norm_mask], axis=2)[::-1] _, bin_mask = cv2.imencode('.png', norm_mask) text_widget.write(base_text + 'Saving Mask...\n') # nopep8 Write Command Text with open(f'{base_name}_(Mask).png', mode='wb') as f: bin_mask.tofile(f) data.update(kwargs) # Update default settings global default_sr global default_hop_length global default_window_size global default_n_fft default_sr = data['sr'] default_hop_length = data['hop_length'] default_window_size = data['window_size'] default_n_fft = data['n_fft'] stime = time.perf_counter() progress_var.set(0) text_widget.clear() button_widget.configure(state=tk.DISABLED) # Disable Button models, devices = load_models() modelFolderName = determineModelFolderName() if modelFolderName: folder_path = f'{data["export_path"]}{modelFolderName}' if not os.path.isdir(folder_path): os.mkdir(folder_path) # Determine Loops total_loops = data['stackPasses'] if not data['stackOnly']: total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): try: # Determine File Name base_name = f'{data["export_path"]}{modelFolderName}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}' for loop_num in range(total_loops): # -Determine which model will be used- if not loop_num: # First Iteration if data['stackOnly']: if os.path.isfile(data['stackModel']): model_name = os.path.basename(data['stackModel']) model = models['stack'] device = devices['stack'] else: raise ValueError( f'Selected stack only model, however, stack model path file cannot be found\nPath: "{data["stackModel"]}"' ) # nopep8 else: model_name = os.path.basename( data[f'{data["useModel"]}Model']) model = models[data['useModel']] device = devices[data['useModel']] else: model_name = os.path.basename(data['stackModel']) # Every other iteration model = models['stack'] device = devices['stack'] # Reference new music file music_file = 'temp.wav' # -Get text and update progress- base_text = get_baseText(total_files=len(data['input_paths']), total_loops=total_loops, file_num=file_num, loop_num=loop_num) progress_kwargs = { 'progress_var': progress_var, 'total_files': len(data['input_paths']), 'total_loops': total_loops, 'file_num': file_num, 'loop_num': loop_num } update_progress(**progress_kwargs, step=0) update_constants(model_name) # -Go through the different steps of seperation- # Wave source text_widget.write( base_text + 'Loading wave source...\n') # nopep8 Write Command Text X, sr = load_wave_source() text_widget.write(base_text + 'Done!\n') # nopep8 Write Command Text update_progress(**progress_kwargs, step=0.1) # Stft of wave source text_widget.write( base_text + 'Stft of wave source...\n') # nopep8 Write Command Text inst, vocal, phase, mask = stft_wave_source(X, model, device) text_widget.write(base_text + 'Done!\n') # nopep8 Write Command Text update_progress(**progress_kwargs, step=0.6) # Inverse stft text_widget.write(base_text + 'Inverse stft of instruments and vocals...\n' ) # nopep8 Write Command Text wav_instrument, wav_vocals = invert_instrum_vocal( inst, vocal, phase) # nopep8 text_widget.write(base_text + 'Done!\n') # nopep8 Write Command Text update_progress(**progress_kwargs, step=0.7) # Save Files text_widget.write( base_text + 'Saving Files...\n') # nopep8 Write Command Text save_files(wav_instrument, wav_vocals) text_widget.write(base_text + 'Done!\n') # nopep8 Write Command Text update_progress(**progress_kwargs, step=0.8) else: # Save Output Image (Mask) if data['output_image']: text_widget.write( base_text + 'Creating Mask...\n') # nopep8 Write Command Text output_image() text_widget.write(base_text + 'Done!\n') # nopep8 Write Command Text text_widget.write( base_text + 'Completed Seperation!\n\n') # nopep8 Write Command Text except Exception as e: traceback_text = ''.join(traceback.format_tb(e.__traceback__)) message = f'Traceback Error: "{traceback_text}"\n{type(e).__name__}: "{e}"\nFile: {music_file}\nLoop: {loop_num}\nPlease contact the creator and attach a screenshot of this error with the file and settings that caused it!' tk.messagebox.showerror(master=window, title='Untracked Error', message=message) print(traceback_text) print(type(e).__name__, e) print(message) progress_var.set(0) button_widget.configure(state=tk.NORMAL) # Enable Button return os.remove('temp.wav') progress_var.set(0) # Update Progress text_widget.write(f'Conversion(s) Completed and Saving all Files!\n' ) # nopep8 Write Command Text text_widget.write( f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}' ) # nopep8 button_widget.configure(state=tk.NORMAL) # Enable Button
class RootLoginView(tk.Tk): def __init__(self): super().__init__() def setupRootLoginUI(self): # self.pack() # 若继承 tk.Frame ,此句必须有! self.title('管理员操作界面') self.geometry("900x600+500+150") # 程序参数/数据 self.tipVar = Variable() self.tipVar.set("当前ATM机内余额为:%.2f" % atm.money) self.resizable(width=False, height=False) # 使用Frame增加一层容器 fm1 = Frame(self) fm2 = Frame(self) fm3 = Frame(self) # img_gif = PhotoImage(file="1.gif") # lable_img = Label(self, image=img_gif,z_index =-99) # lable_img.pack() button_image_gif3 = PhotoImage(file="提额.gif") Button(fm1, text='加钞', font=("宋体", 15), image=button_image_gif3, width=190, height=45, command=self.addCharge).pack(side=TOP, anchor=W, expand=NO) button_image_gif4 = PhotoImage(file="改密按钮.gif") Button(fm1, text='改密', font=("宋体", 15), image=button_image_gif4, width=190, height=45, command=self.modPasswd).pack(side=TOP, anchor=W, expand=NO, pady=80) fm1.pack(side=LEFT, fill=BOTH, expand=YES, pady=150) Label(fm3, text="欢迎进入sunck银行管理员操作界面,非管理员请勿操作!谢谢合作!", font=("宋体", 15), width=30, height=7, wraplength=350).pack(side=TOP) Label(fm3, textvariable=self.tipVar, font=("宋体", 15), width=30, height=10).pack(side=TOP) fm3.pack(side=LEFT, fill=BOTH, expand=YES) button_image_gif5 = PhotoImage(file="关机按钮.gif") Button(fm2, text='关机', font=("宋体", 15), image=button_image_gif5, width=190, height=45, command=self.shutdown).pack(side=TOP, anchor=E, expand=NO) button_image_gif6 = PhotoImage(file="返回按钮.gif") Button(fm2, text='返回', font=("宋体", 15), image=button_image_gif6, width=190, height=45, command=self.back).pack(side=TOP, anchor=E, expand=NO, pady=80) fm2.pack(side=RIGHT, fill=BOTH, expand=YES, pady=150) self.mainloop() # 设置参数 def addCharge(self): # print("addCharge") inDlog = InputDialog() inDlog.setup_UI() self.wait_window(inDlog) # 等待窗口修改值 self.tipVar.set("当前ATM机内余额为:%.2f" % atm.money) def shutdown(self): sys.exit(0) def modPasswd(self): chPwdDlog = changePasswdDialog() chPwdDlog.setup_UI() self.wait_window(chPwdDlog) def back(self): res = self.backView() # print("========", res) if res: self.quit() self.destroy() atmView = atmInitView.ATMInitView() atmView.setupATMInitView() def backView(self): backDlog = BackDialog() backDlog.setup_UI() self.wait_window(backDlog) return backDlog.isback
def increment(*args): for i in range(100): p1["value"] = i + 1 root.update() time.sleep(0.2) if i == 99: # 关闭窗口 root.destroy() elif i == 50: text.set(r'正在生成数据……') # time.sleep(2) root = tk.Tk() root.attributes("-topmost", True) # 最前面显示 text = Variable() text.set(r'正在生成表格……') root.overrideredirect(1) screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() width, height = 600, 60 size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) root.geometry(size) tk.Label(root, textvariable=text).grid(row=2, column=1) # root.geometry('320x240') p1 = ttk.Progressbar(root, length=width, cursor='spider', mode="determinate",
def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress_var: tk.Variable, **kwargs: dict): def save_files(wav_instrument, wav_vocals): """Save output music files""" vocal_name = None instrumental_name = None save_path = os.path.dirname(base_name) # Get the Suffix Name if (not loop_num or loop_num == (total_loops - 1)): # First or Last Loop if data['stackOnly']: if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop vocal_name = '(Vocals)' instrumental_name = '(Instrumental)' else: vocal_name = '(Vocal_Final_Stacked_Output)' instrumental_name = '(Instrumental_Final_Stacked_Output)' elif data['useModel'] == 'instrumental': if not loop_num: # First Loop vocal_name = '(Vocals)' if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop instrumental_name = '(Instrumental)' else: instrumental_name = '(Instrumental_Final_Stacked_Output)' elif data['useModel'] == 'vocal': if not loop_num: # First Loop instrumental_name = '(Instrumental)' if loop_num == (total_loops - 1): # Last Loop if not (total_loops - 1): # Only 1 Loop vocal_name = '(Vocals)' else: vocal_name = '(Vocals_Final_Stacked_Output)' if data['useModel'] == 'vocal': # Reverse names vocal_name, instrumental_name = instrumental_name, vocal_name elif data['saveAllStacked']: folder_name = os.path.basename( base_name) + ' Stacked Outputs' # nopep8 save_path = os.path.join(save_path, folder_name) if not os.path.isdir(save_path): os.mkdir(save_path) if data['stackOnly']: vocal_name = f'(Vocal_{loop_num}_Stacked_Output)' instrumental_name = f'(Instrumental_{loop_num}_Stacked_Output)' elif (data['useModel'] == 'vocal' or data['useModel'] == 'instrumental'): vocal_name = f'(Vocals_{loop_num}_Stacked_Output)' instrumental_name = f'(Instrumental_{loop_num}_Stacked_Output)' if data['useModel'] == 'vocal': # Reverse names vocal_name, instrumental_name = instrumental_name, vocal_name # Save Temp File # For instrumental the instrumental is the temp file # and for vocal the instrumental is the temp file due # to reversement sf.write(f'temp.wav', wav_instrument.T, sr) appendModelFolderName = modelFolderName.replace('/', '_') # -Save files- # Instrumental if instrumental_name is not None: instrumental_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, file_name= f'{os.path.basename(base_name)}_{instrumental_name}{appendModelFolderName}', ) sf.write(instrumental_path, wav_instrument.T, sr) # Vocal if vocal_name is not None: vocal_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, file_name= f'{os.path.basename(base_name)}_{vocal_name}{appendModelFolderName}', ) sf.write(vocal_path, wav_vocals.T, sr) data.update(kwargs) # Update default settings global default_sr global default_hop_length global default_window_size global default_n_fft default_sr = data['sr'] default_hop_length = data['hop_length'] default_window_size = data['window_size'] default_n_fft = data['n_fft'] stime = time.perf_counter() progress_var.set(0) text_widget.clear() button_widget.configure(state=tk.DISABLED) # Disable Button vocal_remover = VocalRemover(data, text_widget) modelFolderName = determineModelFolderName() if modelFolderName: folder_path = f'{data["export_path"]}{modelFolderName}' if not os.path.isdir(folder_path): os.mkdir(folder_path) # Determine Loops total_loops = data['stackPasses'] if not data['stackOnly']: total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): try: # Determine File Name base_name = f'{data["export_path"]}{modelFolderName}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}' # --Seperate Music Files-- for loop_num in range(total_loops): # -Determine which model will be used- if not loop_num: # First Iteration if data['stackOnly']: if os.path.isfile(data['stackModel']): model_name = os.path.basename(data['stackModel']) model = vocal_remover.models['stack'] device = vocal_remover.devices['stack'] else: raise ValueError( f'Selected stack only model, however, stack model path file cannot be found\nPath: "{data["stackModel"]}"' ) # nopep8 else: model_name = os.path.basename( data[f'{data["useModel"]}Model']) model = vocal_remover.models[data['useModel']] device = vocal_remover.devices[data['useModel']] else: model_name = os.path.basename(data['stackModel']) # Every other iteration model = vocal_remover.models['stack'] device = vocal_remover.devices['stack'] # Reference new music file music_file = 'temp.wav' # -Get text and update progress- base_text = get_baseText(total_files=len(data['input_paths']), total_loops=total_loops, file_num=file_num, loop_num=loop_num) progress_kwargs = { 'progress_var': progress_var, 'total_files': len(data['input_paths']), 'total_loops': total_loops, 'file_num': file_num, 'loop_num': loop_num } update_progress(**progress_kwargs, step=0) update_constants(model_name) # -Go through the different steps of seperation- # Wave source text_widget.write(base_text + 'Loading wave source...\n') X, sr = librosa.load(music_file, data['sr'], False, dtype=np.float32, res_type='kaiser_fast') if X.ndim == 1: X = np.asarray([X, X]) text_widget.write(base_text + 'Done!\n') update_progress(**progress_kwargs, step=0.1) # Stft of wave source text_widget.write(base_text + 'Stft of wave source...\n') X = spec_utils.wave_to_spectrogram(X, data['hop_length'], data['n_fft']) if data['tta']: pred, X_mag, X_phase = vocal_remover.inference_tta( X, device=device, model=model) else: pred, X_mag, X_phase = vocal_remover.inference( X, device=device, model=model) text_widget.write(base_text + 'Done!\n') update_progress(**progress_kwargs, step=0.6) # Postprocess if data['postprocess']: text_widget.write(base_text + 'Post processing...\n') pred_inv = np.clip(X_mag - pred, 0, np.inf) pred = spec_utils.mask_silence(pred, pred_inv) text_widget.write(base_text + 'Done!\n') update_progress(**progress_kwargs, step=0.65) # Inverse stft text_widget.write( base_text + 'Inverse stft of instruments and vocals...\n') # nopep8 y_spec = pred * X_phase wav_instrument = spec_utils.spectrogram_to_wave( y_spec, hop_length=data['hop_length']) v_spec = np.clip(X_mag - pred, 0, np.inf) * X_phase wav_vocals = spec_utils.spectrogram_to_wave( v_spec, hop_length=data['hop_length']) text_widget.write(base_text + 'Done!\n') update_progress(**progress_kwargs, step=0.7) # Save output music files text_widget.write(base_text + 'Saving Files...\n') save_files(wav_instrument, wav_vocals) text_widget.write(base_text + 'Done!\n') update_progress(**progress_kwargs, step=0.8) else: # Save output image if data['output_image']: with open('{}_Instruments.jpg'.format(base_name), mode='wb') as f: image = spec_utils.spectrogram_to_image(y_spec) _, bin_image = cv2.imencode('.jpg', image) bin_image.tofile(f) with open('{}_Vocals.jpg'.format(base_name), mode='wb') as f: image = spec_utils.spectrogram_to_image(v_spec) _, bin_image = cv2.imencode('.jpg', image) bin_image.tofile(f) text_widget.write(base_text + 'Completed Seperation!\n\n') except Exception as e: traceback_text = ''.join(traceback.format_tb(e.__traceback__)) message = f'Traceback Error: "{traceback_text}"\n{type(e).__name__}: "{e}"\nFile: {music_file}\nLoop: {loop_num}\nPlease contact the creator and attach a screenshot of this error with the file and settings that caused it!' tk.messagebox.showerror(master=window, title='Untracked Error', message=message) print(traceback_text) print(type(e).__name__, e) print(message) progress_var.set(0) button_widget.configure(state=tk.NORMAL) # Enable Button return os.remove('temp.wav') progress_var.set(0) text_widget.write(f'Conversion(s) Completed and Saving all Files!\n') text_widget.write( f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}' ) # nopep8 button_widget.configure(state=tk.NORMAL) # Enable Button
class OptionsView(tk.Tk): def __init__(self): super().__init__() self.insCardId = " " def setupOptionsView(self): # self.pack() # 若继承 tk.Frame ,此句必须有! self.title('管理员操作界面') self.geometry("900x600+500+230") # 程序参数/数据 self.tipVar = Variable() # self.tipVar.set("当前ATM机内余额为:%.2f" % atm.cardId) self.resizable(width=False, height=False) # 使用Frame增加一层容器 fm1 = Frame(self) fm2 = Frame(self) fm3 = Frame(self) fm4 = Frame(self) button_image_gif7 = PhotoImage(file="开户按钮.gif") Button(fm1, text='开户', font=("宋体", 15), image=button_image_gif7, width=190, height=45,command=self.createUser).pack(side=TOP, anchor=W,expand=NO, pady =7) button_image_gif8 = PhotoImage(file="存款按钮.gif") Button(fm1, text='存款', font=("宋体", 15), image=button_image_gif8, width=190, height=45,command=self.addAcount).pack(side=TOP, anchor=W,expand=NO, pady =7) button_image_gif9 = PhotoImage(file="改密按钮.gif") Button(fm1, text='改密', font=("宋体", 15), image=button_image_gif9, width=190, height=45,command=self.modPasswd).pack(side=TOP, anchor=W,expand=NO, pady =7) button_image_gif10 = PhotoImage(file="锁定按钮.gif") Button(fm1, text='锁卡', font=("宋体", 15), image=button_image_gif10, width=190, height=45,command=self.lockedCard).pack(side=TOP, anchor=W,expand=NO, pady =7) button_image_gif11 = PhotoImage(file="退卡按钮.gif") Button(fm1, text='退卡', font=("宋体", 15),image=button_image_gif11, width=190, height=45,command=self.outPutCard).pack(side=TOP, anchor=W,expand=NO, pady =7) fm1.pack(side=LEFT, fill=BOTH, expand=YES, pady=60) Label(fm3, text="SUNCK IS A GOOD MAN", font=("宋体", 15), width=30, height=7, wraplength=350).pack(side=TOP,padx= 20) Label(fm3, textvariable=self.tipVar, font=("宋体", 11), width=40, height=10).pack(side=TOP) button_image_gif12 = PhotoImage(file="退出按钮.gif") Button(fm4, text='退出', font=("宋体", 15), image=button_image_gif12, width=190, height=45,command=self.shutdown).pack(side=LEFT, anchor=tk.N,expand=NO, padx= 70) button_image_gif13 = PhotoImage(file="插卡按钮.gif") Button(fm4, text='插卡', font=("宋体", 15), image=button_image_gif13, width=115, height=27,command=self.putinCard).pack(side=RIGHT, anchor=tk.S,expand=NO,padx= 50) fm4.pack(side=tk.BOTTOM,fill= "x", expand=YES) fm3.pack(side=LEFT, fill=BOTH, expand=YES) button_image_gif14 = PhotoImage(file="转账按钮.gif") Button(fm2, text='转账', font=("宋体", 15), image=button_image_gif14, width=190, height=45,command=self.transAcount).pack(side=TOP, anchor=E,expand=NO, pady =7) button_image_gif15 = PhotoImage(file="取款按钮.gif") Button(fm2, text='取款', font=("宋体", 15), image=button_image_gif15, width=190, height=45,command=self.getAcount).pack(side=TOP, anchor=E,expand=NO, pady =7) button_image_gif16 = PhotoImage(file="补卡按钮.gif") Button(fm2, text='补卡', font=("宋体", 15), image=button_image_gif16, width=190, height=45,command=self.repairCard).pack(side=TOP, anchor=E,expand=NO, pady =7) button_image_gif17 = PhotoImage(file="解锁按钮.gif") Button(fm2, text='解锁', font=("宋体", 15), image=button_image_gif17, width=190, height=45,command=self.unlockedCard).pack(side=TOP, anchor=E,expand=NO, pady =7) button_image_gif18 = PhotoImage(file="返回按钮.gif") Button(fm2, text='返回', font=("宋体", 15), image=button_image_gif18, width=190, height=45,command=self.back).pack(side=TOP, anchor=E,expand=NO, pady =3) fm2.pack(side=RIGHT, fill=BOTH, expand=YES, pady=60) self.mainloop() # 开户 def createUser(self): creatUserDialog() # 插卡 def putinCard(self): if self.isInCard(): messagebox.askokcancel("消息提示", "当前有卡,请退卡后进行操作!") else: res = self.backputinCard() # print(res) if res !="": self.insCardId = res self.tipVar.set("当前卡号:%s 卡内余额:%.2f" % (self.insCardId, bank.usersDict[self.insCardId]["money"])) def backputinCard(self): picd = putinCardDialog() picd.setup_UI() self.wait_window(picd) return picd.cardId.get() # 改密 def modPasswd(self): if self.isLocked(): chPwdDlog = changePasswdDialog(self.insCardId) chPwdDlog.setup_UI() self.wait_window(chPwdDlog) # 锁卡 def lockedCard(self): if self.isLocked(): # print("islocked") lockedCardDialog(self.insCardId) # 解锁 def unlockedCard(self): if self.isInCard(): print(bank.usersDict[self.insCardId]["isLock"]) if bank.usersDict[self.insCardId]["isLock"]: unlock = unlockedCardDialog(self.insCardId) unlock.setup_UI() self.wait_window(unlock) else: messagebox.askokcancel("消息提示", "此卡无需解锁,请勿重复解锁!") else: messagebox.askokcancel("消息提示","当前无卡,请插卡后进行操作!") # 存款 def addAcount(self): if self.isLocked(): addialog = addAccountDialog(self.insCardId) addialog.setup_UI() self.wait_window(addialog) # print("back",bank.usersDict[self.insCardId]["money"]) self.tipVar.set("当前卡号:%s 卡内余额:%.2f" % (self.insCardId, bank.usersDict[self.insCardId]["money"])) # 取款 def getAcount(self): if self.isLocked(): getdialog = getAccountDialog(self.insCardId) getdialog.setup_UI() self.wait_window(getdialog) # print("back", bank.usersDict[self.insCardId]["money"]) self.tipVar.set("当前卡号:%s 卡内余额:%.2f" % (self.insCardId, bank.usersDict[self.insCardId]["money"])) # 转账 def transAcount(self): if self.isLocked(): transdialog = transAcountDialog(self.insCardId) transdialog.setup_UI() self.wait_window(transdialog) # print("back", bank.usersDict[self.insCardId]["money"]) self.tipVar.set("当前卡号:%s 卡内余额:%.2f" % (self.insCardId, bank.usersDict[self.insCardId]["money"])) # 返回 def back(self): res = self.backView() # print("========", res) if res: self.quit() self.destroy() atmView = atmInitView.ATMInitView() atmView.setupATMInitView() def backView(self): if self.isInCard(): waitcloseDialog = WaitCloseDialog() waitcloseDialog.setup_UI() self.wait_window(waitcloseDialog) return True else: backDlog = BackDialog() backDlog.setup_UI() self.wait_window(backDlog) return backDlog.isback # 补卡 def repairCard(self): if self.isLocked(): self.insCardId = self.backRepairCard() self.tipVar.set("当前卡号:%s 卡内余额:%.2f" % (self.insCardId, bank.usersDict[self.insCardId]["money"])) def backRepairCard(self): modCardIdDlog = modCardIdDialog(self.insCardId) modCardIdDlog.setup_UI() self.wait_window(modCardIdDlog) return modCardIdDlog.new_cardId # 退卡 def outPutCard(self): if self.isInCard(): self.insCardId = "" messagebox.askokcancel("消息提示","退卡成功!") self.tipVar.set("") else: # print("0000000000000000") messagebox.askokcancel("消息提示", "当前无卡,请插卡后进行操作!") # 退出 def shutdown(self): sys.exit(0) # 检查是否插卡 def isInCard(self): # print("**********",self.insCardId) if self.insCardId == " ": pass else: if self.insCardId in bank.usersDict: self.tipVar.set("当前卡号:%s 卡内余额:%.2f"%(self.insCardId, bank.usersDict[self.insCardId]["money"])) return True self.tipVar.set("") return False # 检查是否锁卡 def isLocked(self): if self.isInCard(): if bank.usersDict[self.insCardId]["isLock"]: messagebox.askokcancel("消息提示","卡已被锁,请解锁后操作") return False else: return True else: messagebox.askokcancel("消息提示", "当前无卡,请插卡后进行操作!")