コード例 #1
10
ファイル: recipe-580650.py プロジェクト: jacob-carrier/code
class Scratchpad:

    def __init__(self):
        self.window = Tk()
        self.window.title("Onager Scratchpad")
        self.create_frame()
        self.create_editing_window()
        self.window.bind('<F7>', self.save_file)
        self.window.bind('<F5>', self.open_file)

    def create_frame(self):
        frame_style = Style()
        frame_style.theme_use('alt')
        frame_style.configure("TFrame",
                              relief='raised')
        self.frame = Frame(self.window, style="frame_style.TFrame")
        self.frame.rowconfigure(1)
        self.frame.columnconfigure(1)
        self.frame.grid(row=0, column=0)

    def create_editing_window(self):
        self.editing_window = ScrolledText(self.frame)
        self.editing_window.configure(fg='gold',
                                      bg='blue',
                                      font='serif 12',
                                      padx='15',
                                      pady='15',
                                      wrap='word',
                                      borderwidth='10',
                                      relief='sunken',
                                      tabs='48',
                                      insertbackground='cyan')
        self.editing_window.grid(row=0, column=0)

    def save_file(self, event=None):
        name = asksaveasfilename()
        outfile = open(name, 'w')
        contents = self.editing_window.get(0.0, END)
        outfile.write(contents)
        outfile.close()

    def open_file(self, event=None):
        name = askopenfilename()
        infile = open(name, 'r')
        contents = infile.read()
        self.editing_window.insert(INSERT, contents)
        infile.close()
コード例 #2
0
ファイル: blocks.py プロジェクト: pohmelie/idev
class Logger(Frame):

    ERROR, BORRING, EVENT, NORMAL = "error", "borring", "event", None

    def __init__(self, *args, **kw):
        text_height = kw.pop("text_height", 25)

        Frame.__init__(self, *args, **kw)

        self.deque = deque()

        self.txt = ScrolledText(self, wrap=WORD, state=DISABLED, relief=SUNKEN, height=text_height)
        self.txt.grid(column=0, row=0, sticky=(N, W, E, S))
        self.txt.configure(LoggerColors.default)
        for k, v in LoggerColors.tags.items():
            self.txt.tag_configure(k, v)

        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        self.after(100, self._toscreen)

    def __call__(self, *args):
        self.deque.appendleft(args)

    def _toscreen(self):
        if len(self.deque):
            self.txt["state"] = NORMAL
            while(len(self.deque)):
                self.txt.insert(
                    END,
                    "\n[{}] ".format(strftime("%H:%M:%S")),
                    "time",
                    *self.deque.pop())
            self.txt.yview(END)
            self.txt["state"] = DISABLED
        self.after(100, self._toscreen)
コード例 #3
0
ファイル: Master Typing.py プロジェクト: Demaxl/Mini-Projects
class Type:
    def __init__(self, master, essay, tips):
        self.master = master
        self.essay = essay
        shuffle(tips)
        self.tips = iter(cycle(tips))
        self.temp = self.essay[1]
        self.passage = Label(self.master,
                             text=self.essay[0],
                             padx=45,
                             pady=50,
                             bg='#ffffbb',
                             font=('Verdana', 15),
                             relief=RAISED,
                             justify=LEFT,
                             wraplength=1269)
        self.passage.pack(side=TOP, fill=X)

        self.textinput = ScrolledText(self.master,
                                      width=90,
                                      height=18,
                                      bd=10,
                                      font=('Garamond', 15),
                                      state=NORMAL,
                                      wrap=WORD)
        self.textinput.place(x=290, y=290)

        self.timer_clicked = False
        minutes = self.temp // 60
        seconds = self.temp % 60
        self.countdown = Label(text='{}:{:02d}'.format(minutes, (seconds)),
                               font=('Arial', 19),
                               bg='yellow',
                               relief=GROOVE)
        self.countdown.place(x=620, y=250)
        self.countdown.bind('<Button-1>', self.count)
        self.textinput.bind('<Control-Return>', lambda dummy=0: self.submit())
        self.submitted = False

        self.draw()

    def draw(self):
        self.result = Label(text='', font=('Arial', 18, 'bold'))
        self.result.place(x=50, y=350)
        self.remark = Label(text='', font=('Arial', 18, 'bold'))
        self.remark.place(x=65, y=550)
        self.random_tip = Button(self.master,
                                 text='Tips',
                                 font=('Arial', 12, 'bold'),
                                 fg='black',
                                 bg='powder blue',
                                 relief=GROOVE,
                                 width=10,
                                 command=self.show_tips)
        self.random_tip.place(x=1180, y=370)
        self.exit_btn = Button(self.master,
                               text='Quit',
                               font=('Arial', 12, 'bold'),
                               fg='black',
                               bg='powder blue',
                               relief=GROOVE,
                               width=10,
                               command=lambda: self.master.destroy())
        self.exit_btn.place(x=1180, y=420)
        self.restart_btn = Button(self.master,
                                  text='Restart',
                                  font=('Arial', 12, 'bold'),
                                  fg='black',
                                  bg='powder blue',
                                  width=10,
                                  relief=GROOVE,
                                  command=self.restart)
        self.restart_btn.place(x=1180, y=550)

        level = ['Easy', 'Normal', 'Hard']
        self.level_var = StringVar()
        self.level_var.set('Normal')
        self.difficulty_easy = ttk.Radiobutton(self.master,
                                               text='Easy',
                                               variable=self.level_var,
                                               value='Easy',
                                               command=self.level_change)
        self.difficulty_easy.place(x=1280, y=280)
        self.difficulty_normal = ttk.Radiobutton(self.master,
                                                 text='Normal',
                                                 variable=self.level_var,
                                                 value='Normal',
                                                 command=self.level_change)
        self.difficulty_normal.place(x=1280, y=300)
        self.difficulty_hard = ttk.Radiobutton(self.master,
                                               text='Hard',
                                               variable=self.level_var,
                                               value='Hard',
                                               command=self.level_change)
        self.difficulty_hard.place(x=1280, y=320)
        self.difficulty = Label(self.master,
                                text=f'Difficulty: Normal',
                                font=('Times', 14),
                                fg='orange')
        self.difficulty.place(x=1190, y=230)

        self.start_text = Label(self.master,
                                text='Click the Timer to Start!',
                                font=('Courier', 13, 'bold underline'))
        self.start_text.place(x=530, y=220)

    def submit(self):
        self.submitted = True

    def calculate(self):
        total = self.essay[0].split()
        typed_words = self.textinput.get(1.0, END).split()

        correct = []
        incorrect = []
        wrong_case = []
        excess_words = []
        if len(typed_words) == len(total):
            for i in range(len(total)):
                if total[i] == typed_words[i]:
                    correct.append(total[i])
                else:
                    incorrect.append(typed_words[i])
                    if typed_words[i].lower() == total[i].lower():
                        wrong_case.append(typed_words[i])

        elif len(typed_words) < len(total):
            diff = len(total) - len(typed_words)
            for i in range(len(typed_words)):
                if typed_words[i] == total[i]:
                    correct.append(typed_words[i])
                else:
                    incorrect.append(typed_words[i])
                    if typed_words[i].lower() == total[i].lower():
                        wrong_case.append(typed_words[i])

            empty = ['space'] * diff
            for e in empty:
                incorrect.append(e)
        else:
            for i in range(len(total)):
                if typed_words[i] == total[i]:
                    correct.append(typed_words[i])
                else:
                    incorrect.append(typed_words[i])
                    if typed_words[i].lower() == total[i].lower():
                        wrong_case.append(typed_words[i])
            for i in range(1, len(typed_words) - len(total)):
                excess_words.append(typed_words[-i])
            for i in excess_words:
                incorrect.append(i)

        score = 100 - ((len(incorrect) / len(total)) * 100)
        self.result.configure(
            text=f'Accuracy: {round(score) if score > 0 else 0}%\n\n' +
            f'Wrong Case: {len(wrong_case)}\n\n Excess Words: {len(excess_words)}'
        )
        if score >= 70:
            color = 'green'
            word = 'PASS'
        else:
            color = 'red'
            word = 'FAIL'
        self.remark.configure(text=f"Remark: {word}", fg=color)
        return True

    def run(self, name, temp):
        self.start_text.destroy()
        self.timer_clicked = True
        self.textinput.delete(1.0, END)
        self.textinput.focus()

        try:
            while 1:
                mins, secs = divmod(temp, 60)
                self.countdown.configure(text='{}:{:02d}'.format(mins, secs))
                if temp == 0:
                    self.countdown.configure(text='Time UP')
                    self.textinput.configure(state=DISABLED)
                    self.calculate()
                    return

                elif temp <= 10:
                    self.countdown.configure(bg='red', fg='white')
                if self.submitted == True:
                    self.calculate()
                    return

                temp -= 1
                sleep(1)
                self.master.update()
        except RuntimeError:
            print('MASTER TYPING HAS BEEN CLOSED')
        except TclError:
            print('MASTER TYPING HAS BEEN CLOSED')

    def count(self, event):
        if not self.timer_clicked:
            _thread.start_new_thread(self.run, ('Timer', self.temp))

    def restart(self):
        self.master.destroy()
        main()

    def level_change(self):
        if not self.timer_clicked:
            if self.level_var.get() == 'Easy':
                self.temp = self.temp + 30
                colour = 'green'
            elif self.level_var.get() == 'Normal':
                self.temp = self.essay[1]
                colour = 'orange'
            else:
                self.temp -= 30
                colour = 'red'
            minutes = self.temp // 60
            seconds = self.temp % 60
            self.difficulty.configure(
                text=f'Difficulty: {self.level_var.get()}', fg=colour)
            self.countdown.configure(
                text='{}:{:02d}'.format(minutes, (seconds)))
            self.master.update()

    def show_tips(self):
        showinfo(title='Tip', message=next(self.tips))
コード例 #4
0
    ENBTN = Button(tab1, text="Encrypt Database", command=encrypt, state=DISABLED)
    ENBTN.grid(column=2, row=5)
else:
    ENBTN = Button(tab1, text="Encrypt Database", command=encrypt)
    ENBTN.grid(column=2, row=5)
if encryptcheck() == 0:
    DNBTN = Button(tab1, text="Decrypt Database", command=decrypt, state=DISABLED)
    DNBTN.grid(column=3, row=5)
else:
    DNBTN = Button(tab1, text="Decrypt Database", command=decrypt)
    DNBTN.grid(column=3, row=5)

lbl5 = Label(tab2, text="Log events:")
lbl5.grid(column=0,row=0)
LOG = ScrolledText(tab2,width=100,height=10,wrap=WORD)
LOG.grid(column=0,row=1,columnspan=4)
LOG.configure(state='disabled')

RE = Button(tab2, text="Refresh", command=update_log)
RE.grid(column=0, row=2)
splunk = Button(tab2, text="Go see splunk dashboard")
splunk.grid(column=1, row=2)
splunk.bind("<Button-1>", lambda e: callback("http://127.0.0.1:8000/en-US/app/search/ispj"))
##es = Button(tab2, text="Go see ElasticSearch dashboard")
##es.grid(column=2, row=2)
##es.bind("<Button-1>", lambda e: callback("http://127.0.0.1:8000/en-US/app/search/ispj"))

PATH.focus()
window.mainloop()

