Beispiel #1
0
 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)
Beispiel #2
0
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()
Beispiel #3
0
    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')])
Beispiel #4
0
    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')])
Beispiel #5
0
    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')])
Beispiel #6
0
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()))
Beispiel #7
0
    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')])
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
 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))
Beispiel #11
0
    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)
Beispiel #12
0
#-*- 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()  # 进入消息循环
Beispiel #13
0
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
Beispiel #14
0
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
Beispiel #15
0
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
Beispiel #17
0
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("消息提示", "当前无卡,请插卡后进行操作!")