Пример #1
0
    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()
Пример #2
0
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)
Пример #3
0
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()
Пример #4
0
    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()
Пример #6
0
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)
Пример #7
0
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()
Пример #8
0
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()
Пример #9
0
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)
Пример #10
0
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))
Пример #11
0
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=
    "-------------------------------------------------------------------------"
Пример #12
0
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
Пример #13
0
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()
Пример #14
0
    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)
Пример #15
0
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='请选择通道')
Пример #16
0
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)
Пример #17
0
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()
Пример #18
0
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='请选择通道')
Пример #19
0
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)
Пример #20
0
    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()
Пример #21
0
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)
Пример #22
0
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")
Пример #25
0
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"
              ))
Пример #26
0
    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')))
Пример #27
0
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()
Пример #28
0
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)
Пример #29
0
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")
Пример #30
0
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',
                    'Мы заметили, что вы выбрали неверный адрес!'
                )