コード例 #5
0
class ToolsGui():
    def __init__(self, init_window_name):
        self.init_window_name = init_window_name
        self.bs64image = None

    def md5_upper_event(self, event):
        self.str_trans_to_md5(True)

    def fast_copy(self):
        data = self.result_data_Text.get(0.0, END).strip()
        pyperclip.copy(data)

    # 设置窗口
    def set_init_window(self):
        # 左侧视图
        self.init_window_name.update()
        print(self.init_window_name.winfo_width())
        frm1 = Frame(self.init_window_name)
        frm1.pack(fill=BOTH, side=LEFT, expand=True)

        self.init_data_label = Label(frm1,
                                     text="待处理数据",
                                     font=("宋体", 15, "bold"),
                                     height=2,
                                     bg='dodgerblue')
        self.init_data_label.pack(fill=X)

        self.init_data_Text = ScrolledText(frm1, undo=True)  # 原始数据录入框
        self.init_data_Text.pack(fill=BOTH, expand=True)
        self.log_label = Label(frm1,
                               text="日志",
                               font=("宋体", 15, "bold"),
                               height=2,
                               bg='dodgerblue')
        self.log_label.pack(fill=X)
        self.log_data_Text = ScrolledText(frm1, )  # 日志框
        self.log_data_Text.pack(fill=BOTH, expand=True)

        # 中间按钮试图
        frm2 = Frame(self.init_window_name)
        frm2.pack(fill=BOTH, side=LEFT, expand=True)
        # md5计算
        self.str_trans_to_md5_button = Button(frm2,
                                              text="MD5计算\n(右键点击大写)",
                                              bg="limegreen",
                                              command=self.str_trans_to_md5)
        self.str_trans_to_md5_button.bind('<Button-3>',
                                          self.md5_upper_event,
                                          add=True)
        self.str_trans_to_md5_button.pack(fill=BOTH, expand=True)
        # base64编码
        self.str_trans_to_bs64_button = Button(frm2,
                                               text="base64编码",
                                               bg="gold",
                                               command=self.str_trans_to_bs64)
        self.str_trans_to_bs64_button.pack(fill=BOTH, expand=True)
        # base64解码
        self.bs64_trans_to_str_button = Button(frm2,
                                               text="base64解码",
                                               bg="limegreen",
                                               command=self.bs64_trans_to_str)
        self.bs64_trans_to_str_button.pack(fill=BOTH, expand=True)
        # url编码
        self.str_trans_to_url_button = Button(frm2,
                                              text="URL编码",
                                              bg="gold",
                                              command=self.str_trans_to_url)
        self.str_trans_to_url_button.pack(fill=BOTH, expand=True)
        # url解码
        self.url_trans_to_str_button = Button(frm2,
                                              text="URL解码",
                                              bg="limegreen",
                                              command=self.url_trans_to_str)
        self.url_trans_to_str_button.pack(fill=BOTH, expand=True)
        # unicode转中文
        self.unicode_trans_to_zh_button = Button(
            frm2,
            text="Unicode转中文",
            bg="gold",
            command=self.unicode_trans_to_zh)
        self.unicode_trans_to_zh_button.pack(fill=BOTH, expand=True)
        # json格式化
        self.str_trans_to_json_button = Button(frm2,
                                               text="Json格式化",
                                               bg="limegreen",
                                               command=self.str_trans_to_json)
        self.str_trans_to_json_button.pack(fill=BOTH, expand=True)

        # base64转图片
        self.bs64_trans_to_pic_button = Button(frm2,
                                               text="base64转图片",
                                               bg="gold",
                                               command=self.bs64_trans_to_pic)
        self.bs64_trans_to_pic_button.pack(fill=BOTH, expand=True)

        # 图片转base64
        self.pic_trans_to_bs64_button = Button(frm2,
                                               text="图片转base64",
                                               bg="limegreen",
                                               command=self.pic_trans_to_bs64)
        self.pic_trans_to_bs64_button.pack(fill=BOTH, expand=True)

        # chrome请求头转换
        self.header_trans_to_json_button = Button(
            frm2,
            text="请求头转Json",
            bg="gold",
            command=self.header_trans_to_json)
        self.header_trans_to_json_button.pack(fill=BOTH, expand=True)

        # 右侧结果试图
        frm3 = Frame(self.init_window_name)
        frm3.pack(fill=BOTH, side=RIGHT, expand=True)
        self.result_data_label = Label(frm3,
                                       height=2,
                                       text="输出结果",
                                       font=("宋体", 15, "bold"),
                                       bg="dodgerblue")
        self.result_data_label.pack(fill=X)
        copybtn = Button(self.result_data_label,
                         text='一键复制',
                         command=self.fast_copy)
        copybtn.pack(side=RIGHT)
        self.result_data_Text = ScrolledText(frm3)  # 处理结果展示
        self.result_data_Text.pack(fill=BOTH, expand=True)

    # 功能函数
    def str_trans_to_md5(self, upper=False):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                myMd5 = hashlib.md5()
                myMd5.update(src)
                res = myMd5.hexdigest()
                if upper:
                    res = res.upper()
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_bs64(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = base64.b64encode(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def bs64_trans_to_str(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = base64.b64decode(src).decode()
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_url(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = urllib.parse.quote(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def url_trans_to_str(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                res = urllib.parse.unquote(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def unicode_trans_to_zh(self):
        src = self.init_data_Text.get(0.0, END).strip()
        print(src, type(src))
        if src:
            try:
                src = src.replace('\\\\u', '\\u')
                res = src.encode().decode('unicode_escape')
                print(res, type(res))
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_json(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                tmp = eval(src)
                res = json.dumps(tmp, ensure_ascii=False, indent=4)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def pic_trans_to_bs64(self):
        try:
            picpath = filedialog.askopenfilename(title='选择图片文件',
                                                 filetypes=[('PNG图片', '*.png'),
                                                            ('JPG图片',
                                                             ('*.jpg', '*.jpe',
                                                              '*.jpeg')),
                                                            ('BMP图片', '*.bmp'),
                                                            ('所有文件', '*')])
            if picpath:
                self.init_data_Text.delete(1.0, END)
                self.init_data_Text.insert(1.0, '图片路径:\n' + picpath)
                with open(picpath, 'rb') as handle:
                    image_base64 = str(base64.b64encode(handle.read()),
                                       encoding='utf-8')
                    self.write_res_to_text(image_base64)
        except Exception as e:
            self.result_data_Text.delete(1.0, END)
            self.write_log_to_text("[ERROR]:%s" % e)

    def bs64_trans_to_pic(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                binary_data = base64.b64decode(src)
                # print(binary_data)
                img_data = BytesIO(binary_data)
                img_open = Image.open(img_data)
                self.bs64image = ImageTk.PhotoImage(img_open)
                self.result_data_Text.delete(1.0, END)
                self.result_data_Text.image_create(END, image=self.bs64image)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def header_trans_to_json(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if ': ' in src:
            try:
                lines = src.split('\n')
                h = {}
                for line in lines:
                    if line:
                        l = line.split(': ')
                        h[l[0]] = l[1]
                res = json.dumps(h,
                                 ensure_ascii=False,
                                 indent=4,
                                 separators=(',', ': '))
                self.write_res_to_text(res)

            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    # 结果展示
    def write_res_to_text(self, res):
        # 输出到界面
        self.result_data_Text.delete(1.0, END)
        self.result_data_Text.insert(1.0, res)
        self.write_log_to_text("[INFO]:转换成功!")

    # 日志动态打印
    def write_log_to_text(self, logmsg):
        current_time = time.strftime('[%Y-%m-%d %H:%M:%S]',
                                     time.localtime(time.time()))
        logmsg_in = str(current_time) + logmsg + "\n"  # 换行
        self.log_data_Text.configure(state='normal')
        self.log_data_Text.insert(END, logmsg_in)
        self.log_data_Text.see(END)
        self.log_data_Text.configure(state='disabled')
コード例 #6
0
def open_detailed_window(link):
    # article page url
    article_url = "https://tr.sputniknews.com" + link
    print(article_url)
    # article page html
    article_page = requests.get(article_url)
    # create soup object for article page
    article_soup = BeautifulSoup(article_page.content, "lxml")
    # body part of article
    article_div = article_soup.find("div", class_="b-article")
    # article title text
    # more detailed then main page title
    article_title = article_div.find("div",
                                     "b-article__lead").text.replace('\n', '')
    # article detailed text including news details
    article_detail = article_div.find("div", "b-article__text").text

    # create a new window can open over the main window
    new_win = Toplevel(root)
    new_win.geometry("1000x1000")
    new_win.resizable(0, 0)

    # create a canvas for movable text like newscast
    canvas = Canvas(new_win, bg='black')
    canvas.pack()
    canvas.create_text(0,
                       -200,
                       text=article_title,
                       font=('Times New Roman', 30, 'bold'),
                       fill='white',
                       tags=("marquee", ),
                       anchor='w')
    # get canvas dimensions for editing for animation
    x1, y1, x2, y2 = canvas.bbox("marquee")
    width = x2 - x1
    height = y2 - y1
    canvas['width'] = width
    canvas['height'] = height
    # moving speed of title text right to left
    anim_speed = 100

    # article image url
    # image size = 1000x541
    article_img_url = article_soup.find("div", "b-article__header").img["src"]
    print(article_img_url)

    # get image saved name with saved folder and image name stored at server
    saved_img_name = os.path.join(
        "articles_img",
        article_img_url.split("/")[-1].replace(":", "_"))

    # create folder for save article image if not exist
    if not os.path.exists('articles_img'):
        os.makedirs('articles_img')
    # download article image if not stored
    if not os.path.exists(saved_img_name):
        # get image stream
        r = requests.get(article_img_url, stream=True)
        # check image available
        if r.status_code == 200:
            # when we not set true image file will be 0 byte
            r.raw.decode_content = True
            with open(saved_img_name, "wb") as f:
                # save getting img to device
                shutil.copyfileobj(r.raw, f)

    # load image available for tkinter
    photo = ImageTk.PhotoImage(Image.open(saved_img_name))

    # create article image
    Label(new_win, image=photo, width=1000).pack()

    # create scrollable text for article detail using with mouse wheel
    txt = ScrolledText(new_win, font="arial 20")
    txt.pack()
    # add article detail text
    txt.insert(INSERT, article_detail)
    txt.configure(state="disabled")

    def right2left_news_title():
        # get current dimensions
        x1, y1, x2, y2 = canvas.bbox("marquee")
        if (x2 < 0 or y1 < 0):
            x1 = canvas.winfo_width()
            y1 = canvas.winfo_height() // 2
            canvas.coords("marquee", x1, y1)
        else:
            canvas.move("marquee", -2, 0)
        # run method always
        canvas.after(1000 // anim_speed, right2left_news_title)

    # call method one time,after that will be run always when close the window
    right2left_news_title()
    new_win.mainloop()
コード例 #7
0
root.title(user)
root['height'] = 600
root['width'] = 800
root.resizable(0, 0)  # 禁止放缩窗口

############################## 创建显示消息的主文本框
listbox = ScrolledText(root, bg='#F5F5DC')
listbox.place(x=160, y=0, width=640, height=500)
# 文本框使用的字体颜色
listbox.tag_config('red', foreground='red')
listbox.tag_config('blue', foreground='blue')
listbox.tag_config('green', foreground='green')
listbox.tag_config('purple', foreground='purple')
listbox.insert(tkinter.END, '欢迎来到这个简陋的小聊天室!斯是陋室,惟吾德馨!', 'blue')
# 设置文本框内容不能修改
listbox.configure(state='disabled')

############################## 创建显示在线用户的文本框
online_user_box_on = 0  # 在线用户列表框开关状态
online_user_box = tkinter.Listbox(root, bg='#F5FFFA')
online_user_box.place(x=0, y=0, width=160, height=500)


# 打开关闭在线用户列表
def users_online():
    global online_user_box, online_user_box_on
    if online_user_box_on == 1:
        online_user_box.place(x=0, y=0, width=160, height=500)
        listbox.place(x=160, y=0, width=640, height=500)
        online_user_box_on = 0
    else:
コード例 #8
0
class MainWindow(Frame):

    #__init__ is called when ever an object of the class is constructed.
    def __init__(self, topWindow):
        #construct the main (top) window
        Frame.__init__(self, topWindow)
        self.master = topWindow

        #set topWindow to XGA resolution
        topWindow.geometry('%dx%d' % (1024, 768))
        #topWindow.minsize(1152,864)

        #definte winow title
        self.master.title("RadarWorld")

        #define the ratio of the columns and rows, grid geom. manager will bu used
        topWindow.columnconfigure(0, weight=20)
        topWindow.columnconfigure(1, weight=80)
        topWindow.rowconfigure(0, weight=90)
        topWindow.rowconfigure(1, weight=3)
        topWindow.rowconfigure(2, weight=1)

        #define left side frame INSIDE row=col=0 to place the controls
        #Two Columns and as many rows as needed
        leftSideControlsFrame = LabelFrame(topWindow,
                                           bd=3,
                                           relief=GROOVE,
                                           text="Radar Controls")
        leftSideControlsFrame.grid(row=0, column=0, sticky=W + E + N + S)
        leftSideControlsFrame.columnconfigure(0, weight=1)
        leftSideControlsFrame.rowconfigure(0, weight=1)
        leftSideControlsFrame.rowconfigure(1, weight=1)
        leftSideControlsFrame.rowconfigure(2, weight=98)

        #define right side frame inside row=col=1 to place the controls
        rightSideControlsFrame = Frame(topWindow)
        rightSideControlsFrame.grid(row=0, column=1, sticky=W + E + N + S)
        rightSideControlsFrame.columnconfigure(
            0, weight=1)  # an empty column must be defined for the widgets

        #build the topwindow
        self.grid(sticky=W + E + N + S)

        #* * * * * * define the Ui elements * * * * * *
        # Menubar:
        menubar = Menu(topWindow)
        topWindow.config(menu=menubar)
        # Menubar - File Menu:
        fileMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="File", menu=fileMenu)
        fileMenu.add_command(label="Open", command=MainWindow.doNothing)
        fileMenu.add_separator()
        fileMenu.add_command(label="Exit", command=MainWindow.quit)
        # Menubar - Edit Menu:
        editMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Edit", menu=editMenu)
        editMenu.add_command(label="Settings", command=MainWindow.doNothing)
        # Menubar - Help Menu:
        helpMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Help", menu=helpMenu)
        helpMenu.add_command(label="About", command=MainWindow.helpMenu_About)

        # - - - - - Left side elements (controls) - - - - - -
        spaceHolder = Label(leftSideControlsFrame,
                            text="Avaiable Interfaces:",
                            bd=1,
                            relief=FLAT,
                            anchor=W)
        spaceHolder.grid(row=0, column=0, padx=10, pady=0, sticky=W + N + E)

        self.serialPortCmbBox = Combobox(
            leftSideControlsFrame, values=serialSystemClass.getSerialPorts())
        self.serialPortCmbBox.current(0)
        self.serialPortCmbBox.grid(row=1,
                                   column=0,
                                   padx=0,
                                   pady=0,
                                   columnspan=2,
                                   sticky=W + E + N + S)
        self.serialPortCmbBox.bind('<<ComboboxSelected>>',
                                   self.on_serialPortCmbBox_select)

        # - - - - - Right side elements (graph) - - - - - - -
        #draw the canvas into the frame. Get max frame size after update()
        #FigureRightSide = plt.Figure(dpi=100) #create new figure from matplotlib.pyplt (plt) lib

        self.FigureRightSide, (self.ax1, self.ax2) = plt.subplots(2, 1)
        self.Readings = 5

        self.canvasForGraph = FigureCanvasTkAgg(
            self.FigureRightSide, master=rightSideControlsFrame
        )  #create canvas for figure int the frame

        self.canvasForGraph.get_tk_widget().grid(sticky=W + E + N + S)

        t = np.arange(0, 100, .01)  # time data
        self.ax1.plot(t, 50 * np.sin(2 * np.pi * t))
        self.ax2.plot(t, 1 * np.sin(2 * np.pi * t))
        #self.FigureRightSide.ax2.clear()
        #self.ax2.clear()
        __dir__(MainWindow)

        # Log Window:
        self.scrolled_text = ScrolledText(topWindow, height=5)
        self.scrolled_text.configure(font='TkFixedFont')
        self.scrolled_text.tag_config('INFO', foreground='black')
        #self.scrolled_text.insert(END, "hello")

        # Status bar:
        self.statusbarText = StringVar()
        self.statusBar = Label(topWindow,
                               textvariable=self.statusbarText,
                               bd=1,
                               relief=SUNKEN,
                               anchor=W)

        # Clock:
        self.clockText = StringVar()
        self.clock = Label(topWindow,
                           textvariable=self.clockText,
                           bd=1,
                           relief=SUNKEN,
                           anchor=E)

    #* * * * * * functions to serve the Ui * * * * * *
    def helpMenu_About():
        messagebox.showinfo("About RadarWorld", "v0.0")

    def doNothing():
        pass

    #close the GUI (on file-exit, or window close)
    def quit():
        loggerFunctions.closeLoggerFile()
        #serialSystemClass.closeSerialPort(MainWindow(root).serialPortCmbBox.get())
        root.destroy()

    def on_serialPortCmbBox_select(self, event=None):
        #get selection from combobox and display in log window
        print("comboboxes:", self.serialPortCmbBox.get())
        log_contents = loggerFunctions.sendToLogger(
            'Selected:' + str(self.serialPortCmbBox.get()))
        MainWindow(root).updateLogWindow(log_contents)

        #open serial port by with the serialUtilsClass __init__
        #ser = serialUtilsClass(self.serialPortCmbBox.get())
        #ser.sendData(7)
        #test = ser.recieveData(5)
        #test=ser.recieveFrame(b'\0x16', 1031)
        #print(len(test))

        #portList=serialSystemClass.getSerialPorts()
        #msg= serialSystemClass.openSerialPort(self.serialPortCmbBox.get())
        #log_contents = log_contents + msg
        #MainWindow(root).updateLogWindow(log_contents)

    #update log window with current message
    def updateLogWindow(self, logTextToAppend):
        self.scrolled_text.insert(END, logTextToAppend)
        self.scrolled_text.see(END)
        self.scrolled_text.grid(row=1,
                                column=0,
                                columnspan=2,
                                sticky=W + E + N + S)

    #update the clock in given intervals with the after() function
    def updateClock(self):
        now = datetime.datetime.now()
        clockBarCurrentTime = now.strftime("%d.%m.%Y.   %H:%M:%S")
        self.clockText.set(clockBarCurrentTime)
        self.clock.grid(row=2, column=1, sticky=W + E + N + S)
        self.after(1000, self.updateClock)

    def updateStatusBar(self):
        #create the list to store the message
        statusBarTextList = list()
        statusBarCurrentMsg = "RadarWorld 1.0"
        #place empty chars to the end of the message
        statusBarCurrentMsgExtended = statusBarCurrentMsg.ljust(
            len(statusBarCurrentMsg) + 1)
        statusBarTextList.append(statusBarCurrentMsgExtended)
        #add additional text
        statusBarCurrentState = "Status: Connected via SER"
        statusBarCurrentMsgExtended = statusBarCurrentState.ljust(
            len(statusBarCurrentState) + 0)
        statusBarTextList.append(statusBarCurrentMsgExtended)
        #update the status bar with the current text
        self.statusbarText.set(''.join(statusBarTextList))
        self.statusBar.grid(row=2,
                            column=0,
                            columnspan=1,
                            sticky=W + E + N + S)
        #call the own function after 1 sec
        self.after(1000, self.updateStatusBar)

    def updateGraph(self):
        t = np.arange(0, 100, .01)  # time data

        self.ax1.clear()
        self.ax2.clear()
        print("self.Readings", self.Readings)
コード例 #9
0
class ChatGrupo(Interface):
    def __init__(self, tk, dados_cliente: Usuario, grupo: str,
                 soquete: socket):
        self.soquete = soquete
        self.dados_cliente = dados_cliente
        self.grupo = grupo
        super().__init__(tk)

    def _iniciar_tela(self):
        self._mudar_titulo(f"Chat - {self.grupo}")

        self.main_frame = Frame(self._tk,
                                bg=COR_DE_FUNDO_PADRAO,
                                padx=5,
                                pady=5)
        self.main_frame.grid_rowconfigure(1, minsize=10)
        self.main_frame.grid_columnconfigure(1, minsize=15)
        self.main_frame.grid_columnconfigure(3, minsize=10)
        self.main_frame.pack(fill=X)

        self.recv_area = ScrolledText(self.main_frame,
                                      font=FONTE_CHAT_MENSAGEM_RECEBIDA,
                                      borderwidth=2,
                                      width=60,
                                      height=15)
        self.recv_area.configure(state=DISABLED, wrap=WORD)
        self.recv_area.grid(row=0, column=0)

        self.send_area = ScrolledText(self.main_frame,
                                      font=FONTE_CHAT_MENSAGEM_ENVIADA,
                                      borderwidth=2,
                                      width=60,
                                      height=5)
        self.send_area.configure(wrap=WORD)
        self.send_area.grid(row=2, column=0)

        self.btn_exit = Button(self.main_frame,
                               text="SAIR",
                               font=FONTE_CHAT_BTN_SAIR,
                               padx=50,
                               pady=20,
                               command=self.__acao_btn_exit)
        self.btn_exit.grid(row=1, column=2)

        self.btn_send = Button(self.main_frame,
                               text="ENVIAR",
                               font=FONTE_CHAT_BTN_ENVIAR,
                               padx=50,
                               pady=20,
                               command=self.__enviar_mensagem)
        self.btn_send.grid(row=2, column=2)

        try:
            self.soquete.send(
                codificar(
                    PedidoMensagensGrupoArquivadas(self.dados_cliente,
                                                   self.grupo)))

            mensagens_arquivadas = self.soquete.recv(BUFFER)
            mensagens_arquivadas = descodificar(mensagens_arquivadas,
                                                [MensagemGrupo])

            if mensagens_arquivadas:
                for mensagem in mensagens_arquivadas:
                    if mensagem:
                        self.__mostrar_mensagem(mensagem)

        except ConnectionResetError as erro:
            print(erro)
            _conexao_resetada()
            self.soquete.close()
            try:
                self.main_frame.destroy()
                Login(self._tk)
            except AttributeError:
                exit()

        except ConnectionAbortedError as erro:
            print(erro)
            _conexao_abortada()
            self.soquete.close()
            try:
                self.main_frame.destroy()
                Login(self._tk)
            except AttributeError:
                exit()

        except JSONDecodeError as erro:
            print(erro)
            _dados_recebidos_invalidos()
            self.soquete.close()
            try:
                self.main_frame.destroy()
                Login(self._tk)
            except AttributeError:
                exit()

        self.receber_mensagens = Thread(target=self.__receber_mensagens)
        self.receber_mensagens.start()

    def __mostrar_mensagem(self, msg: MensagemGrupo):
        self.recv_area.configure(state=NORMAL)

        self.recv_area.insert(END, f"{msg.remetente.nome}: {msg.mensagem}")
        self.recv_area.insert(END, "\n")

        self.recv_area.configure(state=DISABLED)
        self.recv_area.see(END)

    def __enviar_mensagem(self):
        msg = self.send_area.get("1.0", END).strip()
        self.send_area.delete("1.0", END)
        msg = MensagemGrupo(self.dados_cliente, msg, self.grupo)
        try:
            self.soquete.send(codificar(msg))

        except ConnectionResetError as erro:
            print(erro)
            _conexao_resetada()
            self.soquete.close()
            try:
                self.main_frame.destroy()
                Login(self._tk)
            except AttributeError:
                exit()

        self.btn_send.config(state=DISABLED)
        sleep(1)
        self.btn_send.config(state=NORMAL)

    def __receber_mensagens(self):
        while True:
            try:
                msg = descodificar(self.soquete.recv(BUFFER), Pedido)
                if msg:
                    self.__mostrar_mensagem(msg)
                else:
                    break

            except ConnectionResetError as erro:
                print(erro)
                _conexao_resetada()
                self.send_area.insert(END, "DESCONECTADO DO CHAT")
                self.send_area.configure(state=DISABLED)
                self.send_area.see(END)
                break

            except ConnectionAbortedError as erro:
                print(erro)
                _conexao_abortada()
                self.send_area.insert(END, "DESCONECTADO DO CHAT")
                self.send_area.configure(state=DISABLED)
                self.send_area.see(END)
                break

            except JSONDecodeError as erro:
                print(erro)
                _dados_recebidos_invalidos()
                self.send_area.insert(END, "DESCONECTADO DO CHAT")
                self.send_area.configure(state=DISABLED)
                self.send_area.see(END)
                break

    def __acao_btn_exit(self):
        try:
            self.soquete.send(codificar(None))
            self.receber_mensagens.join()
            self.main_frame.destroy()
            MenuGrupos(self._tk, self.dados_cliente, self.soquete)

        except ConnectionResetError as erro:
            print(erro)
            _conexao_resetada()
            self.soquete.close()
            try:
                self.main_frame.destroy()
                Login(self._tk)
            except AttributeError:
                exit()

    def _fechar(self):
        try:
            self.soquete.send(codificar(None))
            self.receber_mensagens.join()
            self.soquete.send(codificar(PedidoDesconectar(self.dados_cliente)))

        except ConnectionResetError as erro:
            print(erro)
            _conexao_resetada()

        finally:
            self.soquete.close()
            self._tk.destroy()
コード例 #10
0
class RoomListDialog(tkinter.Toplevel):
    """Dialog with list of all rooms from drawing."""
    def __init__(self, parent, drawing):
        """Initialize the dialog."""
        tkinter.Toplevel.__init__(self, parent)
        self.title("Seznam místností")

        rooms = drawing.rooms
        rooms_count = len(rooms)

        self.add_label(0, 0, "Počet místností")
        self.add_value_widget(0, 1, rooms_count)

        self.txt = ScrolledText(self, undo=True, tabs="4c 7c 10c 24c")
        self.txt.grid(row=1,
                      column=0,
                      columnspan=2,
                      sticky="nwse",
                      padx=2,
                      pady=2)

        self.txt.tag_configure("underlined", underline=True)
        self.txt.tag_configure("blue", foreground="blue")
        self.txt.tag_configure("green", foreground="green")
        self.txt.tag_configure("red", foreground="red")

        self.txt.insert(tkinter.INSERT,
                        "SAP ID\tgr.ID\tzakreslena\tsouřadnic\n", "underlined")

        for room in rooms:
            if "room_id" in room:
                self.txt.insert(tkinter.END, room["room_id"] + "\t", "blue")
            else:
                self.txt.insert(tkinter.END, "x\t", "red")

            if "canvas_id" in room and room["canvas_id"] is not None:
                self.txt.insert(tkinter.END, str(room["canvas_id"]) + "\t")
            else:
                self.txt.insert(tkinter.END, "x\t", "red")

            if room["polygon"] is not None and len(room["polygon"]) > 0:
                self.txt.insert(tkinter.END, "ano\t", "green")
            else:
                self.txt.insert(tkinter.END, "ne\t", "red")

            if room["polygon"] is not None:
                typ = "?"
                if "type" in room:
                    typ = room["type"]
                self.txt.insert(tkinter.END,
                                str(len(room["polygon"])) + " (" + typ + ")\n")
            else:
                self.txt.insert(tkinter.END, "?\n")

        self.txt.configure(state="disabled")

        okButton = tkinter.Button(self, text="OK", command=self.ok)
        okButton.grid(row=2, column=0, sticky="WE")

        # close the dialog on 'x' click
        self.protocol("WM_DELETE_WINDOW", self.destroy)

        # get the focus
        self.grab_set()

        # how the buttons should behave
        self.bind("<Return>", lambda event: self.ok())
        self.bind("<Escape>", lambda event: self.destroy())

        # get the focus
        okButton.focus_set()

    def ok(self):
        """Handle event when Ok button is pressed."""
        self.destroy()

    def add_label(self, row, column, text):
        """Add a label to dialog."""
        label = tkinter.Label(self, text=text)
        label.grid(row=row, column=column, sticky="W", padx=5, pady=5)

    def add_value_widget(self, row, column, value):
        """Add a widget with value to dialog."""
        widget = self.value_widget(value)
        widget.grid(row=row, column=column, sticky="W", padx=5, pady=5)

    def value_widget(self, value):
        """Create new widget with value."""
        widget = tkinter.Entry(self)
        widget.insert(tkinter.END, value)
        widget.configure(state='readonly')
        return widget
コード例 #11
0
ファイル: frame.py プロジェクト: gfruleux/AoE2DERMSParser
    def draw(self):
        self.root.title("AoE2 Definitive Edition RandomMapScript Parser")

        helv10b = tkfont.Font(family='Helvetica', size=10, weight='bold')
        row_index = 0

        # ### Map Resources
        tk.Label(self.root, text="Select Map Resources", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        var_map_res = tk.StringVar()
        combo_map_res = ttk.Combobox(self.root,
                                     values=list(MAP_RESOURCES_DICT.values()),
                                     justify="center",
                                     textvariable=var_map_res)
        combo_map_res.bind(
            "<<ComboboxSelected>>",
            lambda event: self.update_map_resources(var_map_res.get()))
        combo_map_res.grid(row=row_index, column=1)
        combo_map_res.current(0)
        row_index += 1
        lbl_map_res_txt = get_dict_first_key(MAP_RESOURCES_DICT)
        lbl_map_res = tk.Label(self.root, text=lbl_map_res_txt)
        lbl_map_res.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_map_resources = lbl_map_res

        # ### Map Size
        row_index += 1
        tk.Label(self.root, text="Select Map Size", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        var_map_size = tk.StringVar()
        combo_map_size = ttk.Combobox(self.root,
                                      values=list(MAP_SIZE_DICT.values()),
                                      justify="center",
                                      textvariable=var_map_size)
        combo_map_size.bind(
            "<<ComboboxSelected>>",
            lambda event: self.update_map_size(var_map_size.get()))
        combo_map_size.grid(row=row_index, column=1)
        combo_map_size.current(0)
        row_index += 1
        lbl_map_size_txt = get_dict_first_key(MAP_SIZE_DICT)
        lbl_map_size = tk.Label(self.root, text=lbl_map_size_txt)
        lbl_map_size.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_map_size = lbl_map_size

        # ### Game Type
        row_index += 1
        tk.Label(self.root, text="Select Game Type", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        var_game_type = tk.StringVar()
        combo_gamme_type = ttk.Combobox(self.root,
                                        values=list(GAME_TYPE_DICT.values()),
                                        justify="center",
                                        textvariable=var_game_type)
        combo_gamme_type.bind(
            "<<ComboboxSelected>>",
            lambda event: self.update_game_type(var_game_type.get()))
        combo_gamme_type.grid(row=row_index, column=1)
        combo_gamme_type.current(0)
        row_index += 1
        lbl_game_type_txt = get_dict_first_key(GAME_TYPE_DICT)
        lbl_game_type = tk.Label(self.root, text=lbl_game_type_txt)
        lbl_game_type.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_game_type = lbl_game_type

        # ### GeneratingObjects.inc
        row_index += 1
        tk.Label(self.root, text="Select GeneratingObjects.inc", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        btn_gen_obj = tk.Button(self.root,
                                text="Browse",
                                command=lambda: self.update_gen_obj())
        btn_gen_obj.grid(row=row_index, column=1)
        row_index += 1
        lbl_gen_obj = tk.Label(self.root,
                               text=self._path_gen_obj or "Not selected")
        lbl_gen_obj.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_gen_obj = lbl_gen_obj

        # ### Output Dir
        row_index += 1
        tk.Label(self.root, text="Select Output directory", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        btn_out_dir = tk.Button(self.root,
                                text="Browse",
                                command=lambda: self.update_out_dir())
        btn_out_dir.grid(row=row_index, column=1)
        row_index += 1
        lbl_out_dir = tk.Label(self.root,
                               text=self._path_out_dir or "Not selected")
        lbl_out_dir.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_out_dir = lbl_out_dir

        # ### RMS files
        row_index += 1
        tk.Label(self.root, text="Select RMS files to parse", font=helv10b, bg="lightblue") \
            .grid(row=row_index, column=0)
        btn_rms = tk.Button(self.root,
                            text="Browse",
                            command=lambda: self.update_rms())
        btn_rms.grid(row=row_index, column=1)
        row_index += 1
        lbl_rms_files = tk.Label(self.root,
                                 text=self._path_rms_file_list
                                 or "Not selected")
        lbl_rms_files.grid(row=row_index, column=0, columnspan=2)
        self._ptr_lbl_rms_files = lbl_rms_files

        # ### Run
        row_index += 1
        btn_run = tk.Button(self.root, text="Run", command=lambda: self.run())
        btn_run.grid(row=row_index, column=0, columnspan=2)
        self._ptr_btn_run = btn_run
        self._btn_default_color = self._ptr_btn_run.cget("background")
        # ### Logging ScrollText
        row_index += 1
        scroll_log = ScrolledText(height=12)
        scroll_log.grid(row=row_index, column=0, columnspan=2)
        scroll_log.configure(state='disabled')
        self._ptr_scroll = scroll_log

        self.root.mainloop()
コード例 #12
0
class Toki(tk.Tk):
    def __init__(self, file=None):
        super().__init__()
        self.actions = {
            'ENT': '\n',
            'BKSP': 'backspace',
            'TAB': 'tab',
            'HOME': 'home',
            'PAGEUP': 'pgup',
            'DEL': 'del',
            'END': 'end',
            'PAGEDOWN': 'pgdn',
            'UP': 'up',
            'LEFT': 'left',
            'DOWN': 'down',
            'RIGHT': 'right'
        }
        self.insert = False
        self.file = file
        self.title('ilo nimi pi sitelen pona')
        self.menu = tk.Frame(self)
        self.filemenu = tk.Menubutton(self.menu,
                                      font=("sitelen luka tu tu", 14),
                                      text='\uE02A')  #file
        self.filemenud = tk.Menu(self.filemenu, tearoff=0)
        self.filemenud.add_checkbutton(
            label="\uE02A\uE05D",  #new
            font=("sitelen luka tu tu", 14),
            command=lambda: Toki().mainloop())
        self.filemenud.add_checkbutton(
            label="o\uE047e\uE02A",  #open
            font=("sitelen luka tu tu", 14),
            command=self.opennew)
        self.filemenud.add_separator()
        self.filemenud.add_checkbutton(
            label="o\uE009e\uE02A",  #save
            font=("sitelen luka tu tu", 14),
            command=lambda: self.save(False))
        self.filemenud.add_checkbutton(
            label="o\uE009e\uE02A\uE05D",  #save as
            font=("sitelen luka tu tu", 14),
            command=lambda: self.save(True))
        self.filemenud.add_checkbutton(
            label="o\uE049e\uE02APDF",  #export
            font=("sitelen luka tu tu", 14),
            command=self.export)
        self.filemenud.add_separator()
        self.filemenud.add_checkbutton(
            label="o\uE050",  #close
            font=("sitelen luka tu tu", 14),
            command=self.destroy)
        self.filemenu["menu"] = self.filemenud
        self.text = ScrolledText(self, width=40)
        self.text.configure(font=('sitelen luka tu tu', 20))
        self.keyboardFrame = tk.Frame(self, padx=5, pady=5)
        self.keyboard = Keyboard(self.keyboardFrame)
        self.menu.pack(expand=tk.YES, fill=tk.X)
        self.filemenu.grid(row=0)
        self.keyboardFrame.pack()
        self.keyboard.grid(row=0)
        self.text.pack(expand=tk.YES, fill=tk.BOTH)
        if self.file:
            self.open(self.file)
        self.after(0, self.getWord)

    def getWord(self):
        words = self.keyboard.getWords()
        if words:
            self.text.focus()
            for w in words:
                if w in self.actions:
                    pa.press(self.actions[w])
                elif w == 'INS':
                    self.insert = not self.insert
                else:
                    if self.insert:
                        pa.press('del')
                    self.text.insert(tk.INSERT, w)
        self.after(10, self.getWord)

    def save(self, new):
        if new:
            filename = filedialog.askopenfilename(
                title="lipu awen li seme?",
                parent=self,
                defaultextension='.toki',
                filetypes=(("lipu Toki", "*.toki"), ("lipu ali", "*.*")))
        else:
            filename = filedialog.asksaveasfilename(
                title="lipu awen li seme?",
                parent=self,
                defaultextension='.toki',
                filetypes=(("lipu .toki", "*.toki"), ("lipu ali", "*.*")))
        if filename:
            try:
                with open(filename, 'wb') as f:
                    f.write(self.text.get('1.0', 'end').encode())
                    self.title('ilo nimi pi sitelen pona: ' + filename)
                    self.file = filename
            except IOError as e:
                messagebox.showerror(
                    'pakala!', 'ni li ike:\nI/O error ({0}): {1}'.format(
                        e.errno, e.strerror))
            else:
                messagebox.showinfo('pona!', 'lipu li awen!')

    def open(self, filename):
        try:
            with open(filename, 'rb') as f:
                self.text.insert('1.0', f.read().decode())
            self.title('ilo nimi pi sitelen pona: ' + filename)
            self.file = filename
        except IOError as e:
            messagebox.showerror(
                'pakala!',
                'ni li ike:\nI/O error ({0}): {1}'.format(e.errno, e.strerror))

    def opennew(self):
        filename = filedialog.askopenfilename(title="lipu open li seme?",
                                              parent=self,
                                              defaultextension='.toki',
                                              filetypes=(("lipu Toki",
                                                          "*.toki"),
                                                         ("lipu ali", "*.*")))
        if filename:
            if self.file:
                Toki(filename).mainloop()
            else:
                self.open(filename)

    def export(self):
        filename = filedialog.asksaveasfilename(
            title="lipu pana li seme?",
            parent=self,
            defaultextension='.pdf',
            filetypes=(("lipu .pdf", "*.pdf"), ("lipu ali", "*.*")))
        try:
            pdf = fpdf.FPDF()
            pdf.add_page()
            try:
                pdf.add_font(
                    'sitelen luka tu tu',
                    '',
                    (r'C:\Windows\Fonts\sitelen_luka_tu_tu.ttf' if os.name
                     == 'nt' else '/usr/share/fonts/sitelen_luka_tu_tu.ttf'),
                    uni=True)
            except RuntimeError:
                pdf.add_font(
                    'sitelen luka tu tu',
                    '',
                    (r'C:\Windows\Fonts\sitelen_luka_tu_tu.ttf_' if os.name
                     == 'nt' else '/usr/share/fonts/sitelen_luka_tu_tu_.ttf'),
                    uni=True)
            pdf.set_font('sitelen luka tu tu', size=20)
            for t in self.text.get('1.0', tk.END).split('\n'):
                pdf.cell(200, 10, txt=t, ln=1, align='L')
            pdf.output(filename)
        except Exception as e:
            messagebox.showerror('pakala!', 'ni li ike:\n' + str(e))
        else:
            messagebox.showinfo('pona!', 'lipu li pana!')
コード例 #13
0
ファイル: PageOne.py プロジェクト: paai-lab/AIR-BAGEL-2020
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, bg='dark slate gray')


        # Create main containers
        top_frame = Frame(self, bg='dark slate gray', width=50, height=50, padx=7, pady=3)
        center = Frame(self, bg='dark slate gray', width=50, height=40, padx=7, pady=3)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        top_frame.grid(row=0, sticky="nsew")
        center.grid(row=1, sticky="nsew")
        top_frame.grid_rowconfigure(0, weight=1)
        top_frame.grid_columnconfigure(1, weight=1)
        center.grid_rowconfigure(0, weight=1)
        center.grid_columnconfigure(1, weight=1)


        # Title widget (top frame)
        top_mid_label1 = Label(top_frame, text='(1) Data import and preprocessing', font=("Consolas", 13, 'bold'),
                               fg="white", bg='gray25', relief = "raised")

        top_mid_label1.grid(row=0, column=1, sticky="nsew")

        # Create sub frame (center frame)
        ctr_left = Frame(center, bg='gray1', width=150, height=190, highlightthickness=1, highlightbackground="gray15")
        ctr_right = Frame(center, bg='gray1', height=190, highlightthickness=1, highlightbackground="gray15")
        ctr_left.grid(row=0, column=0, padx=(0, 7), pady=(0, 3), sticky="ns")
        ctr_right.grid(row=0, column=1, pady=(0, 3), sticky="nsew")
        ctr_right.grid_rowconfigure(1, weight=1)
        ctr_right.grid_columnconfigure(0, weight=1)

        # File list in directory folder (center-left)
        global path
        org_path = os.getcwd()
        Resource_Step1.org_path = org_path
        System_Step1.org_path = org_path
        PageThree.org_path =org_path
        os.chdir(os.sep.join([str(org_path), "input"]))
        input_path = os.getcwd()

        ctr_left_label1 = Label(ctr_left, text='Files', font=("Consolas", 10, 'bold'),
                                fg="white", bg='gray25', anchor="center", relief="raised")
        ctr_left_label1.grid(row=0, column=0, sticky="we")
        # ctr_left_label1.config(width=25)

        dir_scroll = ScrolledText(ctr_left, width=24, height=2, wrap=tk.WORD)
        dir_scroll.grid(row=1, column=0, rowspan=4)
        dir_scroll.insert(tk.INSERT, 'Directory : "{}"'.format(input_path))
        dir_scroll.configure(background='snow', font=("ms sans Serif", 6))

        file_list = os.listdir(input_path)
        csv_list = [s for s in file_list if '.csv' in s]

        def selectdata():
            global event_log
            alert_value = 0
            alert_message1 = ''
            if self.cVar1.get() > 0:
                event_log = pd.read_csv(csv_list[int(self.cVar1.get()) - 1])
                dat_name = str(csv_list[int(self.cVar1.get()) - 1])
                dat_name = str(dat_name.split('.')[0])
                PageThree.dat_name=dat_name
                alert_value += 1
                alert_message1 = 'Completely loaded: {}'.format(csv_list[int(self.cVar1.get()) - 1])
                PageTwo.event_log = event_log       #orginal data without preprocessing
                datainfo(event_log)
                autodetection()
                messagebox.showinfo("Message", alert_message1)
                ctr_left_label2.config(highlightbackground="gray1", highlightcolor = "gray1", highlightthickness=2)
                ctr_right_label2.config(highlightbackground="dark orange", highlightcolor = "dark orange", highlightthickness=2)

            if alert_value == 0:
                alert_message1 = "Nothing was checked"
                messagebox.showinfo("Error", alert_message1)

        # autodetection: automatically set key attributes (center-right)
        def autodetection():
            # Caseid
            case_candidate = [list(event_log).index(i) for i in list(event_log)
                              if "case" in i or "Case" in i or "CASE" in i]
            if len(case_candidate) == 0:
                pass
            if len(case_candidate) == 1:
                caseid_value_chosen.current(case_candidate)
            if len(case_candidate) > 1:
                att_list = [list(event_log)[i] for i in case_candidate]
                case_candidate2 = [att_list.index(i) for i in att_list if "id" in i or "ID" in i]
                if len(case_candidate2) == 1:
                    caseid_value_chosen.current(case_candidate2)
                else:
                    caseid_value_chosen.current(case_candidate[0])

            # Eventid
            cand = ["-- no attribute --"] + list(event_log)
            event_candidate = [cand.index(i) for i in cand
                              if "event" in i or "Event" in i or "EVENT" in i]
            if len(event_candidate) == 0:
                pass
            if len(event_candidate) == 1:
                eventid_value_chosen.current(event_candidate)
            if len(event_candidate) > 1:
                att_list = [cand[i] for i in event_candidate]
                event_candidate2 = [att_list.index(i) for i in att_list if "id" in i or "ID" in i]
                if len(event_candidate2) == 1:
                    eventid_value_chosen.current(event_candidate2)
                else:
                    eventid_value_chosen.current(event_candidate[0])

            # Activity
            activity_candidate = [list(event_log).index(i) for i in list(event_log)
                               if "activity" in i or "Activity" in i or "ACTIVITY" in i]
            if len(activity_candidate) == 0:
                activity_candidate = [list(event_log).index(i) for i in list(event_log)
                               if "name" in i or "Name" in i or "NAME" in i]
                if len(activity_candidate) == 0:
                    pass
                if len(activity_candidate) == 1:
                    activity_value_chosen.current(activity_candidate)
                if len(activity_candidate) > 1:
                    activity_value_chosen.current(activity_candidate[0])
            if len(activity_candidate) == 1:
                activity_value_chosen.current(activity_candidate)
            if len(activity_candidate) > 1:
                activity_value_chosen.current(activity_candidate[0])

            # timestamp
            time_candidate = [list(event_log).index(i) for i in list(event_log)
                               if "time" in i or "Time" in i or "TIME" in i]
            if len(time_candidate) == 0:
                time_candidate = [list(event_log).index(i) for i in list(event_log)
                                      if "date" in i or "Date" in i or "DATE" in i]
                if len(time_candidate) == 0:
                    pass
                if len(time_candidate) == 1:
                    timestamp_value_chosen.current(time_candidate)
                if len(time_candidate) > 1:
                    timestamp_value_chosen.current(time_candidate[0])
            if len(time_candidate) == 1:
                timestamp_value_chosen.current(time_candidate)
            if len(time_candidate) > 1:
                att_list = [list(event_log)[i] for i in time_candidate]
                time_candidate2 = [att_list.index(i) for i in att_list
                                   if "complete" in i or "Complete" in i or "COMPLETE" in i]
                if len(time_candidate2) == 1:
                    timestamp_value_chosen.current(time_candidate2)
                else:
                    timestamp_value_chosen.current(time_candidate[0])

        # datainfo: display maximum 20 rows of data (center-right)
        def datainfo(event_log):
            l=list(event_log)
            caseid_value_chosen['values'] = list(event_log)
            caseid_value_chosen.current(0)
            eventid_value_chosen['values'] = ["-- no attribute --"] +l
            eventid_value_chosen.current(0)
            activity_value_chosen['values'] = list(event_log)
            activity_value_chosen.current(0)
            timestamp_value_chosen['values'] = list(event_log)
            timestamp_value_chosen.current(0)
            pd.set_option('display.width', 1000)
            mylist.delete('1.0', END)
            mylist.insert(tk.CURRENT, event_log[1:20].to_string(index=False))

        ctr_left_label2 = LabelFrame(ctr_left, text="csv_list (max=10)", font=("Consolas", 10, 'bold'),
                                     fg="white", bg='gray1', bd=3, height=248)
        ctr_left_label2.config(highlightbackground="dark orange", highlightcolor = "dark orange", highlightthickness=2)
        ctr_left_label2.grid(row=12, sticky="we", padx=5, pady=(7, 0), ipadx=0, ipady=0)
        ctr_left_label2.grid_propagate(False)
        style1 = ttk.Style()
        style1.configure("Red.TCheckbutton", foreground="aquamarine", background='gray1')
        style1.map('Red.TCheckbutton', background=[('active', 'gray1')])
        i = 0
        self.cVar1 = IntVar()
        self.cVar1.set(0)
        for values in csv_list[0:10]:
            globals()['c{}'.format(i)] = ttk.Checkbutton(ctr_left_label2, text=csv_list[i], onvalue=i + 1, offvalue=0,
                                                         variable=self.cVar1)
            globals()['c{}'.format(i)].grid(column=0, row=i + 10, sticky='w')
            globals()['c{}'.format(i)].configure(style="Red.TCheckbutton")
            i = i + 1
        action = tk.Button(ctr_left, text="Load",  width = 10, command=selectdata)
        action.grid(row=13,  sticky="we" , padx =60 ,pady= (7,10))



        os.chdir(os.sep.join([str(org_path), "utils"]))
        image1 = PhotoImage(file= "IEL lab logo5.png")
        # smaller_image1 = image1.subsample(2, 2)
        smaller_image1 = image1

        image_frame = Frame(ctr_left, bg='gray1')
        image_frame.grid(row=15, pady=(20,0))

        panel1 = Label(image_frame, image = smaller_image1, bg ='gray1',borderwidth=0, highlightthickness=0)
        panel1.photo = smaller_image1
        panel1.grid(row=0, column=0)


        def callback(url):
            webbrowser.open_new(url)

        link1 = Label(image_frame, text=" Intelligent Enterprise Lab.", bg = 'gray1', fg="cyan2", cursor="hand2")
        link1.bind("<Button-1>", lambda e: callback("http://iel.unist.ac.kr/?page=introduction"))
        link1.grid(row=0, column=1, sticky='w')



        image2 = PhotoImage(file= "GitHub-Mark-Light-32px.png")
        # smaller_image2 = image2.subsample(1, 1)
        smaller_image2=image2


        panel2 = Label(image_frame, image = smaller_image2, bg ='gray1',borderwidth=0, highlightthickness=0)
        panel2.photo = smaller_image2
        panel2.grid(row=1, column=0, pady=5)


        link2 = Label(image_frame, text=" Github repository", bg = 'gray1', fg="cyan2", cursor="hand2")
        link2.bind("<Button-1>", lambda e: callback("https://github.com/jonghyeonk/AIR-BAGEL"))
        link2.grid(row=1, column=1, pady=5, sticky='w')

        os.chdir(os.sep.join([str(org_path), "input"]))


        # Select key attribute (center-right)
        ctr_right_label1 = Label(ctr_right, text='Environment', font=("Consolas", 10, 'bold'),
                                 fg="white", bg='gray25',  relief="raised")
        ctr_right_label1.grid(row=0, column=0, sticky="nsew")
        # ctr_right_label1.config(width=45)

        ctr_right_sub = Frame(ctr_right, bg='gray1', height=190, highlightthickness=1, highlightbackground="gray15")
        ctr_right_sub.grid(row=1, column=0, sticky="nsew")


        ctr_right_label2 = LabelFrame(ctr_right_sub, text="Set key attributes", font=("Consolas", 10, 'bold'),
                                      fg="white", bg='gray1', bd=3, padx=14, pady=7)

        ctr_right_label2.grid(row=1, sticky="w", padx=14, pady=(7, 0))

        Caseid_Label = Label(ctr_right_label2, text=" 1. Case_ID", font=("Consolas", 10, 'bold'),
                             fg="white", bg='gray10', anchor="w", width=14)
        Caseid_Label.grid(column=0, row=4)
        Eventid_Label = Label(ctr_right_label2, text=" 2. Event_ID", font=("Consolas", 10, 'bold'),
                             fg="white", bg='gray10', anchor="w", width=14)
        Eventid_Label.grid(column=0, row=5)
        Activity_Label = Label(ctr_right_label2, text=" 3. Activity", font=("Consolas", 10, 'bold'),
                             fg="white", bg='gray10', anchor="w", width=14)
        Activity_Label.grid(column=0, row=6)
        Timestamp_Label = Label(ctr_right_label2, text=" 4. Timestamp", font=("Consolas", 10, 'bold'),
                             fg="white", bg='gray10', anchor="w", width=14)
        Timestamp_Label.grid(column=0, row=7)
        Timeform_Label = Label(ctr_right_label2, text="    - format", font=("Consolas", 10),
                             fg="white", bg='gray10', anchor="w", width=14)
        Timeform_Label.grid(column=0, row=8)

        caseid_value = tk.StringVar()
        caseid_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=caseid_value)
        caseid_value_chosen.grid(column=1, row=4)

        eventid_value = tk.StringVar()
        eventid_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=eventid_value)
        eventid_value_chosen.grid(column=1, row=5)

        activity_value = tk.StringVar()
        activity_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=activity_value)
        activity_value_chosen.grid(column=1, row=6)

        timestamp_value = tk.StringVar()
        timestamp_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=timestamp_value)
        timestamp_value_chosen.grid(column=1, row=7)

        timeform_value = tk.StringVar()
        timeform_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=timeform_value)
        timeform_value_chosen.grid(column=1, row=8)
        timeform_value_chosen['values'] = ["","2020-01-02 03:04:05.006" , "2020-01-02 03:04:05",
                                           "2020-01-02 03:04:05.006 PM", "2020-01-02 03:04:05 PM",
                                           "20-01-02 03:04:05.006", "20-01-02 03:04:05",
                                           "20-01-02 03:04:05.006 PM", "20-01-02 03:04:05 PM",
                                           "2020/01/02 03:04:05.006", "2020/01/02 03:04:05",
                                           "2020/01/02 03:04:05.006 PM", "2020/01/02 03:04:05 PM",
                                           "20/01/02 03:04:05.006", "20/01/02 03:04:05",
                                           "20/01/02 03:04:05.006 PM", "20/01/02 03:04:05 PM",
                                           "Self-configuration"]
        timeform_value_chosen.current(0)

        def TextBoxUpdate(event=None):
            if event.widget.get() == "Self-configuration":
                timeform_value_chosen.current(0)

        timeform_value_chosen.bind("<<ComboboxSelected>>", TextBoxUpdate)

        # Scrollbar to represent dataframe (center-left)
        ctr_right_label3 = LabelFrame(ctr_right_sub, text="Data preview (maximum 20 rows)", font=("Consolas", 10, 'bold'),
                                      fg="white", bg='gray1', bd=3, padx=12, width=400, height=135, pady=7)

        ctr_right_label3.grid(row=3, sticky="w", padx=14, pady=(14, 0))

        mylist = Text(ctr_right_label3, width=50, height=6, wrap=NONE)
        vscroll = Scrollbar(ctr_right_label3, orient=VERTICAL, command=mylist.yview)
        vscroll.place(in_=mylist, relx=1.0, relheight=1.0, bordermode="outside")
        mylist['yscroll'] = vscroll.set
        hscroll = Scrollbar(ctr_right_label3, orient=HORIZONTAL, command=mylist.xview)
        hscroll.place(in_=mylist, rely=1.0, relwidth=1.0, bordermode="outside")
        mylist['xscroll'] = hscroll.set
        mylist.grid(row=0, column=0, padx=(0,20), pady=(0,30))
        global n
        n = 0

        def iserror(func, *args, **kw):
            try:
                func(*args, **kw)
                return False
            except Exception:
                return True

        def save_key_attributes():
            if len(event_log) > 0:
                selected_caseid = caseid_value_chosen.get()
                selected_eventid = eventid_value_chosen.get()
                selected_activity = activity_value_chosen.get()
                selected_timestamp = timestamp_value_chosen.get()

                global extracted_data  #event_log only with key attributes
                if selected_eventid=="-- no attribute --" :
                    extracted_data = event_log[
                        [selected_caseid, selected_activity, selected_timestamp]]
                    extracted_data["Event"] = list(range(0,len(event_log.index)))
                    cols = extracted_data.columns.tolist()
                    cols = cols[:1]+ cols[-1:] + cols[1:3]
                    extracted_data = extracted_data[cols]

                if selected_eventid!="-- no attribute --" :
                    extracted_data = event_log[[selected_caseid, selected_eventid, selected_activity, selected_timestamp]]

                extracted_data.columns = \
                    ["Case", "Event", "Activity", "Timestamp"]
                extracted_data = extracted_data.dropna(subset=['Case'])
                PageTwo.firstpreprocess = extracted_data
                extracted_data = extracted_data.sort_values(["Case", "Timestamp"],
                                                            ascending=[True, True])


                form_dict = {"2020-01-02 03:04:05.006":"%Y-%m-%d %H:%M:%S.%f",
                             "2020-01-02 03:04:05":"%Y-%m-%d %H:%M:%S",
                            "2020-01-02 03:04:05.006 PM":"%Y-%m-%d %I:%M:%S.%f %p",
                            "2020-01-02 03:04:05 PM":"%Y-%m-%d %I:%M:%S %p",
                            "20-01-02 03:04:05.006":"%y-%m-%d %H:%M:%S.%f",
                            "20-01-02 03:04:05":"%y-%m-%d %H:%M:%S",
                            "20-01-02 03:04:05.006 PM":"%y-%m-%d %I:%M:%S.%f %p",
                            "20-01-02 03:04:05 PM":"%y-%m-%d %I:%M:%S %p",
                             "2020/01/02 03:04:05.006": "%Y/%m/%d %H:%M:%S.%f",
                             "2020/01/02 03:04:05": "%Y/%m/%d %H:%M:%S",
                             "2020/01/02 03:04:05.006 PM": "%Y/%m/%d %I:%M:%S.%f %p",
                             "2020/01/02 03:04:05 PM": "%Y/%m/%d %I:%M:%S %p",
                             "20/01/02 03:04:05.006": "%y/%m/%d %H:%M:%S.%f",
                             "20/01/02 03:04:05": "%y/%m/%d %H:%M:%S",
                             "20/01/02 03:04:05.006 PM": "%y/%m/%d %I:%M:%S.%f %p",
                             "20/01/02 03:04:05 PM": "%y/%m/%d %I:%M:%S %p"
                             }

                if timeform_value_chosen.get() not in form_dict.keys() :
                    form = timeform_value_chosen.get()
                    if iserror(dt.strptime, extracted_data['Timestamp'][0], form):
                        if "\"" in form or "\'" in form:
                            words = ["Type timestamp format without", "\'", "or", "\""]
                            words = " ".join(words)
                            messagebox.showinfo("Error", words)
                        else: messagebox.showinfo("Error", "Wrong input for timestamp format: use format in 'datetime' packages. (ex: %Y-%m-%d %H:%M:%S)")
                    else:
                        time = extracted_data['Timestamp'].apply(lambda x: dt.strptime(x, form))
                        unixtime = time.apply(lambda x: (x - dt(1970, 1, 1)).total_seconds())
                        extracted_data['Timestamp'] = time
                        extracted_data['unixtime'] = unixtime
                        PageTwo.extracted_data = extracted_data
                        messagebox.showinfo("Message", "Loaded")
                        tk.Frame.grid_forget()
                        parent.show_frame1()


                if timeform_value_chosen.get() in form_dict.keys():
                    form = form_dict[timeform_value_chosen.get()]
                    if iserror(dt.strptime, extracted_data['Timestamp'][0], form):
                        messagebox.showinfo("Error",
                                            "{0} is not matched with {1}".format(extracted_data['Timestamp'][0], form))
                    else:
                        time = extracted_data['Timestamp'].apply(lambda x: dt.strptime(x, form))
                        unixtime = time.apply(lambda x: (x - dt(1970, 1, 1)).total_seconds())
                        extracted_data['Timestamp'] = time
                        extracted_data['unixtime'] = unixtime
                        PageTwo.extracted_data = extracted_data
                        messagebox.showinfo("Message", "Loaded")
                        parent.show_frame1()

            else:
                messagebox.showinfo("Error", "Error")

        button1 = tk.Button(ctr_right_sub, text="Next", width=10,
                            command= save_key_attributes)
        button1.grid(row=4, padx=(0,20), pady=(7,10), sticky = 'e')
コード例 #14
0
ファイル: flashpacks.py プロジェクト: haitiangk92/Flash-Packs
class FlashPacks():
    def __init__(self):
        self.root = Tk()
        self.root.title("Flash Packs")
        self.root.configure(bg=app_color)
        self.root.resizable(height=False, width=False)
        self.root.geometry("1000x600")
        self.root.update()
        self.center_widget(self.root)

        self.read_decks()
        #self.main_menu_frame()
        self.deck_frame(decks[0])
        self.root.mainloop()

    def read_decks(self):
        try:
            os.mkdir(res)
        except Exception:
            print(f"App Folder Already Exists")

        try:
            directories = os.listdir(f"{res}/Decks")
            for directory in directories:
                if ".deck" in directory:
                    directory = directory[0:len(directory) - 5]
                    decks.append(Deck(directory))
        except Exception:
            print(f"No decks made......ever")
            try:
                os.mkdir(f"{res}/Decks")
            except Exception:
                print(f"Decks Folder Already Exists")

    def center_widget(self, widget):
        mid_width = int(int(dim[0]) / 2)
        mid_height = int(int(dim[1]) / 2)
        w_width = widget.winfo_width()
        w_height = widget.winfo_height()

        widget.geometry(
            f"{w_width}x{w_height}+{int(mid_width-w_width/2)}+{int(mid_height-w_height/2)}"
        )

    def main_menu_frame(self):
        self.main = Frame(self.root, bg=app_color)

        deck_label = Label(self.main, text="Choose A Deck", fg=txt_color_1)
        deck_label.configure(width=110,
                             font=("Times", 40),
                             anchor=W,
                             bg=app_color)
        deck_label.pack(padx=35)

        self.deck_list = ScrolledText(self.main)
        self.deck_list.configure(width=110,
                                 height=20,
                                 border=1,
                                 relief=SUNKEN,
                                 state=DISABLED)
        self.deck_list.pack()

        self.load_decks()

        buttons_frame = Frame(self.main, bg=app_color)

        add_btn = ttk.Button(buttons_frame,
                             text="Add New Deck",
                             command=self.create_deck_pop_up)
        add_btn.grid(row=0, column=0, padx=100)

        remove_btn = ttk.Button(buttons_frame,
                                text="Remove Deck",
                                state=DISABLED)
        remove_btn.grid(row=0, column=1, padx=100)

        study_btn = ttk.Button(buttons_frame,
                               text="Study Deck",
                               state=DISABLED)
        study_btn.grid(row=0, column=2, padx=100)

        buttons_frame.pack(pady=35)
        self.main.pack(pady=20, padx=20)

    def load_decks(self):
        self.deck_list.configure(state=NORMAL)
        if len(decks) == 0:
            deck_frame = Frame()

            deck_name = Label(deck_frame,
                              text="No Decks Available",
                              font=("Times", 30),
                              fg=txt_color_2,
                              width=44,
                              anchor=W,
                              bg="light grey")
            deck_name.pack(fill=BOTH)

            deck_cards = Label(deck_frame,
                               text="Number of cards: N/A",
                               font=("Times", 10),
                               anchor=W,
                               bg="light grey")
            deck_cards.pack(fill=BOTH)

            deck_used = Label(deck_frame,
                              text="Last Studied: N/A",
                              font=("Times", 10),
                              anchor=W,
                              bg="lightgrey")
            deck_used.pack(fill=BOTH)

            self.deck_list.window_create(END, window=deck_frame)
            self.deck_list.insert(END, "\n")
        else:
            for i in range(len(decks)):
                self.add_deck(decks[i])

        self.deck_list.configure(state=DISABLED)

    def create_deck_pop_up(self):
        self.name_pop = Toplevel(bg=app_accient_color)
        self.name_pop.title("New Deck")
        self.name_pop.geometry("300x100")
        self.name_pop.update()
        #self.name_pop.bell()
        self.center_widget(self.name_pop)

        name_label = Label(self.name_pop,
                           text="Name the deck",
                           anchor=W,
                           bg=app_accient_color)
        name_label.pack(fill=BOTH, pady=15, padx=20)

        entry_frame = Frame(self.name_pop, bg=app_accient_color)

        self.name_input = Entry(entry_frame)
        self.name_input.focus_set()
        self.name_input.bind("<Return>", self.pop_up_enter_hit)
        self.name_input.grid(row=0, column=0, padx=20)

        enter_btn = ttk.Button(entry_frame,
                               text="OK",
                               command=self.pop_up_ok_btn_hit)
        enter_btn.grid(row=0, column=1)

        entry_frame.pack()

        self.name_pop.mainloop()

    def pop_up_enter_hit(self, event):
        self.pop_up_ok_btn_hit()

    def pop_up_ok_btn_hit(self):
        name = self.name_input.get()
        new_deck = Deck(name)

        if len(decks) == 0:
            self.deck_list.configure(state=NORMAL)
            self.deck_list.delete(1.0, END)
            self.deck_list.configure(state=DISABLED)

        duplicate_found = False
        for deck in decks:
            if name == deck.deck_name:
                duplicate_found = True
                error_msg = Toplevel()
                error_msg.title("Error")
                error_msg.resizable(width=False, height=False)
                error_msg.geometry("250x20")
                error_msg.update()
                self.center_widget(error_msg)

                Label(error_msg, text=f'"{name}" Already Exists').pack()

                error_msg.mainloop()
                break

        if not duplicate_found:
            self.name_pop.destroy()
            self.add_deck(new_deck)

    def add_deck(self, new_deck):
        bg_color = bg_colors[len(decks) % 2]

        deck_frame = Frame()

        deck_name = Label(deck_frame,
                          text=new_deck.deck_name,
                          font=("Times", 30),
                          fg=txt_color_2,
                          width=44,
                          anchor=W,
                          bg=bg_color)
        deck_name.pack(fill=BOTH)

        deck_cards = Label(deck_frame,
                           text=f"Number of cards: {len(new_deck.cards)}",
                           font=("Times", 10),
                           anchor=W,
                           bg=bg_color)
        deck_cards.pack(fill=BOTH)

        deck_used = Label(deck_frame,
                          text=f"Last Studied: {new_deck.last_studied}",
                          font=("Times", 10),
                          anchor=W,
                          bg=bg_color)
        deck_used.pack(fill=BOTH)

        self.deck_list.configure(state=NORMAL)
        self.deck_list.window_create(END, window=deck_frame)
        self.deck_list.insert(END, "\n")
        self.deck_list.configure(state=DISABLED)

        decks.append(new_deck)

    def deck_frame(self, deck):
        cards = deck.cards

        if len(cards) > 0:
            self.target_card = cards[int(random.random() * len(cards))]
        else:
            self.target_card = ""

        self.deck_frame = Frame(self.root, bg="white")
        self.deck_frame.configure(width=600, height=400)

        cards_frame = Frame(self.deck_frame, bg="white")

        flash_card = Label(cards_frame,
                           text=self.target_card.face
                           if len(cards) > 0 else "No cards in the Deck",
                           bg="white")
        flash_card.pack(padx=80, pady=80)

        buttons_frame = Frame(cards_frame)
        Button(buttons_frame,
               text="Flip Card",
               command=lambda: flash_card.configure(text=self.flip_card(
                   self.target_card, flash_card["text"]))).grid(row=0,
                                                                column=0)

        Button(buttons_frame,
               text="Next",
               command=lambda: flash_card.configure(text=self.next_card(cards))
               ).grid(row=0, column=1)

        Button(buttons_frame,
               text="Add Card",
               command=lambda: self.add_card(deck, cards)).grid(row=0,
                                                                column=2)

        buttons_frame.pack()
        cards_frame.pack()
        self.deck_frame.pack(pady=100)

    def flip_card(self, card, current):
        return card.content if current == card.face else card.face

    def next_card(self, deck):
        self.target_card = deck[int(random.random() * len(deck))]
        return self.target_card.face

    def add_card(self, deck, cards):
        self.new_card_pop_up = Toplevel()
        self.new_card_pop_up.title("New Card")

        Label(self.new_card_pop_up, text="Front").pack()
        face = Entry(self.new_card_pop_up)
        face.pack()
        Label(self.new_card_pop_up, text="Back").pack()
        content = Entry(self.new_card_pop_up)
        content.pack()
        Button(self.new_card_pop_up,
               text="OK",
               command=lambda: self.add_card_ok(face.get(), content.get(),
                                                deck, cards)).pack()

    def add_card_ok(self, face, content, deck, cards):
        new_card = Card(face, content)
        deck.add_card(new_card)
        self.new_card_pop_up.destroy()
        cards.append(new_card)
コード例 #15
0

root = Tk()
root.title("Metin Özetleyici")
root.geometry("970x600")
root.configure(background='lavender blush')

L1 = Label(text="Özetlemek İstediğiniz Metin",
           font=("Verdana", 13, "bold"),
           fg="gray40")
L1.configure(background='lavender blush')
Tittle = Text(bd=5, width=60, height=1)
Tittle.insert(INSERT, "Başlığı Giriniz...")
Tittle.configure(font=("Verdana 10 italic "), fg="VioletRed3")
T1 = ScrolledText(bd=5, width=100, height=10)
T1.configure(font=("Verdana 10 italic"), fg="gray40")
T1.insert(INSERT, "Metni Giriniz...")
L1.place(x=60, y=5)
T1.place(x=60, y=70)
Tittle.place(x=60, y=35)

L2 = Label(text="Metnin Özet Hali", font=("Verdana", 13, "bold"), fg="gray40")
L2.configure(background='lavender blush')
T2 = ScrolledText(bd=5, width=100, height=10)
T2.configure(font=("Verdana 10 italic"), fg="gray40")
L2.place(x=60, y=330)
T2.place(x=60, y=360)

B1 = Button(text="ÖZETLE (TextRank)",
            bd=2,
            height=2,
コード例 #16
0
ファイル: console_widget.py プロジェクト: parklez/twitch-bot
class Console(tkinter.Frame):

    def __init__(self, parent, settings, max_lines=200, **kwargs):
        super().__init__(parent, **kwargs)

        self.settings = settings
        self.max_lines = max_lines
        self.console = ScrolledText(self,
                                    bg=Theme.CONSOLE_BG,
                                    highlightbackground=Theme.BG,
                                    highlightcolor=Theme.BG,
                                    wrap=tkinter.CHAR,
                                    width=40,
                                    height=10,
                                    state='disabled',
                                    relief='flat')

        # Despite setting height above, this widget gets expanded fully,
        # if the canvas is smaller than the height, will look odd.
        self.console.pack(fill=tkinter.BOTH,
                          expand=True)

        self.font = ('Helvetica', 11, 'bold')

        # Text color
        self.console.tag_config('TEXT',
                                foreground=Theme.CONSOLE_TEXT,
                                font=('Helvetica', 11),
                                spacing1=5,
                                spacing3=5)

        self.console.tag_config('TEXT_ALT',
                                foreground=Theme.CONSOLE_TEXT,
                                background=Theme.CONSOLE_BG_ALT,
                                selectbackground='SystemHighlight',
                                font=('Helvetica', 11),
                                spacing1=5,
                                spacing3=5)
        # Why does setting 'background' causes highlighted text color to be transparent?
        # https://web.archive.org/web/20201112014139id_/https://effbot.org/tkinterbook/tkinter-widget-styling.htm
        self.alt_bg = False

        # Logging colors
        self.console.tag_config('INFO', foreground=Theme.LOG_INFO)
        self.console.tag_config('DEBUG', foreground=Theme.LOG_DEBUG)
        self.console.tag_config('ERROR', foreground=Theme.LOG_ERROR)
        self.console.tag_config('WARNING', foreground=Theme.LOG_WARNING)
        self.console.tag_config('CRITICAL', foreground=Theme.LOG_CRITICAL)
        self.console.focus()

        if not self.settings['irc']['username']:
            self.welcome()
        self.after(100, self.pooling)

    def pooling(self):
        while 1:
            try:
                message = QUEUE.get(block=False)
                self.insert(message)
            except queue.Empty:
                break
        self.after(100, self.pooling)

    def insert(self, text):
        self.console.configure(state='normal') # Allow writing
        try: # Tcl can't render some characters
            if isinstance(text, Message):
                self.alt_bg = not self.alt_bg
                user_color = 'lightblue1' if not text.tags.get('color') else text.tags.get('color')
                username_tag = f'{text.sender}{"alt_bg" if self.alt_bg else ""}'
                self.console.tag_config(username_tag,
                                        font=self.font,
                                        foreground=user_color,
                                        background=Theme.CONSOLE_BG_ALT if self.alt_bg else Theme.CONSOLE_BG,
                                        selectbackground='SystemHighlight',
                                        spacing1=5,
                                        spacing3=5)
                self.console.insert(tkinter.END, text.sender, username_tag)
                self.console.insert(tkinter.END, f': {text.message}\n', 'TEXT_ALT' if self.alt_bg else 'TEXT')
            else:
                message = LOGGER.handlers[1].format(text) # This is not a good way to access this
                self.console.insert(tkinter.END, f'{message}\n', text.levelname)

        except tkinter.TclError as e:
            if isinstance(text, Message):
                # Replace every char outside of Tcl's allowed range with the ? char.
                text.message = ''.join((ch if ord(ch) <= 0xFFFF else '\uFFFD') for ch in text.message)
                self.console.insert(tkinter.END, f': {text.message}\n', 'TEXT')

            else:
                self.console.insert(tkinter.END, f'{e}\n', 'ERROR')

        #https://stackoverflow.com/questions/4609382/getting-the-total-number-of-lines-in-a-tkinter-text-widget
        self.line_count = int(self.console.index('end-2c').split('.')[0])
        if self.line_count > self.max_lines:
            self.console.delete(1.0, 2.0)

        self.console.configure(state='disabled') # Disallow writing
        self.console.yview(tkinter.END)

    def welcome(self):
        self.font = ('TkDefaultFont', 11, 'bold')
        self.console.tag_configure('lightblue', foreground='lightblue1', font=self.font, justify='center')
        self.console.tag_configure('white', foreground='white', font=self.font)
        self.console.tag_configure('orange', foreground='orange', font=self.font)
        self.console.tag_configure('pink', foreground='#FFC8D7', font=self.font)
        self.console.tag_configure('red', foreground='red', font=self.font, spacing1=2, spacing3=2)
        self.console.tag_config('grey', foreground='grey', font=('TkDefaultFont', 8, 'bold'))

        self.console.configure(state='normal')
        self.console.insert(tkinter.END, '~ Welcome to parky\'s twitch bot! ~\n\n', 'lightblue')
        self.console.insert(tkinter.END, '\n', 'white')
        self.console.insert(tkinter.END, 'Quick setup:\n', 'orange')
        self.console.insert(tkinter.END, '\n', 'white')
        self.console.insert(tkinter.END, '1', 'red')
        self.console.insert(tkinter.END, '. Click on the "', 'white')

        self.settings_img = tkinter.PhotoImage(data=Theme.SETTINGS_ICON)
        self.console.image_create(tkinter.END, image=self.settings_img)

        self.console.insert(tkinter.END, '" button.\n', 'white')
        self.console.insert(tkinter.END, '2', 'red')
        self.console.insert(tkinter.END, '. Fill in IRC fields to gain chat access!\n', 'white')
        self.console.insert(tkinter.END, '3', 'red')
        self.console.insert(tkinter.END, '. ', 'white')
        self.console.insert(tkinter.END, 'Fill in Twitch API to gain access to channel metadata, such as current title, game, uptime, followers... ', 'white')
        self.console.insert(tkinter.END, '(optional)\n', 'grey')
        self.console.insert(tkinter.END, '\n', 'TEXT')

        self.console.configure(state='disabled')
コード例 #17
0
            self.text.configure(state='disabled')
            # Autoscroll to the bottom
            self.text.yview(tkinter.END)

        # This is necessary because we can't modify the Text from other threads
        self.text.after(0, append)


# Sample usage
if __name__ == '__main__':
    # Create the GUI
    root = tkinter.Tk()

    from tkinter.scrolledtext import ScrolledText
    st = ScrolledText(root, state='disabled')
    st.configure(font='TkFixedFont')
    st.pack()

    # Create textLogger
    text_handler = TextHandler(st)

    # Add the handler to log
    log = logging.getLogger()
    log.addHandler(text_handler)

    # Log some messages
    log.debug('debug message')
    log.info('info message')
    log.warning('warn message')
    log.error('error message')
    log.critical('critical message')
コード例 #18
0
class DisplayImageLabelPlace():
    def __init__(self, master, **kwargs):

        self.word_edited = 0  # false
        self.master = master
        frame = tk.Frame(master)
        frame.configure(bg='#dddddd')
        frame.grid()

        self.img_lbl = tk.Label(self.master,
                                width=400,
                                height=6,
                                bg="light gray")
        self.img_lbl.place(anchor='nw', relwidth=0.35, relheight=0.94)
        self.page_no_var = tk.IntVar()

        text_font = tkinter.font.Font(family="Calibri (Body)",
                                      size=13,
                                      weight="normal")

        self.page_raw = ScrolledText(self.master,
                                     width=50,
                                     height=16,
                                     wrap=tk.WORD,
                                     background='white')
        self.page_raw.tag_configure('tag-right', justify='right')
        self.page_raw.configure(font=text_font)
        # self.page_raw.config (state ='disabled')
        self.page_raw.place(relx=0.36, rely=0)

        self.page_edited = ScrolledText(self.master,
                                        width=50,
                                        height=16,
                                        wrap=tk.WORD,
                                        background='light gray')
        self.page_edited.tag_configure('tag-right', justify='right')
        self.page_edited.configure(font=text_font)
        self.page_edited.place(relx=0.36, rely=.47)

        cols = ('#', 'pdf', 'Dic', 'Type')
        self.listBox = ttk.Treeview(self.master,
                                    columns=cols,
                                    show='headings',
                                    height=25,
                                    selectmode="browse")
        self.listBox.column("#", minwidth=0, width=40, stretch=tk.NO)
        self.listBox.column("pdf", minwidth=0, width=90, stretch=tk.NO)
        self.listBox.column("Dic", minwidth=0, width=90, stretch=tk.NO)
        self.listBox.column("Type", minwidth=0, width=100, stretch=tk.NO)
        self.listBox.place(relx=0.73, rely=0)
        for col in cols:
            self.listBox.heading(col, text=col)

        verscrlbar = ttk.Scrollbar(self.master,
                                   orient="vertical",
                                   command=self.listBox.yview)
        verscrlbar.place(relx=0.97, rely=0, height=530)
        self.listBox.configure(yscrollcommand=verscrlbar.set)

        self.listBox.bind("<Double-1>", self.listBox_OnDoubleClick)
        self.listBox.bind("<ButtonRelease-1>", self.listBox_OnClick)
        self.listBox.bind("<KeyRelease-Up>", self.listBox_UpArrow)
        self.listBox.bind("<KeyRelease-Down>", self.listBox_DownArrow)

        self.edit_word_var = tk.StringVar()
        self.dict_entry = tk.Entry(self.master,
                                   textvariable=self.edit_word_var,
                                   width=20,
                                   justify='right').place(relx=0.74, rely=0.80)

        self.word_pdf_type = tk.IntVar()
        tk.Radiobutton(self.master,
                       text='Specific',
                       variable=self.word_pdf_type,
                       value=0).place(relx=0.85, rely=0.80)
        tk.Radiobutton(self.master,
                       text='Dict',
                       variable=self.word_pdf_type,
                       value=1).place(relx=0.85, rely=0.84)

        tk.Button(self.master,
                  text="Save  ",
                  fg="red",
                  command=self.save_dict_word).place(relx=0.95, rely=0.80)
        tk.Button(self.master,
                  text="Save Page",
                  fg="red",
                  command=self.save_dict_page).place(relx=0.95, rely=0.94)

        tk.Button(self.master, text="GO",
                  command=self.draw_page).place(relx=0.2, rely=0.94)
        tk.Button(self.master, text="Prev  ",
                  command=self.prev_page).place(relx=0.25, rely=0.94)
        tk.Entry(self.master, textvariable=self.page_no_var,
                 width=4).place(relx=0.3, rely=0.94)
        tk.Button(self.master, text="Next  ",
                  command=self.next_page).place(relx=0.33, rely=0.94)
        tk.Button(self.master, text="Copy  ",
                  command=self.copy_clipboard).place(relx=0.37, rely=0.94)
        tk.Button(self.master, text="reEdit  ",
                  command=self.reedit_page).place(relx=0.41, rely=0.94)
        tk.Button(self.master, text="Quit  ", fg="red",
                  command=quit).place(relx=0.55, rely=0.94)

        self.page_no_var.set(4)
        self.draw_page()

    def draw_page(self):

        self.word_edited = 0  # False
        page_no = self.page_no_var.get()
        page = 'ABH-' + format(page_no, '03') + '.png'

        # image_path = f'.\\data\\books\\ABH\\pages\\{page}'
        image_path = os.path.join('.', 'data', 'books', 'ABH', 'pages', page)

        img_file = Image.open(image_path)
        img_file.thumbnail((600, 650), Image.ANTIALIAS)
        self.img_lbl.img = ImageTk.PhotoImage(img_file)
        self.img_lbl.config(image=self.img_lbl.img)

        # words= str(((pytesseract.image_to_string(Image.open(image_path), lang='ara'))))
        page_raw, page_edited = get_db_page(page_no)

        self.page_raw.config(state='normal')
        self.page_raw.delete('1.0', 'end')  # clear text
        self.page_raw.insert('end', page_raw, 'tag-right')
        self.page_raw.config(state='disabled')

        self.page_edited.config(state='normal')
        self.page_edited.delete('1.0', 'end')  # clear text
        self.page_edited.insert('end', page_edited, 'tag-right')
        self.page_edited.config(state='disabled')

        self.word_pdf_type.set(0)  # default Specific

        for i in self.listBox.get_children():
            self.listBox.delete(i)  # clear text
        rows = get_page_dict(page_no)
        for i, row in enumerate(rows, start=1):
            self.listBox.insert("",
                                "end",
                                iid=i,
                                values=(i, row[0], row[1],
                                        (row[3] if row[3] != None else ''), 0))

        self.listBox.selection_set(['1'])  # select first line

    def next_page(self):
        if self.word_edited:
            if tk.messagebox.askyesno("Save?", "Save Changes?"):
                self.save_dict_page()

        self.page_no_var.set(self.page_no_var.get() + 1)
        self.draw_page()

    def prev_page(self):
        if self.word_edited:
            if tk.messagebox.askyesno("Save?", "Save Changes?"):
                self.save_dict_page()
        self.page_no_var.set(self.page_no_var.get() - 1)
        self.draw_page()

    def copy_clipboard(self):
        pyperclip.copy(self.page_edited.get("1.0", tk.END))

    def reedit_page(self):
        page_no = self.page_no_var.get()
        page_reedited = rebuild_page_text(page_no)
        # page_raw, page_reedited = get_db_page(page_no)
        self.page_edited.config(state='normal')
        self.page_edited.delete('1.0', 'end')  # clear text
        self.page_edited.insert('end', page_reedited, 'tag-right')
        self.page_edited.config(state='disabled')

    def listBox_DictLineChange(self, event):
        # item = self.self.listBox.item(item,"values")
        item = self.listBox.focus()
        # print (event,":", item, self.listBox.selection(), self.listBox.item(item,"values"))

        items = self.listBox.item(item, "values")
        self.edit_word_var.set(items[2])
        if items[3] in ['', 'Specific', 'None']:
            self.word_pdf_type.set(0)
        else:
            self.word_pdf_type.set(1)

    def listBox_OnClick(self, event):
        self.listBox_DictLineChange(event)

    def listBox_OnDoubleClick(self, event):
        self.listBox_DictLineChange(event)

    def listBox_UpArrow(self, event):
        self.listBox_DictLineChange(event)

    def listBox_DownArrow(self, event):
        self.listBox_DictLineChange(event)

    def save_dict_word(self):  # update on the TreeView
        self.word_edited = 1
        word_types = ['Specific', 'Dict']

        # item = self.listBox.focus()
        word_type = word_types[self.word_pdf_type.get()]
        word_dict = self.edit_word_var.get()
        selected = self.listBox.focus()
        temp = self.listBox.item(selected, 'values')

        self.listBox.item(selected,
                          values=(temp[0], temp[1], word_dict, word_type, 1))

    def save_dict_page(self):  # save changes in the page's dict to DB

        page_edited = False
        for w in self.listBox.get_children():
            row = self.listBox.item(w, 'values')
            if int(row[4]):  # row got modified
                # update_book_word(pdf_word, dict_word, page_no, word_type)
                update_book_word(row[1], row[2], self.page_no_var.get(),
                                 row[3])
                page_edited = True
        self.word_edited = 0
        if page_edited:  # refresh edited page text
            page_reedited = rebuild_page_text(self.page_no_var.get())
            self.page_edited.config(state='normal')
            self.page_edited.delete('1.0', 'end')  # clear text
            self.page_edited.insert('end', page_reedited, 'tag-right')
            self.page_edited.config(state='disabled')
コード例 #19
0
class GUI:
    """Graphical user interface to clfit.

    Data attributes that may sensibly be used externally:

    exe (string) -- path to clfit executable

    device (string) -- PGPLOT device, passed to clfit

    fileName (tkinter.StringVar) -- path to OI-FITS/Mapping Data file
    (use set() & get() methods)

    ChangeFileButton (tkinter.Button) -- brings up data file dialog
    box (may wish to disable)

    initialdir (string) -- initial directory for file dialog boxes

    preFitCallback -- function to call just before running clfit. If this
    returns false, clfit won't be run

    postFitCallback -- function to call after running clfit (if successful)

    """

    def __init__(self, parent, dismissCommand=None):
        """Constructor.

        Arguments are:

        parent -- parent window

        dismissCommand -- function to call when Dismiss button clicked

        """
        # Initialise data attributes
        self.parent = parent
        self.exe = "clfit"
        self.device = "/xserv"
        self.fileName = tk.StringVar()
        self.fileName.set("(unset)")
        self.initialdir = os.getcwd()
        self.preFitCallback = None
        self.postFitCallback = None
        self.calErr = tk.StringVar()
        self.calErr.set("0.0")
        self.cwl = tk.StringVar()
        self.bw = tk.StringVar()
        self.wlmin = tk.StringVar()
        self.wlmax = tk.StringVar()
        self.target_id = tk.StringVar()
        self.nofit = tk.IntVar()
        self.nofit.set(0)
        self.plots = [
            "No plot",
            "uv",
            "vis2",
            "t3amp",
            "t3phi",
            "vis2-wl",
            "t3amp-wl",
            "t3phi-wl",
            "vis2-mjd",
            "t3amp-mjd",
            "t3phi-mjd",
            "vis2-st",
            "t3amp-st",
            "t3phi-st",
            "vis2-pa",
            "post",
            "mpost",
            "post2d",
            "mpost2d",
        ]
        self.selPlot = tk.StringVar()
        self.selPlot.set(self.plots[1])
        self.plotXIndex = tk.StringVar()
        self.plotXIndex.set("1")
        self.plotYIndex = tk.StringVar()
        self.plotYIndex.set("2")
        self.plotXFrom = tk.StringVar()
        self.plotXTo = tk.StringVar()
        self.plotYFrom = tk.StringVar()
        self.plotYTo = tk.StringVar()
        self.margErr = tk.IntVar()
        self.margErr.set(0)
        self.margErrVar = tk.StringVar()
        self.margErrVar.set("1")

        # Initialise GUI elements
        fileFrame = tk.Frame(parent)
        fileFrame.pack(side=tk.TOP)
        tk.Label(fileFrame, text="Data file:").pack(side=tk.LEFT)
        tk.Label(fileFrame, textvariable=self.fileName).pack(side=tk.LEFT)
        self.ChangeFileButton = tk.Button(
            fileFrame, text="Change", command=self._ChangeFileName
        )
        self.ChangeFileButton.pack(side=tk.LEFT)
        calErrFrame = tk.Frame(parent)
        calErrFrame.pack(side=tk.TOP, fill=tk.X, pady=4)
        tk.Label(
            calErrFrame, text="Calibration Error (extra frac. error in system vis.)"
        ).pack(side=tk.LEFT, anchor=tk.W)
        tk.Entry(calErrFrame, textvariable=self.calErr, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        wbFrame = tk.Frame(parent)
        wbFrame.pack(side=tk.TOP, fill=tk.X, pady=4)
        tk.Label(wbFrame, text="Waveband:").pack(side=tk.LEFT, anchor=tk.W)
        tk.Entry(wbFrame, textvariable=self.cwl, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        tk.Entry(wbFrame, textvariable=self.bw, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        tk.Label(wbFrame, text="or Wavelength range:").pack(side=tk.LEFT, anchor=tk.W)
        tk.Entry(wbFrame, textvariable=self.wlmin, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        tk.Entry(wbFrame, textvariable=self.wlmax, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        targetFrame = tk.Frame(parent)
        targetFrame.pack(side=tk.TOP, fill=tk.X, pady=4)
        tk.Label(
            targetFrame, text="TARGET_ID (blank to use 1st in OI_TARGET table):"
        ).pack(side=tk.LEFT, anchor=tk.W)
        tk.Entry(targetFrame, textvariable=self.target_id, width=5).pack(
            side=tk.LEFT, anchor=tk.W, padx=4
        )
        tk.Label(parent, text="Model:").pack(side=tk.TOP, anchor=tk.W)
        self.ModelText = ScrolledText(
            parent, height=19, width=40, font=("Helvetica", 10)
        )
        self.ModelText.pack(side=tk.TOP, expand=1, fill=tk.BOTH)
        midFrame1 = tk.Frame(parent)
        midFrame1.pack(side=tk.TOP, fill=tk.X, pady=4)
        tk.Label(midFrame1, text="Plot:").pack(side=tk.LEFT, anchor=tk.NW)
        plotFrame = tk.Frame(midFrame1)
        plotFrame.pack(side=tk.LEFT)
        ncol = 3
        for i in range(len(self.plots)):
            p = self.plots[i]
            tk.Radiobutton(plotFrame, text=p, variable=self.selPlot, value=p).grid(
                row=int((i + 1) / ncol), column=(i + 1) % ncol, sticky=tk.W
            )
        tk.Entry(plotFrame, textvariable=self.plotXIndex, width=3).grid(
            row=int(len(self.plots) / ncol) - 1, column=ncol
        )
        tk.Entry(plotFrame, textvariable=self.plotYIndex, width=3).grid(
            row=int(len(self.plots) / ncol), column=ncol
        )
        rangeFrame = tk.Frame(midFrame1)
        rangeFrame.pack(side=tk.LEFT)
        tk.Label(rangeFrame, text="X From:").grid(row=0, column=0, sticky=tk.E)
        tk.Entry(rangeFrame, textvariable=self.plotXFrom, width=5).grid(row=0, column=1)
        tk.Label(rangeFrame, text="To:").grid(row=0, column=2)
        tk.Entry(rangeFrame, textvariable=self.plotXTo, width=5).grid(row=0, column=3)
        tk.Label(rangeFrame, text="Y From:").grid(row=1, column=0, sticky=tk.E)
        tk.Entry(rangeFrame, textvariable=self.plotYFrom, width=5).grid(row=1, column=1)
        tk.Label(rangeFrame, text="To:").grid(row=1, column=2)
        tk.Entry(rangeFrame, textvariable=self.plotYTo, width=5).grid(row=1, column=3)
        tk.Label(rangeFrame, text="[Y for (m)post2d only]").grid(row=2, columnspan=4)
        tk.Button(midFrame1, text="Go", command=self.Go).pack(
            side=tk.RIGHT, anchor=tk.NE, padx=4
        )
        tk.Button(midFrame1, text="Save model", command=self.SaveModel).pack(
            side=tk.RIGHT, anchor=tk.NE, padx=4
        )
        tk.Button(midFrame1, text="Load model", command=self.LoadModel).pack(
            side=tk.RIGHT, anchor=tk.NE, padx=4
        )
        midFrame2 = tk.Frame(parent)
        midFrame2.pack(side=tk.TOP, fill=tk.X, pady=4)
        tk.Checkbutton(
            midFrame2,
            text="Don't fit (report goodness-of-fit only)",
            variable=self.nofit,
        ).pack(side=tk.LEFT, anchor=tk.W, padx=8)
        tk.Entry(midFrame2, textvariable=self.margErrVar, width=5).pack(
            side=tk.LEFT, anchor=tk.W
        )
        tk.Checkbutton(
            midFrame2, text="Error bar by marginalising", variable=self.margErr
        ).pack(side=tk.LEFT, anchor=tk.W)
        midFrame3 = tk.Frame(parent)
        midFrame3.pack(side=tk.TOP, fill=tk.X)
        tk.Label(midFrame3, text="Results:").pack(side=tk.LEFT, anchor=tk.SW)
        if dismissCommand is None:
            dismissCommand = parent.quit
        tk.Button(midFrame3, text="Dismiss", command=dismissCommand).pack(
            side=tk.RIGHT, padx=4, pady=4
        )
        tk.Button(midFrame3, text="Clear results", command=self.ClearResults).pack(
            side=tk.RIGHT, padx=4, pady=4
        )
        self.Results = ScrolledText(
            parent, height=31, width=90, font=("Courier", 10), state=tk.DISABLED
        )
        self.Results.tag_config("result", foreground="#1e90ff")  # dodger blue
        self.Results.tag_config("commentary", foreground="#ff8c00")  # dark orange
        self.Results.tag_config("error", foreground="#8b0000")  # dark red
        self.Results.pack(side=tk.TOP, expand=1, fill=tk.BOTH)

    def LoadModel(self):
        """Get filename and read model from file."""
        fileName = tk_filedialog.askopenfilename(
            parent=self.parent,
            initialdir=self.initialdir,
            filetypes=[("mfit model files", "*.model"), ("All files", "*")],
        )
        if fileName != "":
            self.ReadModel(fileName)

    def ReadModel(self, fileName):
        """Read model from file."""
        try:
            fil = open(fileName, "r")
            text = fil.read()
            fil.close()
        except IOError as e:
            (errNo, errStr) = e.args
            self.ShowResult("Error reading %s: %s\n" % (fileName, errStr), "error")
        else:
            self.SetModel(text)

    def SetModel(self, text):
        """Set model text."""
        self.ModelText.delete(1.0, tk.END)
        self.ModelText.insert(tk.END, text)

    def ClearResults(self):
        """Clear results window."""
        self.Results.configure(state=tk.NORMAL)
        self.Results.delete(1.0, tk.END)
        self.Results.configure(state=tk.DISABLED)

    def SaveModel(self):
        """Get filename and write model to file."""
        fileName = tk_filedialog.asksaveasfilename(
            parent=self.parent,
            initialdir=self.initialdir,
            filetypes=[("mfit model files", "*.model"), ("All files", "*")],
        )
        if fileName != "":
            self.WriteModel(fileName)

    def WriteModel(self, fileName):
        """Write model text to file."""
        fil = open(fileName, "w")
        fil.write(self.ModelText.get(1.0, tk.END))
        fil.close()

    def _ChangeFileName(self):
        newName = tk.filedialog.askopenfilename(
            parent=self.parent,
            initialdir=self.initialdir,
            title="Choose data file for fit",
            filetypes=[
                ("(OI-)FITS files", "*fits"),
                ("COAST Mapping Data files", "*.mapdat"),
                ("wbCalib / nbCalib files", "*calib"),
                ("All files", "*"),
            ],
        )
        if newName != "":
            self.fileName.set(newName)

    def ShowResult(self, text, tag):
        """Display text in 'Results'."""
        self.Results.configure(state=tk.NORMAL)
        self.Results.insert(tk.END, text, tag)
        self.Results.yview(tk.END)
        self.Results.configure(state=tk.DISABLED)
        self.parent.update_idletasks()

    def Go(self):
        """Fit the current model."""
        # Execute pre-callback
        if callable(self.preFitCallback):
            if not self.preFitCallback():
                return
        # Write model text to tempfile
        self._tempName = tempfile.mktemp(".model")
        self.WriteModel(self._tempName)
        # Run clfit so we can grab its output
        args = ["nice", self.exe, "--device", self.device]
        try:
            c = float(self.calErr.get())
        except ValueError:
            pass
        else:
            args += f"--calerr {c:.3f}".split()
        try:
            cwl = float(self.cwl.get())
            bw = float(self.bw.get())
        except ValueError:
            try:
                wlmin = float(self.wlmin.get())
                wlmax = float(self.wlmax.get())
                args += f"--waverange {wlmin:.2f} {wlmax:.2f}".split()
            except ValueError:
                pass  # don't specify waveband(s)
        else:
            args += f"--waveband {cwl:.2f} {bw:.2f}".split()
        try:
            target_id = int(self.target_id.get())
            args += f"--target_id {target_id}".split()
        except ValueError:
            pass
        p = self.selPlot.get()
        if p != self.plots[0]:  # not 'No plot'
            if p == "post" or p == "mpost":
                try:
                    index = int(self.plotXIndex.get())
                except ValueError:
                    index = 1
            if p == "post2d" or p == "mpost2d":
                try:
                    indx = (int(self.plotXIndex.get()), int(self.plotYIndex.get()))
                except ValueError:
                    indx = (1, 2)
            try:
                xmin = float(self.plotXFrom.get())
                xmax = float(self.plotXTo.get())
                if p[-2:] == "2d":
                    ymin = float(self.plotYFrom.get())
                    ymax = float(self.plotYTo.get())
            except ValueError:
                if p == "post" or p == "mpost":
                    args += f"--plot {p} {index}".split()
                elif p == "post2d" or p == "mpost2d":
                    args += f"--plot {p} {indx[0]} {indx[1]}".split()
                else:
                    args += f"--plot {p}".split()
            else:
                if p == "post" or p == "mpost":
                    args += f"--zoomplot {p} {index} {xmin} {xmax}".split()
                elif p == "post2d" or p == "mpost2d":
                    args += (
                        f"--zoomplot {p} {indx[0]} {indx[1]} {xmin:.4f} {xmax:.4f}"
                        f" {ymin:.4f} {ymax:.4f}".split()
                    )
                else:
                    args += f"--zoomplot {p} {xmin:.4f} {xmax:.4f}".split()
        if self.nofit.get():
            args += ["--nofit"]
        if self.margErr.get():
            args += f"--margerr {self.margErrVar.get()}".split()
        args += [self.fileName.get(), self._tempName]
        self.ShowResult("Running %s:\n" % " ".join(args), tag="commentary")

        # https://gitpress.io/u/1282/tkinter-read-async-subprocess-output
        self._proc = Popen(args, bufsize=10, stdout=PIPE, stderr=STDOUT, close_fds=True)
        oldflags = fcntl.fcntl(self._proc.stdout, fcntl.F_GETFL)
        fcntl.fcntl(self._proc.stdout, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
        self.parent.createfilehandler(
            self._proc.stdout, tk.READABLE, self._HandleChildOutput
        )

    def _HandleChildOutput(self, fd, mask):
        """Handle output from child process."""
        self._ShowOutput()
        returncode = self._proc.poll()
        if returncode is not None:
            # child process completed
            time.sleep(0.5)  # wait for last output
            self._ShowOutput()
            if returncode != 0:
                self.ShowResult(f"Subprocess exited with code {returncode}\n", "error")
            else:
                self.ShowResult("Subprocess exited normally\n", "commentary")
            self.parent.deletefilehandler(self._proc.stdout)
            os.remove(self._tempName)
            # Execute post-callback
            if callable(self.postFitCallback):
                self.postFitCallback()

    def _ShowOutput(self):
        """Read child process output and pass to ShowResult()."""
        try:
            result = self._proc.stdout.read()
        except IOError as e:
            (errNo, errMsg) = e.args
            self.ShowResult("I/O Error %d: %s\n" % (errNo, errMsg), "commentary")
        else:
            self.ShowResult(result, "result")
コード例 #20
0
class ConsoleUi:
    """Poll messages from a logging queue and display them in a scrolled text widget"""
    def __init__(self, frame):
        self.frame = frame

        # Create a ScrolledText wdiget
        self.scrolled_text = ScrolledText(frame, state='disabled', height=12)
        self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E))
        self.scrolled_text.configure(font='TkFixedFont')
        self.scrolled_text.tag_config('INFO', foreground='black')
        self.scrolled_text.tag_config('DEBUG', foreground='gray')
        self.scrolled_text.tag_config('WARNING', foreground='orange')
        self.scrolled_text.tag_config('ERROR', foreground='red')
        self.scrolled_text.tag_config('CRITICAL',
                                      foreground='red',
                                      underline=1)
        self.scrolled_text.tag_config(
            'COPYOVER',
            foreground='blue',
        )
        self.scrolled_text.tag_config(
            'COPYNEW',
            foreground='green',
        )
        self.scrolled_text.tag_config(
            'DELETE',
            foreground='red',
        )
        self.scrolled_text.tag_config(
            'MOVE',
            foreground='magenta',
        )

        # Start polling messages from the queue
        self.frame.after(100, self.poll_log_queue)

    def display(self, record):
        msg = record
        # Send special message to clear the log
        if msg == "__clear__":
            self.scrolled_text.configure(state='normal')
            self.scrolled_text.delete(1.0, tk.END)
            self.scrolled_text.configure(state='disabled')
            return

        self.scrolled_text.configure(state='normal')
        self.scrolled_text.insert(tk.END, msg[1] + '\n', msg[0])
        self.scrolled_text.configure(state='disabled')

        # Autoscroll to the bottom
        self.scrolled_text.yview(tk.END)

    def poll_log_queue(self):
        # Check every 100ms if there is a new message in the queue to display
        while True:
            try:
                record = msg_queue.get(block=False)
            except queue.Empty:
                break
            else:
                self.display(record)
        self.frame.after(100, self.poll_log_queue)
コード例 #21
0
    def asset_page(asset, origin, origin_details=None, original_origin=None):
        def open_class():
            selected = listbox.curselection()
            if selected:
                class_id = asset["classList"][selected[0]]["id"]
                class_page(class_id,
                           origin="asset",
                           origin_details=asset_id,
                           original_origin=original_origin)

        def return_to_layer_2_search_results():
            if origin_details:
                layer_2_search_results(origin_details)
            else:
                layer_1_search()

        def return_to_class_page():
            if origin_details:
                class_page(origin_details, "classes")
            else:
                layer_1_classes()

        def return_to_layer_2_critical_items():
            layer_1_critical()

        if not asset:
            return
        if isinstance(asset, int):
            asset_id = asset
            for obj in db["assets"]:
                if obj["assetId"] == asset_id:
                    asset = obj
                    break
        else:
            asset_id = asset["assetId"]

        for child in list(window.children.values()):
            child.destroy()

        layer_3 = tk.Frame(window)
        layer_3.pack()

        asset_detail_page = tk.Frame(layer_3)
        asset_detail_page.pack()
        window.title("Asset #" + str(asset_id))

        if origin == "search":
            tk.Button(asset_detail_page,
                      text="Back to search results",
                      command=return_to_layer_2_search_results).pack()
        elif origin == "critical":
            tk.Button(asset_detail_page,
                      text="Back to critical items",
                      command=return_to_layer_2_critical_items).pack()
        elif origin == "class":
            if origin_details:
                tk.Button(asset_detail_page,
                          text="Back to " + classes[origin_details]["name"] +
                          " details",
                          command=return_to_class_page).pack()
            else:
                tk.Button(asset_detail_page,
                          text="Back to classes",
                          command=return_to_class_page).pack()
        else:
            tk.Button(asset_detail_page, text="Go home",
                      command=layer_0_home).pack()

        if "name" in asset.keys():
            tk.Label(asset_detail_page, text="name: " + asset["name"]).pack()
        else:
            tk.Label(asset_detail_page, text="(unnamed)").pack()

        tk.Label(asset_detail_page, text="ID: " + str(asset_id)).pack()

        if "description" in asset.keys():
            tk.Label(asset_detail_page,
                     text="description:\n" + asset["description"]).pack()
        else:
            tk.Label(asset_detail_page, text="description:\nnone").pack()

        if "classList" in asset.keys():
            tk.Label(asset_detail_page, text="classes of this asset:").pack()
            if len(asset["classList"]) > 0:
                listbox = tk.Listbox(asset_detail_page,
                                     selectmode=tk.BROWSE,
                                     width=40)
                listbox.pack()
                listbox.bind('<Double-1>', lambda x: open_class())
                for i, class_obj in enumerate(asset["classList"]):
                    listbox.insert(i, class_obj["name"])
            else:
                tk.Label(asset_detail_page, text="None").pack()
        else:
            tk.Label(asset_detail_page, text="None").pack()

        tk.Label(asset_detail_page, text="raw data about this asset:").pack()
        detail = ScrolledText(asset_detail_page)
        detail.pack()
        for attr, data in asset.items():
            if isinstance(data, dict):
                detail.insert(tk.INSERT, str(attr) + "\n")
                for key, val in data.items():
                    detail.insert(tk.INSERT,
                                  (str(key) + ": " + str(val)) + "\n")
            elif isinstance(data, list):
                detail.insert(tk.INSERT, str(attr) + "\n")
                for val in data:
                    detail.insert(tk.INSERT, str(val) + "\n")
            else:
                detail.insert(tk.INSERT, str(attr) + ": " + str(data) + "\n")

        detail.configure(state="disabled")
コード例 #22
0
ファイル: p2_main.py プロジェクト: Satyam2000/CS384_1801EE48
class Notepad(tk.Tk):
    """A notepad application"""

    def __init__(self):
        super().__init__()
        self.withdraw()

        #this is how to check platform & set zoom status
        platform = self.tk.call('tk', 'windowingsystem')
        self.wm_state('zoomed') if platform == 'win32' else self.attributes(
            '-zoomed', 1)

        # code for naming file and about file variables.
        self.file = pathlib.Path.cwd() / 'Untitled_notepad.txt'
        self.file_defaults = {
            'defaultextension': '*',
            'filetypes': [('All Files', '.*')]}

        # code to find,search and replace variables
        self.query = None
        self.matches = None
        self.findnext = None
        self.findreplace = None

        # code to do main menu setup
        self.menu = tk.Menu(self)
        self.configure(menu=self.menu)
        self.menu_file = tk.Menu(self.menu, tearoff=False)
        self.menu_edit = tk.Menu(self.menu, tearoff=False)
        

    # file menu looks like
        #To open a new file
        self.menu_file.add_command(label='New', accelerator='Ctrl+N', command=self.new_file)
        #To open already existing file.
        self.menu_file.add_command(label='Open...', accelerator='Ctrl+O', command=self.open_file)
        #To save the current file
        self.menu_file.add_command(label='Save', accelerator='Ctrl+S', command=self.save_file)
        #To save an existing file under new name 
        self.menu_file.add_command(label='Save As...', accelerator='Ctrl+Shift+S', command=self.save_file_as)
		#To Exit current file or loation.
        self.menu_file.add_command(label='Exit', accelerator='Alt+F4', command=self.quit_App)


        # edit menu looks like
        
        #To give a Feature of undo and Redo.
        self.menu_edit.add_command(label='Redo', accelerator='Ctrl+Y', command=self.redo_edit)
        self.menu_edit.add_command(label='Undo', accelerator='Ctrl+Z', command=self.undo_edit)
        #To give a feature of cut,copy and Paste.
        self.menu_edit.add_command(label='Cut', accelerator='Ctrl+X', command=self.text_cut)
        self.menu_edit.add_command(label='Copy', accelerator='Ctrl+C', command=self.text_copy)
        self.menu_edit.add_command(label='Paste', accelerator='Ctrl+V', command=self.text_paste)
        #To give the feature of finding something and/or replacing it.
        self.menu_edit.add_command(label='Find', accelerator='Ctrl+F', command=self.ask_find_next)
        self.menu_edit.add_command(label='Find and Replace', accelerator='Ctrl+H', command=self.ask_find_replace)
        #To get the current time and date at the begining of cursor.
        self.menu_edit.add_command(label='Time/Date', accelerator='F5', command=self.get_datetime)

    
        # code to add cascading menus to main menu
        self.menu.add_cascade(label='File', menu=self.menu_file)
        self.menu.add_cascade(label='Edit', menu=self.menu_edit)
       

        # how to setup  text widget
        self.text_frame = tk.Frame(self)
        self.text = ScrolledText(self.text_frame, wrap=tk.WORD, font='-size 20', undo=True, maxundo=10,
                                 autoseparator=True, blockcursor=False, padx=5, pady=10)

        # set default tab size to 4 characters
        self.font = tkfont.Font(family='Courier New', size=12, weight=tkfont.NORMAL,
                                slant=tkfont.ROMAN, underline=False, overstrike=False)
        self.text.configure(font=self.font)
        tab_width = self.font.measure(' ' * 4)
        self.text.configure(tabs=(tab_width,))
        self.text.insert(tk.END, self.file.read_text()
                         if self.file.is_file() else '')

        # packing up all widget to screen
        self.text.pack(fill=tk.BOTH, expand=tk.YES)
        self.text_frame.pack(fill=tk.BOTH, expand=tk.YES)

        # adding up status bar
        self.status_bar = StatusBar(self, self.text)

        # this is the final setup
        self.update_title()

        #self.eval('tk::PlaceWindow . center')
        self.deiconify()

    # -------------defining FILE MENU starts--------------------------------------

    def new_file(self, event=None):
        """Create a new file"""
        # check for content change before opening new file
        self.confirm_changes()

        # reset text widget
        self.text.delete(1.0, tk.END)
        self.file = pathlib.Path.cwd() / 'Untitled_notepad.txt'
        self.update_title()

    def open_file(self, event=None):
        """Open an existing file"""
        # check for content change before opening new file
        self.confirm_changes()

        # open new file
        file = filedialog.askopenfilename(
            initialdir=self.file.parent, **self.file_defaults)
        if file:
            self.text.delete(1.0, tk.END)  # delete existing content
            self.file = pathlib.Path(file)
            self.text.insert(tk.END, self.file.read_text())
            self.update_title()
            self.status_bar.update_status()

    def save_file(self, event=None):
        """Save the currently open file"""
        if self.file.name == 'Untitled_notepad.txt':
            file = filedialog.asksaveasfilename(
                initialfile=self.file, **self.file_defaults)
            self.file = pathlib.Path(file) if file else self.file
        self.file.write_text(self.text.get(1.0, tk.END))
        self.update_title()

    def save_file_as(self, event=None):
        """Save the currently open file with a different name or location"""
        file = filedialog.asksaveasfilename(
            initialdir=self.file.parent, **self.file_defaults)
        if file:
            self.file = pathlib.Path(file)
            self.file.write_text(self.text.get(1.0, tk.END))
            self.update_title()


    def confirm_changes(self):
        """Check to see if content has changed from original file; if so, confirm save"""
        if self.file.is_file():
            original = self.file.read_text()
            current = self.text.get(1.0, tk.END)
            if original != current:
                confirm = messagebox.askyesno(
                    message="Save current file changes?")
                if confirm:
                    self.save_file()
        # new unsaved document with content is prompted to save
        elif self.text.count(1.0, tk.END)[0] > 1:
            confirm = messagebox.askyesno(message="Save current document?")
            if confirm:
                self.save_file()

    def update_title(self):
        """Update the title with the file name"""
        self.title(self.file.name + " - Notepad")

    def quit_App(self):
        """Quit application after checking for user changes"""
        self.confirm_changes()
        self.destroy()

#-----------------FILE Menu definition Ends--------------------------------

#-----------------EDIT MENU definition starts------------------------------

    def undo_edit(self):
        """Undo the last edit in the stack"""
        try:
            self.text.edit_undo()
        except tk.TclError:
            pass

    def redo_edit(self):
        """Redo the last edit in the stack"""
        try:
            self.text.edit_redo()
        except tk.TclError:
            pass

    def text_copy(self):
        """Append selected text to the clipboard"""
        selected = self.text.get(tk.SEL_FIRST, tk.SEL_LAST)
        self.text.clipboard_clear()
        self.text.clipboard_append(selected)

    def text_paste(self):
        """Paste clipboard text into text widget at cursor"""
        self.text.insert(tk.INSERT, self.text.clipboard_get())

    def text_cut(self):
        """Cut selected text and append to clipboard"""
        selected = self.text.get(tk.SEL_FIRST, tk.SEL_LAST)
        self.text.delete(tk.SEL_FIRST, tk.SEL_LAST)
        self.text.clipboard_clear()
        self.text.clipboard_append(selected)

    def quit_application(self, event=None):
        """Quit application after checking for user changes"""
        self.confirm_changes()
        self.destroy()

    def ask_find_next(self, event=None):
        """Create find next popup widget"""
        self.findnext = Find(self, self.text)

    def ask_find_replace(self, event=None):
        """Create replace popup widget"""
        self.findreplace = Replace(self, self.text)

    def get_datetime(self, event=None):
        """insert date and time at cursor position"""
        self.text.insert(tk.INSERT, datetime.datetime.now().strftime("%c"))
コード例 #23
0
    def update(sv_version, changelog):
        nonlocal debug

        updatewindow = tk.Toplevel(master)
        updatewindow.title(_('Update'))
        updatewindow.geometry(master.popup_geometry(400, 300))
        updatewindow.resizable(False, False)
        updatewindow.focus()

        try:
            updatewindow.iconbitmap('asset/icon.ico')
        except tk.TclError:
            pass

        button_frame = tk.Frame(updatewindow)
        button_frame.pack(side=tk.BOTTOM, pady=3, fill='x')

        cancel_button = ttk.Button(button_frame, text=_('Cancel'),
                                   command=updatewindow.destroy)
        update_button = ttk.Button(button_frame, width=28, text=_('Update now'))

        text_frame = tk.Frame(updatewindow)
        text_frame.pack(side=tk.TOP, pady=3)
        text = tk.Label(text_frame,
                        text=_('New version %s is available.') % sv_version)
        text.pack()

        changelog_box = ScrolledText(updatewindow, width=57, relief='solid', bd=0)
        changelog_box.insert(tk.CURRENT, changelog)
        changelog_box.configure(state=tk.DISABLED)
        changelog_box.pack(padx=5)

        updatewindow.grab_set()

        def start_update():
            '''Withdraw main window and start update download'''
            nonlocal button_frame
            nonlocal cancel_button
            nonlocal update_button
            nonlocal debug
            nonlocal sv_version

            master.withdraw()
            try:
                os.remove('update.zip')
            except OSError:
                pass

            install = True

            # For development purposes
            if not bundle and debug:
                if not msgbox.askyesno('', 'Install update?'):
                    install = False

            cancel_button.destroy()
            update_button.destroy()

            def cancel():
                if msgbox.askokcancel(_('Cancel'), _('Are you sure to cancel?')):
                    os._exit(0)

            # There's no cancel button so we use close button as one instead
            updatewindow.protocol("WM_DELETE_WINDOW", cancel)

            # Define progress variables
            dl_p = tk.IntVar()
            dl_p.set(0)
            dl_pbar = ttk.Progressbar(button_frame,
                                      length=150,
                                      orient=tk.HORIZONTAL,
                                      variable=dl_p)
            dl_pbar.pack(side='left', padx=5)

            dl_prog_var = tk.StringVar()
            dl_prog_var.set('-------- / --------')
            dl_prog = tk.Label(button_frame, textvariable=dl_prog_var)

            dl_speed_var = tk.StringVar()
            dl_speed_var.set('---------')
            dl_speed = tk.Label(button_frame, textvariable=dl_speed_var)

            dl_prog.pack(side='right', padx=5)
            dl_speed.pack(side='right', padx=5)
            master.update()

            dl_url = f'https://github.com/sw2719/steam-account-switcher/releases/download/v{sv_version}/Steam_Account_Switcher_v{sv_version}.zip'

            try:
                r = req.get(dl_url, stream=True)
                r.raise_for_status()
                total_size = int(r.headers.get('content-length'))
                total_in_MB = round(total_size / 1048576, 1)
            except req.RequestException:
                msgbox.showerror(_('Error'),
                                 _('Error occured while downloading update.'))
                os._exit(1)

            if round(total_in_MB, 1).is_integer():
                total_in_MB = int(total_in_MB)

            def launch_updater():
                if not install:
                    return

                while not os.path.isfile('update.zip'):
                    sleep(1)

                try:
                    archive = os.path.join(os.getcwd(), 'update.zip')

                    f = zf.ZipFile(archive, mode='r')
                    f.extractall(members=(member for member in f.namelist() if 'updater' in member))

                    os.execv('updater/updater.exe', sys.argv)
                except (FileNotFoundError, zf.BadZipfile, OSError):
                    error_msg(_('Error'), _("Couldn't perform automatic update.") + '\n' +
                              _('Update manually by extracting update.zip file.'))

            def dl_callback(downloader):
                nonlocal total_in_MB

                current_size = downloader.total_downloaded
                current_in_MB = round(current_size / 1048576, 1)

                if round(current_in_MB, 1).is_integer():
                    current_in_MB = int(current_in_MB)

                perc = int(current_size / total_size * 100)
                prog = f'{current_in_MB}MB / {total_in_MB}MB'

                dl_p.set(perc)
                dl_prog_var.set(prog)
                dl_speed_var.set(downloader.readable_speed + '/s')
                master.update()

                if perc == 100 and downloader.total_merged == downloader.total_length:
                    launch_updater()

            downloader = Downloader(dl_url, 'update.zip', 8)
            downloader.subscribe(dl_callback)
            downloader.start()

        update_button['command'] = lambda: start_update()
        if LOCALE == 'fr_FR':
            padx_int = 80
        else:
            padx_int = 110
        cancel_button.pack(side='left', padx=(padx_int, 0))
        update_button.pack(side='right', padx=(0, padx_int))
コード例 #24
0
ファイル: Team_1_chat.py プロジェクト: stolucc/CS3505_team_1
class ChatBox(object):
    """
    Creates a chat object/window.
    It allows multiple player to chat with each other if they wish to.

    :param sock: This is the socket through which messages will be
                 sent/received.
    :type sock: python socket
    """
    def __init__(self, sock):
        self.name = ""  # Initially set to empty string
        self.sock = sock  # set socket to a socket already being used

    def new_message(self, msg):
        """
        When a message is recieved this will show it in the chat window

        :param msg: New message recieved from other player
        :type msg: String.
        """
        # concatenate name + message
        string = msg["name"] + ": " + msg["chat_msg"]
        # shows the message on the screen
        self.recvd.insert("end", "%s \n" % string)
        # always shows last line received
        self.recvd.see(END)

    def send(self, event):
        """
        sends a json message to server when you press "Return" key
        to send a message.
        """
        if self.msg.get().strip() != "":  # validates empty string
            # sets message to be sent
            message = {"name": self.name, "chat_msg": self.msg.get()}
            message = json.dumps(message)  # converts it in json form
            self.sock.sendall(message.encode())  # sends message to server
            self.msg.delete(0, 'end')  # clear the variable

    def start(self, name):
        """ 
        creates a tkinter window where a person can send/receive
        messages from others

        :param name: Name of player (self)
        :type name: String.
        """
        self.name = name  # set name to the name entered in form
        self.root = Tk()  # creates tkinter window
        self.root.geometry('+%d+%d' % (1000, 0))
        self.frame = Frame(self.root)  # create a frame on the window
        # Where the Client enters the message
        self.msg = Entry(self.frame, width=50, font=('TkDefaultFont', 11))
        self.msg.configure(bg='pink')  # set background colour of textfield
        # The text area where all received messages go.
        self.recvd = ScrolledText(self.frame, height=29, width=50)
        # Set background colour of received messages
        self.recvd.configure(bg='lightblue')
        self.root.title("Chat")  # set title of window to chat
        self.root.minsize(500, 500)  # minimum size of tkinter window
        self.root.maxsize(500, 500)  # maximum size of tkinter window
        self.root.configure(bg='lightblue')  # set background of tkinter window
        self.root.bind('<Return>', self.send)  # listens for return key press
        self.recvd.pack()  # packs message box
        self.msg.pack(ipady=5)  # packs textfield
        self.frame.pack()  # packs frame
        self.root.mainloop()  # loop for showing new message
コード例 #25
0
class AdvisorGui:
    def __init__(self):
        self.root = Tk()
        self.root.geometry("600x400")
        self.imdb_id_entry = None
        self.num_of_neighbors_entry = None
        self.num_of_common_movies_entry = None
        self.log_area = None
        self.algorithm_nbr = IntVar()
        self.num_of_neighbors = 4

    def start(self):
        self.init_id_placeholder()
        self.init_algorithms_selectors()
        self.init_num_of_neighbors_placeholder()
        self.init_num_of_movie_placeholder()
        self.init_info_area()
        self.init_start_button()
        self.root.mainloop()

    def init_id_placeholder(self):
        Label(self.root, text="Insert your IMDb ID: ").grid(row=0,
                                                            column=0,
                                                            sticky="W")
        default_id = IntVar()
        self.imdb_id_entry = Entry(textvariable=default_id)
        self.imdb_id_entry.grid(row=0, column=1, sticky="W")
        default_id.set(Config.main_user_id)

    def init_algorithms_selectors(self):
        Label(self.root, text="Select algorithm: ").grid(row=1,
                                                         column=0,
                                                         sticky="W")
        Radiobutton(self.root,
                    text="User-User",
                    variable=self.algorithm_nbr,
                    value=1).grid(row=1, column=1, sticky="W")
        Radiobutton(self.root,
                    text="Item-Item",
                    variable=self.algorithm_nbr,
                    value=0).grid(row=1, column=2, sticky="W")

    def init_num_of_neighbors_placeholder(self):
        Label(self.root, text="Set num of neighbors: ").grid(row=3,
                                                             column=0,
                                                             sticky="W")
        default_num = IntVar()
        self.num_of_neighbors_entry = Entry(textvariable=default_num)
        self.num_of_neighbors_entry.grid(row=3, column=1, sticky="W")
        default_num.set(Config.num_of_neighbors)

    def init_num_of_movie_placeholder(self):
        Label(self.root, text="Set num of movies you want: ").grid(row=4,
                                                                   column=0,
                                                                   sticky="W")
        default_num = IntVar()
        self.num_of_common_movies_entry = Entry(textvariable=default_num)
        self.num_of_common_movies_entry.grid(row=4, column=1, sticky="W")
        default_num.set(Config.num_of_movies)

    def init_info_area(self):
        self.log_area = ScrolledText(self.root,
                                     state='disabled',
                                     width=70,
                                     height=15)
        self.log_area.grid(column=0,
                           row=5,
                           sticky='w',
                           columnspan=4,
                           padx=12,
                           pady=10)

    def init_start_button(self):
        Button(self.root, text="Find movies!",
               command=self.start_searching).grid(row=10, column=1)

    def start_searching(self):
        Config.num_of_neighbors = int(self.num_of_neighbors_entry.get())
        Config.num_of_movies = int(self.num_of_common_movies_entry.get())
        Config.algorithm_nbr = self.algorithm_nbr.get()
        Config.main_user_id = self.imdb_id_entry.get()
        UsersGenerator().update_user(one_update=True)
        if Config.algorithm_nbr == 1:
            best_movies = UserUserCF().get_best_movies()
        else:
            best_movies = ItemItemCF().get_best_movies()
        self.log_area.configure(state='normal')
        self.log_area.delete(1.0, END)
        self.log_area.insert(INSERT, best_movies)
        self.log_area.configure(state='disabled')
コード例 #26
0
class BlinkyViewer(object):
    def __init__(self, window, video_source=0, industrial=False):
        self.window = window
        self.window.protocol("WM_DELETE_WINDOW", self.on_closing_callback)
        # overload "Exit" function for Menu file -> quit
        self.window.createcommand("exit", self.on_closing_callback)

        # window update delay
        self.delay = 33  # milliseconds

        # control
        self.checksat = False
        self.convert_bw = False
        self.convert_log = False

        # zoom size
        self.zoom_patch_size = 31

        # open video feed
        self.video_source = video_source
        self.processor = ReadSpeedMonitor(monitor=True)

        # Choose the video source
        self.industrial = industrial

        self.vid = None
        self.start_video()

        # Keep track of the current frame
        self.current_frame = None

        # GEOMETRY #
        ############

        # Here we want to compute the size of the different boxes
        screen_w = self.window.winfo_screenwidth()
        screen_h = self.window.winfo_screenheight()
        vid_h, vid_w = self.vid.shape

        # set the size of the video canvas
        self.vid_can_w = int(screen_w * 0.75)
        self.vid_can_h = int(self.vid_can_w * (vid_h / vid_w))

        if self.vid_can_h > 0.9 * screen_h:
            self.vid_can_h = int(screen_h * 0.75)
            self.vid_can_w = int(self.vid_can_h * (vid_w / vid_h))

        self.window_w = int(1.33 * self.vid_can_w)

        self.zoom_wh = int(0.33 * self.vid_can_w)
        self.fig_w = self.zoom_wh
        self.fig_h = self.vid_can_h - self.zoom_wh
        self.plist_w = self.zoom_wh
        self.plist_h = int(0.9 * screen_h) - self.vid_can_h

        self.buttons_w = int(self.vid_can_w / 3)
        self.buttons_h = int(0.9 * screen_h) - self.vid_can_h

        self.console_w = int(self.vid_can_w / 3)
        self.console_h = int(0.9 * screen_h) - self.vid_can_h

        self.info_w = self.vid_can_w - self.buttons_w - self.console_w
        self.info_h = int(0.9 * screen_h) - self.vid_can_h

        self.window_h = self.vid_can_h + self.plist_h

        self.window_w = int(1.03 * self.window_w)
        self.window_h = int(1.03 * self.window_h)

        self.window.geometry(f"{self.window_w}x{self.window_h}+0+0")

        # THE LEFT PANEL #
        ##################

        # create canvas of the right size
        self.canvas = Canvas(self.window,
                             width=self.vid_can_w,
                             height=self.vid_can_h)
        self.canvas.grid(row=0, column=0, rowspan=2, columnspan=4)
        self.canvas.bind("<Button-1>", self.mouse_callback)

        # The control frame with all buttons
        self.frame_control = Frame(self.window)
        self.frame_control.grid(row=2, column=0, sticky=N)

        # The Buttons
        self.frame_control_buttons = Frame(self.frame_control)
        self.frame_control_buttons.grid(row=0, column=0)

        self.btn_checksat = Button(self.frame_control_buttons,
                                   text="Sat",
                                   width=10,
                                   command=self.toggle_checksat)
        self.btn_checksat.grid(row=0, column=0)

        self.btn_convert_bw = Button(self.frame_control_buttons,
                                     text="BW",
                                     width=10,
                                     command=self.toggle_convert_bw)
        self.btn_convert_bw.grid(row=1, column=0)

        self.btn_convert_log = Button(self.frame_control_buttons,
                                      text="Log",
                                      width=10,
                                      command=self.toggle_convert_log)
        self.btn_convert_log.grid(row=2, column=0)

        # The processing part
        self.frame_control_proc = Frame(self.window)
        self.frame_control_proc.grid(row=2, column=1, sticky="n")

        self.label_frame = Label(self.frame_control_proc, text=f"Record:")
        self.label_frame.grid(row=0, column=0, sticky="nw")

        self.output_filename = DEFAULT_FILENAME
        self.label_file = Label(self.frame_control_proc, text=f"Output file:")
        self.label_file.grid(row=1, column=0, sticky="nw")

        self.entry_filename = Entry(self.frame_control_proc, width=20)
        self.entry_filename.insert(0, self.output_filename)
        self.entry_filename.grid(row=1, column=1, sticky="nw")

        self.label_boxsize = Label(self.frame_control_proc, text="Box size:")
        self.label_boxsize.grid(row=2, column=0, sticky="nw")

        self.entry_boxsize = Entry(self.frame_control_proc, width=3)
        self.entry_boxsize.insert(0, "1")
        self.entry_boxsize.grid(row=2, column=1, sticky="nw")

        self.btn_process = Button(self.frame_control_proc,
                                  text=PROCESS_LABEL,
                                  width=10,
                                  command=self.process_callback)
        self.btn_process.grid(row=3, column=0)

        self.canvas_info = InfoBox({
            "fps_video": 0,
            "fps_proc": 0
        },
                                   self.window,
                                   width=self.info_w // 2,
                                   height=self.info_h)
        self.canvas_info.grid(row=2, column=2, sticky="n")

        # The Console
        self.canvas_console = Canvas(self.window,
                                     width=self.console_w,
                                     height=self.console_h)
        self.canvas_console.grid(row=2, column=3, sticky="ne")
        self.console = ScrolledText(self.canvas_console,
                                    state=DISABLED,
                                    borderwidth=2,
                                    relief="solid",
                                    width=60,
                                    height=12)
        self.console.grid(row=0, column=0, sticky="ne")

        # THE RIGHT PANEL #
        ###################

        # The pixel tracking figure
        self.pixel_tracker = PixelTracker(
            row=self.vid.height // 2,
            col=self.vid.width // 2,
            width=self.fig_w,
            height=self.fig_h,
            buffer_size=100,
            master=self.window,
        )
        self.pixel_tracker.grid(row=0, column=4)

        # The zoom
        self.canvas_zoom = ZoomCanvas(
            self.zoom_patch_size,
            self.zoom_wh,
            self.vid.shape,
            self.window,
        )
        self.canvas_zoom.grid(row=1, column=4)
        self.canvas_zoom.bind("<Button-1>", self.zoom_callback)

        # Notify pixel tracker of initial zoom selection
        self.pixel_tracker.add(self.canvas_zoom.selected, label=PREVIEW_LABEL)

        # Buttons to add and remove pixels
        self.frame_pix_btn = Frame(self.window)
        self.frame_pix_btn.grid(row=2, column=4)

        self.btn_add_pixel = Button(
            self.frame_pix_btn,
            text="Add Pixel",
            width=10,
            command=self.add_pixel_callback,
        )
        self.btn_add_pixel.grid(row=0, column=0, sticky="nw")

        self.btn_drop_pixel = Button(
            self.frame_pix_btn,
            text="Drop Pixel",
            width=10,
            command=self.drop_pixel_callback,
        )
        self.btn_drop_pixel.grid(row=0, column=1, sticky="nw")

        # The selected pixels list
        self.pixel_list = PixelList(
            self.frame_pix_btn, width=self.plist_w // 2,
            height=self.plist_h)  #, list_width=40, list_height=10)
        self.pixel_list.grid(row=0, column=2, rowspan=2, sticky="nw")

        self.log("Welcome to BlinkyViewer")

        self.update()

        # Populate the window
        window.title("BlinkyViewer")

        self.window.mainloop()

    def start_video(self):
        # first stop the video if already running
        if self.vid is not None:
            self.vid.stop()

        if not self.industrial:
            self.vid = ThreadedVideoStream(self.video_source)
        else:
            if not icube_sdk_available:
                raise ValueError(
                    "The Driver for the DN3V camera is not available")

            self.vid = icube_sdk.ICubeCamera(self.video_source, 200)
            self.vid.start()

        print("Video FPS:", self.vid.fps)

    def log(self, message):
        self.console.configure(state="normal")
        self.console.insert("end", "\n" + message)
        self.console.configure(state="disabled")
        self.console.see("end")

    def coord_canvas_to_video(self, col, row):
        """ Transforms from canvas to video coordinate """
        c = int((col / self.vid_can_w) * self.vid.width)
        r = int((row / self.vid_can_h) * self.vid.height)
        return c, r

    def coord_video_to_canvas(self, col, row):
        """ Transforms from video to canvas coordinate """
        c = int((col / self.vid.width) * self.vid_can_w)
        r = int((row / self.vid.height) * self.vid_can_h)
        return c, r

    def update(self):

        fps_proc = self.processor.fps if self.processor is not None else 0.
        self.canvas_info.update(fps_video=f"{self.vid.fps:6.2f}",
                                fps_proc=f"{fps_proc:6.2f}")

        new_frame = None

        # Get a frame from the video source
        while self.vid.available:
            new_frame = np.array(self.vid.read(block=False), copy=False)

            if new_frame is None:
                break

            if self.processor is not None:
                self.processor.process(new_frame)

            self.pixel_tracker.push(new_frame)

        # If the video stream stopped, restart it
        if not self.vid.is_streaming:
            # if recording, stop
            if self.process_is_recording():
                self.process_callback()

            # restart video
            self.start_video()

            self.log("Looping the video")

        if new_frame is not None:
            self.current_frame = new_frame

        if self.current_frame is not None:

            # shorten
            frame = self.current_frame

            self.pixel_tracker.update()

            if frame.ndim == 2:
                frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB)

            elif self.convert_bw:
                # convert to black and white
                frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
                # but convert back to color so that we
                # an add visual help in color
                frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB)

            if self.checksat:
                sat_pix = np.where(frame == 255)
                sat_col = (0, 255, 0)
                for col in range(3):
                    sat_pix[2][:] = col
                    frame[sat_pix] = sat_col[col]

            if self.convert_log:
                tmp = frame.astype(np.float32)
                tmp = np.log2(tmp + 1)
                frame = (tmp * 255 / np.max(tmp)).astype(np.uint8)

            # create zoomed-in vignette
            self.canvas_zoom.update(frame)

            # Display the video frame
            frame = cv2.resize(frame, (self.vid_can_w, self.vid_can_h),
                               interpolation=cv2.INTER_NEAREST)

            # indicate the location of selected pixels
            frame = self.pixel_tracker.mark(
                frame, conv_func=self.coord_video_to_canvas)
            frame = self.canvas_zoom.mark(frame,
                                          conv_func=self.coord_video_to_canvas)

            self.photo = PIL.ImageTk.PhotoImage(
                image=PIL.Image.fromarray(frame))
            self.canvas.create_image(0, 0, image=self.photo, anchor=NW)

        self.window.after(self.delay, self.update)

    def toggle_checksat(self):
        self.checksat = toggle(self.checksat)

    def toggle_convert_bw(self):
        self.convert_bw = toggle(self.convert_bw)

    def toggle_convert_log(self):
        self.convert_log = toggle(self.convert_log)

    def add_pixel_callback(self):
        self.pixel_list.add(self.canvas_zoom.selected)
        self.pixel_tracker.add(self.canvas_zoom.selected)
        self.log(
            f"Selected pixel at {pixel_to_str(self.canvas_zoom.selected)}")

    def drop_pixel_callback(self):
        for plbl in self.pixel_list.curselection:
            self.pixel_tracker.remove(plbl)
        self.pixel_list.curdelete()
        self.log(f"Dropped pixel at {pixel_to_str(self.canvas_zoom.selected)}")

    def choose_file_callback(self):
        """ Called when pressing on the choose file button """
        tmp_filename = asksaveasfilename(defaultextension=".blinky",
                                         initialdir=".")
        if tmp_filename != "":
            self.output_filename = tmp_filename
            self.label_file.config(text=f"Output file: {self.output_filename}")

    def process_is_recording(self):
        return self.btn_process.cget("text") == STOP_LABEL

    def process_is_not_recording(self):
        return self.btn_process.cget("text") == PROCESS_LABEL

    def process_callback(self):
        """ Called when pressing the "Process" button """

        if self.process_is_not_recording():

            bbox = self.entry_boxsize.get()
            pixel_list = self.pixel_list.get()
            self.output_filename = self.entry_filename.get()

            if self.output_filename == "":
                self.log("Please choose a filename")

            elif not bbox.isdigit():
                self.log("The box size should be a number")

            elif len(pixel_list) == 0:
                self.log("No pixel has been selected for recording.")

            else:

                bbox = int(bbox)

                self.log("Start recording")

                # If the video is from a file, we restart
                if not isinstance(self.video_source, int):
                    self.vid.stop()

                if self.processor is not None:
                    self.processor.stop()

                self.processor = BoxCatcher(pixel_list, [bbox, bbox],
                                            monitor=True)

                # If the video is from a file, we restart
                if not isinstance(self.video_source, int):
                    self.vid = ThreadedVideoStream(self.video_source)

                self.btn_process.config(text=STOP_LABEL)
                self.process_record_start_time = time.perf_counter()

        elif self.process_is_recording():

            self.log("Stop recording")

            self.btn_process.config(text=PROCESS_LABEL)

            if isinstance(self.processor, BoxCatcher):
                # stop the processor
                self.processor.stop()

                recording_time = time.perf_counter(
                ) - self.process_record_start_time
                fps = self.processor.data.shape[0] / recording_time

                # save the result in blinky file
                new_file = BlinkyFile(self.processor.pixels,
                                      self.processor.data, fps)
                new_file.dump(self.output_filename)

                # Replace by the simple speed meter
                self.processor = ReadSpeedMonitor(monitor=True)

        else:
            raise ValueError("Invalid button state")

    def mouse_callback(self, event):
        """ Called when clicking on the main camera display """
        col, row = self.coord_canvas_to_video(event.x, event.y)
        frame_shape = self.vid.shape
        if col >= frame_shape[1]:
            col = frame_shape[1] - 1
        if row >= frame_shape[0]:
            row = frame_shape[0] - 1

        self.canvas_zoom.set_origin((col, row))
        self.pixel_tracker.add(self.canvas_zoom.selected, label=PREVIEW_LABEL)

    def zoom_callback(self, event):
        """ Called when clicking on the zoomed out vignette """
        self.canvas_zoom.on_click(event)
        self.pixel_tracker.add(
            self.canvas_zoom.selected,
            label=PREVIEW_LABEL,
        )

    def on_closing_callback(self):
        self.log("Goodbye!")
        self.vid.stop()
        if self.processor is not None:
            self.processor.stop()

        self.window.destroy()
コード例 #27
0
ファイル: Book_gui.py プロジェクト: sprotg/2020_3d
class Book_gui(ttk.Frame):
    def __init__(self, master=None):
        ttk.Frame.__init__(self, master)

        self.data = Books_data(False)
        self.kurv = self.data.create_new_transaction()

        self.build_GUI()

        self.opdater_transaktions_tabel()
        self.opdater_tabel()

    def opdater_tabel(self):
        l = self.data.get_book_list(200)

        self.db_view.delete(*self.db_view.get_children())
        for b in l:
            self.db_view.insert("", tk.END, values=(b.titel, b.forfatter, b.aarstal, b.get_rating(), b.id))

    def opdater_transaktions_tabel(self):
        self.trans_view.delete(*self.trans_view.get_children())
        for t in self.data.transactions:
            self.trans_view.insert("", tk.END, values=(t.id, t.get_amount(), t.status))

    def on_trans_selected(self, event):
        t = self.trans_view.item(self.trans_view.focus())['values']
        print(t)

    def on_book_selected(self, event):
        curItem = self.db_view.item(self.db_view.focus())['values']
        if len(curItem) > 0:
            b = self.data.get_book(curItem[4])

            self.lbl_titel.configure(text="Titel: {}".format(b.titel))
            self.lbl_forfatter.configure(text="Forfatter: {}".format(b.forfatter))

            self.can.delete("all")
            print(b.ratings[0]/sum(b.ratings))

            self.can.create_line(5,195,5,5, arrow=tk.LAST)
            self.can.create_line(5,195,165,195, arrow=tk.LAST)
            for i in range(0,len(b.ratings)):
                self.can.create_rectangle(i*25 + 10,190,i*25 + 30,190-200*(b.ratings[i]/sum(b.ratings)))


    def slet_bog(self):
        def close():
            dlg.destroy()
            dlg.update()

        def confirm():
            curItem = self.db_view.item(self.db_view.focus())['values']

            if len(curItem) > 0:
                b = Book()
                b.titel = curItem[0]
                b.forfatter = curItem[1]
                b.aarstal = curItem[2]
                b.id = int(curItem[4])

                self.data.slet_bog(b)
                self.opdater_tabel()

                dlg.destroy()
                dlg.update()


        dlg = tk.Toplevel()
        lbl = tk.Label(dlg, text="Vil du slette bogen?")
        lbl.grid(column=0, row=0)
        but_annuller = ttk.Button(dlg, text="Fortryd", command=close)
        but_annuller.grid(column=0,row=1)
        but_ok = ttk.Button(dlg, text="Bekræft", command=confirm)
        but_ok.grid(column=1,row=1)



    def rediger_bog(self):
        def change_book():
            b.titel = en_titel.get()
            b.forfatter = en_forfatter.get()
            self.data.update_book(b)
            b.give_rating(sc_rating.scale.get())
            self.opdater_tabel()
            dlg.destroy()
            dlg.update()

        def close():
            dlg.destroy()
            dlg.update()

        curItem = self.db_view.item(self.db_view.focus())['values']

        if len(curItem) > 0:
            b = self.data.get_book(curItem[4])

            dlg = tk.Toplevel()

            lbl_titel = ttk.Label(dlg, text='Titel')
            lbl_titel.grid(column =0, row = 0)
            en_titel = ttk.Entry(dlg)
            en_titel.grid(column=1, row=0)
            en_titel.delete(0, tk.END)
            en_titel.insert(0, b.titel)

            lbl_forfatter = ttk.Label(dlg, text='Forfatter')
            lbl_forfatter.grid(column =0, row = 1)
            en_forfatter = ttk.Entry(dlg)
            en_forfatter.grid(column=1, row=1)
            en_forfatter.delete(0, tk.END)
            en_forfatter.insert(0, b.forfatter)

            lbl_rating = ttk.Label(dlg, text='Rating')
            lbl_rating.grid(column =0, row = 2)
            sc_rating = ttk.LabeledScale(dlg, from_ = 0, to = 5)
            sc_rating.value = b.get_rating()
            sc_rating.grid(column=1, row=2)

            but_annuller = ttk.Button(dlg, text="Annuller", command=close)
            but_annuller.grid(column=1,row=3)
            but_ok = ttk.Button(dlg, text="Gem ændringer", command=change_book)
            but_ok.grid(column=0,row=3)

    def sorterTitel(self):
        self.data.sorter("titel")
        self.opdater_tabel()

    def sorterForfatter(self):
        self.data.sorter("forfatter")
        self.opdater_tabel()

    def sorterAarstal(self):
        self.data.sorter("aarstal")
        self.opdater_tabel()

    def sorterRating(self):
        self.data.sorter("rating")
        self.opdater_tabel()

    def log_text(self, msg):
        self.cons.configure(state='normal')
        self.cons.insert(tk.END, msg + '\n')
        self.cons.configure(state='disabled')
        # Autoscroll to the bottom
        self.cons.yview(tk.END)

    def ansaet(self):
        #(Opgave 4)
        #Denne funktion skal ansætte en ny Employee i butikken
        self.data.ansaet()
        self.update_ui()

    def fyr(self):
        #(Opgave 4)
        #Denne funktion skal fyre en af de ansatte
        self.data.fyr()
        self.update_ui()

    def udbetal_loen(self):
        l = self.data.udbetal_loen()
        self.log_text("Der blev udbetalt {} i løn".format(l))
        self.update_ui()

        self.after(30000, self.udbetal_loen)

    def simulate_customer(self):
        #Udsalg?
        rabat = self.sc_tilbud.scale.get() * 0.01

        amount = int(rabat * randint(100,200) + randint(0,int(500*sqrt(len(self.data.ansatte)))))
        self.data.indtaegt(amount)

        self.log_text("En kunde købte for {}".format(amount))
        self.update_ui()

        #Hvis der er udsalg, kommer der hurtigere nye kunder!
        self.after(int(5000*rabat), self.simulate_customer)


    def update_ui(self):
        self.lblAnsatte.configure(text="Antal ansatte: {}".format(len(self.data.ansatte)))
        self.lblMoney.configure(text="Pengebeholdning: {}".format(self.data.money))


    def tilfoj_kurv(self):
        curItem = self.db_view.item(self.db_view.focus())['values']
        if len(curItem) > 0:
            #Tilføj id til kurven
            self.kurv.add_item(curItem[4])
            self.kurv_text.configure(state='normal')
            self.kurv_text.delete('1.0', tk.END)
            for i in self.kurv.items:
                b = self.data.get_book(i)
                self.kurv_text.insert(tk.END, b.titel + ',' + str(b.pris) + '\n')
            self.kurv_text.configure(state='disabled')
            # Autoscroll to the bottom
            self.kurv_text.yview(tk.END)
        self.opdater_transaktions_tabel()

    def koeb(self):
        pris = self.kurv.get_amount()
        self.data.indtaegt(pris)
        self.kurv.finalize()
        self.log_text("En kunde fyldte sin kurv for {} kr.".format(pris))
        self.kurv_text.configure(state='normal')
        self.kurv_text.delete('1.0', tk.END)
        self.kurv_text.configure(state='disabled')
        self.kurv = self.data.create_new_transaction()
        self.opdater_transaktions_tabel()

    def build_GUI(self):
        self.tabs = ttk.Notebook(self)
        bog_fane = ttk.Frame(self.tabs)
        sim_fane = ttk.Frame(self.tabs)

        self.tabs.add(bog_fane, text='Bøger')
        self.tabs.add(sim_fane, text='Simulering')

        right_frame = ttk.Frame(bog_fane)
        top_frame = ttk.Frame(right_frame)
        data_frame = ttk.Frame(right_frame)
        knap_frame = ttk.Frame(bog_fane)


        self.edit_button = ttk.Button(knap_frame, text="Rediger bog", command=self.rediger_bog)
        self.edit_button.pack(side=tk.TOP)

        self.del_button = ttk.Button(knap_frame, text="Slet bog", command=self.slet_bog)
        self.del_button.pack(side=tk.TOP)

        self.add_button = ttk.Button(knap_frame, text="Tilføj til kurv", command=self.tilfoj_kurv)
        self.add_button.pack(side=tk.TOP)

        self.buy_button = ttk.Button(knap_frame, text="Køb", command=self.koeb)
        self.buy_button.pack(side=tk.TOP)

        self.kurv_text = ScrolledText(knap_frame, state='disabled', width=20,height=5)
        self.kurv_text.pack(side=tk.TOP)
        self.kurv_text.configure(font='TkFixedFont')

        self.cons = ScrolledText(sim_fane, state='disabled', height=12)
        self.cons.pack(side = tk.TOP)
        self.cons.configure(font='TkFixedFont')
        self.after(1000, self.simulate_customer)

        butAnsaet = ttk.Button(sim_fane, text="Ansæt en person", command=self.ansaet)
        butAnsaet.pack(side=tk.TOP)
        butFyr = ttk.Button(sim_fane, text="Fyr en person", command=self.fyr)
        butFyr.pack(side=tk.TOP)
        self.after(3000, self.udbetal_loen)
        self.lblMoney = ttk.Label(sim_fane, text="Pengebeholdning: {}".format(self.data.money))
        self.lblMoney.pack(side=tk.TOP)
        self.lblAnsatte = ttk.Label(sim_fane, text="Antal ansatte: {}".format(len(self.data.ansatte)))
        self.lblAnsatte.pack(side=tk.TOP)
        self.sc_tilbud = ttk.LabeledScale (sim_fane,from_=50,to=110)
        self.sc_tilbud.pack(side=tk.TOP)

        self.db_view = ttk.Treeview(data_frame, column=("column1", "column2", "column3", "column4", "column5"), show='headings')
        self.db_view.bind("<ButtonRelease-1>", self.on_book_selected)
        self.db_view.heading("#1", text="Titel", command=self.sorterTitel)
        self.db_view.column("#1",minwidth=0,width=150, stretch=tk.NO)
        self.db_view.heading("#2", text="Forfatter", command=self.sorterForfatter)
        self.db_view.column("#2",minwidth=0,width=150, stretch=tk.NO)
        self.db_view.heading("#3", text="Årstal", command=self.sorterAarstal)
        self.db_view.column("#3",minwidth=0,width=80, stretch=tk.NO)
        self.db_view.heading("#4", text="Rating", command=self.sorterRating)
        self.db_view.column("#4",minwidth=0,width=80, stretch=tk.NO)
        self.db_view.heading("#5", text="id")
        #Læg mærke til at kolonne 5 ikke bliver vist.
        #Vi kan stadig finde id på den bog der er valgt,
        #men brugeren kan ikke se id.
        self.db_view["displaycolumns"]=("column1", "column2", "column3", "column4")
        ysb = ttk.Scrollbar(data_frame, command=self.db_view.yview, orient=tk.VERTICAL)
        self.db_view.configure(yscrollcommand=ysb.set)
        self.db_view.pack(side = tk.TOP, fill=tk.BOTH)

        self.trans_view = ttk.Treeview(knap_frame, column=("column1", "column2", "column3"), show='headings')
        self.trans_view.bind("<ButtonRelease-1>", self.on_trans_selected)
        self.trans_view.heading("#1", text="id")
        self.trans_view.column("#1",minwidth=0,width=20, stretch=tk.NO)
        self.trans_view.heading("#2", text="Pris")
        self.trans_view.column("#2",minwidth=0,width=30, stretch=tk.NO)
        self.trans_view.heading("#3", text="Status")
        self.trans_view.column("#3",minwidth=0,width=80, stretch=tk.NO)
        self.trans_view["displaycolumns"]=("column1", "column2", "column3")
        ysb = ttk.Scrollbar(data_frame, command=self.trans_view.yview, orient=tk.VERTICAL)
        self.trans_view.configure(yscrollcommand=ysb.set)
        self.trans_view.pack(side = tk.TOP, fill=tk.BOTH)

        #Top Frame
        self.can = tk.Canvas(top_frame, width=200, height=200)
        self.can.grid(column=1, row=0, rowspan=2)

        self.lbl_titel = ttk.Label(top_frame, text='Titel')
        self.lbl_forfatter = ttk.Label(top_frame, text='Forfatter')
        self.lbl_titel.grid(column=0, row=0)
        self.lbl_forfatter.grid(column=0, row=1)

        top_frame.pack(side=tk.TOP)
        data_frame.pack(side = tk.TOP)
        knap_frame.pack(side = tk.LEFT, fill=tk.Y)
        right_frame.pack(side=tk.RIGHT, fill=tk.Y)
        self.tabs.pack(expand=1, fill="both")

        self.pack()

        self.after(10000, self.udbetal_loen)
        self.after(1000, self.simulate_customer)
コード例 #28
0
ファイル: 翻译.py プロジェクト: ruyisymple/-GUI
    def __init__(self):
        # 打包图片资源
        # 详情参考:https://www.pythonf.cn/read/49736
        # 详情参考:https://www.cnblogs.com/darcymei/p/9397173.html
        def getPath(filename):
            # 方法一(如果要将资源文件打包到app中,使用此法)
            bundle_dir = getattr(sys, '_MEIPASS',
                                 os.path.abspath(os.path.dirname(__file__)))
            path = os.path.join(bundle_dir, filename)
            # 方法二获取路径可以,但如果打包资源好像不行。
            # path = os.path.join(os.path.dirname(sys.argv[0]), filename)
            return path

        # 界面
        window = tk.Tk()
        window.title("翻译")
        window.geometry("800x500")
        window.resizable(0, 0)  # 设置窗口大小不可变
        window.configure(bg='SkyBlue')
        str = '注意:原文中不允许出现连续符号,否则无法后续翻译'
        lab1 = tk.Label(window, text=str, font=('Arial', 10), bg='SkyBlue')
        lab1.place(x=10, y=465)
        lab2 = tk.Label(window,
                        text="版本号:3.0",
                        font=('Roman', 15),
                        bg='SkyBlue')
        lab2.place(x=650, y=465)

        # 菜单
        # 菜单功能
        def save_as():
            a1 = tkinter.filedialog.asksaveasfilename()  #返回文件名
            with open(a, 'w') as f:
                f.write(t1.get('0.0', 'end') + '\n' + t2.get('0.0', 'end'))

        a2 = ''  # 保存路径

        def change_path():
            nonlocal a2  # 函数内改变函数外的值
            a2 = tkinter.filedialog.askdirectory()  #返回目录名

        def save_translation():
            name = tkinter.simpledialog.askstring(title='保存',
                                                  prompt='请输入保存文件名:',
                                                  initialvalue='译文.txt')
            with open(a2 + name, 'w') as f:
                f.write(t2.get('0.0', 'end'))

        def save_All():
            name = tkinter.simpledialog.askstring(title='保存',
                                                  prompt='请输入保存文件名:',
                                                  initialvalue='译文.txt')
            with open(a2 + name, 'w') as f:
                f.write(t1.get('0.0', 'end') + '\n' + t2.get('0.0', 'end'))

        datalist1 = []  # 储存记录
        datalist2 = []
        i = -1  # 标记迭代

        def go_back():
            lenth = len(datalist1)
            if lenth != 0:
                nonlocal i
                if i == lenth - 2:
                    i = -1
                i += -1
                t1.delete('0.0', 'end')
                t2.delete('0.0', 'end')
                t1.insert('insert', datalist1[i])
                t2.insert('insert', datalist2[i])
                if i == -lenth or i == 0:
                    i = -lenth + 1

        logo2 = tk.PhotoImage(file=getPath("image\\last.png"))
        b3 = tk.Button(window,
                       image=logo2,
                       width=50,
                       height=30,
                       command=go_back)
        b3.place(x=620, y=11)

        def go_up():
            lenth = len(datalist1)
            nonlocal i
            if lenth != 0:
                if i == -lenth + 1:
                    i = 0
                i += 1
                t1.delete('0.0', 'end')
                t2.delete('0.0', 'end')
                t1.insert('insert', datalist1[i])
                t2.insert('insert', datalist2[i])
                if i == lenth - 1 or i == -1:
                    i = lenth - 2

        logo3 = tk.PhotoImage(file=getPath("image\\next.png"))
        b4 = tk.Button(window, image=logo3, width=50, height=30, command=go_up)
        b4.place(x=720, y=10)

        def clear_cache():
            nonlocal datalist1, datalist2
            del datalist1[:]
            del datalist2[:]

        # 创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
        menubar = tk.Menu(window)
        # 创建一个File菜单项(默认不下拉,下拉内容包括Save,Exit功能项)
        # 将tearoff设置为1以后,就是表明这个菜单是可以独立出来的,如果是0的话就不可以独立出来
        filemenu = tk.Menu(menubar, tearoff=0)
        Editmenu = tk.Menu(menubar, tearoff=0)
        # 将上面定义的空菜单命名为File,放在菜单栏中,就是装入那个容器中
        menubar.add_cascade(label='File', menu=filemenu)
        menubar.add_cascade(label='Edit', menu=Editmenu)
        # 创建第二级菜单,即菜单项里面的菜单
        submenu = tk.Menu(filemenu, tearoff=0)  # 和上面定义菜单一样,不过此处实在File上创建一个空的菜单
        # 给放入的菜单submenu命名为save
        filemenu.add_cascade(label='保存', menu=submenu, underline=0)
        # 这里和上面创建原理也一样,在save菜单项中加入一个小菜单命令Submenu_1
        submenu.add_command(label='保存译文', command=save_translation)
        submenu.add_command(label='保存全部', command=save_All)
        filemenu.add_separator()  # 添加一条分隔线
        # 用tkinter里面自带的quit()函数
        filemenu.add_cascade(label='另存为', command=save_as)
        filemenu.add_cascade(
            label='联系作者',
            command=lambda: tkinter.messagebox.showinfo(
                '联系', '有什么建议请和作者联系:' + '\n' + 'QQ:2632959526(如一)' + '\n' +
                '^_^'.center(30)))
        verstr = '版本1.0:内置老版本有道翻译'+'\n'\
                 '版本2.0:优化翻译,更新新版本有道翻译'+'\n'\
                 '版本3.0:新添清除缓存,将前进后退设置为按钮放在界面上,优化界面,加入logo'+'\n'
        filemenu.add_cascade(
            label='版本详情',
            command=lambda: tkinter.messagebox.showinfo('版本变动', verstr))
        filemenu.add_command(label='退出', command=window.quit)

        Editmenu.add_cascade(label='更改默认路径', command=change_path)
        Editmenu.add_cascade(label='清除缓存', command=clear_cache)
        window.config(menu=menubar)
        # 文本框
        t1 = ScrolledText(window, height=30, width=50, bg='LightCyan')
        t1.pack(side='left')
        t2 = ScrolledText(window, height=30, width=50, bg='LightCyan')
        t2.pack(side='right')
        t2.configure(state='disabled')  # 只读
        lab3 = tk.Label(window, text="logo", font=('Arial', 7), bg='SkyBlue')
        lab3.place(x=770, y=450)
        # 说明图片位置,并导入图片到画布上
        canvas = tk.Canvas(window, width=30, height=30)
        image_file = tk.PhotoImage(file=getPath('image\\bg1.gif'))
        image = canvas.create_image(100, 100, anchor='se', image=image_file)
        canvas.place(x=765, y=465)

        # 翻译
        def trat():

            t2.delete('0.0', 'end')  # 将译文清除
            t2.configure(state='normal')  # 可写
            var = t1.get('0.0', 'end')
            # 无论是谷歌翻译或者是有道翻译我都发现了一个问题,那就是在中译英的过程中,如果碰到中文的句号或者感叹号等使段落结束的标点符号,那么就会切分翻译,最后以元组返回,
            var1 = var.replace('\n', ' ').replace('。', '.').replace('!', '.')
            content = ''  # 获取翻译内容
            # 调用翻译函数
            y = Youdao(var1)
            y.get_result()
            content = target['translateResult'][0][0]['tgt']
            t2.insert('insert', content)
            datalist1.append(t1.get('0.0', 'end'))
            datalist2.append(t2.get('0.0', 'end'))
            count = len(datalist1)

        logo1 = tk.PhotoImage(file=getPath("image\\translate.png"))
        b1 = tk.Button(window, image=logo1, width=85, height=35, command=trat)
        b1.place(x=0, y=10)

        # 重置
        def reset():
            print(a2)
            flag = tk.messagebox.askquestion(title='重置', message='是否重置?')
            if flag == 'yes':
                t1.delete('0.0', 'end')
                t2.delete('0.0', 'end')
                t2.configure(state='disabled')  # 只读

        logo4 = tk.PhotoImage(file=getPath("image\\reset.png"))
        b2 = tk.Button(window, image=logo4, width=40, height=30, command=reset)
        #b2 = tk.Button(window, text='重置', bg='red', font=('Arial', 12), width=5, height=1, command=reset)
        b2.place(x=380, y=410)
        window.mainloop()
コード例 #29
0
ファイル: GUI.py プロジェクト: grunmurstraumr/h3xh4x
class GUI:
    def __init__(self):
        self.root = tk.Tk()
        self.root.minsize(300, 300)
        self.root.geometry('1000x700')

        #Initialize variables
        self.frame_index = 0
        self.frame_count = float('NaN')
        self.text_available = True
        self.data = []

        #Set up view window
        self.tabbed_views = ttk.Notebook(master=self.root)
        self.hex_frame = tk.Frame(master=self.tabbed_views)
        self.hex_window = ScrolledText(master=self.hex_frame, wrap=tk.WORD)#tk.Text(master=self.hex_frame, wrap=tk.WORD)
        #self.hex_scroll = tk.Scrollbar(master=self.hex_frame, command=self.hex_window.yview())
        self.text_frame = tk.Frame(master=self.tabbed_views)
        self.text_window = ScrolledText(master=self.text_frame)
        #self.text_scroll = tk.Scrollbar(master=self.text_frame, command=self.text_window.yview())
        self.tabbed_views.add(self.hex_frame, text='Hex')
        self.tabbed_views.add(self.text_frame, text='Text')
        self.tab_id = self.tabbed_views.select()
        self.current_tab = self.hex_window  # Should point to a selected tab in ttk.


        #Set up menus
        self.main_menu = tk.Menu(master=self.root)
        self.file_menu = tk.Menu(master=self.main_menu)
        self.file_menu.add_command(label='Load File', command=self.load_file)
        self.file_menu.add_command(label="Save file", command=self.save_file)
        self.main_menu.add_cascade(label='File', menu=self.file_menu)

        #Bind events
        self.hex_window.bind('<Visibility>', self._switch_tab)
        self.text_window.bind('<Visibility>', self._switch_tab)

        #Set up labels
        self.byte_number_label = tk.Label(self.root)
        self.error_label = tk.Label(master=self.root, foreground=config.get('PALETTE', 'error_foreground'))
        self.frame_count_label = tk.Label(text="{} of {}".format(self.frame_index, self.frame_count))

        #Set up buttons
        self.nav_button_frame = tk.Frame()
        self.previous_frame_btn = tk.Button(master=self.nav_button_frame, text="Previous frame", command=self._print_previous_frame)
        self.next_frame_btn = tk.Button(master=self.nav_button_frame, text='next frame', command=self._print_next_frame)

        #Pack and position
        self.root.config(menu=self.main_menu)
        self.next_frame_btn.grid(row=0, column=1)
        self.previous_frame_btn.grid(row=0, column=0)
        self.frame_count_label.pack()
        self.nav_button_frame.pack()
        self.error_label.pack()
        self.tabbed_views.pack(fill=tk.BOTH, expand=1)
        self.text_window.pack(fill=tk.BOTH, expand=1)
        self.hex_window.pack(fill=tk.BOTH, expand=1)
        self.byte_number_label.pack()


    def _switch_tab(self, event):
        try:
            self._update_data()
            self.tab_id = self.tabbed_views.select()
            self.current_tab = event.widget
            self._update_view()

        except ValueError:
            self.tabbed_views.select(self.tab_id)
            self.report_input_error()
            return


    def _update_view(self):
        if not self.data:
            "Early exit if no data is present"
            return
        #Clear editor window
        self.frame_count_label.configure(text="{} of {}".format(self.frame_index+1, self.frame_count))
        self.current_tab.delete('0.0', tk.END)
        #Insert new content
        output = None
        if self.current_tab is self.hex_window:
            output = self._hexify_output(self.data[self.frame_index])
        elif self.current_tab is self.text_window:
            output = self._textify_output(self.data[self.frame_index])
            if not self.text_available:
                self.text_window.configure(foreground=config.get("PALETTE", "error_foreground"), wrap=tk.WORD)
                self.error_label.configure(text="Warning, no text representation available. Hex displayed instead.")
            else:
                self.text_window.configure(foreground=config.get('PALETTE', 'standard_foreground'), wrap=tk.CHAR)
                self.error_label.configure(text="")
        else:
            raise RuntimeError
        self.current_tab.insert(tk.END, output)

    def _update_data(self):
        try:
            self.data[self.frame_index] = self._validate_and_retrieve_data()
        except IndexError: # No data is previously loaded, assume new data is entered
            self.data.append(self._validate_and_retrieve_data())

    def _validate_and_retrieve_data(self):
        if self.current_tab is self.hex_window or not self.text_available:
            return self._validate_hex_data()
        else:
            return self._validate_string_data()

    def report_input_error(self):
        """Raises an alert window to inform the user that there is erroneous input"""
        showwarning('Warning', "Invalid input detected. Please check that everything is correct before proceeding")

    def _print_next_frame(self):
        #Check so data is loaded, Do nothing if theres no data
        if not self.data:
            return

        #Save changes made in editor to data.
        try:
            self.data[self.frame_index] = self._validate_and_retrieve_data()
        except ValueError as error:
            self.report_input_error()
            return
        #Increment the frame 'pointer'
        self.frame_index += 1
        #Check if the pointer is past the end and if so reset to begining
        if self.frame_index > len(self.data)-1:
            self.frame_index -= len(self.data)

        self._update_view()

    def _print_previous_frame(self):
        # Check so data is loaded, Do nothing if theres no data
        if not self.data:
            return

        #Save changes made in editor.
        try:
            self.data[self.frame_index] = self._validate_and_retrieve_data()
        except ValueError as error:
            self.report_input_error()
            return
        self.frame_index -= 1
        if self.frame_index < 0:
            #If we move past the first frame, load the last instead
            self.frame_index = len(self.data)-1

        self._update_view()

    def load_file(self):
        filename = filedialog.askopenfilename(initialdir=os.curdir, filetypes=(("All files", "*.*"),("Executable","*.exe"),))
        if filename:
            self.file_cursor_pos = 0
            self.current_tab.delete('0.0', tk.END)
            self.load_file_data(filename)
            self.frame_count_label.config(text='{} of {}'.format(self.frame_index,self.frame_count))
            self._update_view()


    def load_file_data(self, filename: str):
        buffer_size = int(config.get(option='buffer_size', section='FILES', fallback=8192))
        print(buffer_size)
        self.data = []
        self.frame_index = 0
        with open(filename, mode='rb') as file:
            while True:
                chunk = file.read(buffer_size)
                if chunk:
                    self.data.append(chunk)
                else:
                    break
        self.frame_count = len(self.data)
        self.text_available = True
        if self.frame_count == 0:
            #Emty file was read. Append empty bytes object to data
            self.data.append(bytes(''))
        #for index in range(0, self.frame_count):
        #    self.data[index] = ' '.join([hexify(char) for char in self.data[index]])

        return self.data

    def _hexify_output(self, data):
        return ' '.join([hexify(char) for char in data])

    def _textify_output(self, data):
        """Returns the string representation of input data if it can be decoded. Falls back to hexify_output if an error
        occurs. """
        try:
            self.text_available = True
            return data.decode(STRING_ENCODING)
        except Exception:
            self.text_available = False
            return self._hexify_output(data)

    def save_file(self):
        try:
            self.data[self.frame_index] = self._validate_and_retrieve_data()
        except ValueError as error:
            self.report_input_error()
            return
        except IndexError:
            #No data exists in current frame. Append to data
            self.data.append(self._validate_and_retrieve_data())
        filename = filedialog.asksaveasfilename(initialdir=os.curdir)
        if filename:
            self._write_file(filename)

    def _validate_hex_data(self):
        """Validates that data retrieved from window is valid hex-data by converting it to bytes. Returns the data
        if it is valid"""
        data = self.current_tab.get('0.0', tk.END)[:-1] #This returns a newline character at the end, slice to remove
        return bytes.fromhex(data)

    def _validate_string_data(self):
        data = self.current_tab.get('0.0', tk.END)[:-1]
        return bytes(data, STRING_ENCODING)

    def _write_file(self, filename):
        with open(filename, mode='wb') as file:
            file.write(b''.join(self.data))


    def run(self):
        self.root.mainloop()
コード例 #30
0
class Window(tk.Tk):
    """Show a Tk window with scrollable text from stdin.

    Checks stdin for a new line every one millisecond. If the line starts with
    a \`#', the rest of the line is used as a new title for the window.
    Otherwise, the line is appended to the textfield, including the newline
    character.
    """

    def __init__(self):
        """Initialize the window.

        Creates a frame, holding a srollable textfield. Finally reading from
        stdin is initiated.
        """
        super().__init__()

        self.font = Font(size=20)

        self.title('State Machine')

        self.frame = tk.Frame(self)
        self.frame.pack(fill='both', expand=True)

        self.text = ScrolledText(self.frame, wrap='word', font=self.font)
        self.text.configure(state='disabled')
        self.text.pack(side='top', fill='both', expand=True)
        self.text.bind('<1>', lambda ev: self.text.focus_set())

        self.geometry('500x400')

        self.after(1, self.do_read)

    def do_read(self):
        """Try to read a line from stdin."""
        line = sys.stdin.readline()

        if line is not None and line != '':
            self.process_line(line)

        self.after(1, self.do_read)

    def process_line(self, line):
        """Process a line for debug display.

        If a line starts with \`#', change the window's title. Otherwise, write
        the line to the textbox.

        Arguments:
            line: the line to be processed, including newline character
        """
        if line[0] == '#':
            self.title(line[1:].rstrip('\n'))

        else:
            self.write_text(line)

    def write_text(self, text):
        """Write text to the end of the textfield.

        Arguments:
            text: the text to be added to the textfield.
        """
        self.text.configure(state='normal')

        self.text.insert('end', text)

        # Only autoscroll when at end.
        if self.text.vbar.get()[1] == 1.0:
            self.text.pos = self.text.index('end - 1 char')
            self.text.yview_pickplace('end')

        self.text.configure(state='disabled')
コード例 #31
0
class Consulta_GUI():
    def __init__(self, janela):
        def sair():
            driver.quit()
            self.janela.destroy()

        self.janela = janela
        self.menubar = Menu(self.janela)
        self.janela.config(menu=self.menubar)

        self.Menu_1 = Menu(self.menubar)
        self.Menu_2 = Menu(self.menubar)
        self.Menu_3 = Menu(self.menubar)

        self.menubar.add_cascade(label='Opcões', menu=self.Menu_1)
        self.menubar.add_cascade(label='Ajuda', menu=self.Menu_3)

        self.Menu_1.add_command(label="Sair", command=sair),

        self.cancelou = BooleanVar()
        self.cancelou.set(False)
        self.tipo = IntVar()
        self.tipo.set(1)

        def mudartipo(x):
            self.tipo.set(x)

        self.r1 = Radiobutton(self.janela,
                              text="Placa ",
                              value=1,
                              variable=self.tipo,
                              command=lambda: mudartipo(1)).place(x=65,
                                                                  y=10,
                                                                  width=70,
                                                                  height=25)
        self.r2 = Radiobutton(self.janela,
                              text="Chassi",
                              value=2,
                              variable=self.tipo,
                              command=lambda: mudartipo(2)).place(x=140,
                                                                  y=10,
                                                                  width=70,
                                                                  height=25)
        self.LabelDados = Label(self.janela, text='Dados:',
                                fg="#000").place(x=10,
                                                 y=10,
                                                 width=50,
                                                 height=25)
        self.Entrada_Dados = ScrolledText(self.janela, fg="#000")
        self.Entrada_Dados.place(x=10, y=36, width=630, height=190)
        self.Saida_Dados = ScrolledText(self.janela, fg="#000", wrap=NONE)
        self.xbar = Scrollbar(orient='horizontal',
                              command=self.Saida_Dados.xview)
        self.LabelResultado = Label(self.janela,
                                    text='Resultado da Pesquisa:',
                                    fg="#000").place(x=10,
                                                     y=225,
                                                     width=120,
                                                     height=25)
        self.Saida_Dados.place(x=10, y=252, width=780, height=237)
        self.Saida_Dados.configure(xscrollcommand=self.xbar.set)
        self.xbar.place(x=10, y=490, width=780, height=15)
        self.Btn_Consultar = Button(self.janela,
                                    text="Processar",
                                    bg='#228B22',
                                    fg='#fff',
                                    command=self.Atualizar).place(x=650,
                                                                  y=40,
                                                                  width=120,
                                                                  height=25)
        self.Btn_Cancelar = Button(self.janela,
                                   text="Cancelar",
                                   bg='red',
                                   fg='#fff',
                                   command=self.Cancelar).place(x=650,
                                                                y=75,
                                                                width=120,
                                                                height=25)
        self.Btn_LimparDados = Button(self.janela,
                                      text="Limpar Dados",
                                      bg='blue',
                                      fg='#fff',
                                      command=self.LimparDados).place(
                                          x=650, y=110, width=120, height=25)
        self.Btn_LimparResultado = Button(self.janela,
                                          bg='#B0C4DE',
                                          fg='#fff',
                                          text="Limpar Resultado",
                                          command=self.LimparResultado).place(
                                              x=650,
                                              y=145,
                                              width=120,
                                              height=25)
        self.Btn_LimparTudo = Button(self.janela,
                                     bg='yellow',
                                     fg='black',
                                     text="Limpar Tudo",
                                     command=self.LimparTudo).place(x=650,
                                                                    y=180,
                                                                    width=120,
                                                                    height=25)

        self.BarraStatus = Label(self.janela,
                                 text='Informe a Placa ou chassi...',
                                 fg="#000")
        self.BarraStatus.place(x=10, y=510, height=15)
        self.BarraStatusVersao = Label(self.janela,
                                       text='versão: ' + versao + ' - ' +
                                       dataversao,
                                       fg="#000")
        self.BarraStatusVersao.place(x=650, y=510, height=15)

        self.PlacaChassi = ''

        janela.mainloop()

    def LimparDados(self):
        self.Entrada_Dados.delete('1.0', END)

    def LimparResultado(self):
        self.Saida_Dados.delete('1.0', END)

    def LimparTudo(self):
        self.Entrada_Dados.delete('1.0', END)
        self.Saida_Dados.delete('1.0', END)

    def Cancelar(self):
        self.cancelou.set(True)

    def Pesquisar(self):
        driver.get(
            'https://portal.sesp.mt.gov.br/portaldaseguranca/pages/veiculo/consultaVeiculoRoubado.seam'
        )
        #time.sleep(0.5) # Let the user actually see something!
        if (self.tipo.get() == 1):
            driver.find_element_by_css_selector(
                "#consultaVeiculo\:busca\:veiculoOpcao [value='PLACA']").click(
                )
            time.sleep(0.1)
            oplaca = driver.find_element_by_css_selector(
                "#consultaVeiculo\\:j_id46\\:placa")
            oplaca.send_keys(self.PlacaChassi)
        else:
            ochassi = driver.find_element_by_css_selector(
                "#consultaVeiculo\:chassi\:descricao")
            ochassi.send_keys(self.PlacaChassi)

        driver.find_element_by_css_selector(
            "#consultaVeiculo\:consultar").click()

        strMarcaModelo = ''
        strPlaca = ''
        strAnos = ''
        strCor = ''
        strChassi = ''
        strMensagem = ''
        time.sleep(0.5)

        # marca/modelo
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="situacao-veiculo"]/div[2]/ul/li[2]')
            strMarcaModelo = elemento.get_attribute("innerText")
            pattern = re.compile('\n', re.MULTILINE)
            strMarcaModelo = pattern.sub('', strMarcaModelo)
            pattern = re.compile('Marca\/Modelo:', re.MULTILINE)
            strMarcaModelo = pattern.sub('', strMarcaModelo)

        except:
            pass
        # placa
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="situacao-veiculo"]/div[2]/ul/li[3]')
            strPlaca = elemento.get_attribute("innerText")
            pattern = re.compile('\n', re.MULTILINE)
            strPlaca = pattern.sub('', strPlaca)
            pattern = re.compile('Placa:', re.MULTILINE)
            strPlaca = pattern.sub('', strPlaca)
        except:
            pass
        # anos
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="situacao-veiculo"]/div[2]/ul/li[4]')
            strAnos = elemento.get_attribute("innerText")
            pattern = re.compile('\n', re.MULTILINE)
            strAnos = pattern.sub('', strAnos)
            pattern = re.compile('Ano:', re.MULTILINE)
            strAnos = pattern.sub('', strAnos)
            pattern = re.compile(' \/ ', re.MULTILINE)
            strAnos = pattern.sub('\t', strAnos)

        except:
            pass
        # cor
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="situacao-veiculo"]/div[2]/ul/li[5]')
            strCor = elemento.get_attribute("innerText")
            pattern = re.compile('\n', re.MULTILINE)
            strCor = pattern.sub('', strCor)
            pattern = re.compile('Cor:', re.MULTILINE)
            strCor = pattern.sub('', strCor)

        except:
            pass
        # chassi
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="situacao-veiculo"]/div[2]/ul/li[6]')
            strChassi = elemento.get_attribute("innerText")
            pattern = re.compile('\n', re.MULTILINE)
            strChassi = pattern.sub('', strChassi)
            pattern = re.compile('Chassi:', re.MULTILINE)
            strChassi = pattern.sub('', strChassi)

        except:
            pass

        # REGISTRO NAO ENCONTRADO
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="gritter-item-1"]/div/div[1]/span')
            strMensagem = elemento.get_attribute("innerText")

        except:
            pass

        # REGISTRO NAO ENCONTRADO
        try:
            elemento = driver.find_element_by_xpath(
                '//*[@id="consultaVeiculo:statusVeiculo"]')
            if strMensagem == '':
                strMensagem = 'Veículo Roubado/Furtado: ' + elemento.get_attribute(
                    "innerText")
            else:
                strMensagem = strMensagem + ' / Veículo Roubado/Furtado: ' + elemento.get_attribute(
                    "innerText")

        except:
            pass

        self.Saida_Dados.insert(
            END, self.PlacaChassi + '\t' + '=>\t' + strPlaca + '\t' +
            strMarcaModelo + '\t' + strAnos + '\t' + strCor + '\t' +
            strChassi + '\t' + strMensagem + '\n')

    def Atualizar(self):
        #self.Btn_Consultar.configure(state = 'DISABLED')
        self.cancelou.set(False)
        th = threading.Thread(target=self.Processar)
        th.start()
        #self.Btn_Consultar.configure(state = 'NORMAL')

    def Processar(self):

        dados = self.Entrada_Dados.get('1.0', END)
        valores = dados.split('\n')
        # remove itens em branco
        valores = [i for i in valores if i]

        try:
            i = 0
            for x in valores:
                if self.cancelou.get() == True: break

                i += 1
                self.BarraStatus.configure(text='Processando...' + str(i) +
                                           ' de ' + str(len(valores)) + ': ' +
                                           x)
                x = x.replace(' ', '')
                x = x.replace('-', '')

                self.PlacaChassi = x

                try:
                    self.Pesquisar()
                except:
                    self.Pesquisar()

            if self.cancelou.get() == True:
                self.BarraStatus.configure(text='Cancelado pelo usuário')
            else:
                self.BarraStatus.configure(text='Informe Placa ou Chassi...')

        except Exception as e:
            self.BarraStatus.configure(text="Favor reprocessar")
            messagebox.showinfo("ALLRisk - Consulta Placa MT - erro", e)
コード例 #32
0
ファイル: pyNote.py プロジェクト: DavidJacobson/PyNote
	create=open("note"+str(lastfound+1)+".txt","w")
	create.close()
	to_open.append("note"+str(lastfound+1)+".txt")
else:
	#Stupid hacky bug fix for when it's not the first file
	create=open("note0.txt","w")
	create.close()

for i in to_open:
	window.append(Tk()) #Create a new window for each note

for i in window:
	textbox=ScrolledText(i)
	#Set coloring
	i.configure(background="#FFFFA0")
	textbox.configure(background="#FFFFA0")
	
	textbox.pack()
	textboxes.append(textbox) #Make a list of all the textbook objects

for i in range(len(window)):
	window[i].wm_title("note "+str(i)) #Set the title
	to_open[i]
	with open(to_open[i],"r") as to_read:
		for iii in to_read:
			textbox.insert("0.0",iii)
def main():
	ii=0
	
	for i in window:
		textbox=textboxes[ii]
コード例 #33
0
class ChatClientGUI(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.master = master
        self.master.protocol("WM_DELETE_WINDOW", self.close_window)
        self.master.title("Chat Client GUI")
        self.pack(fill="both", expand=True)
        self.font = font.Font(font=("Helvetica Neue", 12))
        self.background_color = "#333333"
        self.box_background_color = "#655F5F"
        self.text_color = "#FFFFFF"

        # Build the chat
        self.chat_frame = Frame(self)
        self.chat_frame.pack(fill="both", expand=True, anchor="nw")
        self.chat_frame.configure(bg=self.background_color)
        self.chat_box = ScrolledText(self.chat_frame,
                                     font=self.font,
                                     wrap="word")
        self.chat_box.configure(state="disabled",
                                bg=self.box_background_color,
                                fg=self.text_color)
        self.chat_box.pack(side="left",
                           fill="both",
                           expand=True,
                           padx=5,
                           pady=5,
                           anchor="nw")

        # Users list
        self.users_label = Label(self.chat_frame,
                                 text="Users in Channel",
                                 bg=self.background_color,
                                 fg=self.text_color,
                                 font=font.Font(font=("Helvetica Neue", 12,
                                                      "bold")))
        self.users_label.pack(side="top", anchor="n")
        self.users_box = ScrolledText(self.chat_frame,
                                      font=self.font,
                                      width=25)
        self.users_box.configure(state="disabled",
                                 bg=self.box_background_color,
                                 fg=self.text_color)
        self.users_box.pack(side="right",
                            fill="y",
                            padx=5,
                            pady=5,
                            anchor="ne")

        # Build the input section
        self.input_frame = Frame(self, height=1)
        self.input_frame.pack(side="bottom", fill="x", anchor="sw")
        self.input_frame.configure(bg=self.background_color)
        self.chat_input = Entry(self.input_frame, font=self.font)
        self.chat_input.configure(bg=self.box_background_color,
                                  fg=self.text_color,
                                  insertbackground=self.text_color)
        self.chat_input.pack(side="left",
                             fill="x",
                             expand=True,
                             padx=5,
                             pady=5)
        self.chat_input.bind("<Return>", self.send_message_on_return)
        self.send_button = Button(self.input_frame,
                                  text="Send",
                                  width=10,
                                  command=self.send_message,
                                  bg=self.box_background_color,
                                  fg=self.text_color)
        self.send_button.pack(side="right", fill="x", padx=5, pady=5)

        # Update the window and then set the minsize
        self.master.update()
        self.master.minsize(self.master.winfo_width(),
                            self.master.winfo_height())

        # Non tkinter class variables
        self.instance = None
        self.running = True

        # Spawn threads used for chat client and channel users fetch
        self.chat_client_thread = Thread(target=self.start_chat_client)
        self.chat_client_thread.start()
        self.users_fetch = Thread(target=self.get_users)
        self.users_fetch.start()

    def send_message(self):
        message = self.chat_input.get()
        self.instance.send_privmsg(message)
        self.write_to_chatbox(message, self.instance.client_username)
        self.chat_input.delete(0, "end")

    def send_message_on_return(self, event):
        # Forward to the send message handler (to get around needing the "event" parameter)
        self.send_message()
        del event

    def write_to_chatbox(self, msg, username):
        date = f"[{datetime.now():%I:%M:%S}] "
        formatted_message = f"{date} {username}: {msg}"
        self.chat_box.configure(state="normal")
        self.chat_box.insert("end", formatted_message + "\n")
        self.chat_box.see("end")
        self.chat_box.configure(state="disabled")

    def write_many(self, msg, times):
        for _ in range(times):
            self.write_to_chatbox(msg)

    def start_chat_client(self):
        with open("settings.json", "r") as r:
            settings = json.load(r)
            username = settings["username"]
            token = settings["token"]
            channel = settings["channel"]
            server = settings["server"]
            port = settings["port"]
        self.instance = IRCClient(username, token, channel, server, port,
                                  settings, self)
        self.instance.start()

    def get_users(self):
        while self.running:
            time.sleep(5)
            users = self.instance.channels.get(self.instance.channel).users()
            self.users_box.configure(state="normal")
            self.users_box.delete('1.0', 'end')
            for user in users:
                self.users_box.insert('end', user + "\n")
            self.users_box.configure(state="disabled")

    def close_window(self):
        self.running = False
        self.instance.disconnect()
        os._exit(0)
コード例 #34
0
ファイル: texthandler.py プロジェクト: cachitas/uar
            self.text.configure(state='normal')
            self.text.insert('end', msg + '\n')
            self.text.configure(state='disabled')
            self.text.yview('end')  # autoscroll to the bottom

        # This is necessary because we can't modify the Text from other threads
        self.text.after(0, append)


# Sample usage
if __name__ == '__main__':
    # Create the GUI
    root = tk.Tk()

    st = ScrolledText(root, state='disabled')
    st.configure(font='TkFixedFont')
    st.pack()

    # Create textLogger
    text_handler = TextHandler(st)

    # Add the handler to logger
    logger = logging.getLogger()
    logger.addHandler(text_handler)

    # Log some messages
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')