def create_resolution_diy(self): """ 分辨率 自定义 """ og = BigTitle(self.top_win, text='分辨率 自定义') frame = og.frame frame_main = og.frame_main frame_option = tk.Frame(frame_main) frame_notes = tk.Frame(frame_main) v1 = self.var_cb_size v2 = self.var_cb_density cb1 = tk.Checkbutton(frame_option, text=' 宽x高 ', variable=v1, command=lambda v=0: setting.modify_one("size_on", str(v1.get())), fg=theme.COLOR_BLACK ) txt1 = tk.Entry(frame_option, textvariable=self.var_text_size, validate="focusout", validatecommand=self.validate_size, width=9, fg=theme.COLOR_BLACK, background=theme.COLOR_LIST_BG ) cb2 = tk.Checkbutton(frame_option, text=' DPI ', variable=v2, command=lambda v=0: setting.modify_one("density_on", str(v2.get())), fg=theme.COLOR_BLACK ) txt2 = tk.Entry(frame_option, textvariable=self.var_text_density, validate="focusout", validatecommand=self.validate_density, width=4, fg=theme.COLOR_BLACK, background=theme.COLOR_LIST_BG ) utils.tooltip(cb1, "屏幕分辨率,例如:1280x720") utils.tooltip(cb2, "屏幕密度,取值范围为 160~480") s = "小天才手表(宽x高:320x360,DPI:320)" tk.Label(frame_notes, text=s, fg=theme.COLOR_GRAY).grid(column=1, row=1) cb1.grid(column=1, row=1) txt1.grid(column=2, row=1) cb2.grid(column=3, row=1) txt2.grid(column=4, row=1) frame_option.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) frame_notes.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) self.input_size = txt1 self.input_density = txt2 return frame
def clear_msg(): txt = utils.label_msg if txt is not None: try: txt['text'] = '' utils.tooltip(txt, '') except RuntimeError: print('RuntimeError: main thread is not in main loop')
def set(self, package): self.cbb.set(package) if not self.list_package.count(package): return # 更新简介框 index = self.list_package.index(package) n = self.list_name[index] path = self.list_path[index] if n and path: s = "{0} {1}".format(n, path) elif path: s = path else: s = n self.txt['text'] = s self.txt.grid(column=1, row=2, sticky=tk.W) utils.tooltip(self.txt, s, 300, 3000)
def __update_tips(self): s1 = "左键点击以 应用名称 命名\n{}\n\n右键点击 可批量命名剪贴板中的apk".format(self.rename_str1) s2 = "左键点击以 应用包名 命名\n{}\n\n右键点击 可批量命名剪贴板中的apk".format(self.rename_str2) s3 = "左键点击以 渠道名称 命名\n{}\n\n右键点击 可批量命名剪贴板中的apk".format(self.rename_str3) utils.tooltip(self.btn_rename1, s1) utils.tooltip(self.btn_rename2, s2) utils.tooltip(self.btn_rename3, s3)
def __init__(self): top_win = tk.Toplevel(utils.win) # '180x200+1920+1080' top_win.geometry(_win_pos) top_win.title('TV遥控器') frame_btn = tk.Frame(top_win) frame_txt = tk.Frame(top_win) # 配置 并创建按钮 config = ([self.btn_up, '▲', 2, 1, "btn_up", "快捷键:↑"], [self.btn_down, '▼', 2, 3, "btn_down", "快捷键:↓"], [self.btn_left, '◀', 1, 2, "btn_left", "快捷键:←"], [self.btn_right, '▶', 3, 2, "btn_right", "快捷键:→"], [self.btn_enter, '●', 2, 2, "btn_enter", "快捷键:回车键" ], [self.btn_menu, '☰', 1, 4, "btn_menu", "可尝试 菜单键 或 右徽标键"], [self.btn_home, 'home', 2, 4, "btn_home", ""], [ self.btn_back, '⇦', 3, 4, "btn_back", "可尝试 esc键 或 backspace键" ], [self.btn_vol_down, '音量-', 1, 6, "btn_vol_down", ""], [self.btn_vol_mute, '静音', 2, 6, "btn_vol_mute", ""], [self.btn_vol_up, '音量+', 3, 6, "btn_vol_up", ""], [self.btn_power, '电源', 1, 7, "btn_power", "功能:电源键"], [self.btn_screen, '✄', 2, 7, "btn_screen", ""], [self.btn_switch, '切换', 3, 7, "btn_switch", "功能:切换应用"]) arr = [] for c in config: text = c[1] column = c[2] row = c[3] name = c[4] tips = c[5] c[0] = tk.Button(frame_btn, text=text, width=4) btn = c[0] setattr(btn, "name", name) btn.bind("<Button-1>", self.btn_call) if tips: utils.tooltip(btn, tips) btn.grid(column=column, row=row) arr.append(btn) # 分割线 tk.Label(frame_btn).grid(column=1, row=5, sticky=tk.W) t = tuple(arr) utils.set_groove(t) # 文本框 txt = tk.Label(frame_txt, fg=util_theme.COLOR_GRAY, width=18) txt.grid(column=1, row=1) frame_btn.grid(column=1, row=1) frame_txt.grid(column=1, row=2) # frame_btn.focus() # frame_btn.bind("<Button-1>", self.refocus) top_win.bind('<Key>', self.btn_call) top_win.protocol("WM_DELETE_WINDOW", self.on_closing) self.txt = txt self.serial = 'emulator-5554' self.data = None self.frame_btn = frame_btn self.top_win = top_win self.auto_select()
def show_msg(msg): txt = utils.label_msg if txt is not None: txt['text'] = msg utils.tooltip(txt, msg)
def manual_int(self): if self.is_manual_int: return self.is_manual_int = True win = self.win # 颜色 color = util_theme.COLOR_BLACK # 导入文件 / ↑ / ↓ / - /+ frame_top = tk.Frame(win) frame_center = tk.Frame(win) frame_file = tk.Frame(win) frame_group = tk.Frame(win) frame_bottom = tk.Frame(win) if utils.is_windows: w_arr = [30, 60 + 20, 192 + 30, 150 + 240 - 20 - 30, 70] else: w_arr = [50, 60 + 20, 220 + 30, 240 + 240 - 20 - 30, 70] file_chooser = TreeViewNew( frame_file, tree_num=10, file_types=[("视频文件", "*.mp4"), ("QuickTime", "*.mov"), ("avi", "*.avi"), ("mkv", "*.mkv"), ("mpg", "*.mpg")], paste_notice=';-) 右键点我 粘贴视频文件,支持mp4、mov、avi、mkv、mpg格式', tree_widths=w_arr, has_list_btn=True) # listbox 和 scrollBar # 加片头/加片尾/加幕布/加水印 /输出目录 f_mp4 = [("视频文件", "*.mp4")] f_png = [("图片文件", "*.png")] fc_pt = FileChooser(frame_group, cb_text="加片头 ", filetypes=f_mp4, action_btn_text='浏览…', hasGROOVE=True) fc_pw = FileChooser(frame_group, cb_text="加片尾 ", filetypes=f_mp4, action_btn_text='浏览…', hasGROOVE=False) fc_fr = FileChooser(frame_group, cb_text="加幕布 ", filetypes=f_png, action_btn_text='浏览…', hasGROOVE=True) fc_wm = FileChooser(frame_group, cb_text="加水印 ", filetypes=f_png, action_btn_text='浏览…', hasGROOVE=False) # 备案号 选择对象 fc_number = NumberGroup(frame_group, text_width=79) fc_out = FileChooser(frame_group, btn_text=" 输出目录 ", action_btn_text='浏览…', isFolder=True, hasGROOVE=True, btn_call=self.goto_out_dir, text_width=80) # frame_notes = tk.Frame(frame_group, padx=8, pady=-1) # 选项 frame_option = tk.Frame(frame_group) # 帧率/码率 fps_option = RadiobuttonOption(frame_option, title=" 帧率(FPS) ", options=['保持', '24', '25', '30'], set=1) bit_option = RadiobuttonOption( frame_option, title=" 码率(Bitrate) ", options=["保持", '智能', '≥4m', '≥6m', '≥8m', '≥10m'], set=1) tips = "爱奇艺备案号生成的视频码率固定为8m\n" \ "有时码率可能达不到,请注意检查!(视频原码率低或画面较简单时)" utils.tooltip(bit_option.get_frame(), tips, 500, 5000) frame_option_cb = tk.Frame(frame_group) cb_fix = tk.Checkbutton(frame_option_cb, text="双倍时长修正", fg=color, variable=self.var_fix) cb_fast = tk.Checkbutton(frame_option_cb, text="极速模式", fg=color, variable=self.var_fast) cb_30m = tk.Checkbutton(frame_option_cb, text="30m(MPG)", fg=color, variable=self.var_30m, command=self.cb_30m_call) cb_shutdown = Shutdown(frame_option_cb) tips = "输出格式为“mpg”,且码率为30m\n" \ "爱奇艺备案号也受此选项控制" utils.tooltip(cb_30m, tips, 500, 5000) # 开始按钮 start_btn = Start(frame_bottom, text='开始\n合成', command=self.start_check, width=80) # grid cb_fix.grid(column=2, row=2, sticky=tk.W) cb_30m.grid(column=3, row=2, sticky=tk.W) cb_shutdown.grid(column=4, row=2, sticky=tk.W) fps_option.grid(column=2, row=1, sticky=tk.W) bit_option.grid(column=3, row=1, sticky=tk.W) fc_pt.grid(column=1, row=1, sticky=tk.W) fc_pw.grid(column=1, row=2, sticky=tk.W) fc_fr.grid(column=1, row=3, sticky=tk.NW) fc_wm.grid(column=1, row=4, sticky=tk.NW) fc_number.grid(column=1, row=6, sticky=tk.NW) frame_option.grid(column=1, row=21, sticky=tk.NW) frame_option_cb.grid(column=1, row=22, sticky=tk.NW) fc_out.grid(column=1, row=25, sticky=tk.NW) start_btn.grid(column=1, row=1, sticky=tk.W) frame_top.grid(column=1, row=1, sticky=tk.NW) frame_center.grid(column=1, row=2, sticky=tk.NW) frame_file.grid(column=1, row=3, sticky=tk.NW) frame_group.grid(column=1, row=4, sticky=tk.NW) frame_bottom.grid(column=1, row=5, sticky=tk.NW) self.cb_fix = cb_fix self.cb_fast = cb_fast self.cb_30m = cb_30m self.fc_pt = fc_pt self.fc_pw = fc_pw self.fc_frame = fc_fr self.fc_watermark = fc_wm self.fc_number = fc_number self.fc_out = fc_out self.start_btn = start_btn self.cb_shutdown = cb_shutdown self.file_chooser = file_chooser self.fps_option = fps_option self.bit_rate_option = bit_option self.auto_select()
def __init__(self): top_win = tk.Toplevel(utils.win) top_win.title('wifi连接') top_win.geometry(_win_pos) frame_top = tk.Frame(top_win) frame_top2 = tk.Frame(top_win) frame_list = tk.Frame(top_win) # 顶部输入框 var_entry = tk.StringVar() var_entry2 = tk.StringVar() # 模拟器端口 port = "7555" if utils.is_windows else "5555" serial1 = "127.0.0.1:{0}".format(port) serial2 = "127.0.0.1:{0}".format("62001") desc1 = "mumu模拟器" txt1 = tk.Label(frame_top, text='请输入设备的 IP 地址:') txt2 = tk.Label(frame_top, text='最近连接:', fg=theme.COLOR_GRAY) entry = tk.Entry(frame_top, textvariable=var_entry, width=28) entry.select_adjust(15) entry.focus() btn_connect = tk.Button(frame_top, text='连接', width=8) btn_serial1 = tk.Button(frame_top, text=desc1, width=40) btn_scan = tk.Button(frame_top, text='网络发现', width=8) entry.bind('<Return>', self.entry_call) btn_connect.bind('<Button-1>', self.connect_call) utils.bind(btn_serial1, self.emulator_call, False) utils.bind(btn_serial1, self.emulator_call, True) utils.tooltip(btn_serial1, "左键 mumu模拟器 {0}\n右键 夜神模拟器 {1}".format(serial1, serial2)) utils.bind(btn_scan, self.scan_call, False) utils.bind(btn_scan, self.scan_call, True) utils.tooltip(btn_scan, "左键扫描 开放5555端口的ip\n" "右键扫描 开放7555端口的ip") # tree 配置 # 列号,宽度,对齐,列名称 config = [ ["1", 140, "center", "名称"], ["2", 120, "nw", "IP"], ["3", 80, "center", "端口号"] ] names = [] for c in config: names.append(c[0]) tree = ttk.Treeview(frame_list, show="headings", selectmode=tk.EXTENDED, columns=names) tree.config(height=10) for c in config: tree.column(c[0], width=c[1], anchor=c[2]) tree.heading(c[0], text=c[3]) tree.tag_configure(self.ODD, background='#f5f5f5') tree.bind('<Button-1>', self.tree_call) tree.bind('<Double-1>', self.tree_double_call) y_scrollbar = ttk.Scrollbar(frame_list, orient=tk.VERTICAL, command=tree.yview) tree.config(yscrollcommand=y_scrollbar.set) self.i_name = 0 self.i_ip = 1 self.i_port = 2 entry2 = tk.Entry(frame_top2, textvariable=var_entry2, width=28) rename = tk.Button(frame_top2, text='✏', width=2, command=self.rename_call) up = tk.Button(frame_top2, text='↑', width=2, command=self.up_call) down = tk.Button(frame_top2, text='↓', width=2, command=self.down_call) remove_btn = tk.Button(frame_top2, text='-', width=2, command=self.remove_call) entry2.bind('<Return>', self.entry2_call) utils.tooltip(rename, "更改设备名称\n支持输入框按enter键") txt1.grid(column=1, row=1, sticky=tk.NW) entry.grid(column=1, row=2, sticky=tk.E + tk.W) btn_serial1.grid(column=1, row=3, sticky=tk.NW) txt2.grid(column=1, row=4, sticky=tk.NW) btn_connect.grid(column=2, row=2) btn_scan.grid(column=2, row=3) tree.grid(column=1, row=2) y_scrollbar.grid(column=2, row=2, sticky=tk.N + tk.S) entry2.grid(column=2, row=3) rename.grid(column=3, row=3) up.grid(column=4, row=3) down.grid(column=5, row=3) remove_btn.grid(column=6, row=3) frame_top.grid(column=1, row=1) frame_list.grid(column=1, row=2, sticky=tk.NW) frame_top2.grid(column=1, row=3, sticky=tk.EW) utils.set_groove((btn_connect, btn_serial1, btn_scan, up, down, remove_btn)) # utils.win.call('focus', '-force', entry) top_win.protocol("WM_DELETE_WINDOW", self.on_closing) self.top_win = top_win self.frame_top = frame_top self.entry = entry self.var_entry = var_entry self.var_entry2 = var_entry2 self.btn_connect = btn_connect self.btn_emulator1 = btn_serial1 self.widget_arr = [] self.serial1 = serial1 self.serial2 = serial2 self.tree = tree self.auto_select()
def manual_int(self): if self.is_manual_int: return self.is_manual_int = True win = self.win self.win = None frame_btn = tk.Frame(win, bd=1) frame_msg = tk.Frame(win) frame_content = tk.Frame(win) frame_device = tk.Frame(frame_content) color = util_theme.COLOR_BLACK def init_btn(text, width=8): btn = tk.Button(frame_btn, text=text, width=width, fg=color) btn.bind("<Button-1>", self.btn_click) utils.set_groove((btn, )) return btn btn_refresh = init_btn('刷新设备列表', 10) btn_wifi = init_btn('Wifi调试') btn_apk = init_btn('apkinfo') btn_folder = init_btn('定位截图') btn_remote = init_btn('遥控器') btn_setting = init_btn('✿设置') utils.bind(btn_refresh, self.btn_click, True) utils.bind(btn_wifi, self.btn_click, True) utils.bind(btn_apk, self.btn_click, True) # 设置tooltip utils.tooltip(btn_refresh, "右键单击可强制刷新", 300, 3000) cbb = ttk.Combobox(frame_btn, width=10, justify='center') cbb.bind("<<ComboboxSelected>>", self.cbb_call) utils.tooltip(cbb, '选择下拉项即执行操作') # 配置下拉项 c = [['base64 转图片', self.OP_B64_IMG], ['图片转 base64', self.OP_IMG_B64]] values = [] types = [] for arr in c: values.append(arr[0]) types.append(arr[1]) cbb['values'] = tuple(values) cbb.current(0) self.cbb = cbb self.cbb_ops = types # 提示框 w = 70 if utils.is_windows else 60 label_msg = tk.Label(frame_msg, width=w, fg=color, justify='left', anchor="nw") utils.label_msg = label_msg btn_wifi.grid(column=1, row=1) btn_refresh.grid(column=2, row=1) btn_apk.grid(column=3, row=1) btn_folder.grid(column=4, row=1) btn_remote.grid(column=5, row=1) # cbb.grid(column=5, row=1) btn_setting.grid(column=6, row=1) label_msg.grid(column=1, row=2, sticky=tk.NW) frame_device.grid(column=2, row=1, sticky=tk.NW) frame_btn.grid(column=1, row=1, sticky=tk.NW) frame_msg.grid(column=1, row=2, sticky=tk.NW) frame_content.grid(column=1, row=3, sticky=tk.NW) # menu = tk.Menu(win) # for i in ('One', 'Two', 'Three'): # menu.add_command(label=i) # if (win.tk.call('tk', 'windowingsystem') == 'aqua'): # win.bind('<2>', lambda e: menu.post(e.x_root, e.y_root)) # print('<2>') # win.bind('<Control-1>', lambda e: menu.post(e.x_root, e.y_root)) # else: # win.bind('<3>', lambda e: menu.post(e.x_root, e.y_root)) # print('<3>') utils.main = self self.btn_refresh = btn_refresh self.btn_wifi = btn_wifi self.btn_apk = btn_apk self.btn_folder = btn_folder self.btn_remote = btn_remote self.btn_setting = btn_setting self.frame_device = frame_device self.show_devices()
def set_cb_tooltip(self, tips, delay=500, duration=3000): if self.cb is not None: utils.tooltip(self.cb, tips, delay, duration)
def __init__(self, _parent): IPanel.__init__(self, _parent) frame = self.frame self.th = utils.thread_func self.msg = util_atool.show_msg # frame = tk.LabelFrame(_parent, text=' 指令列表 ', fg=util_theme.COLOR_GRAP2, borderwidth=1, padx=4, pady=4) # 包名下拉框 btn_frame = tk.Frame(frame) cbb_item = PackageCombobox(frame) cbb = ttk.Combobox(btn_frame, width=18, state='readonly', height=20, justify='center') cbb.bind("<<ComboboxSelected>>", self.cbb_call) # utils.tooltip(cbb, '选择下拉项即执行操作') utils.tooltip(cbb, '选择下拉项改变按钮功能') btn = tk.Button(btn_frame, text="Go", width=12, fg=util_theme.COLOR_BLACK) utils.bind(btn, self.btn_call) utils.bind(btn, self.btn_call, True) frame_btn_group = tk.Frame(btn_frame) # btn_am = tk.Button(frame_btn_group, text="应用管理", width=6) btn_screen = tk.Button(frame_btn_group, text="截屏", width=6) btn_install = tk.Button(frame_btn_group, text="安装", width=6) btn_log = tk.Button(frame_btn_group, text="日志", width=6) # utils.bind(btn_am, self.btn_group_call) # utils.bind(btn_am, self.btn_group_call, True) utils.bind(btn_screen, self.btn_group_call) utils.bind(btn_screen, self.btn_group_call, True) utils.bind(btn_install, self.btn_group_call) utils.bind(btn_install, self.btn_group_call, True) utils.bind(btn_log, self.btn_group_call) utils.bind(btn_log, self.btn_group_call, True) utils.tooltip(btn_screen, "左键截屏并自动打开图片\n右键截屏不自动打开图片", 800) utils.tooltip(btn_install, "左键点击 安装\n右键点击 安装剪贴板里的apk", 800) utils.tooltip(btn_log, "左键获取日志\n右键清除日志", 800) utils.set_groove((btn, btn_screen, btn_install, btn_log)) # btn_am.grid(column=1, row=1, sticky=tk.NW) btn_screen.grid(column=2, row=1, sticky=tk.NW) btn_install.grid(column=3, row=1, sticky=tk.NW) btn_log.grid(column=4, row=1, sticky=tk.NW) cbb.grid(column=1, row=1, sticky=tk.NW) btn.grid(column=2, row=1, sticky=tk.NW) tk.Label(btn_frame, width='4').grid(column=3, row=1, sticky=tk.NW) frame_btn_group.grid(column=4, row=1) # cbb_item.grid(1, 2, tk.NW) btn_frame.grid(column=1, row=1, sticky=tk.NW) self.btn = btn self.cbb_item = cbb_item self.cbb = cbb self.cbb_ops = None # self.btn_am = btn_am self.btn_screen = btn_screen self.btn_install = btn_install self.btn_log = btn_log
def cbb_call(self, _): index = self.cbb.current() op = self.cbb_ops[index] if op == OP.SEPARATOR: s = '' else: s = self.cbb.get() tips = "点击执行 " + s if op == OP.INSTALL: tips = "左键点击 " + s tips += "\n右键点击 安装剪贴板里的apk" elif op == OP.AM_LIST: tips = "成功后将拷贝到剪贴板, 请粘贴后使用!\n" \ "左键点击 读取用户安装的应用信息," + s tips += "\n右键点击 获取全部的应用信息" elif op == OP.CLEAR: tips = "左键点击 " + s tips += "\n右键点击 清除数据并启动应用" elif op == OP.SCREEN_SHOT: tips = "左键点击 " + s tips += "\n右键点击 截图 不自动打开截图文件" elif op == OP.SIZE_CUSTOM: tips = "左键点击 更改至自定义的分辨率" \ "\n右键点击 查询当前配置信息" \ "\n前往设置界面单独设置 宽x高 和 DPI 信息" elif op == OP.SIZE_SCALE: tips = "左键点击 2倍" tips += "\n右键点击 3倍" elif op == OP.SIZE_ORIGINAL: tips = "左键点击 " + s tips += "\n右键点击 查询当前分辨率信息" elif op == OP.DEBUG_LAYOUT: tips = "左键点击 显示布局边界" tips += "\n右键点击 关闭布局边界" elif op == OP.ACTIVITY_CUR_RUN: tips = "左键点击 " + s tips += "\n右键点击 仅获取前台运行程序的包名" elif op == OP.CLIPPER: tips = "左键点击 发送文本到安卓剪贴板" \ "\n右键点击 获取安卓剪贴板的文本" \ "\n备注:1.支持输入中文,但不支持空格等特殊符号" \ "\n2.’此功能需要设备上安装 Clipper 才能使用" \ "\nhttps://github.com/majido/clipper/releases" elif op == OP.STOP: tips = "左键点击 {} (指定包名的)".format(s) tips += "\n右键点击 {} (正在运行的)".format(s) elif op == OP.PULL_APK: # 下载apk tips = "左键点击 {} (指定包名的)".format(s) tips += "\n右键点击 {} (正在运行的)".format(s) elif op == OP.UNINSTALL: # 卸载应用 tips = "左键点击 {}".format(s) tips += "\n右键点击 {} (保留数据)".format(s) elif op == OP.RUN: # 启动应用 tips = "左键点击 {}".format(s) tips += "\n右键点击 重启正在运行的应用".format(s) elif op == OP.SCRCPY: arr_win = [ "设备 BACK 键 Ctrl+B | 鼠标右键", "设备 HOME 键 Ctrl+H | 鼠标中键", "设备 任务管理 键 (切换APP) Ctrl+S", "设备 菜单 键 Ctrl+M", "设备音量+键 Ctrl+↑", "设备音量-键 Ctrl+↓", "设备电源键 Ctrl+P", "复制内容到设备 Ctrl+V", "点亮手机屏幕 鼠标右键", "安装APK 将 apk 文件拖入投屏", "传输文件到设备 将文件拖入投屏(非apk)" ] arr_mac = [ "设备 BACK 键 ⌘+B | 鼠标右键", "设备 HOME 键 Ctrl+H | 鼠标中键", "设备 任务管理 键 (切换APP) ⌘+S", "设备 菜单 键 Ctrl+M", "设备音量+键 ⌘+↑", "设备音量-键 ⌘+↓", "设备电源键 ⌘+P", "复制内容到设备 ⌘+V", "点亮手机屏幕 鼠标右键", "安装APK 将 apk 文件拖入投屏", "传输文件到设备 将文件拖入投屏(非apk)" ] arr = arr_win if utils.is_windows else arr_mac tips = "左键点击 " + s tips += "\n\nscrcpy操作说明:\n" + "\n".join(arr) utils.tooltip(self.btn, tips, 800) if op[0:6] == "_need_": self.grid_cbb_package() else: self.grid_cbb_package(False)
def cbb_current(self, _index): """选中一个下拉项""" self.cbb.current(_index) s = self.cbb.get() utils.tooltip(self.btn, "点击执行 " + s, 800)
def manual_int(self): if self.is_manual_int: return self.is_manual_int = True win = self.win # 颜色 color = util_theme.COLOR_BLACK frame_file = tk.Frame(win) frame_group = tk.Frame(win) frame_check = tk.Frame(win) frame_wm = tk.Frame(win) frame_out = tk.Frame(win) frame_start = tk.Frame(win) if utils.is_windows: w_arr = [30, 60, 192, 150 + 240, 70] else: w_arr = [50, 60, 220, 240 + 240, 70] file_chooser = TreeViewNew( frame_file, tree_num=15, file_types=[("视频文件", "*.mp4"), ("QuickTime", "*.mov"), ("avi", "*.avi"), ("mkv", "*.mkv"), ("mpg", "*.mpg"), ("ts", "*.ts")], paste_notice=';-) 点我 粘贴媒体文件, 支持mp4、mov、avi、mkv、mpg、ts格式', tree_widths=w_arr, has_list_btn=True) # 选项 lf_size = tk.LabelFrame(frame_group, padx=8, pady=4, text=' 分辨率 ', width=300, borderwidth=1) lf_tune = tk.LabelFrame(frame_group, padx=8, pady=4, text=' 画面优化 ', borderwidth=1) lf_format = tk.LabelFrame(frame_group, padx=8, pady=4, text=' 输出格式 ', width=200, borderwidth=1) cb_size1 = tk.Checkbutton(lf_size, text="流畅 (640x360)", variable=self.cb_size_var1) cb_size2 = tk.Checkbutton(lf_size, text="高清 (1280x720)", variable=self.cb_size_var2) cb_size1.select() cb_size2.select() cb_tune1 = tk.Checkbutton(lf_tune, text="动画类 (亲宝儿歌)", variable=self.cb_tune_var1) cb_tune2 = tk.Checkbutton(lf_tune, text="实拍类 (舞蹈学堂)", variable=self.cb_tune_var2) cb_tune1.select() cb_tune1.bind("<Button-1>", self.tune_cb_call) cb_tune2.bind("<Button-1>", self.tune_cb_call) cb_format1 = tk.Checkbutton(lf_format, text=" mp4 ", variable=self.cb_format_var1) cb_format2 = tk.Checkbutton(lf_format, text=" flv ", variable=self.cb_format_var2) cb_format3 = tk.Checkbutton(lf_format, text=" m3u8 ", variable=self.cb_format_var3) cb_format4 = tk.Checkbutton(lf_format, text=" ts(电信) ", variable=self.cb_format_var4) cb_format5 = tk.Checkbutton(lf_format, text=" ts(移动) ", variable=self.cb_format_var5) cb_format1.select() cb_format3.bind("<Button-1>", self.format_cb_call) cb_format4.bind("<Button-1>", self.format_cb_call) cb_format5.bind("<Button-1>", self.format_cb_call) utils.tooltip(cb_format4, "电信渠道的ts文件,分辨率统一为 1280x720", 100, 2000) utils.tooltip(cb_format5, "移动渠道的ts文件,分辨率统一为 1280x720", 100, 2000) fc_number = FileChooser(frame_wm, cb_text="加备案号", filetypes=[("图片文件", "*.png")], action_btn_text='浏览…', hasGROOVE=False) cb_fix = tk.Checkbutton(frame_check, text="双倍时长修正", fg=color, variable=self.var_fix) cb_ratio = tk.Checkbutton(frame_check, text="黑边视频", fg=color, variable=self.keep_ratio_var) cb = tk.Checkbutton(frame_check, text="保留上层目录", fg=color, variable=self.keep_parent_var) fc_number.set_cb_tooltip("目前仅支持 ts(电信)和ts(移动)转码方案", 100, 2000) utils.tooltip(cb_fix, "目前仅支持 ts(电信)和ts(移动)转码方案", 100, 2000) utils.tooltip(cb_ratio, "目前仅支持 ts(电信)和ts(移动)转码方案", 100, 2000) # 自动关机 self.item_shutdown = Shutdown(frame_check) # 输出目录 self.fc_out = FileChooser(frame_out, label_text="输出:", action_btn_text='浏览…', isFolder=True, hasGROOVE=True, text_width=86) # 开始转码 按钮 self.start_btn = Start(frame_start, text='转码', command=self.start_check) self.start_btn.grid(column=1, row=1, sticky=tk.W) cb_size1.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) cb_size2.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) cb_tune1.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) cb_tune2.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) cb_format1.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) cb_format2.grid(column=2, row=1, sticky=tk.N + tk.S + tk.W) cb_format3.grid(column=3, row=1, sticky=tk.N + tk.S + tk.W) cb_format4.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) cb_format5.grid(column=2, row=2, sticky=tk.N + tk.S + tk.W) lf_size.grid(column=2, row=1) lf_tune.grid(column=3, row=1) lf_format.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) fc_number.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) cb_fix.grid(column=1, row=2, sticky=tk.W) cb_ratio.grid(column=2, row=2, sticky=tk.W) cb.grid(column=3, row=2, sticky=tk.W) self.item_shutdown.grid(column=4, row=2, sticky=tk.W) self.fc_out.grid(column=0, row=0, sticky=tk.NW) frame_file.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) frame_group.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) frame_wm.grid(column=1, row=3, sticky=tk.N + tk.S + tk.W) frame_check.grid(column=1, row=4, sticky=tk.N + tk.S + tk.W) frame_out.grid(column=1, row=5, sticky=tk.N + tk.S + tk.W) frame_start.grid(column=1, row=6, sticky=tk.N + tk.S + tk.W) self.cb_size1 = cb_size1 self.cb_size2 = cb_size2 self.cb_tune1 = cb_tune1 self.cb_tune2 = cb_tune2 self.cb_format1 = cb_format1 self.cb_format2 = cb_format2 self.cb_format3 = cb_format3 self.cb_format4 = cb_format4 self.cb_format5 = cb_format5 self.file_chooser = file_chooser self.fc_number = fc_number self.auto_select()
def __init__(self, parent, **kw): frame = parent color_black = util_theme.COLOR_BLACK # **kw key = 'file_types' self.file_types = kw[key] if key in kw else [ ("文件", "*.*"), ] key = 'tree_num' tree_num = kw[key] if key in kw else 20 key = 'paste_notice' self.smart_notice = kw[key] if key in kw else ' ;-) 右键点我 粘贴文件' key = 'tree_widths' tree_widths = kw[key] if key in kw else [] key = 'has_list_btn' has_list_btn = kw[key] if key in kw else False # 补齐格式 arr = [] for t in self.file_types: if len(t) >= 2: arr.append(t[1].replace("*", "")) self.file_types_tup = tuple(arr) # 补齐宽度 if utils.is_mac: w_arr = [50, 100, 220, 420, 70] else: w_arr = [30, 70, 192, 370, 70] for i in range(len(w_arr)): if len(tree_widths) - 1 < i: tree_widths.append(w_arr[i]) frame_top = tk.Frame(frame) frame_center = tk.Frame(frame) # 导入文件 / ↑ / ↓ / - /+ import_btn = tk.Button(frame_top, text='导入文件', width=14) import_dir_btn = tk.Button(frame_top, text='导入目录', width=8) import_list_btn = tk.Button(frame_top, text='↺', width=2) import_btn.bind("<Button-1>", self.import_call) import_dir_btn.bind("<Button-1>", self.import_call) import_list_btn.bind("<Button-1>", self.import_call) w = 101 - 12 - 10 if utils.is_mac else 62 tf = setting_fftool.font_default smart_paste = tk.Label(frame_top, padx=8, bd=0, height=1, width=w, fg=color_black, font=tf) smart_paste['text'] = self.smart_notice utils.bind(smart_paste, self.paste_right_click, True) tips = "右键单击此处可以粘贴哦!" utils.tooltip(smart_paste, tips, 100, 6000) up = tk.Button(frame_top, text='↑', width=2, command=self.up_call) down = tk.Button(frame_top, text='↓', width=2, command=self.down_call) remove_btn = tk.Button(frame_top, text='-', width=2, command=self.remove_call) add_btn = tk.Button(frame_top, text='+', width=2, command=self.add_call) import_btn.grid(column=1, row=0) import_dir_btn.grid(column=2, row=0) if has_list_btn: import_list_btn.grid(column=3, row=0) smart_paste.grid(column=4, row=0) up.grid(column=11, row=0) down.grid(column=12, row=0) remove_btn.grid(column=13, row=0) add_btn.grid(column=14, row=0) # 设置tooltip utils.tooltip(import_list_btn, "恢复上次的文件列表", 300, 3000) # treeview self.tree = TreeView(frame_center, tree_num=tree_num, tree_widths=tree_widths) w = (frame_top, frame_center, import_btn, import_list_btn, import_dir_btn, up, down, remove_btn, add_btn) utils.set_groove(w) frame_top.grid(column=1, row=1, sticky=tk.NW) frame_center.grid(column=1, row=2, sticky=tk.NW) self.paste = smart_paste self.import_btn = import_btn self.import_list_btn = import_list_btn self.import_dir_btn = import_dir_btn self.up = up self.down = down self.remove_btn = remove_btn self.add_btn = add_btn
def __init__(self, _parent, **kw): IPanel.__init__(self, _parent) frame = self.frame label_text = kw['label_text'] if 'label_text' in kw else '' cb_text = kw['cb_text'] if 'cb_text' in kw else '' cb_call = kw['cb_call'] if 'cb_call' in kw else None btn_text = kw['btn_text'] if 'btn_text' in kw else '' btn_call = kw['connect_call'] if 'connect_call' in kw else None action_btn_text = kw[ 'action_btn_text'] if 'action_btn_text' in kw else '...' action_btn_call = kw[ 'action_btn_call'] if 'action_btn_call' in kw else None file_types = kw['filetypes'] if 'filetypes' in kw else [] is_folder = kw['isFolder'] if 'isFolder' in kw else False text_width = kw['text_width'] if 'text_width' in kw else 80 # 颜色 color = util_theme.COLOR_BLACK wrap_length = 780 font_name = '微软雅黑' if utils.is_windows else '' font_size = 7 if utils.is_windows else 12 self.cb_call = cb_call has_check = False if label_text: self.label_txt = tk.Label(frame, text=label_text, fg=color) self.label_txt.grid(column=1, row=1, sticky=tk.W) # 勾选框 形式 elif cb_text: self.var_cb = tk.IntVar() cb = tk.Checkbutton(frame, text=cb_text, variable=self.var_cb, fg=color, command=self.checkbox_call) cb.grid(column=1, row=1, sticky=tk.W) self.cb = cb has_check = True # 按钮 形式 elif btn_text: btn = tk.Button(frame, text=btn_text, fg=color) if btn_call: btn.config(command=btn_call) utils.tooltip(btn, "点击打开目录", 100, 2000) btn.grid(column=1, row=1, sticky=tk.W) self.btn = btn utils.set_groove((btn, )) # 文件路径 txt = tk.Label(frame, text='') txt.config(width=text_width, height=1, bd=1, padx=3, fg=color, wraplength=wrap_length, justify='left', anchor='w') txt.grid(column=2, row=1) # 选择文件按钮 action_btn = tk.Button(frame, text=action_btn_text, fg=color, font=(font_name, font_size), state=tk.DISABLED) if len(file_types): action_btn.config(command=self.open_file_call) utils.bind(action_btn, self.right_click_call, True) self.filetypes = file_types self.action_btn_call = action_btn_call if is_folder: action_btn.config(command=self.open_folder_call, state=tk.NORMAL) utils.bind(action_btn, self.right_click_call, True) utils.tooltip(action_btn, "左键点击 选择文件/目录\n右键点击 前往对应文件/目录", 100, 2000) action_btn.grid(column=3, row=1) tup = (frame, action_btn) utils.set_groove(tup) self.txt = txt self.action_btn = action_btn self.hasCheck = has_check self.is_folder = is_folder
def __init__(self, apk): top_win = tk.Toplevel(utils.win) top_win.title('apk信息查看器') # top_win.geometry('200x200') # top_win.bind("<Destroy>", self.destroyed) color = util_theme.COLOR_BLACK frame_top = tk.Frame(top_win, padx=2, pady=2) frame_content = tk.Frame(top_win, padx=2, pady=2) bind = utils.bind btn_browse = tk.Button(frame_top, text='选择apk', fg=color, width=10) bind(btn_browse, self.btn_call) bind(btn_browse, self.btn_call, True) utils.tooltip(btn_browse, "左键点击 选择一个apk文件\n右键点击 读取剪贴板中的文件") frame_rename = tk.Frame(frame_top) btn_rename1 = tk.Button(frame_rename, text='应用名', width=6, fg=color) btn_rename2 = tk.Button(frame_rename, text='包名', width=6, fg=color) btn_rename3 = tk.Button(frame_rename, text='渠道名', width=6, fg=color) bind(btn_rename1, self.rename_call) bind(btn_rename2, self.rename_call) bind(btn_rename3, self.rename_call) bind(btn_rename1, self.rename_right_call, True) bind(btn_rename2, self.rename_right_call, True) bind(btn_rename3, self.rename_right_call, True) # labelframe label_frame_base = tk.LabelFrame(frame_content, text=' 基本 ', borderwidth=1) label_frame_sign = tk.LabelFrame(frame_content, text=' 签名、文件 ', borderwidth=1) label_frame_per = tk.LabelFrame(frame_content, text=' 权限 ', borderwidth=1) icon_frame = tk.Frame(label_frame_base, padx=0, pady=0) icon_left = tk.Frame(icon_frame, padx=0, pady=0) icon_right = tk.Frame(icon_frame, padx=0, pady=0) # label item config = [ [icon_left, "名称", 0, 30, 1, 1], [icon_left, "包名", 0, 30, 1, 2], [icon_left, "版本号", 0, 30, 1, 3], [icon_left, "内部版本号", 0, 30, 1, 4], [icon_left, "友盟渠道", 0, 30, 1, 5], [icon_left, "友盟appkey", 0, 30, 1, 6], [label_frame_base, "min_sdk", 0, 55, 1, 2], [label_frame_base, "target_sdk", 0, 55, 1, 3], [label_frame_sign, "签名MD5", 0, 55, 1, 1], [label_frame_sign, "签名SHA1", 0, 55, 1, 2], [label_frame_sign, "签名SHA256", 0, 55, 1, 3], [label_frame_sign, "文件地址", 0, 55, 1, 4], [label_frame_sign, "文件大小", 0, 55, 1, 5], [label_frame_sign, "文件MD5", 0, 55, 1, 6], ] obj_arr = [] for arr in config: col = arr[4] row = arr[5] obj = LabelItem(arr[0], name=arr[1], value_width=arr[3]) obj.grid(column=col, row=row, sticky=tk.NW) obj_arr.append(obj) # icon m_icon = IconItem(icon_right) # 权限文本框 m_entry = tk.Text(label_frame_per, height=9, width=65, fg=color, bd=1, wrap=tk.WORD, highlightthickness=1, highlightcolor=util_theme.COLOR_GRAY, font=util_theme.get_small_format()) btn_browse.grid(column=1, row=1) tk.Label(frame_top, width=19).grid(column=2, row=1) frame_rename.grid(column=3, row=1) btn_rename1.grid(column=2, row=1) btn_rename2.grid(column=3, row=1) btn_rename3.grid(column=4, row=1) label_frame_base.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) label_frame_sign.grid(column=1, row=2, sticky=tk.N + tk.S + tk.W) label_frame_per.grid(column=1, row=4, sticky=tk.N + tk.S + tk.W) m_icon.grid(column=1, row=1) m_entry.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) icon_left.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) icon_right.grid(column=2, row=1, sticky=tk.N + tk.S + tk.W) icon_frame.grid(column=1, row=1, sticky=tk.N + tk.S + tk.W) frame_top.grid(column=1, row=1, sticky=tk.W) frame_content.grid(column=1, row=2) self.m_name = obj_arr[0] self.m_package = obj_arr[1] self.m_ver = obj_arr[2] self.m_ver_inner = obj_arr[3] self.m_um_channel = obj_arr[4] self.m_um_key = obj_arr[5] self.m_min_sdk = obj_arr[6] self.m_target_sdk = obj_arr[7] self.m_sign_md5 = obj_arr[8] self.m_sign_sha1 = obj_arr[9] self.m_sign_sha256 = obj_arr[10] self.m_apk_path = obj_arr[11] self.m_apk_size = obj_arr[12] self.m_apk_md5 = obj_arr[13] self.m_entry = m_entry utils.set_groove((btn_browse, btn_rename1, btn_rename2, btn_rename3)) self.m_icon = m_icon self.top_win = top_win self.btn_browse = btn_browse self.btn_rename1 = btn_rename1 self.btn_rename2 = btn_rename2 self.btn_rename3 = btn_rename3 self.destroy_arr = [frame_top, frame_content, btn_browse] self.__update_tips() # 如果定义了 apk 地址 if os.path.exists(apk): self.__show_info(apk)
def set_text(self, text): """设置文本框上的内容 """ self.txt['text'] = text tips = text if os.path.exists(text) else text + "\n*此文件不存在!" utils.tooltip(self.txt, tips)
def set_tips(self, tips): if self.pre_img is not None: utils.tooltip(self.pre_img, tips)