def change_name(self, event): """Change category name.""" def ok(event): cats = [l.cget('text').lower() for l in self.cat_labels.values()] cat = name.get().strip().lower() if cat and cat not in cats: label.configure(text=cat.capitalize()) if old_cat == self.default_category.get(): self.default_category.set(cat.capitalize()) self.update_def_cat_menu() name.destroy() label = event.widget old_cat = label.cget('text') name = Entry(self, justify='center') name.insert(0, label.cget('text')) name.place(in_=label, relx=0, rely=0, anchor='nw', relwidth=1, relheight=1) name.bind('<FocusOut>', lambda e: name.destroy()) name.bind('<Escape>', lambda e: name.destroy()) name.bind('<Return>', ok) name.selection_range(0, 'end') name.focus_set()
class Application_ui(Frame): # 这个类仅实现界面生成功能,具体事件处理代码在子类Application中。 def __init__(self, master=None): Frame.__init__(self, master) self.master.title('Excel转化Rpy工具') self.master.geometry('600x343') self.createWidgets() def createWidgets(self): self.top = self.winfo_toplevel() self.style = Style() self.bkg_gif = PhotoImage(data=base64.b64decode(back_ground_gif_data)) self.background_label = Label(self.top, image=self.bkg_gif) self.background_label.place(x=0, y=0, relwidth=1, relheight=1) self.Text = Text(self.top, font=('宋体', 9)) self.Text.place(relx=0.066, rely=0.07, relwidth=0.869, relheight=0.563) self.saveAddr = Entry(self.top, font=('宋体', 9)) self.saveAddr.place(relx=0.355, rely=0.84, relwidth=0.409, relheight=0.052) self.ComboList = ['源文件目录', '自定义目录'] self.Combo = Combobox(self.top, values=self.ComboList, font=('宋体', 9), state='readonly') self.Combo.place(relx=0.184, rely=0.84, relwidth=0.146, relheight=0.058) self.Combo.set(self.ComboList[0]) self.Combo.bind('<<ComboboxSelected>>', self.comboEvent) self.style.configure('InputButton.TButton', font=('宋体', 9)) self.InputButton = Button(self.top, text='浏览', command=self.InputButton_Cmd, style='InputButton.TButton') self.InputButton.place(relx=0.184, rely=0.7, relwidth=0.133, relheight=0.073) self.Haruhi_gif = PhotoImage(data=base64.b64decode(haruhi_gif_data)) self.style.configure('ConvertButton.TButton', font=('宋体', 9)) self.ConvertButton = Button(self.top, image=self.Haruhi_gif, command=self.ConvertButton_Cmd, style='ConvertButton.TButton') self.ConvertButton.place(relx=0.788, rely=0.7, relwidth=0.146, relheight=0.236) self.style.configure('OutputLabel.TLabel', anchor='w', font=('宋体', 9)) self.OutputLabel = Label(self.top, text='保存目录:', style='OutputLabel.TLabel') self.OutputLabel.place(relx=0.066, rely=0.84, relwidth=0.107, relheight=0.05) self.style.configure('InputLabel.TLabel', anchor='w', font=('宋体', 9)) self.InputLabel = Label(self.top, text='输入设置:', style='InputLabel.TLabel') self.InputLabel.place(relx=0.066, rely=0.723, relwidth=0.107, relheight=0.05) menubar = Menu(self.top) filemenu = Menu(menubar, tearoff=0) # tearoff意为下拉 menubar.add_cascade(label='帮助', menu=filemenu) filemenu.add_command(label='视频教程', command=self.open_help_url) filemenu.add_command(label='检查更新', command=self.check_for_update) self.top.config(menu=menubar)
class StudentIDDlg(Toplevel): def __init__(self, initialText, title, labeltext = '' ): Toplevel.__init__(self) self.initUI(initialText,title,labeltext) def initUI(self,initialText,title,labeltext=''): self.STID = initialText self.geometry("200x120") if len(title) > 0: self.title(title) self.style = Style() self.style.theme_use("default") # default style = Style() style.configure("Exit.TButton", foreground="red", background="white") style.configure("MainButton.TButton", foreground="yellow", background="red") if len(labeltext) == 0: labeltext = 'Please enter your ID..' self.bind("<Return>", self.ok) xpos = 40 ypos = 30 xpos2 = xpos+100 l1 = Label(self, text=initialText, foreground = "#ff0000", background = "light blue", font = "Arial 9") # Arial 12 bold italic l1.place(x=xpos, y=ypos) self.txtID = Entry(self) self.txtID.place(x=xpos2, y = ypos, width=70) self.txtID.bind("<Return>", self.ok) self.txtID.bind("<Escape>", self.cancel) self.txtID.focus_set() ypos += 30 okButton = Button(self, text="OK", background = "light blue", command=self.ok) #okButton.configure(style="ExitButton.TButton") # does not work okButton.place(x=xpos2, y=ypos) def getID(self): return self.STID def ok(self, event=None): self.STID = self.txtID.get() self.destroy() def cancel(self, event=None): self.destroy()
def show_form(self): title_text = Label(self,text = "Title",) entry_text = Label(self,text = "Entry",) title_text.place(x = 15, y = 100) entry_text.place(x = 15, y =150) title_entry = Entry(self,textvariable = self.title, width = "30") scroll = ttk.Scrollbar(self) title_entry.place(x = 15, y = 120) self.entry.place(x = 15, y = 170) scroll.pack(side=tk.RIGHT, fill=tk.Y) scroll.config(command=self.entry.yview) self.entry.config(yscrollcommand=scroll.set) add_button = ttk.Button(self, text = "Submit", command=self.add_entry) add_button.pack(side = BOTTOM)
Frame with Image replace the image with your own image, if the screen size is large enough, about 1000 wide by 350 high. ''' from tkinter import Tk, PhotoImage from tkinter.ttk import Frame, Style, Label, Entry from PIL import Image, ImageTk root = Tk() s = Style() im = Image.open('../images/BountyMoorea.jpg') # change to your own file tkim = ImageTk.PhotoImage(im) width,height = im.size s.element_create("ship", "image", tkim) s.layout("ship", [("ship", {"sticky": "nsew"})]) fr=Frame(root, style="ship", height=height,width=width) fr.grid(column=0, row=1, sticky='nsew') il = Label(fr, text= 'Label') il.place(relx=0.1, rely=0.1, anchor='center') # using place to position widget en = Entry(fr, width=15) en.place(relx=0.1, rely=0.15, anchor='center') root.mainloop()
class main(): def __init__(self, tk): self.frame_lgn = Frame(lgn_Screen, width=450, height=750) self.frame_lgn.pack() #Separator self.pane_W = LabelFrame(lgn_Screen, text='Your Credentials', width=300, height=200) self.pane_W.place(x=1, y=10) #Login Entry self.usr_label = Label(lgn_Screen, text="Usuário:") self.usr_label.place(x=22, y=53) self.usr_entry = Entry(lgn_Screen, width=25) self.usr_entry.place(x=72, y=50) #Passowrd Entry self.pw_label = Label(lgn_Screen, text="Senha:") self.pw_label.place(x=30, y=103) self.pw_entry = Entry(lgn_Screen, show="*", width=25) self.pw_entry.place(x=72, y=100) def validate(): usr = str(self.usr_entry.get()) pw = str(self.pw_entry.get()) print(usr) print(pw) #Separator message self.pane_W_Text = LabelFrame(lgn_Screen, text='Your Message:', width=300, height=200) self.pane_W_Text.place(x=1, y=210) #textbox self.tb = Text(lgn_Screen, width=35, height=8, borderwidth=0) self.tb.place(x=7, y=225) #Separator data self.pane_groups = LabelFrame(lgn_Screen, text='Seus Grupos aparecerão aqui:', width=300, height=200) self.pane_groups.place(x=1, y=410) self.tvGroups = Treeview(lgn_Screen) self.tvGroups.place(x=7, y=425, width=287, height=130) #Aviso de Botão fontStyle = tkFont.Font(size=8) self.advcLbl = Label( lgn_Screen, text= "* Aviso: o botão para confirmar o grupo será \nliberado em breve!", font=fontStyle) self.advcLbl.place(x=7, y=610) def conf_Message(): msg = str(self.tb.get('1.0', 'end-1c')) print(msg) from selenium import webdriver from time import sleep from selenium.webdriver.common.keys import Keys url = "https://facebook.com/" d = webdriver.Chrome() d.get(url) sleep(2) target_user = d.find_element_by_xpath('//*[@id="email"]') target_pw = d.find_element_by_xpath('//*[@id="pass"]') target_user.click() sleep(2) target_user.send_keys(str(self.usr_entry.get())) sleep(2) target_pw.send_keys(str(self.pw_entry.get())) sleep(6) log_in = d.find_element_by_xpath('//*[@id="u_0_b"]') sleep(1) log_in.click() sleep(3) webdriver.ActionChains(d).send_keys(Keys.ESCAPE).perform() sleep(4) explore_Group = d.find_element_by_xpath( '//*[@id="navItem_1434659290104689"]/a/div') explore_Group.click() sleep(3) webdriver.ActionChains(d).send_keys(Keys.ESCAPE).perform() sleep(1) try: while True: see_more = d.find_element_by_xpath( "//*[contains(text(), 'Ver mais')]") see_more.click() sleep(2) except: pass sleep(3) groups = d.find_elements_by_class_name('_2yaa') l_groups = [] for g_names in groups: l_groups.append(str(g_names.text)) print(l_groups) group_index = [] counter = 0 for j in l_groups[:-1]: if str(j) == 'Descobrir': continue print(str(counter) + " - " + str(j)) counter += 1 self.tvGroups.insert('', 'end', text=j) #selected_Group = "" def confirmGroup(): self.cur = self.tvGroups.focus() self.selectedItem = str(self.tvGroups.item(self.cur)['text']) print(self.selectedItem) openGroup = d.find_element_by_xpath("//*[contains(text(), '" + self.selectedItem + "')]") openGroup.click() sleep(6) postit = d.find_element_by_xpath( "//*[@name='xhpc_message_text']") postit.send_keys(str(self.tb.get('1.0', 'end-1c'))) sleep(5) publish = d.find_element_by_class_name('_332r') publish.click() self.selgroup = Button(lgn_Screen, text="Confirmar", width=10, font='Verdana 8', borderwidth=0, bg='#FFFFFF', fg='#363636', command=confirmGroup) self.selgroup.place(x=175, y=570) self.cnf_Msg = Button(lgn_Screen, text="Confirmar", width=10, font='Verdana 8', borderwidth=0, bg='#FFFFFF', fg='#363636', command=conf_Message) self.cnf_Msg.place(x=175, y=370, height=20)
def imu_visualization(): #TKINTER setup root = tk.Tk() root.title = 'Imu visualization' nb = Notebook(root) #Grid the notebook nb.grid(row = 0, column = 0) #initialize the frame embed = tk.Frame(root, width=580, height = 500) #if the notebook is grided, no need to pack, if not, use the following one line of code #embed.pack() nb.add(embed, text="imuviz tab") #Tell pygame's SDL window which window ID to use os.environ['SDL_WINDOWID'] = str(embed.winfo_id()) #show the window so it's assigned an ID root.update() label_yaw = Label(embed, text = "Yaw:") label_pitch = Label(embed, text = "Pitch:") label_roll = Label(embed, text = "Roll:") label_yaw.place(x=500,y = 0) label_pitch.place(x=500, y = 50) label_roll.place(x=500, y = 100) entry_yaw = Entry(embed, text = "Yaw:") entry_pitch = Entry(embed, text = "Pitch:") entry_roll = Entry(embed, text = "Roll:") entry_yaw.place(x = 500, y = 25) entry_pitch.place(x = 500, y = 75) entry_roll.place(x = 500, y = 125) #PYGAME pygame.init() screen = Screen(500,500,scale=1.5) cube = Cube(40,30,60) # test the ponycube q = Quaternion(1,0,0,0) incr = Quaternion(0.96,0.01,0.01,0).normalized() #initialize client imuc = IMUTCPClient.IMUTCPClient() while True: #recieve IMU data control = imuc.recv_imu_update() if control is not None: print(control) entry_yaw.delete(0,tk.END) entry_yaw.insert(0, str(control["yaw"])) entry_pitch.delete(0,tk.END) entry_pitch.insert(0, str(control["pitch"])) entry_roll.delete(0,tk.END) entry_roll.insert(0, str(control["roll"])) # #test the entry using random numbers # entry_yaw.delete(0,tk.END) # entry_yaw.insert(0, str(round(numpy.random.randn(),6))) # entry_pitch.delete(0,tk.END) # entry_pitch.insert(0, str(round(numpy.random.randn(),6))) # entry_roll.delete(0,tk.END) # entry_roll.insert(0, str(round(numpy.random.randn(),6))) q = Quaternion(control["quatW"], control["quatX"], control["quatY"], control["quatZ"]).normalized() # #test the ponycube # q = q * incr cube.draw(screen,q) event = pygame.event.poll() pygame.display.flip() pygame.time.delay(50) cube.erase(screen) #TKINTER root.update()
class MainWindow: def __init__(self) -> None: self.Root = Tk() self.App = Frame(self.Root, padding=(5, 2)) self.UpdatesFrame = LabelFrame(self.App, text='Обновление', borderwidth=2, relief='sunken', padding=(5, 2)) self.upd_enabled = BooleanVar() # Флаг обновлений self.upd_unit = StringVar() # Единица измерения времени self.time_units = {Minutes: 'Минут', Hours: 'Часов', Days: 'Дней', Weeks: 'Недель', Months: 'Месяцев'} self.size_units = {Bytes: 'Байт', KBytes: 'Кбайт', MBytes:'Мбайт', GBytes:'Гбайт', TBytes:'Тбайт'} # Список единиц измерения времени self.maxfsize = StringVar() # Максимальный размер файла self.size_unit = StringVar() # Единица измерения информации self.units_amount1 = StringVar() # Количество единиц self.quar = BooleanVar() # False - удалять, True - карантин self.quar_path = StringVar() # Расположение карантина self.rpt_enabled = BooleanVar() # Флаг отправки отчета self.email = StringVar() # Адрес отправки self.passwd = StringVar() # Пароль исходящего ящика self.rpt_unit = StringVar() # Единица измерения времени self.units_amount2 = StringVar() # Количество единиц self.Upd_Label1 = Label(self.UpdatesFrame, text='Проверять обновления антивирусных баз') self.Upd_Checkbutton1 = Checkbutton(self.UpdatesFrame, variable=self.upd_enabled) self.Upd_Label2 = Label(self.UpdatesFrame, text='Частота проверки: каждые') self.Upd_Spinbox1 = Spinbox(self.UpdatesFrame, textvariable=self.units_amount1, from_=1, to=999999999, width=4) self.Upd_OptionMenu1 = OptionMenu(self.UpdatesFrame, self.upd_unit, *self.time_units.values()) self.Upd_Button1 = Button( self.UpdatesFrame, text='Источники антивирусных сигнатур', command=EntryOptionsWindow('AV_SOURCES', self.Root).main) self.ScanFrame = LabelFrame(self.App, text='Сканирование', borderwidth=2, relief='sunken', padding=(5, 2)) self.Scn_Label1 = Label(self.ScanFrame, text='Максимальный размер файла:') self.Scn_Spinbox1 = Spinbox(self.ScanFrame, textvariable=self.maxfsize, from_=0, to=999999999, width=8) self.Quar_Label = Label(self.ScanFrame, text='При обнаружении угрозы') self.Quar_RadButton1 = Radiobutton(self.ScanFrame, text='Удаление', variable=self.quar, value=False) self.Quar_RadButton2 = Radiobutton(self.ScanFrame, text='Карантин', variable=self.quar, value=True) self.Scn_OptionMenu1 = OptionMenu(self.ScanFrame, self.size_unit, *self.size_units.values()) self.Scn_Edit_Targets = Button(self.ScanFrame, text='Цели сканирования', command=EntryOptionsWindow('SCAN_TARGETS', self.Root, select_path=True).main) self.Scn_Edit_Exceptions = Button(self.ScanFrame, text='Исключения', command=EntryOptionsWindow('SCAN_EXCLUDE', self.Root).main) self.Quar_Button1 = Button(self.ScanFrame, text='Расположение карантина', command=lambda: self.quar_path.set(filedialog.askdirectory())) self.ReportFrame = LabelFrame(self.App, text='Отправка отчета', borderwidth=2, relief='sunken', padding=(5, 2)) self.Rpt_Label1 = Label(self.ReportFrame, text='Отправлять отчеты о сканировании') self.Rpt_Checkbutton1 = Checkbutton(self.ReportFrame, variable=self.rpt_enabled) self.Rpt_Label2 = Label(self.ReportFrame, text='Адрес отправки отчетов:') self.Rpt_Entry1 = Entry(self.ReportFrame, textvariable=self.email, width=32) self.Rpt_Label3 = Label(self.ReportFrame, text='Пароль:') self.Rpt_Entry2 = Entry(self.ReportFrame, textvariable=self.passwd, width=32, show='*') self.Rpt_Label4 = Label(self.ReportFrame, text='Частота:') self.Rpt_Spinbox1 = Spinbox(self.ReportFrame, textvariable=self.units_amount2, from_=1, to=999999999, width=4) self.Rpt_OptionMenu1 = OptionMenu(self.ReportFrame, self.rpt_unit, *self.time_units.values()) self.Rpt_Button1 = Button(self.ReportFrame, text='Получатели', command=EntryOptionsWindow('SEND_TO', self.Root).main) self.Buttons = Frame(self.App, padding=(5, 2)) self.Button1 = Button(self.Buttons, text='Готово', command=self.save_conf) self.Button2 = Button(self.Buttons, text='Отмена', command=self.Root.destroy) def main(self) -> None: self.upd_unit.set(self.time_units[type(UPDATE_FREQ)]) self.units_amount1.set(UPDATE_FREQ.value) self.upd_enabled.set(CHECK_FOR_UPDATES) self.Upd_Checkbutton1.configure(command=( lambda: self.__change_state( self.upd_enabled, self.Upd_Label2, self.Upd_Spinbox1, self.Upd_OptionMenu1, self.Upd_Button1) and self.upd_enabled.set(not self.upd_enabled.get()))) self.Rpt_Checkbutton1.configure(command=( lambda: self.__change_state( self.rpt_enabled, self.Rpt_Label2, self.Rpt_Entry1, self.Rpt_Label3, self.Rpt_Entry2, self.Rpt_Label4, self. Rpt_Spinbox1, self.Rpt_OptionMenu1, self.Rpt_Button1) and self.rpt_enabled.set(not self.rpt_enabled.get()))) self.maxfsize.set(MAX_FILE_SIZE.value) self.size_unit.set(self.size_units[type(MAX_FILE_SIZE)]) self.quar.set(REMOVE_THREATS) self.quar_path.set(QUARANTINE_PATH) self.rpt_enabled.set(SEND_SCAN_REPORTS) self.email.set(SEND_FROM) self.passwd.set(SEND_PASSWD) self.rpt_unit.set(self.time_units[type(SEND_FREQ)]) self.units_amount2.set(SEND_FREQ.value) self.App.pack(fill='both', expand=True) center_win(self.Root, '500x500') self.Root.resizable(False, False) self.Root.title('CobraAV Configuration') self.UpdatesFrame.place(y=0, height=150, width=490) self.__change_state(self.upd_enabled, self.Upd_Label2, self.Upd_Spinbox1, self.Upd_OptionMenu1) self.__change_state(self.rpt_enabled, self.Rpt_Label2, self.Rpt_Entry1, self.Rpt_Label3, self.Rpt_Entry2, self.Rpt_Label4, self.Rpt_Spinbox1, self.Rpt_OptionMenu1, self.Rpt_Button1) self.Upd_Label1.place(relx=.01, rely=.05) # Проверять обновления ? self.Upd_Checkbutton1.place(relx=.8, rely=.05) # Да/Нет self.Upd_Label2.place(relx=.01, rely=.3) # Частота проверки self.Upd_Spinbox1.place(relx=.55, rely=.3, width=60) # Количество self.Upd_OptionMenu1.place(relx=.72, rely=.28) # Единицы измерения self.Upd_Button1.place(relx=.01, rely=.65) # Источники сигнатур self.ScanFrame.place(y=150, height=150, width=490) self.Scn_Label1.place(relx=.01, rely=.05) # Максимальный размер файла self.Scn_Spinbox1.place(relx=.55, rely=.05, width=60) # Количество self.Quar_Label.place(relx=.01, rely=.35) self.Quar_RadButton1.place(relx=.52, rely=.35) # Переключатель на удаление угрозы self.Quar_RadButton2.place(relx=.72, rely=.35) # Переключатель на добавление вкарантина угрозы self.Quar_Button1.place(relx=.56, rely=.65) # Расположение карантина self.Scn_OptionMenu1.place(relx=.72, rely=.014) # Единицы измерения self.Scn_Edit_Targets.place(relx=.01, rely=.65) # Цели сканирования self.Scn_Edit_Exceptions.place(relx=.33, rely=.65) # Исключения self.Rpt_Label1.place(relx=.01, rely=.05) # Отправлять отчеты ? self.Rpt_Checkbutton1.place(relx=.8, rely=.05) # Да/Нет self.ReportFrame.place(y=300, height=150, width=490) self.Rpt_Label2.place(relx=.01, rely=.35) # Адрес отправки отчетов: self.Rpt_Entry1.place(relx=.35, rely=.35) # Ввод адреса отправки отчетов self.Rpt_Label3.place(relx=.01, rely=.50) # Пароль: self.Rpt_Entry2.place(relx=.35, rely=.50) # Ввод пароля: self.Rpt_Label4.place(relx=.01, rely=.75) # Частота отправки self.Rpt_Spinbox1.place(relx=.35, rely=.75, width=60) # Количество self.Rpt_OptionMenu1.place(relx=.52, rely=.72) # Единицы измерения self.Rpt_Button1.place(relx=.72, rely=.74) # Получатели self.Buttons.place(y=450, height=50, width=490) self.Button1.place(relx=.62, rely=.2) # Кнопка "Готово" self.Button2.place(relx=.82, rely=.2) # Кнопка "Отмена" self.Root.mainloop() @staticmethod def __change_state(state: BooleanVar, *args: Widget) -> None: for i in args: i.configure(state=('disabled', 'normal')[state.get()]) def save_conf(self) -> None: size_units = {v: k for k, v in self.size_units.items()} time_units = {v: k for k, v in self.time_units.items()} def wrap_list(a: 'list[str]') -> str: return '[' + ', '.join(f"r'{i}'" for i in a) + ']' def wrap_cls(_unit: Variable, amount: Variable) -> str: unit = _unit.get() if unit in size_units: return size_units[unit].__name__ + f'({amount.get()})' elif unit in time_units: return time_units[unit].__name__ + f'({amount.get()})' else: raise NotImplementedError with open(CONF_PATH, 'w') as f: f.write( f"""from libunits import * CHECK_FOR_UPDATES = {int(self.upd_enabled.get())} # Check for updates UPDATE_FREQ = {wrap_cls(self.upd_unit, self.units_amount1)} # Check interval MAX_FILE_SIZE = {wrap_cls(self.size_unit, self.maxfsize)} # Max file size # Antivirus database sources AV_SOURCES = {wrap_list(AV_SOURCES)} # Antivirus database path DB_PATH = r'{DB_PATH}' # On threat: # 0 - quarantine # 1 - remove REMOVE_THREATS = {int(self.quar.get())} # Directories to scan SCAN_TARGETS = {wrap_list(SCAN_TARGETS)} # Exclude from scanning SCAN_EXCLUDE = {wrap_list(SCAN_EXCLUDE)} # quarantine location QUARANTINE_PATH = r'{self.quar_path.get() or QUARANTINE_PATH}' # Send scan reports SEND_SCAN_REPORTS = {int(self.rpt_enabled.get())} # Scan reports frequency SEND_FREQ = {wrap_cls(self.rpt_unit, self.units_amount2)} # Send from this email SEND_FROM = r'{self.email.get()}' # Sender email password SEND_PASSWD = r'{self.passwd.get()}' # Send to these emails SEND_TO = {wrap_list(SEND_TO)} """) self.Root.destroy()
class App_test(object): def __init__(self, master, fuc): self.win = master self.win.title('12306火车票查询系统V2.6') curWidth = self.win.winfo_width() curHeight = self.win.winfo_height() scnWidth, scnHeight = self.win.maxsize() tmpcnf = '1130x600+500+300' # % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2) self.win.geometry(tmpcnf) self.creat_res() self.add_train_info() self.add_check_button() self.res_config(fuc) self.set_combox_defaut() self.train_message = {} # self.get_train_args() # self.win.mainloop() def creat_res(self): self.v = IntVar() # 车票查询 self.v.set(True) self.temp = StringVar() # 开始站 self.temp2 = StringVar() # 目的站 self.start_mon = StringVar() # 出发月 self.start_day = StringVar() # 出发日 self.start_year = StringVar() # 出啊年 self.La_start_end = Label(self.win, text="请输入出发地和目的地", fg="blue") self.E_startstation = Entry(self.win, textvariable=self.temp) self.E_endstation = Entry(self.win, textvariable=self.temp2) self.La_startstation = Label(self.win, text="出发站:") self.La_endstation = Label(self.win, text="目的站:") self.La_time = Label(self.win, text="请选择出发时间-年-月-日", fg="blue") self.B_search = Button(self.win, text="搜索") self.R_site = Radiobutton(self.win, text="车票查询", variable=self.v, value=True) self.R_price = Radiobutton(self.win, text="票价查询", variable=self.v, value=False) self.B_buy_tick = Button(self.win, text="购票") self.C_year = Combobox(self.win, textvariable=self.start_year) self.La_s = Label(self.win, text="--") self.C_mon = Combobox(self.win, textvariable=self.start_mon) self.La_s1 = Label(self.win, text="--") self.C_day = Combobox(self.win, textvariable=self.start_day) # 滚动条 self.S_move = Scrollbar(self.win) self.La_start_end.place(x=10, y=10, width=150, height=30) self.E_startstation.place(x=70, y=50, width=145, height=30) self.E_startstation.insert(10, "杭州东") self.E_endstation.place(x=70, y=100, width=145, height=30) self.E_endstation.insert(10, "南京南") self.La_startstation.place(x=10, y=50, width=50, height=30) self.La_endstation.place(x=10, y=100, width=50, height=30) self.La_time.place(x=0, y=140, width=190, height=30) self.C_year.place(x=10, y=180, width=70, height=30) self.La_s.place(x=80, y=180, width=20, height=30) self.C_mon.place(x=100, y=180, width=50, height=30) self.La_s1.place(x=150, y=180, width=20, height=30) self.C_day.place(x=170, y=180, width=50, height=30) self.B_search.place(x=10, y=220, width=80, height=40) self.S_move.place(x=1100, y=40, width=30, height=550) self.B_buy_tick.place(x=10, y=310, width=80, height=40) self.R_site.place(x=10, y=270, width=90, height=30) self.R_price.place(x=100, y=270, width=90, height=30) def res_config(self, fuc): localTime = time.localtime(int(time.time())) # 获取今年的年份 startTime = int(time.strftime("%Y", localTime)) # 2018 self.C_year.config( values=[x for x in range(startTime, startTime + 10)]) self.C_mon.config(values=["{:02d}".format(x) for x in range(1, 13)]) # 时间格式是2018-01-01 self.C_day.config(values=["{:02d}".format(x) for x in range(1, 32)]) self.B_search.config(command=fuc) self.S_move.config(command=self.tree.yview) self.tree.config(yscrollcommand=self.S_move.set) def add_train_info(self): lis_train = ["C" + str(x) for x in range(0, 15)] tuple_train = tuple(lis_train) self.tree = Treeview(self.win, columns=tuple_train, height=30, show="headings") self.tree.place(x=228, y=40, width=870, height=550) train_info = [ ' 车次 ', ' 出发/到达站', '出发/到达时间', '历时 ', '商/特座', '一等座', '二等座', '高软', '软卧', '动卧', '硬卧', '软座', '硬座', '无座', '其他' ] for i in range(0, len(lis_train)): self.tree.column(lis_train[i], width=len(train_info[i]) * 11, anchor='center') self.tree.heading(lis_train[i], text=train_info[i]) def add_check_button(self): self.v1 = IntVar() self.v2 = IntVar() self.v3 = IntVar() self.v4 = IntVar() self.v5 = IntVar() self.v6 = IntVar() self.v7 = IntVar() self.v1.set("T") self.Check_total = Checkbutton(self.win, text="全部车次", variable=self.v1, onvalue='T') self.Check_total.place(x=228, y=7, width=90, height=30) self.Check_total = Checkbutton(self.win, text="G-高铁", variable=self.v2, onvalue='T') self.Check_total.place(x=318, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="D-动车", variable=self.v3, onvalue='T') self.Check_total.place(x=398, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="Z-直达", variable=self.v4, onvalue='T') self.Check_total.place(x=478, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="T-特快", variable=self.v5, onvalue='T') self.Check_total.place(x=558, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="K-快速", variable=self.v6, onvalue='T') self.Check_total.place(x=638, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="其他", variable=self.v7, onvalue='T') self.Check_total.place(x=718, y=7, width=70, height=30) # 设置下拉框默认值 def set_combox_defaut(self): localTime = time.localtime(int(time.time())) mon = int(time.strftime("%m", localTime)) day = int(time.strftime("%d", localTime)) self.C_year.current(0) self.C_mon.current(mon - 1) self.C_day.current(day - 1)
TCombobox3 = Combobox(Frame3) TCombobox3.place(relx=0.11, rely=0.19, relheight=0.08, relwidth=0.6) TCombobox3.configure(textvariable=combobox2) TCombobox3.configure(width=173) TCombobox3.configure(takefocus="") TCombobox3['values'] = hashtags Radiobutton2 = Radiobutton(Frame3) Radiobutton2.place(relx=0.07, rely=0.3, relheight=0.09, relwidth=0.44) Radiobutton2.configure(text='''Multiple Hashtags''') Radiobutton2.configure(value="2") Radiobutton2.configure(variable=radio) Entry1 = Entry(Frame3) Entry1.place(relx=0.11, rely=0.42, relheight=0.08, relwidth=0.51) Entry1.configure(width=144) Button2 = Button(Frame3) Button2.place(relx=0.63, rely=0.42, height=20, width=20) Button2.configure(padding=(2, 0, 0, 0)) Button2.configure(text='''+''') Button3 = Button(Frame3) Button3.place(relx=0.74, rely=0.87, height=25, width=60) Button3.configure(padding=(2, 0, 0, 0)) Button3.configure(text='''Follow''') Button3.configure(command=follow) Button3.configure(width=56) Scale1 = Scale(Frame3, command=lambda s: struc1(s))
split_name = [x.split() for x in name] l1_string = "" l2_string = "" l3_string = "" # Title title = Label(root, text=" Epidemic Map") title.config(font=(35)) title.place(x=380, y=20) # id input text label1 = Label(root, text="Enter ID Number :") label1.place(x=50, y=120) id = Entry(root, width=20) id.place(x=150, y=120) #Split Label split_label = Label( root, text= "-------------------------------------------------------------------------" ) split_label.place(x=40, y=150) # Layer One : Person split_label2 = Label( root, text= "-------------------------------------------------------------------------"
class UnrealAirSimGUI(multiprocessing.Process): def __init__(self, dataPipe, vehicle_names): multiprocessing.Process.__init__(self) self.dataPipe = dataPipe self.vehicle_names = vehicle_names self.WIDTH = 580 self.HEIGHT = 500 self.update_tracking_interval = 20 self.start() def run(self): # 1/2 Configure the Individual GUI Tabs print("Start GUI Setup!") self.root = tk.Tk() # The GUI self.root.title("Unreal Vehicle GUI") self.nb = Notebook(self.root) # Add Main Tab self.StateFrame = Frame(self.nb, width = self.WIDTH, height = self.HEIGHT) # Top of Gui self.nb.add(self.StateFrame, text = "Vehicle State") # Get Notebook Gridded self.nb.grid(row = 0, column = 0) # Configure Video Tab self.VideoFrame = Frame(self.nb, width = self.WIDTH, height = self.HEIGHT) self.nb.add(self.VideoFrame, text = "Video Feed") # Configure Plotting Tab self.PlottingFrame = Frame(self.nb, width = self.WIDTH, height = self.HEIGHT) self.nb.add(self.PlottingFrame, text = "Track n' Map") self.fig = plt.figure(1, figsize= (4,4)) self.ax = Axes3D(self.fig) self.last_3d_viz_x_pos = 0 self.last_3d_viz_y_pos = 0 self.last_3d_viz_z_pos = 0 self.ax.scatter(self.last_3d_viz_x_pos,self.last_3d_viz_y_pos,self.last_3d_viz_z_pos) self.canvas = FigureCanvasTkAgg(self.fig, self.PlottingFrame) self.canvas.get_tk_widget().grid(row = 1, column = 0) # Configure Virtual IMU Tab: self.embed = tk.Frame(self.root, width = self.WIDTH, height = self.HEIGHT) self.nb.add(self.embed, text="Virtual IMU") os.environ['SDL_WINDOWID'] = str(self.embed.winfo_id()) #Tell pygame's SDL window which window ID to use # Start PYGAME for IMU Visualization pygame.init() self.screen = Screen(500,500, scale=1.5) self.cube = Cube(40,40,40) # END Initialization self.root.update() # 2/2 Configure the Labels and Entries on the GUI # For Switch Vehicle Feeds self.current_vehicle_feed = tk.StringVar(self.StateFrame) # Linked to current vehicle choice self.switch_vehicle_feed = Combobox(self.StateFrame, textvariable = self.current_vehicle_feed) self.switch_vehicle_feed['values'] = self.vehicle_names self.switch_vehicle_feed.grid(row = 0, column = 3) self.switch_vehicle_feed.current(0) # Labels for state variables self.label_posx = Label(self.StateFrame, text = "PosX:") self.label_posy = Label(self.StateFrame, text = "PosY:") self.label_posz = Label(self.StateFrame, text = "PosZ:") self.label_velx = Label(self.StateFrame, text = "Vel X:") self.label_vely = Label(self.StateFrame, text = "Vel Y:") self.label_velz = Label(self.StateFrame, text = "Vel Z:") self.label_accx = Label(self.StateFrame, text = "Acc X:") self.label_accy = Label(self.StateFrame, text = "Acc Y:") self.label_accz = Label(self.StateFrame, text = "Acc Z:") self.label_rollrate = Label(self.StateFrame, text = "Roll Rate:") self.label_pitchrate = Label(self.StateFrame, text = "Pitch Rate:") self.label_yawrate = Label(self.StateFrame, text = "Yaw Rate:") self.label_angaccx = Label(self.StateFrame, text = "AngAcc X:") self.label_angaccy = Label(self.StateFrame, text = "AngAcc Y:") self.label_angaccz = Label(self.StateFrame, text = "AngAcc Z:") self.label_roll = Label(self.StateFrame, text = "Roll:") self.label_pitch = Label(self.StateFrame, text = "Pitch:") self.label_yaw = Label(self.StateFrame, text = "Yaw:") # Assemble into grid -- No need to pack if you are using grid self.label_posx.grid(row = 0, column = 0) self.label_posy.grid(row = 1, column = 0) self.label_posz.grid(row = 2, column = 0) self.label_velx.grid(row = 3, column = 0) self.label_vely.grid(row = 4, column = 0) self.label_velz.grid(row = 5, column = 0) self.label_accx.grid(row = 6, column = 0) self.label_accy.grid(row = 7, column = 0) self.label_accz.grid(row = 8, column = 0) self.label_rollrate.grid(row = 9, column = 0) self.label_pitchrate.grid(row = 10, column = 0) self.label_yawrate.grid(row = 11, column = 0) self.label_angaccx.grid(row = 12, column = 0) self.label_angaccy.grid(row = 13, column = 0) self.label_angaccz.grid(row = 14, column = 0) self.label_roll.grid(row = 15, column = 0) self.label_pitch.grid(row = 16, column = 0) self.label_yaw.grid(row = 17, column = 0) # Entries for State Updates: self.entry_posx = Entry(self.StateFrame, text = "PosX:") self.entry_posy = Entry(self.StateFrame, text = "PosY:") self.entry_posz = Entry(self.StateFrame, text = "PosZ:") self.entry_velx = Entry(self.StateFrame, text = "Vel X:") self.entry_vely = Entry(self.StateFrame, text = "Vel Y:") self.entry_velz = Entry(self.StateFrame, text = "Vel Z:") self.entry_accx = Entry(self.StateFrame, text = "Acc X:") self.entry_accy = Entry(self.StateFrame, text = "Acc Y:") self.entry_accz = Entry(self.StateFrame, text = "Acc Z:") self.entry_roll = Entry(self.StateFrame, text = "Roll:") self.entry_pitch = Entry(self.StateFrame, text = "Pitch:") self.entry_yaw = Entry(self.StateFrame, text = "Yaw:") self.entry_rollrate = Entry(self.StateFrame, text = "Roll Rate:") self.entry_pitchrate = Entry(self.StateFrame, text = "Pitch Rate:") self.entry_yawrate = Entry(self.StateFrame, text = "Yaw Rate:") self.entry_angaccx = Entry(self.StateFrame, text = "AngAcc X:") self.entry_angaccy = Entry(self.StateFrame, text = "AngAcc Y:") self.entry_angaccz = Entry(self.StateFrame, text = "AngAcc Z:") # Entries Gridded self.entry_posx.grid(row = 0, column = 1) self.entry_posy.grid(row = 1, column = 1) self.entry_posz.grid(row = 2, column = 1) self.entry_velx.grid(row = 3, column = 1) self.entry_vely.grid(row = 4, column = 1) self.entry_velz.grid(row = 5, column = 1) self.entry_accx.grid(row = 6, column = 1) self.entry_accy.grid(row = 7, column = 1) self.entry_accz.grid(row = 8, column = 1) self.entry_roll.grid(row = 15, column = 1) self.entry_pitch.grid(row = 16, column = 1) self.entry_yaw.grid(row = 17, column = 1) self.entry_rollrate.grid(row = 9, column = 1) self.entry_pitchrate.grid(row = 10, column = 1) self.entry_yawrate.grid(row = 11, column = 1) self.entry_angaccx.grid(row = 12, column = 1) self.entry_angaccy.grid(row = 13, column = 1) self.entry_angaccz.grid(row = 14, column = 1) # Meta Data For the State Page self.entry_action = Entry(self.StateFrame, text = "Action") self.entry_action_name = Entry(self.StateFrame, text = "Action Name") self.entry_env_state = Entry(self.StateFrame, text = "Env State") self.entry_mode = Entry(self.StateFrame, text = "GUI Mode") self.entry_act_time = Entry(self.StateFrame, text = "Action Time") self.entry_sim_image_time = Entry(self.StateFrame, text = "Sim Image Get Time") self.entry_sim_state_time = Entry(self.StateFrame, text = "Sim State Get Time") self.entry_reward_time = Entry(self.StateFrame, text = "Sim Calc Reward Time") self.entry_step_time = Entry(self.StateFrame, text = "Step Time") self.entry_reward = Entry(self.StateFrame, text = "Reward") self.entry_done = Entry(self.StateFrame, text = "Done Flag") self.label_action = Label(self.StateFrame, text = "Action:") self.label_action_name = Label(self.StateFrame, text = "Action Name:") self.label_env_state = Label(self.StateFrame, text = "Env State:") self.label_mode = Label(self.StateFrame, text = "GUI Mode:") self.label_act_time = Label(self.StateFrame, text = "Action Time:") self.label_sim_image_time = Label(self.StateFrame, text = "Sim Image Get Time:") self.label_sim_state_time = Label(self.StateFrame, text = "Sim State Get Time:") self.label_reward_time = Label(self.StateFrame, text = "Calc Reward Time:") self.label_step_time = Label(self.StateFrame, text = "Env Step Time:") self.label_reward = Label(self.StateFrame, text = "Reward:") self.label_done = Label(self.StateFrame, text = "Done:") # Grid Meta Data Display self.label_action.grid(row = 5, column = 2) self.label_action_name.grid(row = 6, column = 2) self.label_env_state.grid(row = 7, column = 2) self.label_mode.grid(row = 8, column = 2) self.label_act_time.grid(row = 9, column = 2) self.label_sim_image_time.grid(row = 10, column = 2) self.label_sim_state_time.grid(row = 11, column = 2) self.label_reward_time.grid(row = 12, column = 2) self.label_step_time.grid(row = 13, column = 2) self.label_reward.grid(row = 14, column = 2) self.label_done.grid(row = 15, column = 2) self.entry_action.grid(row = 5, column = 3) self.entry_action_name.grid(row = 6, column = 3) self.entry_env_state.grid(row = 7, column = 3) self.entry_mode.grid(row = 8, column = 3) self.entry_act_time.grid(row = 9, column = 3) self.entry_sim_image_time.grid(row = 10, column = 3) self.entry_sim_state_time.grid(row = 11, column = 3) self.entry_reward_time.grid(row = 12, column = 3) self.entry_step_time.grid(row = 13, column = 3) self.entry_reward.grid(row = 14, column = 3) self.entry_done.grid(row = 15, column = 3) # Initialize the Vehicle's Virtual IMU Visualization self.label_yaw = Label(self.embed, text = "Yaw:") self.label_pitch = Label(self.embed, text = "Pitch:") self.label_roll = Label(self.embed, text = "Roll:") self.label_yaw.place(x=500,y = 0) # Place the Labels on the far right of the frame self.label_pitch.place(x=500, y = 50) self.label_roll.place(x=500, y = 100) self.entry_imu_yaw = Entry(self.embed, text = "Yaw:") self.entry_imu_pitch = Entry(self.embed, text = "Pitch:") self.entry_imu_roll = Entry(self.embed, text = "Roll:") self.entry_yaw.place(x = 500, y = 25) self.entry_pitch.place(x = 500, y = 75) self.entry_roll.place(x = 500, y = 125) print("GUI Setup DONE!") t_upd = threading.Thread(target = self.updates) t_upd.start() self.root.mainloop() def updates(self): time.sleep(1.5) while True: # Data comes in as a dictionary of 'obs', 'state', 'meta' data = self.dataPipe.recv() vehicle_name = self.current_vehicle_feed.get() # Run the inertial update thread self.t_states = threading.Thread(target = self.update_inertial_states, args = (data[vehicle_name]['state'],)) self.t_states.start() # Start Updater thread by setting the event # Run the Image Data thread self.t_imgs = threading.Thread(target = self.update_image_feeds, args = (data[vehicle_name]['obs'],)) self.t_imgs.start() # Run the meta data update self.t_meta = threading.Thread(target = self.update_metas, args = (data[vehicle_name]['meta'],)) self.t_meta.start() self.t_v_imu_viz = threading.Thread(target = self.update_virtual_imu_visualization, args = (data[vehicle_name]['state'],)) self.t_v_imu_viz.start() self.t_3d_track_viz = threading.Thread(target = self.update_object_3DVisualization, args = (data[vehicle_name]['state'],)) self.t_3d_track_viz.start() # Join Threads self.t_states.join() self.t_imgs.join() self.t_meta.join() self.t_v_imu_viz.join() self.t_3d_track_viz.join() def update_metas(self, data): meta = data self.entry_action_name.delete(0,tk.END) self.entry_action_name.insert(0,str(meta['action_name'])) self.entry_action.delete(0,tk.END) self.entry_action.insert(0,str(meta['action'])) self.entry_env_state.delete(0,tk.END) self.entry_env_state.insert(0,str(meta['env_state'])) self.entry_mode.delete(0,tk.END) self.entry_mode.insert(0,str(meta['mode'])) self.entry_act_time.delete(0, tk.END) self.entry_act_time.insert(0, str(meta['times']['act_time'])) self.entry_sim_image_time.delete(0,tk.END) self.entry_sim_image_time.insert(0,str(meta['times']['sim_img_time'])) self.entry_sim_state_time.delete(0,tk.END) self.entry_sim_state_time.insert(0,str(meta['times']['sim_state_time'])) self.entry_reward_time.delete(0,tk.END) self.entry_reward_time.insert(0,str(meta['times']['reward_time'])) self.entry_step_time.delete(0, tk.END) self.entry_step_time.insert(0, str(meta['times']['step_time'])) self.entry_reward.delete(0, tk.END) self.entry_reward.insert(0, str(meta['reward'])) self.entry_done.delete(0, tk.END) self.entry_done.insert(0, str(meta['done'])) def update_image_feeds(self, data): scalar = 3 col_count = 0 row_count = 0 sim_images = data print("GUI Image Update:") start_time = time.time() for key in sim_images: if len(sim_images[key][0]) > 0: for i in range(self.num_video_feeds): sim_image = sim_images[:,:,scalar*i:scalar*(i+1)] if scalar == 1: sim_image = np.reshape(sim_image, (sim_image.shape[0], sim_image.shape[1])) if ((i % 3) == 0): col_count = 0 row_count += 1 #print('sim image shape ', sim_image.shape, type(sim_image), sim_image, self.isNormal) if self.isNormal: sim_image = np.array(sim_image * 255, dtype = np.uint8) else: sim_image = np.array(sim_image, dtype = np.uint8) img = Image.fromarray(sim_image) imgtk = ImageTk.PhotoImage(image = img) if self.VideoFeeds[i] is None: # Initialize the image panel self.VideoFeeds[i] = Label(self.VideoFrame, image=imgtk) self.VideoFeeds[i].image = imgtk self.VideoFeeds[i].grid(row = row_count, column = col_count) else: self.VideoFeeds[i].configure(image = imgtk) self.VideoFeeds[i].image = imgtk col_count += 1 col_count = 0 row_count = 0 print("Feed Update Time: ", time.time() - start_time) def update_inertial_states(self, data): #print(current_inertial_states) current_inertial_state = data quatx, quaty, quatz, quatw = current_inertial_state[15:] yaw, pitch, roll = SO3Rotation.quaternion_to_euler_angles((quatw, quatx, quaty, quatz)) print('GUI State Update!') start_time = time.time() #print(current_inertial_states, current_inertial_state) self.entry_posx.delete(0,tk.END) self.entry_posx.insert(0, str(current_inertial_state[0])) self.entry_posy.delete(0,tk.END) self.entry_posy.insert(0, str(current_inertial_state[1])) self.entry_posz.delete(0,tk.END) self.entry_posz.insert(0, str(current_inertial_state[2])) self.entry_velx.delete(0,tk.END) self.entry_velx.insert(0, str(current_inertial_state[3])) self.entry_vely.delete(0,tk.END) self.entry_vely.insert(0, str(current_inertial_state[4])) self.entry_velz.delete(0,tk.END) self.entry_velz.insert(0, str(current_inertial_state[5])) self.entry_accx.delete(0,tk.END) self.entry_accx.insert(0, str(current_inertial_state[6])) self.entry_accy.delete(0,tk.END) self.entry_accy.insert(0, str(current_inertial_state[7])) self.entry_accz.delete(0,tk.END) self.entry_accz.insert(0, str(current_inertial_state[8])) self.entry_roll.delete(0,tk.END) self.entry_roll.insert(0, str(roll)) self.entry_pitch.delete(0,tk.END) self.entry_pitch.insert(0, str(pitch)) self.entry_yaw.delete(0,tk.END) self.entry_yaw.insert(0, str(yaw)) self.entry_rollrate.delete(0,tk.END) self.entry_rollrate.insert(0, str(current_inertial_state[9])) self.entry_pitchrate.delete(0,tk.END) self.entry_pitchrate.insert(0, str(current_inertial_state[10])) self.entry_yawrate.delete(0,tk.END) self.entry_yawrate.insert(0, str(current_inertial_state[11])) self.entry_angaccx.delete(0,tk.END) self.entry_angaccx.insert(0, str(current_inertial_state[12])) self.entry_angaccy.delete(0,tk.END) self.entry_angaccy.insert(0, str(current_inertial_state[13])) self.entry_angaccz.delete(0,tk.END) self.entry_angaccz.insert(0, str(current_inertial_state[14])) print('GUI State Update Time! ', time.time() - start_time) def update_virtual_imu_visualization(self, data): quatx = data[15] quaty = data[16] quatz = data[17] quatw = data[18] yaw, pitch, roll = SO3Rotation.quaternion_to_euler_angles((quatw, quatx, quaty, quatz)) self.entry_yaw.delete(0,tk.END) self.entry_yaw.insert(0, str(yaw)) self.entry_pitch.delete(0,tk.END) self.entry_pitch.insert(0, str(pitch)) self.entry_roll.delete(0,tk.END) self.entry_roll.insert(0, str(roll)) q = Quaternion(quatw, quatx, quaty, quatz).normalized() self.cube.draw(self.screen,q) event = pygame.event.poll() pygame.display.flip() pygame.time.delay(10) # ms self.cube.erase(self.screen) #TKINTER self.root.update() def update_object_3DVisualization(self, data): if self.update_tracking_interval % 20 == 0: print("RUNNING 3D VISULIZATION") print(data[0], data[1], data[2]) xpos = data[0] ypos = data[1] zpos = data[2] self.ax.plot3D([self.last_3d_viz_x_pos, xpos], [self.last_3d_viz_y_pos,ypos], zs = [self.last_3d_viz_z_pos, zpos]) self.ax.scatter(xpos, ypos, zpos, color = 'green') self.canvas.draw() self.last_3d_viz_x_pos = xpos self.last_3d_viz_y_pos = ypos self.last_3d_viz_z_pos = zpos self.update_tracking_interval += 1
bt2 = Button(window, text="Train", command=clicked_train) def clicked_open_2(): myLabel4.config(text="Đang chọn ảnh ... ") window.update() global listurl2 listurl2 = tk.filedialog.askopenfilenames( title="Select List File", filetype=(("all files", "*"), ("jpg files", "*.jpg"), ("png files", "*.png"), ("jpeg files", "*.jpeg"))) if (len(listurl2) != 0): myLabel4.config(text="Đã chọn ảnh đối tượng 2") window.update() else: myLabel4.config(text="Chưa chọn ảnh đối tượng 2") window.update() bt3 = Button(window, text="Open Files 2", command=clicked_open_2) bt3.place(x=0, y=50) bt2.place(x=0, y=100) bt.grid(column=0, row=0) name1 = tk.StringVar() name1_textbox = Entry(window, width=15, textvariable=name1) name1_textbox.place(x=150, y=3) name2 = tk.StringVar() name2_textbox = Entry(window, width=15, textvariable=name2) name2_textbox.place(x=150, y=50) window.mainloop()
def initUI(self): # define dialog box properties self.parent.title("Duokan Footnote Linker") self.pack(fill=BOTH, expand=1) # get preferences prefs = self.bk.getPrefs() # info infoLabel = Label(self, text="Additional compatibility: ") infoLabel.place(x=25, y=10) # compatibility check self.kindle = IntVar() # if 'kindle' in prefs: # self.kindle.set(prefs['kindle']) # else: # self.kindle.set(1) self.kindle.set(1) kindleCheck = Checkbutton(self, text="Kindle", variable=self.kindle) kindleCheck.place(x=40, y=30) self.ibooks = IntVar() # if 'ibooks' in prefs: # self.ibooks.set(prefs['ibooks']) # else: # self.ibooks.set(1) self.ibooks.set(1) ibooksCheck = Checkbutton(self, text="iBooks(macOS only)", variable=self.ibooks) ibooksCheck.place(x=150, y=30) # disable compatibility check temporarily # kindleCheck.config(state=tk.DISABLED) # ibooksCheck.config(state=tk.DISABLED) # footnote id prefix anchorIDLabel = Label(self, text="Anchor ID prefix: ") anchorIDLabel.place(x=25, y=60) self.anchorid = StringVar(None) if 'anchorid' in prefs: self.anchorid.set(prefs['anchorid']) else: self.anchorid.set('fnanchor-') anchorIDEntry = Entry(self, textvariable=self.anchorid) anchorIDEntry.place(x=150, y=60, width=85) # footnote definition id fndefIDLabel = Label(self, text="Definition ID prefix: ") fndefIDLabel.place(x=25, y=85) self.fndefid = StringVar(None) if 'fndefid' in prefs: self.fndefid.set(prefs['fndefid']) else: self.fndefid.set('fndef-') fndefIDEntry = Entry(self, textvariable=self.fndefid) fndefIDEntry.place(x=150, y=85, width=85) # backlink class backlinkLabel = Label(self, text="Backlink class: ") backlinkLabel.place(x=25, y=110) self.backlink = StringVar(None) if 'backlink' in prefs: self.backlink.set(prefs['backlink']) else: self.backlink.set('fnsymbol') backlinkEntry = Entry(self, textvariable=self.backlink) backlinkEntry.place(x=150, y=110, width=85) # Notes source location self.separate = IntVar() separateSourceCheck = Checkbutton(self, text="Footnote file: ", variable=self.separate) separateSourceCheck.place(x=5, y=135) self.notesource = StringVar() opf_guide_items = {} for ref_type, title, href in self.bk.getguide(): opf_guide_items[ref_type] = href # look for notes guide item if 'notes' in opf_guide_items: print( 'Separate note source found from OPF guide according to semantics.' ) self.notesource.set(opf_guide_items['notes']) self.separate.set(1) noteSourceEntry = Entry(self, textvariable=self.notesource) noteSourceEntry.place(x=150, y=135, width=150) # OK and Cancel buttons cancelButton = Button(self, text="Cancel", command=self.quit) cancelButton.place(x=25, y=165) okButton = Button(self, text="OK", command=self.savevalues) okButton.place(x=150, y=165)
class Movie_app: def __init__(self): self.win = Tk() self.win.geometry('600x420') self.win.title(" VIP视频破解工具") self.creat_res() self.creat_radiores() self.config() self.page = 1 self.p = Pro() self.win.mainloop() def creat_res(self): #Menu菜单 menu = tk.Menu(self.win) self.win.config(menu=menu) moviemenu = tk.Menu(menu, tearoff=0) menu.add_cascade(label='友情链接', menu=moviemenu) downmenu = tk.Menu(menu, tearoff=0) #各个网站链接 moviemenu.add_command( label='网易公开课', command=lambda: webbrowser.open('http://open.163.com/')) moviemenu.add_command( label='腾讯视频', command=lambda: webbrowser.open('http://v.qq.com/')) moviemenu.add_command( label='搜狐视频', command=lambda: webbrowser.open('http://tv.sohu.com/')) moviemenu.add_command( label='芒果TV', command=lambda: webbrowser.open('http://www.mgtv.com/')) moviemenu.add_command( label='爱奇艺', command=lambda: webbrowser.open('http://www.iqiyi.com/')) moviemenu.add_command( label='PPTV', command=lambda: webbrowser.open('http://www.bilibili.com/')) moviemenu.add_command( label='优酷', command=lambda: webbrowser.open('http://www.youku.com/')) moviemenu.add_command( label='乐视', command=lambda: webbrowser.open('http://www.le.com/')) moviemenu.add_command( label='土豆', command=lambda: webbrowser.open('http://www.tudou.com/')) moviemenu.add_command( label='A站', command=lambda: webbrowser.open('http://www.acfun.tv/')) moviemenu.add_command( label='B站', command=lambda: webbrowser.open('http://www.bilibili.com/')) self.temp = StringVar() #url地址 self.temp2 = StringVar() self.t1 = StringVar() #通道 self.t3 = StringVar() #爱奇艺,优酷,PPTV self.La_title = Label(self.win, text="地址:") self.La_way = Label(self.win, text="选择视频通道:") # self.R_way1=Radiobutton(self.win,text="通道A",variable=self.t1,value=True) # self.R_way2=Radiobutton(self.win,text="通道B",variable=self.t1,value=False) #控件内容设置 self.numberChosen = Combobox(self.win, width=20) self.numberChosen['values'] = ('通道一', '通道二', '通道三', '通道四', '通道五', '通道六', '通道七', '通道八', '通道九', '通道十') self.numberChosen.config(state='readonly') self.numberChosen.current(1) self.R_aiqiyi = Radiobutton(self.win, text="爱奇艺", variable=self.t3, value="a") self.R_youku = Radiobutton(self.win, text="优酷", variable=self.t3, value="y") self.R_pptv = Radiobutton(self.win, text="PPTV", variable=self.t3, value="p") self.t3.set('y') self.B_play = Button(self.win, text="播放▶") self.B_uppage = Button(self.win, text="上页") self.B_nextpage = Button(self.win, text="下页") self.B_search = Button(self.win, text="搜索全站") # self.La_mesasge=Label(self.win,text="☜ ⇠☸⇢ ☞",bg="pink") self.La_page = Label(self.win, bg="#BFEFFF") self.S_croll = Scrollbar(self.win) self.L_box = Listbox(self.win, bg="#BFEFFF", selectmode=SINGLE) self.E_address = Entry(self.win, textvariable=self.temp) self.La_title.place(x=10, y=50, width=50, height=30) self.E_address.place(x=70, y=50, width=200, height=30) self.B_play.place(x=280, y=50, width=80, height=80) # self.R_way1.place(x=160,y=10,width=70,height=30) # self.R_way2.place(x=240,y=10,width=70,height=30) self.numberChosen.place(x=120, y=10, width=180, height=30) self.La_way.place(x=10, y=10, width=100, height=30) # self.R_aiqiyi.place(x=20,y=100,width=70,height=30) self.R_youku.place(x=20, y=100, width=70, height=30) self.R_pptv.place(x=90, y=100, width=70, height=30) self.B_search.place(x=252, y=140, width=100, height=30) # self.La_mesasge.place(x=80,y=125,width=90,height=20) self.L_box.place(x=10, y=180, width=252, height=230) self.S_croll.place(x=260, y=180, width=20, height=230) self.B_uppage.place(x=10, y=140, width=50, height=30) self.B_nextpage.place(x=180, y=140, width=50, height=30) self.La_page.place(x=80, y=140, width=90, height=28) def creat_radiores(self): self.movie = StringVar() #电影 self.S_croll2 = Scrollbar() #分集 self.La_pic = Label(self.win, bg="#E6E6FA") self.La_movie_message = Listbox(self.win, bg="#7EC0EE") self.R_movie = Radiobutton(self.win, text="电影", variable=self.movie, value="m") self.tv = Radiobutton(self.win, text="电视剧", variable=self.movie, value="t") self.zhongyi = Radiobutton(self.win, text="综艺", variable=self.movie, value="z") self.dongman = Radiobutton(self.win, text="动漫", variable=self.movie, value="d") self.jilupian = Radiobutton(self.win, text="纪录片", variable=self.movie, value="j") self.movie.set('m') self.B_view = Button(self.win, text="查看") self.B_info = Button(self.win, text="使用说明") self.B_clearbox = Button(self.win, text="清空列表") self.B_add = Button(self.win, text="添加到播放列表") self.R_movie.place(x=290, y=180, width=80, height=30) self.B_view.place(x=290, y=330, width=70, height=30) self.B_add.place(x=370, y=255, width=100, height=30) self.B_clearbox.place(x=500, y=255, width=70, height=30) self.tv.place(x=290, y=210, width=80, height=30) self.zhongyi.place(x=290, y=240, width=80, height=30) self.dongman.place(x=290, y=270, width=80, height=30) self.jilupian.place(x=290, y=300, width=80, height=30) self.La_movie_message.place(x=370, y=290, width=200, height=120) self.La_pic.place(x=370, y=10, width=200, height=240) self.B_info.place(x=290, y=370, width=70, height=30) self.S_croll2.place(x=568, y=290, width=20, height=120) def show_info(self): msg = """ 1.输入视频播放地址,即可播放 下拉选择可切换视频源 2.选择视频网,选择电视剧或者电影, 搜索全网后选择想要看得影片,点 查看,在右方list里选择分集视频 添加到播放列表里点选播放 3.复制网上视频连接,点击播放即可 4.VIP视频也可以免费播放 """ messagebox.showinfo(title="使用说明", message=msg) def config(self): self.t1.set(True) self.B_play.config(command=self.play_url_movie) self.B_search.config(command=self.search_full_movie) self.B_info.config(command=self.show_info) self.S_croll.config(command=self.L_box.yview) self.L_box['yscrollcommand'] = self.S_croll.set self.S_croll2.config(command=self.La_movie_message.yview) self.La_movie_message['yscrollcommand'] = self.S_croll2.set self.B_view.config(command=self.view_movies) self.B_add.config(command=self.add_play_list) self.B_clearbox.config(command=self.clear_lisbox2) self.B_uppage.config(command=self.uppage_) self.B_nextpage.config(command=self.nextpage_) def uppage_(self): print('---------上一页---------') self.page -= 1 print(self.page) if self.page < 1: self.page = 1 def nextpage_(self): print('----------下一页--------') self.page += 1 print(self.page) if self.t3 == "a" or self.t3 == "y": if self.page > 30: self.page = 30 elif self.t3 == "p": if self.movie == "m": if self.page > 165: self.page = 165 elif self.movie == "t": if self.page > 85: self.page = 85 elif self.movie == "z": if self.page > 38: self.page = 38 elif self.movie == "d": if self.page > 146: self.page = 146 elif self.movie == "j": if self.page > 40: self.page = 40 def clear_lisbox(self): self.L_box.delete(0, END) def clear_lisbox2(self): self.La_movie_message.delete(0, END) def search_full_movie(self): print("-----search----") self.La_page.config(text="当前页:{}".format(self.page)) self.clear_lisbox() try: movie_url, movie_title, movie_src_pic = self.p.get_movie_res( self.t3.get(), self.movie.get(), self.page) self.movie_dic = {} for i, j, k in zip(movie_title, movie_url, movie_src_pic): self.movie_dic[i] = [j, k] for title in movie_title: self.L_box.insert(END, title) print(self.movie_dic) return self.movie_dic except: messagebox.showerror(title='警告', message='请选择电影或者电视剧') def add_play_list(self): print('---------playlist----------') print(self.movie_dic) if self.La_movie_message.get( self.La_movie_message.curselection()) == "": messagebox.showwarning(title="警告", message='请在列表选择影片') else: print( "电影名字:", self.La_movie_message.get( self.La_movie_message.curselection())) if self.movie.get() != "m": self.temp.set(self.new_more_dic[self.La_movie_message.get( self.La_movie_message.curselection())]) else: self.temp.set(self.movie_dic[self.La_movie_message.get( self.La_movie_message.curselection())][0]) def view_pic(self, pic_url): print('--------viewpic---------') pa_url_check = r'//.+[.]jpg' if re.match(pa_url_check, pic_url): print("ok") pic_url = "http:" + pic_url print(pic_url) data = requests.get(pic_url).content # data=urlopen(pic_url).read() io_data = io.BytesIO(data) self.img = Image.open(io_data) self.u = ImageTk.PhotoImage(self.img) self.La_pic.config(image=self.u) def view_movies(self): print("--------viewmovie----------") self.clear_lisbox2() cur_index = self.L_box.curselection() print(self.L_box.get(cur_index)) if self.movie.get() != "m": #非电影类 self.new_more_dic = self.p.get_more_tv_urls( self.movie_dic[self.L_box.get(cur_index)][0], self.t3.get(), self.movie.get()) print(self.new_more_dic) for i, fenji_url in self.new_more_dic.items(): self.La_movie_message.insert(END, i) else: #电影类 self.La_movie_message.insert(END, self.L_box.get(cur_index)) self.view_pic(self.movie_dic[self.L_box.get( self.L_box.curselection())][1]) #加载图片 def play_url_movie(self): print("--------ok-----------") # print(type(self.t1.get()),self.t1.get()) if self.temp.get() == "": messagebox.showwarning(title="警告", message="请先输入视频地址") else: if self.numberChosen.get() != "": self.p.play_movie(self.temp.get(), self.numberChosen.get()) else: messagebox.showwarning(title='警告', message='请选择通道')
class App(Tk): DEFAULT_SIGN_WIDTH = 150.0 DEFAULT_SIGN_HEIGHT = 22.0 DEFAULT_SHEET_WIDHT = 300.0 DEFAULT_SHEET_HEIGHT = 300.0 DEFAULT_SHEETS_PER_FILE = 0 MAX_SHEET_WIDTH = 470 MAX_SHEET_HEIGHT = 310 MAX_SHEETS_PER_FILE = 100 SPINBOX_WIDTH = 8 PADDING = 2 DXF_VERSIONS = ('R2000', 'R2004', 'R2007', 'R2010', 'R2013', 'R2018') # Initialize GUI layout. def __init__(self) -> None: super().__init__() self.title('KylttiMaker') self.minsize(640, 480) # Tree widget that displays fields and their relative marks in a hierarchy. self.tree = Treeview(self, selectmode='browse') self.tree.heading('#0', text='Fields', command=self.remove_selection) self.tree.bind('<Button-3>', self.tree_right_click) self.tree.bind('<<TreeviewSelect>>', self.tree_selection_changed) self.tree.bind('<Double-Button-1>', self.rename) self.bind('<Escape>', self.remove_selection) self.bind('<Delete>', self.remove) self.tree.pack(side=LEFT, fill=BOTH) self.properties = LabelFrame(self, text='Properties') self.properties.pack(side=RIGHT, fill=BOTH, expand=1) self.fields = {} self.selected_iid = None # Entry field that get's temporarily shown to the user whilst renaming a field or a mark. self.new_name = StringVar(self.tree) self.new_name_entry = Entry(self.tree, textvariable=self.new_name) self.new_name_entry.bind('<Key-Return>', self.new_name_entered) # Output options that get's shown to the user when nothing else is selected from the hierarchy. self.frame = Frame(self.properties) Label(self.frame, text='Sheet size').grid(column=0, row=0, sticky='E', pady=App.PADDING) self.sheet_width_var = StringVar(self.frame) self.sheet_width_var.set(App.DEFAULT_SHEET_WIDHT) Spinbox(self.frame, to=App.MAX_SHEET_WIDTH, textvariable=self.sheet_width_var, width=App.SPINBOX_WIDTH).grid(column=1, row=0, sticky='WE') Label(self.frame, text='x').grid(column=2, row=0) self.sheet_height_var = StringVar(self.frame) self.sheet_height_var.set(App.DEFAULT_SHEET_HEIGHT) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.sheet_height_var, width=App.SPINBOX_WIDTH).grid(column=3, row=0, sticky='WE') Label(self.frame, text='Sign size').grid(column=0, row=1, sticky='E', pady=App.PADDING) self.sign_width_var = StringVar(self.frame) self.sign_width_var.set(App.DEFAULT_SIGN_WIDTH) Spinbox(self.frame, to=App.MAX_SHEET_WIDTH, textvariable=self.sign_width_var, width=App.SPINBOX_WIDTH).grid(column=1, row=1, sticky='WE') Label(self.frame, text='x').grid(column=2, row=1) self.sign_height_var = StringVar(self.frame) self.sign_height_var.set(App.DEFAULT_SIGN_HEIGHT) Spinbox(self.frame, to=App.MAX_SHEET_HEIGHT, textvariable=self.sign_height_var, width=App.SPINBOX_WIDTH).grid(column=3, row=1, sticky='WE') Label(self.frame, text='Layers per sheet').grid(column=0, row=2, sticky='W', pady=App.PADDING) self.layers_per_sheet_var = StringVar(self.frame) self.layers_per_sheet_var.set(App.DEFAULT_SHEETS_PER_FILE) Spinbox(self.frame, to=App.MAX_SHEETS_PER_FILE, textvariable=self.layers_per_sheet_var, width=App.SPINBOX_WIDTH).grid(column=1, row=2, sticky='WE') Label(self.frame, text='(0 = No limit)').grid(column=2, row=2, columnspan=2, sticky='W') Label(self.frame, text='DXF version').grid(column=0, row=4, sticky='E', pady=App.PADDING) self.dxf_version = StringVar(self.frame) OptionMenu(self.frame, self.dxf_version, App.DXF_VERSIONS[0], *App.DXF_VERSIONS).grid(column=1, row=4, sticky='W') Button(self.frame, text='Create', command=self.create).grid(column=2, row=4, columnspan=2) self.frame.pack() # Display a popup menu with relevant options when right clicking on the tree widget item. def tree_right_click(self, event: Event) -> None: menu = Menu(self, tearoff=0) iid = self.tree.identify_row(event.y) if iid: if iid in self.fields: menu.add_command(label='Add QR', command=lambda: self.add_mark(QR, iid)) menu.add_command(label='Add Text', command=lambda: self.add_mark(Text, iid)) menu.add_command(label='Add Hole', command=lambda: self.add_mark(Hole, iid)) menu.add_command(label='Rename', command=lambda: self.rename(iid=iid)) menu.add_command(label='Remove', command=lambda: self.remove(iid=iid)) else: menu.add_command(label='Add field', command=self.add_field) menu.tk_popup(event.x_root, event.y_root) # Display the properties of the selected item. def tree_selection_changed(self, event: Event) -> None: # Hide the items previously shown in the properties pane. self.new_name_entry.place_forget() for child in self.properties.winfo_children(): child.pack_forget() selected_items = self.tree.selection() if selected_items: self.selected_iid = selected_items[0] # Check if the selected item is a field or a mark object, in which case show its properties. if self.selected_iid in self.fields: self.fields[self.selected_iid].frame.pack() else: for field_iid in self.fields: if self.selected_iid in self.fields[field_iid].marks: self.fields[field_iid].marks[ self.selected_iid].frame.pack() else: # Clear the properties pane. self.selected_iid = None self.frame.pack() # Create a new field object and add a corresponding node to the hierarchy. def add_field(self) -> None: iid = self.tree.insert('', END, text='Field') self.fields[iid] = Field(self.properties) # Display a entry for the user to input a new name for the item to be renamed. def rename(self, event: Event = None, iid: int = None) -> None: if not iid: if self.selected_iid: iid = self.selected_iid else: return self.editing_iid = iid self.new_name.set(self.tree.item(iid)['text']) self.new_name_entry.place(x=20, y=0) self.new_name_entry.focus_set() self.new_name_entry.select_range(0, END) # Display the renamed item in the hierarchy. def new_name_entered(self, event: Event) -> None: self.tree.item(self.editing_iid, text=self.new_name.get()) self.new_name_entry.place_forget() # Link a new mark speciefied by mark_type parameter to the field speciefied by field_iid parameter. def add_mark(self, mark_type: Union[QR, Text, Hole], field_iid: int = None) -> None: if not field_iid: if self.selected_iid in self.fields: field_iid = self.selected_iid else: print('Select a field first.') return iid = self.tree.insert(field_iid, END, text=mark_type.__name__) self.fields[field_iid].marks[iid] = mark_type(self.properties) self.tree.see(iid) # Remove a tree item speciefied by iid parameter, else removes the currently selected item. def remove(self, event: Event = None, iid: int = None) -> None: if not iid: if self.selected_iid: iid = self.selected_iid else: print('Select something first.') return # Check if the item to be removed is a field item, else check if it is a mark item. if iid in self.fields: self.remove_selection() self.tree.delete(iid) del self.fields[iid] else: for field_iid in self.fields: if iid in self.fields[field_iid].marks: self.remove_selection() self.tree.delete(iid) del self.fields[field_iid].marks[iid] # Clear the selection. def remove_selection(self, event: Event = None) -> None: for item in self.tree.selection(): self.tree.selection_remove(item) # Create sheets according to entered settings. def create(self) -> None: if not self.fields: print('No fields.') return # Calculate the length of the longest field (some fields can have less values than others). total_signs = 0 for field_iid in self.fields: total_signs = max(total_signs, len(self.fields[field_iid].data)) if total_signs == 0: print('No fields with data.') return try: sheet_width = float(self.sheet_width_var.get()) sheet_height = float(self.sheet_height_var.get()) sign_width = float(self.sign_width_var.get()) sign_height = float(self.sign_height_var.get()) layers_per_sheet = int(self.layers_per_sheet_var.get()) assert sign_width > 0, 'Sign width must be greater than 0.' assert sign_height > 0, 'Sign height must be greater than 0.' assert sheet_width >= sign_width, 'Sheet width must be greater than sign width.' assert sheet_height >= sign_height, 'Sheet height must be greater than sign height.' except ValueError: print('Invalid dimensions.') return except AssertionError as e: print(e) return # Show progress bar. progress_bar = Progressbar(self.frame) progress_bar.grid(column=0, row=5, columnspan=4, sticky='WE') # Calculate the needed values to define sheet layout. signs_per_row = int(sheet_width // sign_width) signs_per_column = int(sheet_height // sign_height) signs_per_layer = signs_per_row * signs_per_column # Ceiling division. total_layers = -int(-total_signs // signs_per_layer) if layers_per_sheet > 0: total_sheets = -int(-total_layers // layers_per_sheet) else: total_sheets = 1 print( f'Marking total of {total_signs} signs ({sign_width} x {sign_height}).' ) print( f'Sheet size of {sheet_width} x {sheet_height} fits {signs_per_row} x {signs_per_column} signs,' ) print( f'so the effective sheet size is {signs_per_row * sign_width} x {signs_per_column * sign_height}.' ) print(f'Total of {total_layers} layer(s) are needed.') if layers_per_sheet == 0: print( 'There is no limit on the maximum amount of layers per sheet,') else: print( f'There are maximum of {layers_per_sheet} layer(s) per sheet,') print(f'so total of {total_sheets} sheet(s) are needed.') # Create needed sheet objects. print('Creating sheets.') sheets = [] for _ in range(total_sheets): sheets.append(ezdxf.new(self.dxf_version.get())) # Iterate over all layers and draw their outline based on how many signs that layer will have. print('Drawing layer outlines.') for layer in range(total_layers): max_x = sign_width * signs_per_row max_y = -sign_height * signs_per_column if layer == total_layers - 1: # If last layer. signs_in_last_sheet = total_signs - layer * signs_per_layer if signs_in_last_sheet < signs_per_row: max_x = sign_width * signs_in_last_sheet max_y = sign_height * (-signs_in_last_sheet // signs_per_row) if layers_per_sheet > 0: sheet_index = layer // layers_per_sheet else: sheet_index = 0 # Draw layer outline (left and top side bounds). sheets[sheet_index].modelspace().add_lwpolyline( [(0, max_y), (0, 0), (max_x, 0)], dxfattribs={'layer': str(layer)}) # Iterate over each sign. print('Drawing marks.') for sign_index in range(total_signs): # Update progress bar value. progress_bar['value'] = (sign_index + 1) / total_signs * 100 progress_bar.update() # Calculate in which position, in which layer of which sheet the current sign should be drawn. layer = sign_index // signs_per_layer layer_position = sign_index % signs_per_layer sign_origin_x = (layer_position % signs_per_row) * sign_width sign_origin_y = -(layer_position // signs_per_row) * sign_height if layers_per_sheet > 0: sheet_index = layer // layers_per_sheet else: sheet_index = 0 sheet = sheets[sheet_index] # Draw marks (QR, Text and Hole objects). for field_iid in self.fields: try: self.fields[field_iid].draw(sign_index, sheet, layer, sign_origin_x, sign_origin_y, sign_width, sign_height) except Exception as e: print(e) progress_bar.grid_forget() return # Draw sign outline (right and bottom side bounds). sign_outline = [(sign_origin_x, sign_origin_y - sign_height), (sign_origin_x + sign_width, sign_origin_y - sign_height), (sign_origin_x + sign_width, sign_origin_y)] sheet.modelspace().add_lwpolyline(sign_outline, dxfattribs={'layer': str(layer)}) # Save sheets. # Get a output directory if there are multiple sheets to be saved, otherwise get path for the single output (.dxf) file. print('Saving.') if total_sheets > 1: if directory := tkinter.filedialog.askdirectory(): for index, sheet in enumerate(sheets): # Indicate save progress. progress_bar['value'] = (index + 1) / len(sheets) * 100 progress_bar.update() sheet.saveas(Path(directory) / f'sheet{index}.dxf') elif path := tkinter.filedialog.asksaveasfilename( defaultextension='.dxf', filetypes=(('DXF', '*.dxf'), ('All files', '*.*'))): sheets[0].saveas(path)
class setting_gui(): def __init__(self, root): self.root = root self.root.title('Input wajah | SS Company 2019') self.root.resizable( False, False) #mengatur agar windows tidak bisa diperbesar atau perkecil self.root.geometry("550x350") #mengatur lebay layar self.root.protocol('WM_DELETE_WINDOW', self.quit) self.deklarasi_variable() self.atur_komponen() #menangkap gambar t = threading.Thread(target=self.tangkap_gambar, args=()) t.start() self.get_id_user() def deklarasi_variable(self): self.berjalan = True #deklarasi variable untuk menunjukan program masih berjalan self.simpan = False self.count = 0 self.akhir = 100 #jumlah foto yang akan diambil self.proses = 0 def atur_komponen(self): #tempat untuk menampilkan gambar self.image = Label(self.root) self.image.place(x=10, y=10) #textbox untuk gambar self.txt_gambar = Label(self.root) self.txt_gambar.place(x=80, y=315) #membuat form untuk memasukkan nama #entry nama Label(self.root, text="Masukkan Nama Anda : ").place(x=340, y=10) self.txt_nama = Entry(self.root) self.txt_nama.place(x=340, y=30) #button untuk daftar wajah self.btn_daftar = Button(self.root, text="daftar", command=self.daftar).place(x=340, y=60) #komponen progres bar untuk memberi tahu kapan proses selesai Label(self.root, text="Proses Sedang berjalan : ").place(x=340, y=100) self.proses_bar = Progressbar(self.root, orient='horizontal', length=180, mode='determinate') self.proses_bar.place(x=340, y=120) def tangkap_gambar(self): cp = cv2.VideoCapture(0) while self.berjalan: #membaca input dari webcam _, img = cp.read() #mengimport file pemindai wajah face = cv2.CascadeClassifier('xml/deteksi_wajah.xml') #merubah gambar menjadi gray gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) muka = face.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in muka: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) if len( muka ) == 1 and self.simpan and self.proses <= self.akhir: #jika perintah simpan telah diterima self.simpan_wajah(gray, x, y, w, h) #memanggil fungsi simpan wajah self.update_proses_bar( self.proses) #memanggil fungsi update status bar self.proses += 1 if self.proses == self.akhir and self.simpan: #jika proses penambilan gambar telah selesai self.decode_gambar() self.simpan = False #jika tidak ditemukan wajah pada gambar if len(muka) == 0: self.txt_gambar['text'] = "Wajah tidak ditemukan!" elif len(muka) == 1: self.txt_gambar['text'] = "Wajah ditemukan" elif len(muka) > 1: self.txt_gambar['text'] = "Ditemukan " + str( len(muka)) + " wajah" cek_folder("log/") cv2.imwrite("log/input.png", img) pic = Image.open("log/input.png") pic = pic.resize((300, 300), Image.ANTIALIAS) pic.save("log/input.png") gambar = PhotoImage(file="log/input.png") self.image.config(image=gambar) self.image.image = gambar #fungsi untuk btn_daftar def daftar(self): #cek apakah folder image telah ada cek = tkinter.messagebox.askquestion( "Pemberitahuan", "Pengambilan gambar akan dimulai\nApakah kamu mau lanjut?") if cek == 'yes': cek_folder("image/") self.simpan = True self.count = 0 self.proses = 0 #fungsi untuk menyimpan gambar ke folder image def simpan_wajah(self, gray, x, y, w, h): id = self.get_id_user() #id untuk user yang akan disimpan wajah nya self.count += 1 cv2.imwrite("image/User." + str(id) + '.' + str(self.count) + ".png", gray[y:y + h, x:x + w]) print("gambar ke " + str(self.proses) + " disimpan") #fungsi untuk mengurai gambar def decode_gambar(self): cek_folder('training/') tkinter.messagebox.showinfo( "Pemberitahuan", "Proses Pengambilan Gambar telah Selesai\n" "Dilanjutkan proses training\n" "Jangan melakukan aksi apapun") recognizer = cv2.face.LBPHFaceRecognizer_create( ) #deklarasi untuk pengenalan wajah deteksi = cv2.CascadeClassifier( 'xml/deteksi_wajah.xml') #import file untuk deteksi wajah #mendapatkan gambar dan id user muka, id = get_image("image", deteksi) #decode semua gambar recognizer.train(muka, np.array(id)) #menyimpan hasil proses recognizer.save("training/hasil.yml") # membuat database nama dan id gambar self.simpan_user_id() tkinter.messagebox.showinfo( "Berhasil", "Wajah telah ditambahkan" ) #menampilkan pesan pemberitahuan bahwa proses te;ah berhasil self.proses_bar['value'] = 0 #update status proses bar #menampilkan presentasi proses yang sedang berjalan def update_proses_bar(self, proses): presentase = int((proses / 100) * 100) self.proses_bar['value'] = presentase #fungsi untuk menyimpan nama user dan id gambar yang terhubung def simpan_user_id(self): #cek apakah file telah ada if os.path.isfile('training/data_user.txt'): #jika file sudah ada file = open('training/data_user.txt', 'a') text = "\n" else: #jika file belum ada file = open("training/data_user.txt", 'w') text = "" #mendapatkan id terakhir yang telah tersimpan id = self.get_id_user() nama = self.txt_nama.get() #menuliskan nama ke data_user.txt text = text + str(id) + ":" + nama file.write(text) def get_id_user(self): # cek apakah file telah ada if os.path.isfile('training/data_user.txt'): #jika file sudah ada file = open('training/data_user.txt', 'r') else: #jika file belum ada return 0 #membaca file perbaris baris = file.readlines() if len(baris) > 0: baris = baris[len(baris) - 1] baris = baris.split("\n") baris = baris[0] id = baris.split(":") id = int(id[0]) + 1 else: id = 0 return id def hentikan_proses(self): self.berjalan = False cek = tkinter.messagebox.askquestion( "pemberitahuan", "Apakah Kamu akan mengakhiri proses ini?") if cek == "yes": self.root.quit() else: self.berjalan = True t = threading.Thread(target=self.tangkap_gambar, args=()) t.start() def quit(self): self.berjalan = False cek = tkinter.messagebox.askquestion( "pemberitahuan", "Apakah Kamu akan mengakhiri proses ini?") if cek == "yes": self.root.destroy() else: self.berjalan = True t = threading.Thread(target=self.tangkap_gambar, args=()) t.start()
class Movie_app: def __init__(self): self.win = Tk() self.win.geometry('600x420') self.win.title("爱奇艺-优酷-PPTV视频播放下载器V3.1") self.creat_res() self.creat_radiores() self.config() self.page = 1 self.p = Pro() self.win.mainloop() def creat_res(self): self.temp = StringVar() # url地址 self.temp2 = StringVar() self.t1 = StringVar() # 通道 self.t3 = StringVar() # 爱奇艺,优酷,PPTV self.La_title = Label(self.win, text="地址:") self.La_way = Label(self.win, text="选择视频通道:") self.R_way1 = Radiobutton(self.win, text="通道A", variable=self.t1, value=True) self.R_way2 = Radiobutton(self.win, text="通道B", variable=self.t1, value=False) self.R_aiqiyi = Radiobutton(self.win, text="爱奇艺", variable=self.t3, value="a") self.R_youku = Radiobutton(self.win, text="优酷", variable=self.t3, value="y") self.R_pptv = Radiobutton(self.win, text="PPTV", variable=self.t3, value="p") self.B_play = Button(self.win, text="播放▶") self.B_uppage = Button(self.win, text="上页") self.B_nextpage = Button(self.win, text="下页") self.B_search = Button(self.win, text="♣搜索全站♠") self.La_mesasge = Label(self.win, text="☜ ⇠☸⇢ ☞", bg="pink") self.La_page = Label(self.win, bg="#BFEFFF") self.S_croll = Scrollbar(self.win) self.L_box = Listbox(self.win, bg="#BFEFFF", selectmode=SINGLE) self.E_address = Entry(self.win, textvariable=self.temp) self.La_title.place(x=10, y=50, width=50, height=30) self.E_address.place(x=70, y=50, width=200, height=30) self.B_play.place(x=300, y=50, width=50, height=30) self.R_way1.place(x=160, y=10, width=70, height=30) self.R_way2.place(x=240, y=10, width=70, height=30) self.La_way.place(x=10, y=10, width=100, height=30) self.R_aiqiyi.place(x=20, y=100, width=70, height=30) self.R_youku.place(x=90, y=100, width=70, height=30) self.R_pptv.place(x=160, y=100, width=70, height=30) self.B_search.place(x=252, y=140, width=100, height=30) self.La_mesasge.place(x=80, y=125, width=90, height=20) self.L_box.place(x=10, y=180, width=252, height=230) self.S_croll.place(x=260, y=180, width=20, height=230) self.B_uppage.place(x=10, y=140, width=50, height=30) self.B_nextpage.place(x=180, y=140, width=50, height=30) self.La_page.place(x=80, y=150, width=90, height=28) def creat_radiores(self): self.movie = StringVar() # 电影 self.S_croll2 = Scrollbar() # 分集 self.La_pic = Label(self.win, bg="#E6E6FA") self.La_movie_message = Listbox(self.win, bg="#7EC0EE") self.R_movie = Radiobutton(self.win, text="电影", variable=self.movie, value="m") self.tv = Radiobutton(self.win, text="电视剧", variable=self.movie, value="t") self.zhongyi = Radiobutton(self.win, text="综艺", variable=self.movie, value="z") self.dongman = Radiobutton(self.win, text="动漫", variable=self.movie, value="d") self.jilupian = Radiobutton(self.win, text="纪录片", variable=self.movie, value="j") self.B_view = Button(self.win, text="✤查看✤") self.B_info = Button(self.win, text="使用说明") self.B_clearbox = Button(self.win, text="清空列表") self.B_add = Button(self.win, text="添加到播放列表") self.R_movie.place(x=290, y=180, width=80, height=30) self.B_view.place(x=290, y=330, width=70, height=30) self.B_add.place(x=370, y=255, width=100, height=30) self.B_clearbox.place(x=500, y=255, width=70, height=30) self.tv.place(x=290, y=210, width=80, height=30) self.zhongyi.place(x=290, y=240, width=80, height=30) self.dongman.place(x=290, y=270, width=80, height=30) self.jilupian.place(x=290, y=300, width=80, height=30) self.La_movie_message.place(x=370, y=290, width=200, height=120) self.La_pic.place(x=370, y=10, width=200, height=240) self.B_info.place(x=290, y=370, width=70, height=30) self.S_croll2.place(x=568, y=290, width=20, height=120) def show_info(self): msg = """ 1.输入视频播放地址,即可播放 选择A或者B可切换视频源 2.选择视频网,选择电视剧或者电影, 搜索全网后选择想要看得影片,点 查看,在右方list里选择分集视频 添加到播放列表里点选播放 """ messagebox.showinfo(title="使用说明", message=msg) def config(self): self.t1.set(True) self.B_play.config(command=self.play_url_movie) self.B_search.config(command=self.search_full_movie) self.B_info.config(command=self.show_info) self.S_croll.config(command=self.L_box.yview) self.L_box['yscrollcommand'] = self.S_croll.set self.S_croll2.config(command=self.La_movie_message.yview) self.La_movie_message['yscrollcommand'] = self.S_croll2.set self.B_view.config(command=self.view_movies) self.B_add.config(command=self.add_play_list) self.B_clearbox.config(command=self.clear_lisbox2) self.B_uppage.config(command=self.uppage_) self.B_nextpage.config(command=self.nextpage_) def uppage_(self): print('---------上一页---------') self.page -= 1 print(self.page) if self.page < 1: self.page = 1 def nextpage_(self): print('----------下一页--------') self.page += 1 print(self.page) if self.t3 == "a" or self.t3 == "y": if self.page > 30: self.page = 30 elif self.t3 == "p": if self.movie == "m": if self.page > 165: self.page = 165 elif self.movie == "t": if self.page > 85: self.page = 85 elif self.movie == "z": if self.page > 38: self.page = 38 elif self.movie == "d": if self.page > 146: self.page = 146 elif self.movie == "j": if self.page > 40: self.page = 40 def clear_lisbox(self): self.L_box.delete(0, END) def clear_lisbox2(self): self.La_movie_message.delete(0, END) def search_full_movie(self): print("-----search----") self.La_page.config(text="当前页:{}".format(self.page)) self.clear_lisbox() try: movie_url, movie_title, movie_src_pic = self.p.get_movie_res( self.t3.get(), self.movie.get(), self.page) self.movie_dic = {} for i, j, k in zip(movie_title, movie_url, movie_src_pic): self.movie_dic[i] = [j, k] for title in movie_title: self.L_box.insert(END, title) print(self.movie_dic) return self.movie_dic except: messagebox.showerror(title='警告', message='请选择电影或者电视剧') def add_play_list(self): print('---------playlist----------') print(self.movie_dic) if self.La_movie_message.get( self.La_movie_message.curselection()) == "": messagebox.showwarning(title="警告", message='请在列表选择影片') else: print( "电影名字:", self.La_movie_message.get( self.La_movie_message.curselection())) if self.movie.get() != "m": self.temp.set(self.new_more_dic[self.La_movie_message.get( self.La_movie_message.curselection())]) else: self.temp.set(self.movie_dic[self.La_movie_message.get( self.La_movie_message.curselection())][0]) def view_pic(self, pic_url): print('--------viewpic---------') pa_url_check = r'//.+[.]jpg' if re.match(pa_url_check, pic_url): print("ok") pic_url = "http:" + pic_url print(pic_url) data = requests.get(pic_url).content # data=urlopen(pic_url).read() io_data = io.BytesIO(data) self.img = Image.open(io_data) self.u = ImageTk.PhotoImage(self.img) self.La_pic.config(image=self.u) def view_movies(self): print("--------viewmovie----------") cur_index = self.L_box.curselection() print(self.L_box.get(cur_index)) if self.movie.get() != "m": # 非电影类 self.new_more_dic = self.p.get_more_tv_urls( self.movie_dic[self.L_box.get(cur_index)][0], self.t3.get(), self.movie.get()) print(self.new_more_dic) for i, fenji_url in self.new_more_dic.items(): self.La_movie_message.insert(END, i) else: # 电影类 self.La_movie_message.insert(END, self.L_box.get(cur_index)) self.view_pic(self.movie_dic[self.L_box.get( self.L_box.curselection())][1]) # 加载图片 def play_url_movie(self): print("--------ok-----------") # print(type(self.t1.get()),self.t1.get()) if self.temp.get() == "": messagebox.showwarning(title="警告", message="请先输入视频地址") else: if self.t1.get() != "": self.p.play_movie(self.temp.get(), self.t1.get()) else: messagebox.showwarning(title='警告', message='请选择通道')
class App_test(object): def __init__(self, master, fuc, query, next, pre): self.win = master self.win.title('笔趣阁阅读_v1.0 by: 孤月') self.win.iconbitmap('./ico/gui_text_proce.ico') # 指定界面图标 curWidth = self.win.winfo_width() curHeight = self.win.winfo_height() scnWidth, scnHeight = self.win.maxsize() tmpcnf = '1340x640+500+300' # % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2) self.win.geometry(tmpcnf) self.creat_res() self.set_position() self.add_train_info() self.res_config(fuc, query, next, pre) self.train_message = {} self.gettime() # 系统时间 def creat_res(self): self.v = IntVar() # 书籍查询 self.v.set(True) self.temp = StringVar() # 书名/作者 录入 self.temp2 = StringVar() # 章节名录入 self.sys_time = StringVar() # 系统时间 self.E_startstation = Entry(self.win, textvariable=self.temp) self.E_endstation = Entry(self.win, textvariable=self.temp2) self.La_startstation = Label(self.win, text="根据书名/作者搜索:") self.La_endstation = Label(self.win, text="根据章节名搜索:") self.La_directory = Label(self.win, text="目录") self.La_text = Label(self.win, text="正文") self.La_sys_time = Label(self.win, textvariable=self.sys_time, fg='blue', font=("黑体", 20)) # 设置字体大小颜色 self.B_search = Button(self.win, text="搜索") self.B_buy_tick = Button(self.win, text="阅读") self.B_pre_chapter = Button(self.win, text="上一章") self.B_next_chapter = Button(self.win, text="下一章") self.R_site = Radiobutton(self.win, text="书名查询", variable=self.v, value=True) self.R_price = Radiobutton(self.win, text="章节查询", variable=self.v, value=False) self.init_data_Text = Text(self.win) # 原始数据录入框 self.S_move = Scrollbar(self.win) # 目录滚动条 self.S_text_move = Scrollbar(self.win) # 创建文本框滚动条 # 设置位置 def set_position(self): self.init_data_Text.place(x=430, y=40, width=870, height=550) self.E_startstation.place(x=10, y=50, width=145, height=30) self.E_startstation.insert(10, "星辰变") self.E_endstation.place(x=10, y=140, width=145, height=30) self.E_endstation.insert(10, "第一章 秦羽") self.La_startstation.place(x=10, y=10, width=130, height=30) self.La_endstation.place(x=10, y=100, width=120, height=30) self.La_sys_time.place(x=1150, y=600, width=160, height=30) self.B_search.place(x=10, y=220, width=80, height=40) self.B_pre_chapter.place(x=950, y=600, width=80, height=40) self.B_next_chapter.place(x=1050, y=600, width=80, height=40) self.S_move.place(x=380, y=40, width=30, height=550) self.S_text_move.place(x=1300, y=40, width=30, height=550) self.B_buy_tick.place(x=90, y=220, width=80, height=40) self.R_site.place(x=10, y=180, width=90, height=30) self.R_price.place(x=100, y=180, width=90, height=30) self.La_directory.place(x=180, y=7, width=90, height=30) self.La_text.place(x=420, y=7, width=70, height=30) # 为按钮绑定事件 def res_config(self, fuc, query, next_, pre): self.B_search.config(command=fuc) # 搜索 self.B_buy_tick.config(command=query) # 阅读 self.B_pre_chapter.config(command=pre) # 上一章 self.B_next_chapter.config(command=next_) # 下一章 self.S_move.config(command=self.tree.yview) # 目录滚动条 self.tree.config(yscrollcommand=self.S_move.set) self.S_text_move.config(command=self.init_data_Text.yview) # 文本框滚动条 self.init_data_Text.config(yscrollcommand=self.S_text_move.set) def add_train_info(self): lis_train = ["C" + str(x) for x in range(0, 2)] tuple_train = tuple(lis_train) self.tree = Treeview(self.win, columns=tuple_train, height=30, show="headings") self.tree.place(x=200, y=40, width=180, height=550) train_info = [' 书名 ', ' 作者 '] for i in range(0, len(lis_train)): self.tree.column(lis_train[i], width=len(train_info[i]) * 11, anchor='w') # must be n, ne, e, se, s, sw, w, nw, or center self.tree.heading(lis_train[i], text=train_info[i]) # 实时显示时钟 def gettime(self): # 获取当前时间 self.sys_time.set(time.strftime("%H:%M:%S")) # 每隔一秒调用函数自身获取时间 self.win.after(1000, self.gettime)
class vedoGUI(Frame): def __init__(self, parent): Frame.__init__(self, parent, bg="white") self.parent = parent self.filenames = [] self.noshare = BooleanVar() self.flat = BooleanVar() self.xspacing = StringVar() self.yspacing = StringVar() self.zspacing = StringVar() self.background_grad = BooleanVar() self.initUI() def initUI(self): self.parent.title("vedo") self.style = Style() self.style.theme_use("clam") self.pack(fill=BOTH, expand=True) ############import Button(self, text="Import Files", command=self._importCMD, width=15).place(x=115, y=17) ############meshes Frame(root, height=1, width=398, bg="grey").place(x=1, y=60) Label(self, text="Meshes", fg="white", bg="green", font=("Courier 11 bold")).place(x=20, y=65) # color Label(self, text="Color:", bg="white").place(x=30, y=98) colvalues = ('by scalar', 'gold', 'red', 'green', 'blue', 'coral', 'plum', 'tomato') self.colorCB = Combobox(self, state="readonly", values=colvalues, width=10) self.colorCB.current(0) self.colorCB.place(x=100, y=98) # mode modvalues = ('surface', 'surf. & edges', 'wireframe', 'point cloud') self.surfmodeCB = Combobox(self, state="readonly", values=modvalues, width=14) self.surfmodeCB.current(0) self.surfmodeCB.place(x=205, y=98) # alpha Label(self, text="Alpha:", bg="white").place(x=30, y=145) self.alphaCB = Scale( self, from_=0, to=1, resolution=0.02, bg="white", length=220, orient="horizontal", ) self.alphaCB.set(1.0) self.alphaCB.place(x=100, y=125) # lighting Label(self, text="Lighting:", bg="white").place(x=30, y=180) lightvalues = ('default', 'metallic', 'plastic', 'shiny', 'glossy') self.lightCB = Combobox(self, state="readonly", values=lightvalues, width=10) self.lightCB.current(0) self.lightCB.place(x=100, y=180) # shading phong or flat self.flatCB = Checkbutton(self, text="flat shading", var=self.flat, bg="white") #self.flatCB.select() self.flatCB.place(x=210, y=180) # rendering arrangement Label(self, text="Arrange as:", bg="white").place(x=30, y=220) schemevalues = ('superpose (default)', 'mesh browser', 'n sync-ed renderers') self.schememodeCB = Combobox(self, state="readonly", values=schemevalues, width=20) self.schememodeCB.current(0) self.schememodeCB.place(x=160, y=220) # share cam self.noshareCB = Checkbutton(self, text="independent cameras", variable=self.noshare, bg="white") self.noshareCB.place(x=160, y=245) ############volumes Frame(root, height=1, width=398, bg="grey").place(x=1, y=275) Label(self, text="Volumes", fg="white", bg="blue", font=("Courier 11 bold")).place(x=20, y=280) # mode Label(self, text="Rendering mode:", bg="white").place(x=30, y=310) modevalues = ( "isosurface (default)", "composite", "maximum proj", "lego", "slicer", "slicer2d", ) self.modeCB = Combobox(self, state="readonly", values=modevalues, width=20) self.modeCB.current(0) self.modeCB.place(x=160, y=310) Label(self, text="Spacing factors:", bg="white").place(x=30, y=335) self.xspacingCB = Entry(self, textvariable=self.xspacing, width=3) self.xspacing.set('1.0') self.xspacingCB.place(x=160, y=335) self.yspacingCB = Entry(self, textvariable=self.yspacing, width=3) self.yspacing.set('1.0') self.yspacingCB.place(x=210, y=335) self.zspacingCB = Entry(self, textvariable=self.zspacing, width=3) self.zspacing.set('1.0') self.zspacingCB.place(x=260, y=335) ############## options Frame(root, height=1, width=398, bg="grey").place(x=1, y=370) Label(self, text="Options", fg='white', bg="brown", font=("Courier 11 bold")).place(x=20, y=375) # backgr color Label(self, text="Background color:", bg="white").place(x=30, y=405) bgcolvalues = ("white", "lightyellow", "azure", "blackboard", "black") self.bgcolorCB = Combobox(self, state="readonly", values=bgcolvalues, width=9) self.bgcolorCB.current(3) self.bgcolorCB.place(x=160, y=405) # backgr color gradient self.backgroundGradCB = Checkbutton(self, text="gradient", variable=self.background_grad, bg="white") self.backgroundGradCB.place(x=255, y=405) ################ render button Frame(root, height=1, width=398, bg="grey").place(x=1, y=437) Button(self, text="Render", command=self._run, width=15).place(x=115, y=454) def _importCMD(self): ftypes = [ ("All files", "*"), ("VTK files", "*.vtk"), ("VTK files", "*.vtp"), ("VTK files", "*.vts"), ("VTK files", "*.vtu"), ("Surface Mesh", "*.ply"), ("Surface Mesh", "*.obj"), ("Surface Mesh", "*.stl"), ("Surface Mesh", "*.off"), ("Surface Mesh", "*.facet"), ("Volume files", "*.tif"), ("Volume files", "*.slc"), ("Volume files", "*.vti"), ("Volume files", "*.mhd"), ("Volume files", "*.nrrd"), ("Volume files", "*.nii"), ("Volume files", "*.dem"), ("Picture files", "*.png"), ("Picture files", "*.jpg"), ("Picture files", "*.bmp"), ("Picture files", "*.gif"), ("Picture files", "*.jpeg"), ("Geojson files", "*.geojson"), ("DOLFIN files", "*.xml.gz"), ("DOLFIN files", "*.xml"), ("DOLFIN files", "*.xdmf"), ("Neutral mesh", "*.neu*"), ("GMESH", "*.gmsh"), ("Point Cloud", "*.pcd"), ("3DS", "*.3ds"), ("Numpy scene file", "*.npy"), ("Numpy scene file", "*.npz"), ] self.filenames = tkFileDialog.askopenfilenames(parent=root, filetypes=ftypes) args.files = list(self.filenames) def _run(self): tips() args.files = list(self.filenames) if self.colorCB.get() == "by scalar": args.color = None else: if self.colorCB.get() == 'red': args.color = 'crimson' elif self.colorCB.get() == 'green': args.color = 'limegreen' elif self.colorCB.get() == 'blue': args.color = 'darkcyan' else: args.color = self.colorCB.get() args.alpha = self.alphaCB.get() args.wireframe = False args.showedges = False args.point_size = 0 if self.surfmodeCB.get() == 'point cloud': args.point_size = 2 elif self.surfmodeCB.get() == 'wireframe': args.wireframe = True elif self.surfmodeCB.get() == 'surf. & edges': args.showedges = True else: pass # normal surface mode args.lighting = self.lightCB.get() args.flat = self.flat.get() args.no_camera_share = self.noshare.get() args.background = self.bgcolorCB.get() args.background_grad = None if self.background_grad.get(): b = getColor(args.background) args.background_grad = (b[0] / 1.8, b[1] / 1.8, b[2] / 1.8) args.multirenderer_mode = False args.scrolling_mode = False if self.schememodeCB.get() == "n sync-ed renderers": args.multirenderer_mode = True elif self.schememodeCB.get() == "mesh browser": args.scrolling_mode = True args.ray_cast_mode = False args.lego = False args.slicer = False args.slicer2d = False args.lego = False args.mode = 0 if self.modeCB.get() == "composite": args.ray_cast_mode = True args.mode = 0 elif self.modeCB.get() == "maximum proj": args.ray_cast_mode = True args.mode = 1 elif self.modeCB.get() == "slicer": args.slicer = True elif self.modeCB.get() == "slicer2d": args.slicer2d = True elif self.modeCB.get() == "lego": args.lego = True args.x_spacing = 1 args.y_spacing = 1 args.z_spacing = 1 if self.xspacing.get() != '1.0': args.x_spacing = float(self.xspacing.get()) if self.yspacing.get() != '1.0': args.y_spacing = float(self.yspacing.get()) if self.zspacing.get() != '1.0': args.z_spacing = float(self.zspacing.get()) draw_scene(args) if os.name == "nt": exit() if settings.plotter_instance: settings.plotter_instance.close()
class App_test(object): def __init__(self, master, fuc, query, next, pre, query_all_chapters, query_text): self.win = master self.win.title('shuyaya阅读_v2.0 by: 孤月') # self.win.iconbitmap('./ico/gui_text_proce.ico') # 指定界面图标 curWidth = self.win.winfo_width() curHeight = self.win.winfo_height() scnWidth, scnHeight = self.win.maxsize() tmpcnf = '1340x640+500+300' # % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2) self.win.geometry(tmpcnf) self.creat_res() self.set_position() self.list_box(query_all_chapters, query_text) # self.add_train_info() self.res_config(fuc, query, next, pre) self.train_message = {} self.gettime() # 系统时间 def creat_res(self): # self.v = IntVar() # 书籍查询 # self.v.set(True) self.temp = StringVar() # 书名/作者 录入 self.temp2 = StringVar() # 章节名录入 self.sys_time = StringVar() # 系统时间 self.E_startstation = Entry(self.win, textvariable=self.temp) # self.E_endstation = Entry(self.win, textvariable=self.temp2) self.La_startstation = Label(self.win, text="根据书名/作者搜索:") self.La_endstation = Label(self.win, text="书籍目录:") self.La_directory = Label(self.win, text="目录") self.La_text = Label(self.win, text="正文") self.La_sys_time = Label(self.win, textvariable=self.sys_time, fg='blue', font=("黑体", 20)) # 设置字体大小颜色 self.La_pic = Label(self.win, bg="#E6E6FA") self.La_anthor = Label(self.win, bg="#E6E6FA") self.La_type = Label(self.win, bg="#E6E6FA") self.La_update_time = Label(self.win, bg="#E6E6FA") self.La_latest_chapter = Label(self.win, bg="#E6E6FA") self.B_search = Button(self.win, text="搜索") self.B_buy_tick = Button(self.win, text="阅读") self.B_pre_chapter = Button(self.win, text="上一章") self.B_next_chapter = Button(self.win, text="下一章") # self.R_site = Radiobutton(self.win, text="书名查询", variable=self.v, value=True) # self.R_price = Radiobutton(self.win, text="章节查询", variable=self.v, value=False) self.init_data_Text = Text(self.win) # 原始数据录入框 self.S_move = Scrollbar(self.win) # 目录滚动条 self.S_text_move = Scrollbar(self.win) # 创建文本框滚动条 # 设置位置 def set_position(self): self.init_data_Text.place(x=430, y=40, width=870, height=550) self.E_startstation.place(x=10, y=50, width=145, height=30) self.E_startstation.insert(10, "星辰变") # self.E_endstation.place(x=10, y=140, width=145, height=30) # self.E_endstation.insert(10, "第一章 秦羽") self.La_startstation.place(x=10, y=10, width=130, height=30) self.La_endstation.place(x=10, y=100, width=60, height=30) self.La_sys_time.place(x=1150, y=600, width=160, height=30) self.La_pic.place(x=10, y=350, width=170, height=180) # 图片 self.La_anthor.place(x=10, y=545, width=170, height=30) self.La_type.place(x=10, y=575, width=170, height=30) self.La_update_time.place(x=10, y=605, width=170, height=30) self.La_latest_chapter.place(x=10, y=635, width=170, height=30) self.B_search.place(x=10, y=300, width=80, height=40) self.B_buy_tick.place(x=90, y=300, width=80, height=40) self.B_pre_chapter.place(x=950, y=600, width=80, height=40) self.B_next_chapter.place(x=1050, y=600, width=80, height=40) self.S_move.place(x=380, y=40, width=30, height=550) self.S_text_move.place(x=1300, y=40, width=30, height=550) # self.R_site.place(x=10, y=180, width=90, height=30) # self.R_price.place(x=100, y=180, width=90, height=30) self.La_directory.place(x=180, y=7, width=90, height=30) self.La_text.place(x=420, y=7, width=70, height=30) # 为按钮绑定事件 def res_config(self, fuc, query, next_, pre): self.B_search.config(command=fuc) # 搜索 self.B_buy_tick.config(command=query) # 阅读 self.B_pre_chapter.config(command=pre) # 上一章 self.B_next_chapter.config(command=next_) # 下一章 self.S_move.config(command=self.Ls_box_ct.yview) # 目录滚动条 self.Ls_box_ct.config(yscrollcommand=self.S_move.set) self.S_text_move.config(command=self.init_data_Text.yview) # 文本框滚动条 self.init_data_Text.config(yscrollcommand=self.S_text_move.set) # def printlist(self,event): # print(self.Ls_box.get(self.Ls_box.curselection())) def list_box(self, query_all_chapters, query_text): self.Ls_box = Listbox(self.win, selectmode=EXTENDED, fg='blue') self.Ls_box.place(x=10, y=140, width=170, height=150) self.Ls_box.bind( '<Double-Button-1>', query_all_chapters ) # 鼠标双击 更多事件请看http://www.cnblogs.com/hackpig/p/8195678.html self.Ls_box.insert(END, "获取排行榜") # 请输入书名&作者进行查询 self.Ls_box_ct = Listbox(self.win, selectmode=EXTENDED, fg='blue') self.Ls_box_ct.place(x=200, y=40, width=180, height=550) self.Ls_box_ct.bind('<Double-Button-1>', query_text) def add_train_info(self): lis_train = ["C" + str(x) for x in range(0, 2)] tuple_train = tuple(lis_train) self.tree = Treeview(self.win, columns=tuple_train, height=30, show="headings") self.tree.place(x=200, y=40, width=180, height=550) train_info = [' 书名 ', ' 作者 '] for i in range(0, len(lis_train)): self.tree.column( lis_train[i], width=len(train_info[i]) * 11, anchor='w') # must be n, ne, e, se, s, sw, w, nw, or center self.tree.heading(lis_train[i], text=train_info[i]) # 实时显示时钟 def gettime(self): # 获取当前时间 self.sys_time.set(time.strftime("%H:%M:%S")) # 每隔一秒调用函数自身获取时间 self.win.after(1000, self.gettime)
class App(object): def __init__(self): self.w = Tk() self.w.title('图片识别器') self.w.geometry('500x350') self.creat_res() self.res_config() self.w.mainloop() def creat_res(self): # 布局控件 self.pic_var1 = StringVar() # 图片1 self.pic_var2 = StringVar() # 图片2 self.L_info = Label(self.w, fg='#1E90FF', text='请输入网络图片地址或者选择本地图片', bg='#E3E3E3') self.E_pic1 = Entry(self.w, textvariable=self.pic_var1) self.E_pic2 = Entry(self.w, textvariable=self.pic_var2) self.B_pic1 = Button(self.w, text='选择') self.B_pic2 = Button(self.w, text='选择') self.L_pic1_info = Label(self.w, bg='#63B8FF') self.L_pic2_info = Label(self.w, bg='#63B8FF') self.L_pic1 = Label(self.w, bg='#E3E3E3') self.L_pic2 = Label(self.w, bg='#E3E3E3') self.B_go = Button(self.w, text='GO') self.L_message = Label(self.w, bg='#E3E3E3') self.res_place() def res_place(self): self.L_info.place(x=10, y=6, width=260, height=30) self.E_pic1.place(x=10, y=45, width=200, height=30) self.E_pic2.place(x=270, y=45, width=200, height=30) self.B_pic1.place(x=170, y=85, width=40, height=28) self.B_pic2.place(x=430, y=85, width=40, height=28) self.L_pic1_info.place(x=10, y=85, width=150, height=30) self.L_pic2_info.place(x=270, y=85, width=150, height=30) self.L_pic1.place(x=10, y=120, width=200, height=200) self.L_pic2.place(x=270, y=120, width=200, height=200) self.B_go.place(x=215, y=150, width=50, height=50) self.L_message.place(x=280, y=6, width=215, height=30) def res_config(self): # 配置文件 self.B_pic1.config(command=self.file_path1_config) self.B_pic2.config(command=self.file_path2_config) self.B_go.config(command=self.contrast_pics) def file_path1_config(self): # 配置打开文件路径1 self.path_1 = askopenfilename() self.pic_var1.set(self.path_1) self.view_pics1(self.pic_var1.get()) self.L_pic1.config(image=self.ima1) def file_path2_config(self): # 配置打开文件路径2 self.path_2 = askopenfilename() self.pic_var2.set(self.path_2) self.view_pics2(self.pic_var2.get()) self.L_pic2.config(image=self.ima2) def change_jpg_to_png(self, a): # 转换图片格式 print('转换图片格式') print(a) img = cv2.imread(a) new_name = a.replace('jpg', 'png') # new_file='image/'+new_name.split('/')[-1] cv2.imwrite(new_name, img) print('转换完成') return new_name def view_pics1(self, path): # 显示打开的照片 print('显示') print(path) flag = '' if re.match('[c-zC-Z]:/.+.jpg', path): new_name = self.change_jpg_to_png(path) self.ima1 = PhotoImage(file=new_name) elif re.match('[c-zC-Z]:/.+.png', path): self.ima1 = PhotoImage(file=path) face_num, face_age, face_beaty = self.get_pic_info(flag, path) self.L_pic1_info.config(text='人脸:{} 年龄:{} 颜值:{:.2f}'.format(face_num, face_age, face_beaty)) def view_pics2(self, path): # 显示打开的照片 print('显示') print(path) flag = '' if re.match('[c-zC-Z]:/.+.jpg', path): new_name = self.change_jpg_to_png(path) self.ima2 = PhotoImage(file=new_name) elif re.match('[c-zC-Z]:/.+.png', path): self.ima2 = PhotoImage(file=path) face_num, face_age, face_beaty = self.get_pic_info(flag, path) self.L_pic2_info.config(text='人脸:{} 年龄:{} 颜值:{:.2f}'.format(face_num, face_age, face_beaty)) def get_pic_info(self, flag, path): # 获得图片信息 if re.match('http.+.[jpg]|[png]]', path): # 如果匹配url flag = '1' elif re.match('[c-zC-Z]:/.+.[png]|[jpg]]', path): # 如果匹配本地图片base64 flag = '2' face_num, face_age, face_beaty = check_img(flag, path) return face_num, face_age, face_beaty def contrast_pics(self): # 对比图片 path1 = self.pic_var1.get() path2 = self.pic_var2.get() flag1, flag2 = '', '' if re.match('http.+.[jpg]|[png]]', path1): # 如果匹配url flag1 = '1' elif re.match('[c-zC-Z]:/.+.[png]|[jpg]]', path1): # 如果匹配本地图片base64 flag1 = '2' if re.match('http.+.[jpg]|[png]]', path2): # 如果匹配url flag2 = '1' elif re.match('[c-zC-Z]:/.+.[png]|[jpg]]', path2): # 如果匹配本地图片base64 flag2 = '2' face_res = check_face(flag1, flag2, path1, path2) self.L_message.config(text='两张图片相似度{:.2f}'.format(face_res))
class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.pack(fill=BOTH, expand=1) self.initUI() self.setGeometry() self.component = NewComponent() def setGeometry(self): x = 300 y = 100 self.master.geometry("400x300+%d+%d" % (x, y)) self.master.update() def initUI(self): #setup title self.master.title("Component Creator") self.style = Style() self.style.theme_use("clam") #indicator label self.labelName = Label(self, text="Component Name:") self.labelName.place(x=10, y=10) self.master.update() # create variable and namefield for input of component name sv = StringVar() sv.trace("w", lambda name, index, mode, sv=sv: self.nameChanged(sv)) self.nameField = Entry(self, textvariable=sv) self.nameField.place(x=10 + self.labelName.winfo_width() + 10, y=10) self.master.update() # label for image name that will show img name for a given component name self.imgNameVar = StringVar() self.imgNameVar.set('imageName:') self.labelImageName = Label(self, textvariable=self.imgNameVar) self.labelImageName.place(x=10 + self.labelName.winfo_width() + 10, y=40) # checkbox for visible component or not self.cbVar = IntVar() self.cb = Checkbutton(self, text="Visible Component", variable=self.cbVar) self.cb.place(x=10, y=70) # dropdown list for category self.labelCategory = Label(self, text="Category:") self.labelCategory.place(x=10, y=110) self.master.update() acts = [ 'UserInterface', 'Layout', 'Media', 'Animation', 'Sensors', 'Social', 'Storage', 'Connectivity', 'LegoMindStorms', 'Experimental', 'Internal', 'Uninitialized' ] self.catBox = Combobox(self, values=acts) self.catBox.place(x=10 + self.labelCategory.winfo_width() + 10, y=110) # button to select icon image self.getImageButton = Button(self, text="Select icon", command=self.getImage) self.getImageButton.place(x=10, y=150) self.master.update() # explanation for resizing self.resizeVar = IntVar() self.resizeCB = Checkbutton( self, text="ON=Resize Image (Requires PIL)\nOFF=Provide 16x16 Image", variable=self.resizeVar) self.resizeCB.place(x=10 + self.getImageButton.winfo_width() + 10, y=150) # create button self.createButton = Button(self, text="Create", command=self.create) self.createButton.place(x=10, y=230) #cancel button self.cancelButton = Button(self, text="Cancel", command=self.quit) self.cancelButton.place(x=200, y=230) # open file picker for selecting an icon def getImage(self): ftypes = [('All Picture Files', ('*.jpg', '*.png', '*.jpeg', '*.bmp')), ('All files', '*')] self.component.imgFile = askopenfilename(filetypes=ftypes, title="Select an Icon file") # update component name and image name for component by lowercasing first letter def nameChanged(self, sv): s = sv.get() self.component.compName = s self.component.compImgName = s[:1].lower() + s[1:] if s else '' self.imgNameVar.set('imageName: %s' % self.component.compImgName) # tries to create component def create(self): # sets parameters for new component based on input values self.component.visibleComponent = bool(self.cbVar.get()) self.component.resizeImage = bool(self.resizeVar.get()) self.component.category = self.catBox.get().upper() self.component.compName = self.nameField.get() try: # check if component already exists try: open( '../../components/src/com/google/appinentor/components/runtime/%s.java', 'r') messagebox.showerror( "Duplicate Component", "%s already exists" % self.component.compName) # if doesnt exist will raise error except IOError: # check for name input if not self.component.compImgName: messagebox.showerror("Missing Name", "Please enter component name") return #check for category selection if not self.component.category: messagebox.showerror("Missing Category", "Please select a category") return # check if selected an icon if not self.component.imgFile: messagebox.showerror("Missing Icon", "Please select an icon image") return # copy image file to folder, can get error if user checked resize and doest have PIL installed try: self.component.copyImageToFolder() except ImportError as e: messagebox.showerror( "Unable to import PIL", "Please install PIL or unselect checkbox") return # add references to the image file, can get error if component already exists try: self.component.addImageReference() except DuplicateError as e: messagebox.showerror( "Duplicate Component", "%s already exists" % self.component.compName) return # will create mock component if is visible and add references to SimpleComponentDescriptor self.component.createMockComponent() # will create the actual component file self.component.createComponent() messagebox.showinfo('Success', 'Component created successfully') # if could not open some file for writing except Exception as e: messagebox.showerror("Exception", str(e))
class Window(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): """ Function defines basic layout of whole program. """ # Start instances atributes self.master.title("Image Compare") self.pack(fill=BOTH, expand=1) self.listOfPaths = [] self.lenght = 0 self.i = 0 self.directory1 = "C:\\Plots1" self.directory2 = "C:\\Plots2" Style().configure("TFrame", background="#333") # Defining entrys, lables and text fields self.path1 = Entry(self, width=50) self.path1.place(x=10, y=10) self.path2 = Entry(self, width=50) self.path2.place(x=10, y=35) self.startFromEntry = Entry(self, width=5) self.startFromEntry.place(x=550, y=10) self.plot1PathText = Text(self, height=3, width=75) self.plot1PathText.place(x=620, y=670) self.plot2PathText = Text(self, height=3, width=75) self.plot2PathText.place(x=1230, y=670) self.lb = Listbox(self, height=15, width=100) self.lb.place(x=620, y=740) self.numberOfPlotsText = Text(self, height=1, width=5) self.numberOfPlotsText.place(x=790, y=10) self.currentPlotsText = Text(self, height=1, width=5) self.currentPlotsText.place(x=930, y=10) numberOfPlotsLabel = Label(self, text="Nuber of plots:") numberOfPlotsLabel.place(x=700, y=10) currentPlotsLabel = Label(self, text="Current plot:") currentPlotsLabel.place(x=850, y=10) # Defining buttons previousButton = Button(self, text="Previous", command=self.previousButtonFunction) previousButton.place(x=10, y=670) nextButton = Button(self, text="Next", command=self.nextButtonFunction) nextButton.place(x=100, y=670) differentButton = Button(self, text="Different", command=self.differentButtonFunction) differentButton.place(x=300, y=670) deleteButton = Button(self, text="Delete", command=self.deleteButtonFunction) deleteButton.place(x=380, y=670) getPathButton = Button(self, text="Get Path", command=self.get_filepaths) getPathButton.place(x=350, y=8) startFromButton = Button(self, text="Start From", command=self.startFromButtonFunction) startFromButton.place(x=600, y=8) #Defining messageboxes def onNoPlot(self): string = self.listOfPaths[self.i] string = string.replace(self.directory1, self.directory2) mbox.showerror("Error", "There is no plot {}".format(string)) def onEqualPath(self): mbox.showerror("Error", "The same paths") def onLastPicture(self): mbox.showinfo("Last plot", "That is the last plot.") def onFirstPicture(self): mbox.showinfo("First plot", "That is the first plot.") # Defining buttons function def deleteButtonFunction(self): """ deleteButton functionality, deleting item from listbox. """ result = mbox.askquestion("Delete", "Delete highlighted item?", icon='warning') if result == 'yes': self.lb.delete(ANCHOR) #self.lb is listbox else: return None def startFromButtonFunction(self): """ startFromButton functionality, from which chart program is starting. """ # Get value from entry a = int(self.startFromEntry.get()) - 1 # Check if value is proper if a < 0 or a >= self.lenght: print("Wrong number") else: self.i = a self.picture(self.i) def nextButtonFunction(self): """ nextButton functionality, next picture is choosen. """ if self.i == self.lenght - 1: self.onLastPicture() else: self.i += 1 self.picture(self.i) def previousButtonFunction(self): """ previousButton functionality, previousPicture picture is choosen. """ if self.i == 0: self.onFirstPicture() else: self.i -= 1 self.picture(self.i) def differentButtonFunction(self): """ differentButton functionality. """ adr = self.listOfPaths[self.i] self.addToListbox(adr) def addToListbox(self, adr): """ This function add path to listbox when charts are differentButton. Parameters: ---------- adr: str Path to chart. """ try: if adr in self.lb.get(0, END): return None else: self.lb.insert(0, adr) except TypeError: self.lb.insert(0, adr) def picture(self, adr): """ This function creates three lables with pictures, first label show differences between pictures in next two labels. Parameters: ---------- adr: str Path to chart. """ adress_1 = self.listOfPaths[adr] adress_2 = adress_1.replace(self.directory1, self.directory2) file_img1 = Image.open(adress_1) try: file_img2 = Image.open(adress_2) except FileNotFoundError: adr = self.listOfPaths[self.i] self.addToListbox(adr) self.onNoPlot() return None self.fill_text_fields(adress_1, adress_2) diff = ImageChops.difference(file_img1, file_img2) diff = diff.resize((600, 600)) diffjov = ImageTk.PhotoImage(diff) label1 = Label(self, image=diffjov) label1.image = diffjov label1.place(x=10, y=60) file_img1 = file_img1.resize((600, 600)) image_2 = ImageTk.PhotoImage(file_img1) label2 = Label(self, image=image_2) label2.image = image_2 label2.place(x=620, y=60) file_img2 = file_img2.resize((600, 600)) image_3 = ImageTk.PhotoImage(file_img2) label3 = Label(self, image=image_3) label3.image = image_3 label3.place(x=1230, y=60) def fill_text_fields(self, adr_1, adr_2): """ This function is added plots pathes to labels and added curent plot number to label Parameters: ---------- adr_1: str Path to chart. adr_2: str Path to chart. """ self.plot1PathText.config(state="normal") self.plot1PathText.delete("1.0", END) self.plot1PathText.insert(INSERT, adr_1) self.plot1PathText.config(state="disabled") self.plot2PathText.config(state="normal") self.plot2PathText.delete("1.0", END) self.plot2PathText.insert(INSERT, adr_2) self.plot1PathText.config(state="disabled") self.currentPlotsText.config(state="normal") self.currentPlotsText.delete("1.0", END) self.currentPlotsText.insert(INSERT, self.i + 1) self.currentPlotsText.config(state="disabled") def get_filepaths(self): """ This function will generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames). """ self.directory1 = self.path1.get() self.directory2 = self.path2.get() if self.directory1 == self.directory2: self.onEqualPath() return None file_paths = [] # List which will store all of the full filepaths. self.i = 0 # Walk the tree. for root, directories, files in os.walk(self.directory1): for filename in files: # Join the two strings in order to form the full filepath. filepath = os.path.join(root, filename) file_paths.append(filepath) # Add it to the list. self.listOfPaths = file_paths self.lenght = len(file_paths) self.picture(self.i) self.numberOfPlotsText.insert(INSERT, self.lenght) self.numberOfPlotsText.config(state="disabled") def saveToFile(self): """ This function write to file all elemens from listbox to file. """ pathList = self.lb.get(0, END) currentPath = os.path.abspath(__file__) pathToSave = currentPath.split("\\") pathToSave[-1] = "path.txt" pathToSave.pop(-2) path = "\\".join(pathToSave) with open(path, "w") as fp: for item in pathList: fp.write(item + "\n")
class Sync(Tk): """FolderSync main window.""" def __init__(self): Tk.__init__(self, className='FolderSync') self.title("FolderSync") self.geometry("%ix%i" % (self.winfo_screenwidth(), self.winfo_screenheight())) self.protocol("WM_DELETE_WINDOW", self.quitter) self.icon = PhotoImage(master=self, file=IM_ICON) self.iconphoto(True, self.icon) self.rowconfigure(2, weight=1) self.columnconfigure(0, weight=1) # --- icons self.img_about = PhotoImage(master=self, file=IM_ABOUT) self.img_open = PhotoImage(master=self, file=IM_OPEN) self.img_plus = PhotoImage(master=self, file=IM_PLUS) self.img_moins = PhotoImage(master=self, file=IM_MOINS) self.img_sync = PhotoImage(master=self, file=IM_SYNC) self.img_prev = PhotoImage(master=self, file=IM_PREV) self.img_expand = PhotoImage(master=self, file=IM_EXPAND) self.img_collapse = PhotoImage(master=self, file=IM_COLLAPSE) self.original = "" self.sauvegarde = "" # list of files / folders to delete before starting the copy because # they are not of the same type on the original and the backup self.pb_chemins = [] self.err_copie = False self.err_supp = False # --- init log files l = [f for f in listdir(PATH) if match(r"foldersync[0-9]+.pid", f)] nbs = [] for f in l: with open(join(PATH, f)) as fich: old_pid = fich.read().strip() if exists("/proc/%s" % old_pid): nbs.append(int(search(r"[0-9]+", f).group())) else: remove(join(PATH, f)) if not nbs: i = 0 else: nbs.sort() i = 0 while i in nbs: i += 1 self.pidfile = PID_FILE % i open(self.pidfile, 'w').write(str(getpid())) self.log_copie = LOG_COPIE % i self.log_supp = LOG_SUPP % i self.logger_copie = setup_logger("copie", self.log_copie) self.logger_supp = setup_logger("supp", self.log_supp) date = datetime.now().strftime('%d/%m/%Y %H:%M') self.logger_copie.info("\n### %s ###\n" % date) self.logger_supp.info("\n### %s ###\n" % date) # --- filenames and extensions that will not be copied exclude_list = split(r'(?<!\\) ', CONFIG.get("Defaults", "exclude_copie")) self.exclude_names = [] self.exclude_ext = [] for elt in exclude_list: if elt: if elt[:2] == "*.": self.exclude_ext.append(elt[1:]) else: self.exclude_names.append(elt.replace("\ ", " ")) # --- paths that will not be deleted self.exclude_path_supp = [ ch.replace("\ ", " ") for ch in split( r'(?<!\\) ', CONFIG.get("Defaults", "exclude_supp")) if ch ] # while "" in self.exclude_path_supp: # self.exclude_path_supp.remove("") self.q_copie = Queue() self.q_supp = Queue() # True if a copy / deletion is running self.is_running_copie = False self.is_running_supp = False self.style = Style(self) self.style.theme_use("clam") self.style.configure("TProgressbar", troughcolor='lightgray', background='#387EF5', lightcolor="#5D95F5", darkcolor="#2758AB") self.style.map("TProgressbar", lightcolor=[("disabled", "white")], darkcolor=[("disabled", "gray")]) self.style.configure("folder.TButton", padding=0) # --- menu self.menu = Menu(self, tearoff=False) self.configure(menu=self.menu) # -------- recents self.menu_recent = Menu(self.menu, tearoff=False) if RECENT: for ch_o, ch_s in RECENT: self.menu_recent.add_command( label="%s -> %s" % (ch_o, ch_s), command=lambda o=ch_o, s=ch_s: self.open(o, s)) else: self.menu.entryconfigure(0, state="disabled") # -------- favorites self.menu_fav = Menu(self.menu, tearoff=False) self.menu_fav_del = Menu(self.menu_fav, tearoff=False) self.menu_fav.add_command(label=_("Add"), image=self.img_plus, compound="left", command=self.add_fav) self.menu_fav.add_cascade(label=_("Remove"), image=self.img_moins, compound="left", menu=self.menu_fav_del) for ch_o, ch_s in FAVORIS: label = "%s -> %s" % (ch_o, ch_s) self.menu_fav.add_command( label=label, command=lambda o=ch_o, s=ch_s: self.open(o, s)) self.menu_fav_del.add_command( label=label, command=lambda nom=label: self.del_fav(nom)) if not FAVORIS: self.menu_fav.entryconfigure(1, state="disabled") # -------- log files menu_log = Menu(self.menu, tearoff=False) menu_log.add_command(label=_("Copy"), command=self.open_log_copie) menu_log.add_command(label=_("Removal"), command=self.open_log_suppression) # -------- settings menu_params = Menu(self.menu, tearoff=False) self.copy_links = BooleanVar(self, value=CONFIG.getboolean( "Defaults", "copy_links")) self.show_size = BooleanVar(self, value=CONFIG.getboolean( "Defaults", "show_size")) menu_params.add_checkbutton(label=_("Copy links"), variable=self.copy_links, command=self.toggle_copy_links) menu_params.add_checkbutton(label=_("Show total size"), variable=self.show_size, command=self.toggle_show_size) self.langue = StringVar(self, CONFIG.get("Defaults", "language")) menu_lang = Menu(menu_params, tearoff=False) menu_lang.add_radiobutton(label="English", value="en", variable=self.langue, command=self.change_language) menu_lang.add_radiobutton(label="Français", value="fr", variable=self.langue, command=self.change_language) menu_params.add_cascade(label=_("Language"), menu=menu_lang) menu_params.add_command(label=_("Exclude from copy"), command=self.exclusion_copie) menu_params.add_command(label=_("Exclude from removal"), command=self.exclusion_supp) self.menu.add_cascade(label=_("Recents"), menu=self.menu_recent) self.menu.add_cascade(label=_("Favorites"), menu=self.menu_fav) self.menu.add_cascade(label=_("Log"), menu=menu_log) self.menu.add_cascade(label=_("Settings"), menu=menu_params) self.menu.add_command(image=self.img_prev, compound="center", command=self.list_files_to_sync) self.menu.add_command(image=self.img_sync, compound="center", state="disabled", command=self.synchronise) self.menu.add_command(image=self.img_about, compound="center", command=lambda: About(self)) # --- tooltips wrapper = TooltipMenuWrapper(self.menu) wrapper.add_tooltip(4, _('Preview')) wrapper.add_tooltip(5, _('Sync')) wrapper.add_tooltip(6, _('About')) # --- path selection frame_paths = Frame(self) frame_paths.grid(row=0, sticky="ew", pady=(10, 0)) frame_paths.columnconfigure(0, weight=1) frame_paths.columnconfigure(1, weight=1) f1 = Frame(frame_paths, height=26) f2 = Frame(frame_paths, height=26) f1.grid(row=0, column=0, sticky="ew") f2.grid(row=0, column=1, sticky="ew") f1.grid_propagate(False) f2.grid_propagate(False) f1.columnconfigure(1, weight=1) f2.columnconfigure(1, weight=1) # -------- path to original Label(f1, text=_("Original")).grid(row=0, column=0, padx=(10, 4)) f11 = Frame(f1) f11.grid(row=0, column=1, sticky="nsew", padx=(4, 0)) self.entry_orig = Entry(f11) self.entry_orig.place(x=1, y=0, bordermode='outside', relwidth=1) self.b_open_orig = Button(f1, image=self.img_open, style="folder.TButton", command=self.open_orig) self.b_open_orig.grid(row=0, column=2, padx=(0, 7)) # -------- path to backup Label(f2, text=_("Backup")).grid(row=0, column=0, padx=(8, 4)) f22 = Frame(f2) f22.grid(row=0, column=1, sticky="nsew", padx=(4, 0)) self.entry_sauve = Entry(f22) self.entry_sauve.place(x=1, y=0, bordermode='outside', relwidth=1) self.b_open_sauve = Button(f2, image=self.img_open, width=2, style="folder.TButton", command=self.open_sauve) self.b_open_sauve.grid(row=0, column=5, padx=(0, 10)) paned = PanedWindow(self, orient='horizontal') paned.grid(row=2, sticky="eswn") paned.rowconfigure(0, weight=1) paned.columnconfigure(1, weight=1) paned.columnconfigure(0, weight=1) # --- left side frame_left = Frame(paned) paned.add(frame_left, weight=1) frame_left.rowconfigure(3, weight=1) frame_left.columnconfigure(0, weight=1) # -------- files to copy f_left = Frame(frame_left) f_left.columnconfigure(2, weight=1) f_left.grid(row=2, columnspan=2, pady=(4, 2), padx=(10, 4), sticky="ew") Label(f_left, text=_("To copy")).grid(row=0, column=2) frame_copie = Frame(frame_left) frame_copie.rowconfigure(0, weight=1) frame_copie.columnconfigure(0, weight=1) frame_copie.grid(row=3, column=0, sticky="eswn", columnspan=2, pady=(2, 4), padx=(10, 4)) self.tree_copie = CheckboxTreeview(frame_copie, selectmode='none', show='tree') self.b_expand_copie = Button(f_left, image=self.img_expand, style="folder.TButton", command=self.tree_copie.expand_all) TooltipWrapper(self.b_expand_copie, text=_("Expand all")) self.b_expand_copie.grid(row=0, column=0) self.b_expand_copie.state(("disabled", )) self.b_collapse_copie = Button(f_left, image=self.img_collapse, style="folder.TButton", command=self.tree_copie.collapse_all) TooltipWrapper(self.b_collapse_copie, text=_("Collapse all")) self.b_collapse_copie.grid(row=0, column=1, padx=4) self.b_collapse_copie.state(("disabled", )) self.tree_copie.tag_configure("warning", foreground="red") self.tree_copie.tag_configure("link", font="tkDefaultFont 9 italic", foreground="blue") self.tree_copie.tag_bind("warning", "<Button-1>", self.show_warning) self.tree_copie.grid(row=0, column=0, sticky="eswn") self.scroll_y_copie = Scrollbar(frame_copie, orient="vertical", command=self.tree_copie.yview) self.scroll_y_copie.grid(row=0, column=1, sticky="ns") self.scroll_x_copie = Scrollbar(frame_copie, orient="horizontal", command=self.tree_copie.xview) self.scroll_x_copie.grid(row=1, column=0, sticky="ew") self.tree_copie.configure(yscrollcommand=self.scroll_y_copie.set, xscrollcommand=self.scroll_x_copie.set) self.pbar_copie = Progressbar(frame_left, orient="horizontal", mode="determinate") self.pbar_copie.grid(row=4, columnspan=2, sticky="ew", padx=(10, 4), pady=4) self.pbar_copie.state(("disabled", )) # --- right side frame_right = Frame(paned) paned.add(frame_right, weight=1) frame_right.rowconfigure(3, weight=1) frame_right.columnconfigure(0, weight=1) # -------- files to delete f_right = Frame(frame_right) f_right.columnconfigure(2, weight=1) f_right.grid(row=2, columnspan=2, pady=(4, 2), padx=(4, 10), sticky="ew") Label(f_right, text=_("To remove")).grid(row=0, column=2) frame_supp = Frame(frame_right) frame_supp.rowconfigure(0, weight=1) frame_supp.columnconfigure(0, weight=1) frame_supp.grid(row=3, columnspan=2, sticky="eswn", pady=(2, 4), padx=(4, 10)) self.tree_supp = CheckboxTreeview(frame_supp, selectmode='none', show='tree') self.b_expand_supp = Button(f_right, image=self.img_expand, style="folder.TButton", command=self.tree_supp.expand_all) TooltipWrapper(self.b_expand_supp, text=_("Expand all")) self.b_expand_supp.grid(row=0, column=0) self.b_expand_supp.state(("disabled", )) self.b_collapse_supp = Button(f_right, image=self.img_collapse, style="folder.TButton", command=self.tree_supp.collapse_all) TooltipWrapper(self.b_collapse_supp, text=_("Collapse all")) self.b_collapse_supp.grid(row=0, column=1, padx=4) self.b_collapse_supp.state(("disabled", )) self.tree_supp.grid(row=0, column=0, sticky="eswn") self.scroll_y_supp = Scrollbar(frame_supp, orient="vertical", command=self.tree_supp.yview) self.scroll_y_supp.grid(row=0, column=1, sticky="ns") self.scroll_x_supp = Scrollbar(frame_supp, orient="horizontal", command=self.tree_supp.xview) self.scroll_x_supp.grid(row=1, column=0, sticky="ew") self.tree_supp.configure(yscrollcommand=self.scroll_y_supp.set, xscrollcommand=self.scroll_x_supp.set) self.pbar_supp = Progressbar(frame_right, orient="horizontal", mode="determinate") self.pbar_supp.grid(row=4, columnspan=2, sticky="ew", padx=(4, 10), pady=4) self.pbar_supp.state(("disabled", )) # --- bindings self.entry_orig.bind("<Key-Return>", self.list_files_to_sync) self.entry_sauve.bind("<Key-Return>", self.list_files_to_sync) def exclusion_supp(self): excl = ExclusionsSupp(self) self.wait_window(excl) # paths that will not be deleted self.exclude_path_supp = [ ch.replace("\ ", " ") for ch in split( r'(?<!\\) ', CONFIG.get("Defaults", "exclude_supp")) if ch ] def exclusion_copie(self): excl = ExclusionsCopie(self) self.wait_window(excl) exclude_list = CONFIG.get("Defaults", "exclude_copie").split(" ") self.exclude_names = [] self.exclude_ext = [] for elt in exclude_list: if elt: if elt[:2] == "*.": self.exclude_ext.append(elt[2:]) else: self.exclude_names.append(elt) def toggle_copy_links(self): CONFIG.set("Defaults", "copy_links", str(self.copy_links.get())) def toggle_show_size(self): CONFIG.set("Defaults", "show_size", str(self.show_size.get())) def open_log_copie(self): open_file(self.log_copie) def open_log_suppression(self): open_file(self.log_supp) def quitter(self): rep = True if self.is_running_copie or self.is_running_supp: rep = askokcancel( _("Confirmation"), _("A synchronization is ongoing, do you really want to quit?"), parent=self) if rep: self.destroy() def del_fav(self, nom): self.menu_fav.delete(nom) self.menu_fav_del.delete(nom) FAVORIS.remove(tuple(nom.split(" -> "))) save_config() if not FAVORIS: self.menu_fav.entryconfigure(1, state="disabled") def add_fav(self): sauvegarde = self.entry_sauve.get() original = self.entry_orig.get() if original != sauvegarde and original and sauvegarde: if exists(original) and exists(sauvegarde): if not (original, sauvegarde) in FAVORIS: FAVORIS.append((original, sauvegarde)) save_config() label = "%s -> %s" % (original, sauvegarde) self.menu_fav.entryconfigure(1, state="normal") self.menu_fav.add_command(label=label, command=lambda o=original, s= sauvegarde: self.open(o, s)) self.menu_fav_del.add_command( label=label, command=lambda nom=label: self.del_fav(nom)) def open(self, ch_o, ch_s): self.entry_orig.delete(0, "end") self.entry_orig.insert(0, ch_o) self.entry_sauve.delete(0, "end") self.entry_sauve.insert(0, ch_s) self.list_files_to_sync() def open_sauve(self): sauvegarde = askdirectory(self.entry_sauve.get(), parent=self) if sauvegarde: self.entry_sauve.delete(0, "end") self.entry_sauve.insert(0, sauvegarde) def open_orig(self): original = askdirectory(self.entry_orig.get(), parent=self) if original: self.entry_orig.delete(0, "end") self.entry_orig.insert(0, original) def sync(self, original, sauvegarde): """ peuple tree_copie avec l'arborescence des fichiers d'original à copier vers sauvegarde et tree_supp avec celle des fichiers de sauvegarde à supprimer """ errors = [] copy_links = self.copy_links.get() excl_supp = [ path for path in self.exclude_path_supp if commonpath([path, sauvegarde]) == sauvegarde ] def get_name(elt): return elt.name.lower() def lower(char): return char.lower() def arbo(tree, parent, n): """ affiche l'arborescence complète de parent et renvoie la longueur maximale des items (pour gérer la scrollbar horizontale) """ m = 0 try: with scandir(parent) as content: l = sorted(content, key=get_name) for item in l: chemin = item.path nom = item.name if item.is_symlink(): if copy_links: tree.insert(parent, 'end', chemin, text=nom, tags=("whole", "link")) m = max(m, len(nom) * 9 + 20 * (n + 1)) elif ((nom not in self.exclude_names) and (splitext(nom)[-1] not in self.exclude_ext)): tree.insert(parent, 'end', chemin, text=nom, tags=("whole", )) m = max(m, len(nom) * 9 + 20 * (n + 1)) if item.is_dir(): m = max(m, arbo(tree, chemin, n + 1)) except NotADirectoryError: pass except Exception as e: errors.append(str(e)) return m def aux(orig, sauve, n, search_supp): m_copie = 0 m_supp = 0 try: lo = listdir(orig) ls = listdir(sauve) except Exception as e: errors.append(str(e)) lo = [] ls = [] lo.sort(key=lambda x: x.lower()) ls.sort(key=lambda x: x.lower()) supp = False copie = False if search_supp: for item in ls: chemin_s = join(sauve, item) if chemin_s not in excl_supp and item not in lo: supp = True self.tree_supp.insert(sauve, 'end', chemin_s, text=item, tags=("whole", )) m_supp = max(m_supp, int(len(item) * 9 + 20 * (n + 1)), arbo(self.tree_supp, chemin_s, n + 1)) for item in lo: chemin_o = join(orig, item) chemin_s = join(sauve, item) if ((item not in self.exclude_names) and (splitext(item)[-1] not in self.exclude_ext)): if item not in ls: # le dossier / fichier n'est pas dans la sauvegarde if islink(chemin_o): if copy_links: copie = True self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=("whole", "link")) m_copie = max( m_copie, (int(len(item) * 9 + 20 * (n + 1)))) else: copie = True self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=("whole", )) m_copie = max( m_copie, (int(len(item) * 9 + 20 * (n + 1))), arbo(self.tree_copie, chemin_o, n + 1)) elif islink(chemin_o) and exists(chemin_o): # checking the existence prevent from copying broken links if copy_links: if not islink(chemin_s): self.pb_chemins.append(chemin_o) tags = ("whole", "warning", "link") else: tags = ("whole", "link") self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=tags) m_copie = max(m_copie, int(len(item) * 9 + 20 * (n + 1))) copie = True elif isfile(chemin_o): # first check if chemin_s is also a file if isfile(chemin_s): if getmtime(chemin_o) // 60 > getmtime( chemin_s) // 60: # le fichier f a été modifié depuis la dernière sauvegarde copie = True self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=("whole", )) else: self.pb_chemins.append(chemin_o) self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=("whole", "warning")) elif isdir(chemin_o): # to avoid errors due to unrecognized item types (neither file nor folder nor link) if isdir(chemin_s): self.tree_copie.insert(orig, 'end', chemin_o, text=item) self.tree_supp.insert(sauve, 'end', chemin_s, text=item) c, s, mc, ms = aux( chemin_o, chemin_s, n + 1, search_supp and (chemin_s not in excl_supp)) supp = supp or s copie = copie or c if not c: # nothing to copy self.tree_copie.delete(chemin_o) else: m_copie = max( m_copie, mc, int(len(item) * 9 + 20 * (n + 1))) if not s: # nothing to delete self.tree_supp.delete(chemin_s) else: m_supp = max(m_supp, ms, int(len(item) * 9 + 20 * (n + 1))) else: copie = True self.pb_chemins.append(chemin_o) self.tree_copie.insert(orig, 'end', chemin_o, text=item, tags=("whole", "warning")) m_copie = max( m_copie, (int(len(item) * 9 + 20 * (n + 1))), arbo(self.tree_copie, chemin_o, n + 1)) return copie, supp, m_copie, m_supp self.tree_copie.insert("", 0, original, text=original, tags=("checked", ), open=True) self.tree_supp.insert("", 0, sauvegarde, text=sauvegarde, tags=("checked", ), open=True) c, s, mc, ms = aux(original, sauvegarde, 1, True) if not c: self.tree_copie.delete(original) self.tree_copie.column("#0", minwidth=0, width=0) else: mc = max(len(original) * 9 + 20, mc) self.tree_copie.column("#0", minwidth=mc, width=mc) if not s: self.tree_supp.delete(sauvegarde) self.tree_supp.column("#0", minwidth=0, width=0) else: ms = max(len(sauvegarde) * 9 + 20, mc) self.tree_supp.column("#0", minwidth=ms, width=ms) return errors def show_warning(self, event): if "disabled" not in self.b_open_orig.state(): x, y = event.x, event.y elem = event.widget.identify("element", x, y) if elem == "padding": orig = self.tree_copie.identify_row(y) sauve = orig.replace(self.original, self.sauvegarde) showwarning( _("Warning"), _("%(original)s and %(backup)s are not of the same kind (folder/file/link)" ) % { 'original': orig, 'backup': sauve }, master=self) def list_files_to_sync(self, event=None): """Display in a treeview the file to copy and the one to delete.""" self.pbar_copie.configure(value=0) self.pbar_supp.configure(value=0) self.sauvegarde = self.entry_sauve.get() self.original = self.entry_orig.get() if self.original != self.sauvegarde and self.original and self.sauvegarde: if exists(self.original) and exists(self.sauvegarde): o_s = (self.original, self.sauvegarde) if o_s in RECENT: RECENT.remove(o_s) self.menu_recent.delete("%s -> %s" % o_s) RECENT.insert(0, o_s) self.menu_recent.insert_command( 0, label="%s -> %s" % o_s, command=lambda o=self.original, s=self.sauvegarde: self. open(o, s)) if len(RECENT) == 10: del (RECENT[-1]) self.menu_recent.delete(9) save_config() self.menu.entryconfigure(0, state="normal") self.configure(cursor="watch") self.toggle_state_gui() self.update_idletasks() self.update() self.efface_tree() err = self.sync(self.original, self.sauvegarde) self.configure(cursor="") self.toggle_state_gui() c = self.tree_copie.get_children("") s = self.tree_supp.get_children("") if not (c or s): self.menu.entryconfigure(5, state="disabled") self.b_collapse_copie.state(("disabled", )) self.b_expand_copie.state(("disabled", )) self.b_collapse_supp.state(("disabled", )) self.b_expand_supp.state(("disabled", )) elif not c: self.b_collapse_copie.state(("disabled", )) self.b_expand_copie.state(("disabled", )) elif not s: self.b_collapse_supp.state(("disabled", )) self.b_expand_supp.state(("disabled", )) if err: showerror(_("Errors"), "\n".join(err), master=self) notification_send(_("Scan is finished.")) warnings = self.tree_copie.tag_has('warning') if warnings: showwarning( _("Warning"), _("Some elements to copy (in red) are not of the same kind on the original and the backup." ), master=self) else: showerror(_("Error"), _("Invalid path!"), master=self) def efface_tree(self): """Clear both trees.""" c = self.tree_copie.get_children("") for item in c: self.tree_copie.delete(item) s = self.tree_supp.get_children("") for item in s: self.tree_supp.delete(item) self.b_collapse_copie.state(("disabled", )) self.b_expand_copie.state(("disabled", )) self.b_collapse_supp.state(("disabled", )) self.b_expand_supp.state(("disabled", )) def toggle_state_gui(self): """Toggle the state (normal/disabled) of key elements of the GUI.""" if "disabled" in self.b_open_orig.state(): state = "!disabled" for i in range(7): self.menu.entryconfigure(i, state="normal") else: state = "disabled" for i in range(7): self.menu.entryconfigure(i, state="disabled") self.tree_copie.state((state, )) self.tree_supp.state((state, )) self.entry_orig.state((state, )) self.entry_sauve.state((state, )) self.b_expand_copie.state((state, )) self.b_collapse_copie.state((state, )) self.b_expand_supp.state((state, )) self.b_collapse_supp.state((state, )) self.b_open_orig.state((state, )) self.b_open_sauve.state((state, )) def update_pbar(self): """ Dislay the progress of the copy and deletion and put the GUI back in normal state once both processes are done. """ if not self.is_running_copie and not self.is_running_supp: notification_send(_("Sync is finished.")) self.toggle_state_gui() self.pbar_copie.configure(value=self.pbar_copie.cget("maximum")) self.pbar_supp.configure(value=self.pbar_supp.cget("maximum")) self.menu.entryconfigure(5, state="disabled") self.configure(cursor="") self.efface_tree() msg = "" if self.err_copie: msg += _( "There were errors during the copy, see %(file)s for more details.\n" ) % { 'file': self.log_copie } if self.err_supp: msg += _( "There were errors during the removal, see %(file)s for more details.\n" ) % { 'file': self.log_supp } if msg: showerror(_("Error"), msg, master=self) else: if not self.q_copie.empty(): self.pbar_copie.configure(value=self.q_copie.get()) if not self.q_supp.empty(): self.pbar_supp.configure(value=self.q_supp.get()) self.update() self.after(50, self.update_pbar) @staticmethod def get_list(tree): """Return the list of files/folders to copy/delete (depending on the tree).""" selected = [] def aux(item): tags = tree.item(item, "tags") if "checked" in tags and "whole" in tags: selected.append(item) elif "checked" in tags or "tristate" in tags: ch = tree.get_children(item) for c in ch: aux(c) ch = tree.get_children("") for c in ch: aux(c) return selected def synchronise(self): """ Display the list of files/folders that will be copied / deleted and launch the copy and deletion if the user validates the sync. """ # get files to delete and folder to delete if they are empty a_supp = self.get_list(self.tree_supp) # get files to copy a_copier = self.get_list(self.tree_copie) a_supp_avant_cp = [] for ch in self.pb_chemins: if ch in a_copier: a_supp_avant_cp.append( ch.replace(self.original, self.sauvegarde)) if a_supp or a_copier: Confirmation(self, a_copier, a_supp, a_supp_avant_cp, self.original, self.sauvegarde, self.show_size.get()) def copie_supp(self, a_copier, a_supp, a_supp_avant_cp): """Launch sync.""" self.toggle_state_gui() self.configure(cursor="watch") self.update() self.pbar_copie.state(("!disabled", )) self.pbar_supp.state(("!disabled", )) nbtot_copie = len(a_copier) + len(a_supp_avant_cp) self.pbar_copie.configure(maximum=nbtot_copie, value=0) nbtot_supp = len(a_supp) self.pbar_supp.configure(maximum=nbtot_supp, value=0) self.is_running_copie = True self.is_running_supp = True process_copie = Thread(target=self.copie, name="copie", daemon=True, args=(a_copier, a_supp_avant_cp)) process_supp = Thread(target=self.supp, daemon=True, name="suppression", args=(a_supp, )) process_copie.start() process_supp.start() self.pbar_copie.configure(value=0) self.pbar_supp.configure(value=0) self.update_pbar() def copie(self, a_copier, a_supp_avant_cp): """ Copie tous les fichiers/dossiers de a_copier de original vers sauvegarde en utilisant la commande système cp. Les erreurs rencontrées au cours du processus sont inscrites dans ~/.foldersync/copie.log """ self.err_copie = False orig = abspath(self.original) + "/" sauve = abspath(self.sauvegarde) + "/" chdir(orig) self.logger_copie.info( _("\n###### Copy: %(original)s -> %(backup)s\n") % { 'original': self.original, 'backup': self.sauvegarde }) n = len(a_supp_avant_cp) self.logger_copie.info(_("Removal before copy:")) for i, ch in zip(range(1, n + 1), a_supp_avant_cp): self.logger_copie.info(ch) p_copie = run(["rm", "-r", ch], stderr=PIPE) self.q_copie.put(i) err = p_copie.stderr.decode() if err: self.err_copie = True self.logger_copie.error(err.strip()) self.logger_copie.info(_("Copy:")) for i, ch in zip(range(n + 1, n + 1 + len(a_copier)), a_copier): ch_o = ch.replace(orig, "") self.logger_copie.info("%s -> %s" % (ch_o, sauve)) p_copie = run(["cp", "-ra", "--parents", ch_o, sauve], stderr=PIPE) self.q_copie.put(i) err = p_copie.stderr.decode() if err: self.err_copie = True self.logger_copie.error(err.strip()) self.is_running_copie = False def supp(self, a_supp): """ Supprime tous les fichiers/dossiers de a_supp de original vers sauvegarde en utilisant la commande système rm. Les erreurs rencontrées au cours du processus sont inscrites dans ~/.foldersync/suppression.log. """ self.err_supp = False self.logger_supp.info( _("\n###### Removal: %(original)s -> %(backup)s\n") % { 'original': self.original, 'backup': self.sauvegarde }) for i, ch in enumerate(a_supp): self.logger_supp.info(ch) p_supp = run(["rm", "-r", ch], stderr=PIPE) self.q_supp.put(i + 1) err = p_supp.stderr.decode() if err: self.logger_supp.error(err.strip()) self.err_supp = True self.is_running_supp = False def unlink(self): """Unlink pidfile.""" unlink(self.pidfile) def change_language(self): """Change app language.""" CONFIG.set("Defaults", "language", self.langue.get()) showinfo( _("Information"), _("The language setting will take effect after restarting the application" ))
def _edit(self, event, item): """Edit feed title.""" column = self.tree.identify_column(event.x) if column in ['#1', '#2']: bbox = self.tree.bbox(item, column) entry = Entry(self.tree) entry.place(x=bbox[0], y=bbox[1], width=bbox[2], height=bbox[3], anchor='nw') entry.bind('<Escape>', lambda e: entry.destroy()) entry.bind('<FocusOut>', lambda e: entry.destroy()) if column == '#1': entry.insert(0, self.tree.item(item, 'values')[0]) entry.configure(style='manager.TEntry') def ok(event): name = entry.get() if name: name = self.master.feed_rename( self.tree.set(item, 'Title'), name) self.tree.set(item, 'Title', name) entry.destroy() entry.bind('<Return>', ok) else: entry.insert(0, self.tree.item(item, 'values')[1]) entry.configure(style='no_edit.TEntry', validate='key', validatecommand=self._no_edit_entry) entry.selection_range(0, 'end') entry.focus_set() elif column == '#3': def focus_out(event): x, y = self.tree.winfo_pointerxy() x0 = combo.winfo_rootx() x1 = x0 + combo.winfo_width() y0 = combo.winfo_rooty() y1 = y0 + combo.winfo_height() if not (x0 <= x <= x1 and y0 <= y <= y1): combo.destroy() def ok(event): category = combo.get().strip() self.categories.add(category) self.master.feed_change_cat(self.tree.set(item, 'Title'), self.tree.set(item, 'Category'), category) self.tree.set(item, 'Category', category) combo.destroy() bbox = self.tree.bbox(item, column) cat = list(self.categories) combo = AutoCompleteCombobox(self.tree, values=cat, allow_other_values=True) combo.place(x=bbox[0], y=bbox[1], width=bbox[2], height=bbox[3], anchor='nw') combo.bind('<Escape>', lambda e: combo.destroy()) combo.bind('<FocusOut>', focus_out) combo.bind('<Return>', ok) combo.bind('<<ComboboxSelected>>', ok) combo.current(cat.index(self.tree.set(item, '#3')))
class App(object): def __init__(self): self.win=Tk() self.win.geometry('405x380') self.win.title("网易云mp3播放下载器") self.creat_res() self.res_config() self.win.mainloop() def creat_res(self): self.music_temp=StringVar(value="(.)(.)") self.mp3_lis=[] #备用 self.temp=StringVar()#url输入框 self.temp2=IntVar() #单选框 播放或者下载 self.temp3=StringVar()#path 输入框 self.T_message=Listbox(self.win,background="#EEE9E9") self.B_search=Button(self.win,text="搜索") self.B_path=Button(self.win,text="选择目录") self.E_song=Entry(self.win,textvariable=self.temp) self.E_path=Entry(self.win,textvariable=self.temp3) self.Play_button=Button(self.win,text="播放") self.Pause_button=Button(self.win,textvariable=self.music_temp) self.Temp_button=Button(self.win,text="单曲下载") self.Stop_button=Button(self.win,text="停止") self.Info=Button(self.win,text="说明") self.More_down=Button(self.win,text="歌单批量下载") self.B_search_loacl=Button(self.win,text="扫描本地歌曲") self.S_bal=Scrollbar(self.win) self.R_1=Radiobutton(self.win,variable=self.temp2,text="下载",value=True) self.R_2=Radiobutton(self.win,variable=self.temp2,text="播放",value=False) self.L_mp3_message=Label(self.win,background="#EEE9E9",fg="#9370DB") self.B_search.place(x=340,y=5,width=50,height=30) self.E_song.place(x=10,y=10,width=300,height=35) self.T_message.place(x=10,y=165,width=280,height=200) self.Play_button.place(x=340,y=160,width=50,height=40) self.Pause_button.place(x=340,y=209,width=50,height=40) self.Temp_button.place(x=130,y=125,width=100,height=30) self.S_bal.place(x=286,y=165,width=20,height=200) self.E_path.place(x=10,y=70,width=200,height=40) self.B_path.place(x=230,y=75,width=60,height=38) self.L_mp3_message.place(x=241,y=125,width=152,height=30) self.Info.place(x=340,y=315,width=50,height=40) self.More_down.place(x=10,y=125,width=100,height=30) self.B_search_loacl.place(x=300,y=75,width=100,height=38) self.R_1.place(x=265,y=50,width=60,height=25) self.R_2.place(x=340,y=50,width=60,height=25) self.Stop_button.place(x=340,y=260,width=50,height=40) def res_config(self): self.B_search.config(command=self.get_lis) self.S_bal.config(command=self.T_message.yview) self.T_message["yscrollcommand"]=self.S_bal.set self.T_message.config(selectmode=BROWSE) self.B_path.config(command=self.choose_path) self.More_down.config(command=self.download_music) self.Info.config(command=self.show_mesage) self.Temp_button.config(command=self.single_music_down) self.Play_button.config(command=self.play_music) self.Pause_button.config(command=self.pause_button_click) self.Stop_button.config(command=self.stop_button_click) self.temp2.set(1) #默认配置为下载模式 def choose_path(self): self.path_=askdirectory() self.temp3.set(self.path_) def show_mesage(self): msg="输入框可识别歌单list,或者歌曲名称 '\n'" \ "输入歌单,请搜索后选择单独下载或者全部批量下载 '\n'" \ "播放单曲需要先选择路径,选择歌曲" messagebox.showinfo(message=msg,title="使用说明") def get_web_lis(self): if self.temp.get()!="":#输入框非空 flag = music_get.do_something(self.temp.get()) music_dic=music_get.get_music_id(self.temp.get()) if flag==True:#输入的是链接 mp3_url=music_get.get_mps_url(self.temp.get()) for i, j in mp3_url.items():#i是id号 self.T_message.insert(END,"歌曲:"+i+"\n") else:#如果输入的是单曲 self.T_message.insert(END, "正在查找歌曲:" + self.temp.get() + "\n") for id,name in music_dic.items(): self.T_message.insert(END, "找到歌曲:{}-{}".format(id,name)+ "\n") else: self.T_message.insert(END, "清输入歌曲名或者歌单链接:" + "\n") messagebox.showerror(title="警告",message="请输入歌名或者歌曲清单链接") def get_loacl_lis(self): for file in os.listdir(self.temp3.get()): self.T_message.insert(END, file + "\n") def get_lis(self):#搜索按钮,先判断下输入的是url 还是单曲 print("开关",self.temp2.get()) if self.temp2.get():#wen搜索 print("web搜索") self.get_web_lis() else: #本地搜所 print("本地搜索") self.get_loacl_lis() def download_music(self):#歌单批量下载 try: mp3_url = music_get.get_mps_url(self.temp.get())#mp3 清单表 字典 print(mp3_url) music_get.down_mp3(self.temp3.get(),self.temp.get()) flag = music_get.do_something(self.temp.get()) print(self.temp.get(),self.temp3.get()) if os.path.exists(self.temp3.get()) and flag==True and len(mp3_url)>0:#路径存在,输入连接,dic飞空 self.L_mp3_message.config(text="批量下载中,请不要再操作软件") for i in mp3_url.keys(): t=random.randint(100,300)*0.01 self.T_message.insert(END, "正在努力下载歌曲:" + i + "\n") time.sleep(t) else: self.T_message.insert(END, "请输入歌单连接和存储路径" + "\n") except Exception as s: print(s.args) self.T_message.insert(END, "请先输入歌单连接和存储路径" + "\n") messagebox.showerror(title="警告",message="请输入歌名或者歌曲清单链接") def get_id(self):#获取id号 if self.T_message.curselection():#不为空 s=self.T_message.curselection() res=self.T_message.get(s[0]) pa_id='找到歌曲:[\d]+-.+' if re.match(pa_id,res):#选择listbox id=res[res.find(":")+1:res.find("-")] return id else: self.T_message.insert(END, "请选择带id号的歌曲" + "\n") else: self.T_message.insert(END, "请先搜索歌名" + "\n") def single_music_down(self):#单曲下载 print("----------下载单曲----------") id=self.get_id() flag=music_get.do_something(self.temp.get())#判断是url 还是歌曲名字 如果是url true 否则f if os.path.exists(self.temp3.get()) and flag==False: try: music_get.down_music2(self.temp3.get(),id,self.temp.get()) self.T_message.insert(END, "正在下载歌曲:" +self.temp.get()+ str(id) + "\n") self.L_mp3_message.config(text="歌曲{}_{}下载完成".format(self.temp.get(),id)) except Exception: self.T_message.insert(END, "请选择带的ID号的歌曲:" + "\n") messagebox.showwarning(title="友情提示", message="请选择带的ID号的歌曲") else: self.T_message.insert(END, "erro,请选择存储路径:" + "\n") messagebox.showwarning(title="温馨提示",message="请先搜索歌曲再选择存储路径") def play_music(self): print("播放音乐") path=self.temp3.get()#路径 if os.path.exists(path) and self.temp2.get()==False:#如果路径存在,开关在播放模式 if self.T_message.curselection():#lisbox飞空 print("--------开始播放--------") music_file=self.T_message.get(self.T_message.curselection()) current_music_path=self.temp3.get()+"/"+music_file pa_music=".+[\.]mp3" if re.match(pa_music,music_file):#匹配mp3文件 print("文件识别OK") print(current_music_path) self.L_mp3_message.config(text="文件识别OK") self.play_music_mp3(current_music_path.strip()) #此处有坑,需要清除字符串换行符 self.music_temp.set("暂停") else: print("非mp3文件") self.L_mp3_message.config(text="非mp3文件") else: self.T_message.insert(END, "erro,请选择歌名:" + "\n") else: messagebox.showwarning(title="温馨提示",message="请选择歌曲路径,选择播放模式") def play_music_mp3(self,name):#播放音乐 pygame.init() pygame.mixer.music.load(name) pygame.mixer.music.play() time.sleep(12) # pygame.mixer.music.stop() def pause_button_click(self): if self.music_temp.get()=="暂停": pygame.mixer.music.pause() self.music_temp.set("继续") elif self.music_temp.get()=="继续": pygame.mixer.music.unpause() self.music_temp.set("暂停") def pause_music(self): print("暂停播放") pygame.mixer.music.pause() def stop_button_click(self): pygame.mixer.music.stop()
class Movie_app: def __init__(self): self.win=Tk() self.win.title(" VIP视频破解工具") self.creat_res() self.creat_radiores() self.config() self.page=1 self.p=Pro() self.win.resizable(0,0) #防止用户调整尺寸 curWidth = 600 curHight = 520 # 获取屏幕宽度和高度 scn_w, scn_h = self.win.maxsize() # 计算中心坐标 cen_x = (scn_w - curWidth) / 2 cen_y = (scn_h - curHight) / 2 # 设置窗口初始大小和位置 size_xy = '%dx%d+%d+%d' % (curWidth, curHight, cen_x, cen_y) self.win.geometry(size_xy) self.win.mainloop() def creat_res(self): #Menu菜单 menu = tk.Menu(self.win) self.win.config(menu = menu) moviemenu = tk.Menu(menu,tearoff = 0) menu.add_cascade(label = '友情链接', menu = moviemenu) downmenu = tk.Menu(menu,tearoff = 0) #各个网站链接 moviemenu.add_command(label = '网易公开课',command = lambda :webbrowser.open('http://open.163.com/')) moviemenu.add_command(label = '腾讯视频',command = lambda :webbrowser.open('http://v.qq.com/')) moviemenu.add_command(label = '搜狐视频',command = lambda :webbrowser.open('http://tv.sohu.com/')) moviemenu.add_command(label = '芒果TV',command = lambda :webbrowser.open('http://www.mgtv.com/')) moviemenu.add_command(label = '爱奇艺',command = lambda :webbrowser.open('http://www.iqiyi.com/')) moviemenu.add_command(label = 'PPTV',command = lambda :webbrowser.open('http://www.bilibili.com/')) moviemenu.add_command(label = '优酷',command = lambda :webbrowser.open('http://www.youku.com/')) moviemenu.add_command(label = '乐视',command = lambda :webbrowser.open('http://www.le.com/')) moviemenu.add_command(label = '土豆',command = lambda :webbrowser.open('http://www.tudou.com/')) moviemenu.add_command(label = 'A站',command = lambda :webbrowser.open('http://www.acfun.tv/')) moviemenu.add_command(label = 'B站',command = lambda :webbrowser.open('http://www.bilibili.com/')) self.temp=StringVar()#url地址 self.temp2=StringVar() self.search=StringVar()#搜索 self.t1=StringVar()#通道 self.t3=StringVar()#爱奇艺,优酷,PPTV self.La_title=Label(self.win,text="第三方视频地址:") self.La_way=Label(self.win,text="选择视频解码通道:") self.La_mc=Label(self.win,text="关键字搜索:") #控件内容设置 self.numberChosen = Combobox(self.win,width=20) self.numberChosen['values']=('通道一','通道二','通道三','通道四','通道五','通道六','通道七','通道八','通道九','通道十') self.numberChosen.config(state='readonly') self.numberChosen.current(0) self.B_play=Button(self.win,text="播放▶") self.B_searchSimple=Button(self.win,text="关键字搜索") self.B_uppage=Button(self.win,text="上页") self.B_nextpage=Button(self.win,text="下页") self.B_search=Button(self.win,text="搜索全站") self.La_page=Label(self.win,bg="#BFEFFF") self.S_croll=Scrollbar(self.win) self.L_box=Listbox(self.win,bg="#BFEFFF",selectmode=SINGLE) self.E_address=Entry(self.win,textvariable=self.temp) self.E_search=Entry(self.win,textvariable=self.search) self.label_explain = Label(self.win, fg = 'red', font = ('楷体',12), text = '\n注意:支持大部分主流视频网站的视频播放!\n此软件仅用于交流学习,请勿用于任何商业用途!\n在上面输入框输入现在主流视频网站网页地址\n点击播放弹出浏览器可以解码播放') self.label_explain.place(x=10,y=90,width=360,height=90) self.La_title.place(x=1,y=50,width=90,height=30) self.E_address.place(x=100,y=50,width=200,height=30) self.B_play.place(x=310,y=50,width=60,height=30) self.La_way.place(x=10,y=10,width=100,height=30) self.numberChosen.place(x=120,y=10,width=180,height=30) self.E_search.place(x=90,y=200,width=160,height=30) self.B_searchSimple.place(x=280,y=200,width=80,height=30) self.La_mc.place(x=10,y=200,width=70,height=30) self.B_search.place(x=252,y=240,width=100,height=30) self.L_box.place(x=10,y=280,width=252,height=230) self.S_croll.place(x=260,y=280,width=20,height=230) self.B_uppage.place(x=10,y=240,width=50,height=30) self.B_nextpage.place(x=180,y=240,width=50,height=30) self.La_page.place(x=80,y=240,width=90,height=28) def creat_radiores(self): self.movie=StringVar()#电影 self.S_croll2=Scrollbar()#分集 self.La_pic=Label(self.win,bg="#E6E6FA") self.La_movie_message=Listbox(self.win,bg="#7EC0EE") self.R_movie=Radiobutton(self.win,text="电影",variable=self.movie,value="m") self.tv=Radiobutton(self.win,text="电视剧",variable=self.movie,value="t") self.zhongyi=Radiobutton(self.win,text="综艺",variable=self.movie,value="z") self.dongman=Radiobutton(self.win,text="动漫",variable=self.movie,value="d") self.jilupian=Radiobutton(self.win,text="排行榜",variable=self.movie,value="j") self.movie.set('m') self.B_view=Button(self.win,text="查看") self.B_info=Button(self.win,text="使用说明") self.B_clearbox=Button(self.win,text="清空列表") self.B_add=Button(self.win,text="打开浏览器观看") self.R_movie.place(x=290,y=280,width=80,height=30) self.B_view.place(x=290,y=430,width=70,height=30) self.B_add.place(x=370,y=255,width=100,height=30) self.B_clearbox.place(x=500,y=255,width=70,height=30) self.tv.place(x=290,y=310,width=80,height=30) self.zhongyi.place(x=290,y=340,width=80,height=30) self.dongman.place(x=290,y=370,width=80,height=30) self.jilupian.place(x=290,y=400,width=80,height=30) self.La_movie_message.place(x=370,y=290,width=200,height=220) self.La_pic.place(x=370,y=10,width=200,height=240) self.B_info.place(x=290,y=470,width=70,height=30) self.S_croll2.place(x=568,y=290,width=20,height=220) def show_info(self): msg=""" 1.输入视频播放地址,即可播放 下拉选择可切换视频源 2.选择视频网,选择电视剧或者电影, 搜索全网后选择想要看得影片,点 查看,在右方list里选择分集视频 添加到播放列表里点选播放 3.复制网上视频连接 点击播放即可(VIP视频也可以免费播放) 4.此软件仅用于交流学习 请勿用于任何商业用途! 5.此软件内容来源于互联网 此软件不承担任何由于内容的合法性及 健康性所引起的争议和法律责任。 6.欢迎大家对此软件内容侵犯版权等 不合法和不健康行为进行监督和举报 """ messagebox.showinfo(title="使用说明",message=msg) def config(self): self.t1.set(True) self.B_play.config(command=self.play_url_movie) self.B_search.config(command=self.search_full_movie) self.B_info.config(command=self.show_info) self.S_croll.config(command=self.L_box.yview) self.L_box['yscrollcommand']=self.S_croll.set self.S_croll2.config(command=self.La_movie_message.yview) self.La_movie_message['yscrollcommand']=self.S_croll2.set self.B_view.config(command=self.view_movies) self.B_add.config(command=self.add_play_list) self.B_clearbox.config(command=self.clear_lisbox2) self.B_uppage.config(command=self.uppage_) self.B_nextpage.config(command=self.nextpage_) self.B_searchSimple.config(command=self.searchSimple) def uppage_(self): print('---------上一页---------') self.page-=1 print(self.page) if self.page<1: self.page=1 self.search_full_movie() def nextpage_(self): print('----------下一页--------') self.page+=1 print(self.page) self.search_full_movie() def clear_lisbox(self): self.L_box.delete(0,END) def clear_lisbox2(self): self.La_movie_message.delete(0,END) def search_full_movie(self): print("-----search----") self.La_page.config(text="当前页:{}".format(self.page)) self.clear_lisbox() try: movie_url, movie_title, movie_src_pic=self.p.get_movie_res(self.t3.get(),self.movie.get(),self.page) self.movie_dic={} for i,j,k in zip(movie_title,movie_url,movie_src_pic): self.movie_dic[i]=[j,k] for title in movie_title: self.L_box.insert(END,title) print(self.movie_dic) return self.movie_dic except: messagebox.showerror(title='警告',message='请选择电影或者电视剧') def add_play_list(self): print('---------playlist----------') # print(self.movie_dic) if self.La_movie_message.get(self.La_movie_message.curselection())=="": messagebox.showwarning(title="警告",message='请在列表选择影片') else: print("电影名字:",self.La_movie_message.get(self.La_movie_message.curselection())) # self.temp.set('http://www.133kp.com' + self.new_more_dic[self.La_movie_message.get(self.La_movie_message.curselection())]) webbrowser.open('http://www.133kp.com' + self.new_more_dic[self.La_movie_message.get(self.La_movie_message.curselection())]) def view_pic(self,pic_url): print('--------viewpic---------') pa_url_check=r'//.+[.]jpg' if re.match(pa_url_check,pic_url): print("ok") pic_url="http:"+pic_url print(pic_url) data=requests.get(pic_url).content # data=urlopen(pic_url).read() io_data=io.BytesIO(data) self.img=Image.open(io_data) self.u=ImageTk.PhotoImage(self.img) self.La_pic.config(image=self.u) def view_movies(self): print("--------viewmovie----------") self.clear_lisbox2() cur_index=self.L_box.curselection() print(self.L_box.get(cur_index)) self.new_more_dic=self.p.get_more_tv_urls(self.movie_dic[self.L_box.get(cur_index)][0],self.t3.get(),self.movie.get()) print(self.new_more_dic) for i,fenji_url in self.new_more_dic.items(): self.La_movie_message.insert(END, i) self.view_pic(self.movie_dic[self.L_box.get(self.L_box.curselection())][1])#加载图片 def play_url_movie(self): print("--------ok-----------") # print(type(self.t1.get()),self.t1.get()) if self.temp.get()=="": messagebox.showwarning(title="警告",message="请先输入视频地址") else: if self.numberChosen.get()!="": self.p.play_movie(self.temp.get(),self.numberChosen.get()) else: messagebox.showwarning(title='警告',message='请选择通道') def searchSimple(self): if self.search.get()=="": messagebox.showwarning(title="警告",message="请先输入搜索关键字") else: self.clear_lisbox() url = 'https://www.133kp.com//index.php?m=vod-search&wd={}'.format(self.search.get()) res=requests.get(url=url,headers=self.p.header).content.decode('utf-8') html=etree.HTML(res) movie_size=html.xpath('//input[@class="pagego"]/@size') list = [] for s in range(0, int(movie_size[0])): url = 'https://www.133kp.com/vod-search-pg-{}-wd-{}.html'.format(s+1,self.search.get()) list.append(self.p.simpleSearch(url)) # movie_url, movie_title, movie_src_pic=self.p.simpleSearch(self.search.get()) self.movie_dic={} i = 0 for b in list: for i,j,k in zip(b[0],b[1],b[2]): self.movie_dic[i]=[j,re.findall(r'[(](.*?)[)]', k)[0]] for title in b[0]: self.L_box.insert(END,title) print(self.movie_dic)
class Sticky(Toplevel): """ Sticky note class """ def __init__(self, master, key, **kwargs): """ Create a new sticky note. master: main app key: key identifying this note in master.note_data kwargs: dictionnary of the other arguments (title, txt, category, color, tags, geometry, locked, checkboxes, images, rolled) """ Toplevel.__init__(self, master) # --- window properties self.id = key self.is_locked = not (kwargs.get("locked", False)) self.images = [] self.links = {} self.latex = {} self.nb_links = 0 self.title('mynotes%s' % key) self.attributes("-type", "splash") self.attributes("-alpha", CONFIG.getint("General", "opacity") / 100) self.focus_force() # window geometry self.update_idletasks() self.geometry(kwargs.get("geometry", '220x235')) self.save_geometry = kwargs.get("geometry", '220x235') self.update() self.rowconfigure(1, weight=1) self.minsize(10, 10) self.protocol("WM_DELETE_WINDOW", self.hide) # --- style self.style = Style(self) self.style.configure(self.id + ".TCheckbutton", selectbackground="red") self.style.map('TEntry', selectbackground=[('!focus', '#c3c3c3')]) selectbg = self.style.lookup('TEntry', 'selectbackground', ('focus', )) self.style.configure("sel.TCheckbutton", background=selectbg) self.style.map("sel.TCheckbutton", background=[("active", selectbg)]) # --- note elements # title font_title = "%s %s" % (CONFIG.get("Font", "title_family").replace( " ", "\ "), CONFIG.get("Font", "title_size")) style = CONFIG.get("Font", "title_style").split(",") if style: font_title += " " font_title += " ".join(style) self.title_var = StringVar(master=self, value=kwargs.get("title", _("Title"))) self.title_label = Label(self, textvariable=self.title_var, anchor="center", style=self.id + ".TLabel", font=font_title) self.title_entry = Entry(self, textvariable=self.title_var, exportselection=False, justify="center", font=font_title) # buttons/icons self.roll = Label(self, image="img_roll", style=self.id + ".TLabel") self.close = Label(self, image="img_close", style=self.id + ".TLabel") self.im_lock = PhotoImage(master=self, file=IM_LOCK) self.cadenas = Label(self, style=self.id + ".TLabel") # corner grip self.corner = Sizegrip(self, style=self.id + ".TSizegrip") # texte font_text = "%s %s" % (CONFIG.get("Font", "text_family").replace( " ", "\ "), CONFIG.get("Font", "text_size")) self.txt = Text(self, wrap='word', undo=True, selectforeground='white', inactiveselectbackground=selectbg, selectbackground=selectbg, tabs=(10, 'right', 21, 'left'), relief="flat", borderwidth=0, highlightthickness=0, font=font_text) # tags self.txt.tag_configure("bold", font="%s bold" % font_text) self.txt.tag_configure("italic", font="%s italic" % font_text) self.txt.tag_configure("bold-italic", font="%s bold italic" % font_text) self.txt.tag_configure("underline", underline=True, selectforeground="white") self.txt.tag_configure("overstrike", overstrike=True, selectforeground="white") self.txt.tag_configure("center", justify="center") self.txt.tag_configure("left", justify="left") self.txt.tag_configure("right", justify="right") self.txt.tag_configure("link", foreground="blue", underline=True, selectforeground="white") self.txt.tag_configure("list", lmargin1=0, lmargin2=21, tabs=(10, 'right', 21, 'left')) self.txt.tag_configure("todolist", lmargin1=0, lmargin2=21, tabs=(10, 'right', 21, 'left')) margin = 2 * Font(self, font=font_text).measure("m") self.txt.tag_configure("enum", lmargin1=0, lmargin2=margin + 5, tabs=(margin, 'right', margin + 5, 'left')) for coul in TEXT_COLORS.values(): self.txt.tag_configure(coul, foreground=coul, selectforeground="white") self.txt.tag_configure(coul + "-underline", foreground=coul, selectforeground="white", underline=True) self.txt.tag_configure(coul + "-overstrike", foreground=coul, overstrike=True, selectforeground="white") # --- menus # --- * menu on title self.menu = Menu(self, tearoff=False) # note color menu_note_color = Menu(self.menu, tearoff=False) colors = list(COLORS.keys()) colors.sort() for coul in colors: menu_note_color.add_command( label=coul, command=lambda key=coul: self.change_color(key)) # category self.category = StringVar( self, kwargs.get("category", CONFIG.get("General", "default_category"))) self.menu_categories = Menu(self.menu, tearoff=False) categories = CONFIG.options("Categories") categories.sort() for cat in categories: self.menu_categories.add_radiobutton(label=cat.capitalize(), value=cat, variable=self.category, command=self.change_category) # position: normal, always above, always below self.position = StringVar( self, kwargs.get("position", CONFIG.get("General", "position"))) menu_position = Menu(self.menu, tearoff=False) menu_position.add_radiobutton(label=_("Always above"), value="above", variable=self.position, command=self.set_position_above) menu_position.add_radiobutton(label=_("Always below"), value="below", variable=self.position, command=self.set_position_below) menu_position.add_radiobutton(label=_("Normal"), value="normal", variable=self.position, command=self.set_position_normal) # mode: note, list, todo list menu_mode = Menu(self.menu, tearoff=False) self.mode = StringVar(self, kwargs.get("mode", "note")) menu_mode.add_radiobutton(label=_("Note"), value="note", variable=self.mode, command=self.set_mode_note) menu_mode.add_radiobutton(label=_("List"), value="list", variable=self.mode, command=self.set_mode_list) menu_mode.add_radiobutton(label=_("ToDo List"), value="todolist", variable=self.mode, command=self.set_mode_todolist) menu_mode.add_radiobutton(label=_("Enumeration"), value="enum", variable=self.mode, command=self.set_mode_enum) self.menu.add_command(label=_("Delete"), command=self.delete) self.menu.add_cascade(label=_("Category"), menu=self.menu_categories) self.menu.add_cascade(label=_("Color"), menu=menu_note_color) self.menu.add_command(label=_("Lock"), command=self.lock) self.menu.add_cascade(label=_("Position"), menu=menu_position) self.menu.add_cascade(label=_("Mode"), menu=menu_mode) # --- * menu on main text self.menu_txt = Menu(self.txt, tearoff=False) # style menu_style = Menu(self.menu_txt, tearoff=False) menu_style.add_command(label=_("Bold"), command=lambda: self.toggle_text_style("bold")) menu_style.add_command( label=_("Italic"), command=lambda: self.toggle_text_style("italic")) menu_style.add_command(label=_("Underline"), command=self.toggle_underline) menu_style.add_command(label=_("Overstrike"), command=self.toggle_overstrike) # text alignment menu_align = Menu(self.menu_txt, tearoff=False) menu_align.add_command(label=_("Left"), command=lambda: self.set_align("left")) menu_align.add_command(label=_("Right"), command=lambda: self.set_align("right")) menu_align.add_command(label=_("Center"), command=lambda: self.set_align("center")) # text color menu_colors = Menu(self.menu_txt, tearoff=False) colors = list(TEXT_COLORS.keys()) colors.sort() for coul in colors: menu_colors.add_command(label=coul, command=lambda key=coul: self. change_sel_color(TEXT_COLORS[key])) # insert menu_insert = Menu(self.menu_txt, tearoff=False) menu_insert.add_command(label=_("Symbols"), command=self.add_symbols) menu_insert.add_command(label=_("Checkbox"), command=self.add_checkbox) menu_insert.add_command(label=_("Image"), command=self.add_image) menu_insert.add_command(label=_("Date"), command=self.add_date) menu_insert.add_command(label=_("Link"), command=self.add_link) if LATEX: menu_insert.add_command(label="LaTex", command=self.add_latex) self.menu_txt.add_cascade(label=_("Style"), menu=menu_style) self.menu_txt.add_cascade(label=_("Alignment"), menu=menu_align) self.menu_txt.add_cascade(label=_("Color"), menu=menu_colors) self.menu_txt.add_cascade(label=_("Insert"), menu=menu_insert) # --- restore note content/appearence self.color = kwargs.get("color", CONFIG.get("Categories", self.category.get())) self.txt.insert('1.0', kwargs.get("txt", "")) self.txt.edit_reset() # clear undo stack # restore inserted objects (images and checkboxes) # we need to restore objects with increasing index to avoid placment errors indexes = list(kwargs.get("inserted_objects", {}).keys()) indexes.sort(key=sorting) for index in indexes: kind, val = kwargs["inserted_objects"][index] if kind == "checkbox": ch = Checkbutton(self.txt, takefocus=False, style=self.id + ".TCheckbutton") if val: ch.state(("selected", )) self.txt.window_create(index, window=ch) elif kind == "image": if os.path.exists(val): self.images.append(PhotoImage(master=self.txt, file=val)) self.txt.image_create(index, image=self.images[-1], name=val) # restore tags for tag, indices in kwargs.get("tags", {}).items(): if indices: self.txt.tag_add(tag, *indices) for link in kwargs.get("links", {}).values(): self.nb_links += 1 self.links[self.nb_links] = link self.txt.tag_bind("link#%i" % self.nb_links, "<Button-1>", lambda e, l=link: open_url(l)) for img, latex in kwargs.get("latex", {}).items(): self.latex[img] = latex if LATEX: self.txt.tag_bind(img, '<Double-Button-1>', lambda e, im=img: self.add_latex(im)) mode = self.mode.get() if mode != "note": self.txt.tag_add(mode, "1.0", "end") self.txt.focus_set() self.lock() if kwargs.get("rolled", False): self.rollnote() if self.position.get() == "above": self.set_position_above() elif self.position.get() == "below": self.set_position_below() # --- placement # titlebar if CONFIG.get("General", "buttons_position") == "right": # right = lock icon - title - roll - close self.columnconfigure(1, weight=1) self.roll.grid(row=0, column=2, sticky="e") self.close.grid(row=0, column=3, sticky="e", padx=(0, 2)) self.cadenas.grid(row=0, column=0, sticky="w") self.title_label.grid(row=0, column=1, sticky="ew", pady=(1, 0)) else: # left = close - roll - title - lock icon self.columnconfigure(2, weight=1) self.roll.grid(row=0, column=1, sticky="w") self.close.grid(row=0, column=0, sticky="w", padx=(2, 0)) self.cadenas.grid(row=0, column=3, sticky="e") self.title_label.grid(row=0, column=2, sticky="ew", pady=(1, 0)) # body self.txt.grid(row=1, columnspan=4, column=0, sticky="ewsn", pady=(1, 4), padx=4) self.corner.lift(self.txt) self.corner.place(relx=1.0, rely=1.0, anchor="se") # --- bindings self.bind("<FocusOut>", self.save_note) self.bind('<Configure>', self.bouge) self.bind('<Button-1>', self.change_focus, True) self.close.bind("<Button-1>", self.hide) self.close.bind("<Enter>", self.enter_close) self.close.bind("<Leave>", self.leave_close) self.roll.bind("<Button-1>", self.rollnote) self.roll.bind("<Enter>", self.enter_roll) self.roll.bind("<Leave >", self.leave_roll) self.title_label.bind("<Double-Button-1>", self.edit_title) self.title_label.bind("<ButtonPress-1>", self.start_move) self.title_label.bind("<ButtonRelease-1>", self.stop_move) self.title_label.bind("<B1-Motion>", self.move) self.title_label.bind('<Button-3>', self.show_menu) self.title_entry.bind("<Return>", lambda e: self.title_entry.place_forget()) self.title_entry.bind("<FocusOut>", lambda e: self.title_entry.place_forget()) self.title_entry.bind("<Escape>", lambda e: self.title_entry.place_forget()) self.txt.tag_bind("link", "<Enter>", lambda event: self.txt.configure(cursor="hand1")) self.txt.tag_bind("link", "<Leave>", lambda event: self.txt.configure(cursor="")) self.txt.bind("<FocusOut>", self.save_note) self.txt.bind('<Button-3>', self.show_menu_txt) # add binding to the existing class binding so that the selected text # is erased on pasting self.txt.bind("<Control-v>", self.paste) self.corner.bind('<ButtonRelease-1>', self.resize) # --- keyboard shortcuts self.txt.bind('<Control-b>', lambda e: self.toggle_text_style('bold')) self.txt.bind('<Control-i>', lambda e: self.toggle_text_style('italic')) self.txt.bind('<Control-u>', lambda e: self.toggle_underline()) self.txt.bind('<Control-r>', lambda e: self.set_align('right')) self.txt.bind('<Control-l>', lambda e: self.set_align('left')) def __setattr__(self, name, value): object.__setattr__(self, name, value) if name == "color": self.style.configure(self.id + ".TSizegrip", background=self.color) self.style.configure(self.id + ".TLabel", background=self.color) self.style.configure("close" + self.id + ".TLabel", background=self.color) self.style.configure("roll" + self.id + ".TLabel", background=self.color) self.style.map(self.id + ".TLabel", background=[("active", self.color)]) self.style.configure(self.id + ".TCheckbutton", background=self.color) self.style.map(self.id + ".TCheckbutton", background=[("active", self.color), ("disabled", self.color)]) self.style.map("close" + self.id + ".TLabel", background=[("active", self.color)]) self.style.map("roll" + self.id + ".TLabel", background=[("active", self.color)]) self.configure(bg=self.color) self.txt.configure(bg=self.color) def paste(self, event): """ delete selected text before pasting """ if self.txt.tag_ranges("sel"): self.txt.delete("sel.first", "sel.last") def delete(self, confirmation=True): """ Delete this note """ if confirmation: rep = askokcancel(_("Confirmation"), _("Delete the note?")) else: rep = True if rep: del (self.master.note_data[self.id]) del (self.master.notes[self.id]) self.master.save() self.destroy() def lock(self): """ Put note in read-only mode to avoid unwanted text insertion """ if self.is_locked: selectbg = self.style.lookup('TEntry', 'selectbackground', ('focus', )) self.txt.configure(state="normal", selectforeground='white', selectbackground=selectbg, inactiveselectbackground=selectbg) self.style.configure("sel.TCheckbutton", background=selectbg) self.style.map("sel.TCheckbutton", background=[("active", selectbg)]) self.is_locked = False for checkbox in self.txt.window_names(): ch = self.txt.children[checkbox.split(".")[-1]] ch.configure(state="normal") self.cadenas.configure(image="") self.menu.entryconfigure(3, label=_("Lock")) self.title_label.bind("<Double-Button-1>", self.edit_title) self.txt.bind('<Button-3>', self.show_menu_txt) else: self.txt.configure(state="disabled", selectforeground='black', inactiveselectbackground='#c3c3c3', selectbackground='#c3c3c3') self.style.configure("sel.TCheckbutton", background='#c3c3c3') self.style.map("sel.TCheckbutton", background=[("active", '#c3c3c3')]) self.cadenas.configure(image=self.im_lock) for checkbox in self.txt.window_names(): ch = self.txt.children[checkbox.split(".")[-1]] ch.configure(state="disabled") self.is_locked = True self.menu.entryconfigure(3, label=_("Unlock")) self.title_label.unbind("<Double-Button-1>") self.txt.unbind('<Button-3>') self.save_note() def save_info(self): """ Return the dictionnary containing all the note data """ data = {} data["txt"] = self.txt.get("1.0", "end")[:-1] data["tags"] = {} for tag in self.txt.tag_names(): if tag not in ["sel", "todolist", "list", "enum"]: data["tags"][tag] = [ index.string for index in self.txt.tag_ranges(tag) ] data["title"] = self.title_var.get() data["geometry"] = self.save_geometry data["category"] = self.category.get() data["color"] = self.color data["locked"] = self.is_locked data["mode"] = self.mode.get() data["inserted_objects"] = {} data["rolled"] = not self.txt.winfo_ismapped() data["position"] = self.position.get() data["links"] = {} for i, link in self.links.items(): if self.txt.tag_ranges("link#%i" % i): data["links"][i] = link data["latex"] = {} for img, latex in self.latex.items(): if self.txt.tag_ranges(img): data["latex"][img] = latex for image in self.txt.image_names(): data["inserted_objects"][self.txt.index(image)] = ( "image", image.split('#')[0]) for checkbox in self.txt.window_names(): ch = self.txt.children[checkbox.split(".")[-1]] data["inserted_objects"][self.txt.index(checkbox)] = ( "checkbox", "selected" in ch.state()) return data def change_color(self, key): self.color = COLORS[key] self.save_note() def change_category(self, category=None): if category: self.category.set(category) self.color = CONFIG.get("Categories", self.category.get()) self.save_note() def set_position_above(self): e = ewmh.EWMH() for w in e.getClientList(): if w.get_wm_name() == 'mynotes%s' % self.id: e.setWmState(w, 1, '_NET_WM_STATE_ABOVE') e.setWmState(w, 0, '_NET_WM_STATE_BELOW') e.display.flush() self.save_note() def set_position_below(self): e = ewmh.EWMH() for w in e.getClientList(): if w.get_wm_name() == 'mynotes%s' % self.id: e.setWmState(w, 0, '_NET_WM_STATE_ABOVE') e.setWmState(w, 1, '_NET_WM_STATE_BELOW') e.display.flush() self.save_note() def set_position_normal(self): e = ewmh.EWMH() for w in e.getClientList(): if w.get_wm_name() == 'mynotes%s' % self.id: e.setWmState(w, 0, '_NET_WM_STATE_BELOW') e.setWmState(w, 0, '_NET_WM_STATE_ABOVE') e.display.flush() self.save_note() def set_mode_note(self): self.txt.tag_remove("list", "1.0", "end") self.txt.tag_remove("todolist", "1.0", "end") self.txt.tag_remove("enum", "1.0", "end") self.save_note() def set_mode_list(self): end = int(self.txt.index("end").split(".")[0]) lines = self.txt.get("1.0", "end").splitlines() for i, l in zip(range(1, end), lines): # remove checkboxes try: ch = self.txt.window_cget("%i.0" % i, "window") self.txt.children[ch.split('.')[-1]].destroy() self.txt.delete("%i.0" % i) except TclError: # there is no checkbox # remove enumeration res = re.match('^\t[0-9]+\.\t', l) if res: self.txt.delete("%i.0" % i, "%i.%i" % (i, res.end())) if self.txt.get("%i.0" % i, "%i.3" % i) != "\t•\t": self.txt.insert("%i.0" % i, "\t•\t") self.txt.tag_add("list", "1.0", "end") self.txt.tag_remove("todolist", "1.0", "end") self.txt.tag_remove("enum", "1.0", "end") self.save_note() def set_mode_enum(self): self.txt.configure(autoseparators=False) self.txt.edit_separator() end = int(self.txt.index("end").split(".")[0]) lines = self.txt.get("1.0", "end").splitlines() for i, l in zip(range(1, end), lines): # remove checkboxes try: ch = self.txt.window_cget("%i.0" % i, "window") self.txt.children[ch.split('.')[-1]].destroy() self.txt.delete("%i.0" % i) except TclError: # there is no checkbox # remove bullets if self.txt.get("%i.0" % i, "%i.3" % i) == "\t•\t": self.txt.delete("%i.0" % i, "%i.3" % i) if not re.match('^\t[0-9]+\.', l): self.txt.insert("%i.0" % i, "\t0.\t") self.txt.tag_add("enum", "1.0", "end") self.txt.tag_remove("todolist", "1.0", "end") self.txt.tag_remove("list", "1.0", "end") self.update_enum() self.txt.configure(autoseparators=True) self.txt.edit_separator() self.save_note() def set_mode_todolist(self): end = int(self.txt.index("end").split(".")[0]) lines = self.txt.get("1.0", "end").splitlines() for i, l in zip(range(1, end), lines): res = re.match('^\t[0-9]+\.\t', l) if res: self.txt.delete("%i.0" % i, "%i.%i" % (i, res.end())) elif self.txt.get("%i.0" % i, "%i.3" % i) == "\t•\t": self.txt.delete("%i.0" % i, "%i.3" % i) try: ch = self.txt.window_cget("%i.0" % i, "window") except TclError: ch = Checkbutton(self.txt, takefocus=False, style=self.id + ".TCheckbutton") self.txt.window_create("%i.0" % i, window=ch) self.txt.tag_remove("enum", "1.0", "end") self.txt.tag_remove("list", "1.0", "end") self.txt.tag_add("todolist", "1.0", "end") self.save_note() # --- bindings def enter_roll(self, event): """ mouse is over the roll icon """ self.roll.configure(image="img_rollactive") def leave_roll(self, event): """ mouse leaves the roll icon """ self.roll.configure(image="img_roll") def enter_close(self, event): """ mouse is over the close icon """ self.close.configure(image="img_closeactive") def leave_close(self, event): """ mouse leaves the close icon """ self.close.configure(image="img_close") def change_focus(self, event): if not self.is_locked: event.widget.focus_force() def show_menu(self, event): self.menu.tk_popup(event.x_root, event.y_root) def show_menu_txt(self, event): self.menu_txt.tk_popup(event.x_root, event.y_root) def resize(self, event): self.save_geometry = self.geometry() def bouge(self, event): geo = self.geometry().split("+")[1:] self.save_geometry = self.save_geometry.split("+")[0] \ + "+%s+%s" % tuple(geo) def edit_title(self, event): self.title_entry.place(x=self.title_label.winfo_x() + 5, y=self.title_label.winfo_y(), anchor="nw", width=self.title_label.winfo_width() - 10) def start_move(self, event): self.x = event.x self.y = event.y self.configure(cursor='fleur') def stop_move(self, event): self.x = None self.y = None self.configure(cursor='') def move(self, event): if self.x is not None and self.y is not None: deltax = event.x - self.x deltay = event.y - self.y x = self.winfo_x() + deltax y = self.winfo_y() + deltay self.geometry("+%s+%s" % (x, y)) def save_note(self, event=None): data = self.save_info() data["visible"] = True self.master.note_data[self.id] = data self.master.save() def rollnote(self, event=None): if self.txt.winfo_ismapped(): self.txt.grid_forget() self.corner.place_forget() self.geometry("%sx22" % self.winfo_width()) else: self.txt.grid(row=1, columnspan=4, column=0, sticky="ewsn", pady=(1, 4), padx=4) self.corner.place(relx=1.0, rely=1.0, anchor="se") self.geometry(self.save_geometry) self.save_note() def hide(self, event=None): """ Hide note (can be displayed again via app menu) """ cat = self.category.get() self.master.add_note_to_menu(self.id, self.title_var.get().strip(), cat) data = self.save_info() data["visible"] = False self.master.note_data[self.id] = data del (self.master.notes[self.id]) self.master.save() self.destroy() # --- Settings update def update_title_font(self): font = "%s %s" % (CONFIG.get("Font", "title_family").replace( " ", "\ "), CONFIG.get("Font", "title_size")) style = CONFIG.get("Font", "title_style").split(",") if style: font += " " font += " ".join(style) self.title_label.configure(font=font) def update_text_font(self): font = "%s %s" % (CONFIG.get("Font", "text_family").replace( " ", "\ "), CONFIG.get("Font", "text_size")) self.txt.configure(font=font) self.txt.tag_configure("bold", font="%s bold" % font) self.txt.tag_configure("italic", font="%s italic" % font) self.txt.tag_configure("bold-italic", font="%s bold italic" % font) margin = 2 * Font(self, font=font).measure("m") self.txt.tag_configure("enum", lmargin1=0, lmargin2=margin + 5, tabs=(margin, 'right', margin + 5, 'left')) def update_menu_cat(self, categories): """ Update the category submenu """ self.menu_categories.delete(0, "end") for cat in categories: self.menu_categories.add_radiobutton(label=cat.capitalize(), value=cat, variable=self.category, command=self.change_category) def update_titlebar(self): if CONFIG.get("General", "buttons_position") == "right": # right = lock icon - title - roll - close self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=0) self.roll.grid_configure(row=0, column=2, sticky="e") self.close.grid_configure(row=0, column=3, sticky="e", padx=(0, 2)) self.cadenas.grid_configure(row=0, column=0, sticky="w") self.title_label.grid_configure(row=0, column=1, sticky="ew", pady=(1, 0)) else: # left = close - roll - title - lock icon self.columnconfigure(2, weight=1) self.columnconfigure(1, weight=0) self.roll.grid_configure(row=0, column=1, sticky="w") self.close.grid_configure(row=0, column=0, sticky="w", padx=(2, 0)) self.cadenas.grid_configure(row=0, column=3, sticky="e") self.title_label.grid_configure(row=0, column=2, sticky="ew", pady=(1, 0)) # --- Text edition def add_link(self): def ok(eveny=None): lien = link.get() txt = text.get() if lien: if not txt: txt = lien self.nb_links += 1 if self.txt.tag_ranges("sel"): index = self.txt.index("sel.first") self.txt.delete('sel.first', 'sel.last') else: index = "current" tags = self.txt.tag_names(index) + ("link", "link#%i" % self.nb_links) self.txt.insert("current", txt, tags) if not lien[:4] == "http": lien = "http://" + lien self.links[self.nb_links] = lien self.txt.tag_bind("link#%i" % self.nb_links, "<Button-1>", lambda e: open_url(lien)) top.destroy() top = Toplevel(self) top.transient(self) top.update_idletasks() top.geometry("+%i+%i" % top.winfo_pointerxy()) top.grab_set() top.resizable(True, False) top.title(_("Link")) top.columnconfigure(1, weight=1) text = Entry(top) link = Entry(top) if self.txt.tag_ranges('sel'): txt = self.txt.get('sel.first', 'sel.last') else: txt = '' text.insert(0, txt) text.icursor("end") Label(top, text=_("Text")).grid(row=0, column=0, sticky="e", padx=4, pady=4) Label(top, text=_("Link")).grid(row=1, column=0, sticky="e", padx=4, pady=4) text.grid(row=0, column=1, sticky="ew", padx=4, pady=4) link.grid(row=1, column=1, sticky="ew", padx=4, pady=4) Button(top, text="Ok", command=ok).grid(row=2, columnspan=2, padx=4, pady=4) text.focus_set() text.bind("<Return>", ok) link.bind("<Return>", ok) def add_checkbox(self): ch = Checkbutton(self.txt, takefocus=False, style=self.id + ".TCheckbutton") self.txt.window_create("current", window=ch) def add_date(self): self.txt.insert("current", strftime("%x")) def add_latex(self, img_name=None): def ok(event): latex = r'%s' % text.get() if latex: if img_name is None: l = [ int(os.path.splitext(f)[0]) for f in os.listdir(PATH_LATEX) ] l.sort() if l: i = l[-1] + 1 else: i = 0 img = "%i.png" % i self.txt.tag_bind(img, '<Double-Button-1>', lambda e: self.add_latex(img)) self.latex[img] = latex else: img = img_name im = os.path.join(PATH_LATEX, img) try: math_to_image(latex, im, fontsize=CONFIG.getint("Font", "text_size") - 2) self.images.append(PhotoImage(file=im, master=self)) if self.txt.tag_ranges("sel"): index = self.txt.index("sel.first") self.txt.delete('sel.first', 'sel.last') else: index = self.txt.index("current") self.txt.image_create(index, image=self.images[-1], name=im) self.txt.tag_add(img, index) top.destroy() except Exception as e: showerror(_("Error"), str(e)) top = Toplevel(self) top.transient(self) top.update_idletasks() top.geometry("+%i+%i" % top.winfo_pointerxy()) top.grab_set() top.resizable(True, False) top.title("LaTex") text = Entry(top, justify='center') if img_name is not None: text.insert(0, self.latex[img_name]) else: if self.txt.tag_ranges('sel'): text.insert(0, self.txt.get('sel.first', 'sel.last')) else: text.insert(0, '$$') text.icursor(1) text.pack(fill='x', expand=True) text.bind('<Return>', ok) text.focus_set() def add_image(self): fichier = askopenfilename(defaultextension=".png", filetypes=[("PNG", "*.png")], initialdir="", initialfile="", title=_('Select PNG image')) if os.path.exists(fichier): self.images.append(PhotoImage(master=self.txt, file=fichier)) self.txt.image_create("current", image=self.images[-1], name=fichier) elif fichier: showerror("Erreur", "L'image %s n'existe pas" % fichier) def add_symbols(self): symbols = pick_symbol( self, CONFIG.get("Font", "text_family").replace(" ", "\ "), CONFIG.get("General", "symbols")) self.txt.insert("current", symbols) def toggle_text_style(self, style): '''Toggle the style of the selected text''' if self.txt.tag_ranges("sel"): current_tags = self.txt.tag_names("sel.first") if style in current_tags: # first char is in style so 'unstyle' the range self.txt.tag_remove(style, "sel.first", "sel.last") elif style == "bold" and "bold-italic" in current_tags: self.txt.tag_remove("bold-italic", "sel.first", "sel.last") self.txt.tag_add("italic", "sel.first", "sel.last") elif style == "italic" and "bold-italic" in current_tags: self.txt.tag_remove("bold-italic", "sel.first", "sel.last") self.txt.tag_add("bold", "sel.first", "sel.last") elif style == "bold" and "italic" in current_tags: self.txt.tag_remove("italic", "sel.first", "sel.last") self.txt.tag_add("bold-italic", "sel.first", "sel.last") elif style == "italic" and "bold" in current_tags: self.txt.tag_remove("bold", "sel.first", "sel.last") self.txt.tag_add("bold-italic", "sel.first", "sel.last") else: # first char is normal, so apply style to the whole selection self.txt.tag_add(style, "sel.first", "sel.last") def toggle_underline(self): if self.txt.tag_ranges("sel"): current_tags = self.txt.tag_names("sel.first") if "underline" in current_tags: # first char is in style so 'unstyle' the range self.txt.tag_remove("underline", "sel.first", "sel.last") for coul in TEXT_COLORS.values(): self.txt.tag_remove(coul + "-underline", "sel.first", "sel.last") else: self.txt.tag_add("underline", "sel.first", "sel.last") for coul in TEXT_COLORS.values(): r = text_ranges(self.txt, coul, "sel.first", "sel.last") if r: for deb, fin in zip(r[::2], r[1::2]): self.txt.tag_add(coul + "-underline", "sel.first", "sel.last") def toggle_overstrike(self): if self.txt.tag_ranges("sel"): current_tags = self.txt.tag_names("sel.first") if "overstrike" in current_tags: # first char is in style so 'unstyle' the range self.txt.tag_remove("overstrike", "sel.first", "sel.last") for coul in TEXT_COLORS.values(): self.txt.tag_remove(coul + "-overstrike", "sel.first", "sel.last") else: self.txt.tag_add("overstrike", "sel.first", "sel.last") for coul in TEXT_COLORS.values(): r = text_ranges(self.txt, coul, "sel.first", "sel.last") if r: for deb, fin in zip(r[::2], r[1::2]): self.txt.tag_add(coul + "-overstrike", "sel.first", "sel.last") def change_sel_color(self, color): """ change the color of the selection """ if self.txt.tag_ranges("sel"): for coul in TEXT_COLORS.values(): self.txt.tag_remove(coul, "sel.first", "sel.last") self.txt.tag_remove(coul + "-overstrike", "sel.first", "sel.last") self.txt.tag_remove(coul + "-underline", "sel.first", "sel.last") if not color == "black": self.txt.tag_add(color, "sel.first", "sel.last") underline = text_ranges(self.txt, "underline", "sel.first", "sel.last") overstrike = text_ranges(self.txt, "overstrike", "sel.first", "sel.last") for deb, fin in zip(underline[::2], underline[1::2]): self.txt.tag_add(color + "-underline", deb, fin) for deb, fin in zip(overstrike[::2], overstrike[1::2]): self.txt.tag_add(color + "-overstrike", deb, fin) def set_align(self, alignment): """ Align the text according to alignment (left, right, center) """ if self.txt.tag_ranges("sel"): line = self.txt.index("sel.first").split(".")[0] line2 = self.txt.index("sel.last").split(".")[0] deb, fin = line + ".0", line2 + ".end" if not "\t" in self.txt.get(deb, fin): # tabulations don't support right/center alignment # remove old alignment tag self.txt.tag_remove("left", deb, fin) self.txt.tag_remove("right", deb, fin) self.txt.tag_remove("center", deb, fin) # set new alignment tag self.txt.tag_add(alignment, deb, fin) def update_enum(self): """ update enumeration numbers """ lines = self.txt.get("1.0", "end").splitlines() indexes = [] for i, l in enumerate(lines): res = re.match('^\t[0-9]+\.\t', l) res2 = re.match('^\t[0-9]+\.', l) if res: indexes.append((i, res.end())) elif res2: indexes.append((i, res2.end())) for j, (i, end) in enumerate(indexes): self.txt.delete("%i.0" % (i + 1), "%i.%i" % (i + 1, end)) self.txt.insert("%i.0" % (i + 1), "\t%i.\t" % (j + 1)) self.txt.tag_add("enum", "1.0", "end")
class App(ThemedTk): def __init__(self): ThemedTk.__init__(self, theme='black') self.title('Установщик F_Reference_H') self.geometry('500x200') x = (self.winfo_screenwidth() - self.winfo_reqwidth()) / 2 y = (self.winfo_screenheight() - self.winfo_reqheight()) / 2 self.wm_geometry("+%d+%d" % (x - 150, y - 20)) self.resizable(width=False, height=False) self.iconphoto( True, PhotoImage(file='bin/ico/ico_main.png') ) flow_hack_png = Image.open(f'bin/ico/max_flowhack.png') flow_hack_png = ImageTk.PhotoImage(flow_hack_png) browse_png = Image.open(f'bin/ico/browse.png') browse_png = ImageTk.PhotoImage(browse_png) self.frame = Frame(self) self.frame.place(relwidth=1, relheight=1) self.url = '' self._path = getcwd() flow_hack_label = Label( self.frame, image=flow_hack_png, cursor='heart' ) flow_hack_label.bind('<Button-1>', open_web) flow_hack_label.place(anchor='c', relx=.5, rely=.1) self.check_icon = BooleanVar() self.check_icon.set(bool(True)) Checkbutton( self.frame, text='Создать ярлык на рабочем столе', var=self.check_icon, cursor='cross' ).place(relx=.5, y=60, anchor='c') Label( self.frame, text='Выберите папку для установки', font=('Times New Roman', 10, 'bold italic') ).place(relx=.5, rely=.485, anchor='c') self.input_url = Entry( self.frame, state=DISABLED, font=('Times New Roman', 9, 'bold italic'), foreground='black' ) self.input_url.place( rely=.6, relx=.5, height=20, relwidth=.7, anchor='c' ) Button( self.frame, image=browse_png, cursor='hand1', command=self.directory ).place(relx=.86, rely=.455) Button( self.frame, image=browse_png, cursor='hand1', command=self.directory ).place(relx=.045, rely=.455) Button( self.frame, text='Установить', cursor='hand1', command=self.install ).place(relx=.5, rely=.75, anchor='c') self.license = Label( self.frame, text='Для подтверждения согласия с лицензионным ' 'соглашением\nНажмите на "Установить" правой кнопкой мыши', font=('Times New Roman', 9, 'bold italic'), foreground='black', cursor='hand1', justify='center' ) self.license.bind( '<Button-1>', lambda no_matter: webopen('https://flowhack.github.io/') ) self.license.place(relx=.5, rely=.93, anchor='c') self.mainloop() def directory(self): fits: bool = False while fits == bool(False): self.url = askdirectory() if ('\\' not in self.url) and ('/' not in self.url): showerror( 'Error', 'Мы заметили, что вы выбрали неверный адрес!' ) else: fits: bool = True self.input_url.configure(state=NORMAL) self.input_url.insert(END, self.url) self.input_url.after( 6000, lambda: self.input_url.configure(state=DISABLED) ) def install(self): url = path.join(self.url) try: if url == '': raise NameError('is empty') elif ('\\' not in self.url) and ('/' not in self.url): raise NameError('not file') move_file('bin/dist/F_Reference_H', url) if self.check_icon.get(): system( f'@powershell \"$x=(New-Object -ComObject ' f'WScript.Shell).CreateShortcut(' f'\'%USERPROFILE%/Desktop/F_Reference_H.lnk\');$x' f'.TargetPath=\'' f'{url}/F_Reference_H/F_Reference_H.exe\';$x' f'.WorkingDirectory=\'' f'{url}/F_Reference_H\';$x.Save()\" ' ) system( f'@powershell \"$x=(New-Object -ComObject ' f'WScript.Shell).CreateShortcut(' f'\'%APPDATA%\Microsoft\Windows\Start ' f'Menu\Programs\F_Reference_H.lnk\');$x' f'.TargetPath=\'' f'{url}/F_Reference_H/F_Reference_H.exe\';$x' f'.WorkingDirectory=\'{url}/F_Reference_H\';$x.Save()\"') showinfo('Successfully', 'Установка прошла успешно!') exit_ex() except NameError as error: if str(error) == 'is empty': showerror('Error', 'Пустое поле пути к папке!') if str(error) == 'not file': showerror( 'Error', 'Мы заметили, что вы выбрали неверный адрес!' )