基于python实现的聊天室(客户端:三)发送表情实现

基于python实现的聊天室(客户端:三)发送表情实现,第1张

前言

这是一个基于python的聊天室

需求

实现表情发送

过程

首先我想实现的是表情发送,那么就需要点击对吧,首先我们得知道点击的是什么控件,点击控件之后怎么获取到表情符号,在加到输入框上。


选择控件

首先给大家看个图,就是这个ttkbootstrap.DateEntry控件,下面的日期的选中是不是非常符合我们对于表情排列的需求呢,所以,我开始看他的源代码。




我为了偷懒甚至是直接copy了他的整个类来跑,最后发现在 def _on_date_ask(self):这个方法里,使用了一个静态方法

new_date = Querybox.get_date(
            parent=self.entry,
            startdate=old_date,
            firstweekday=self._firstweekday,
            bootstyle=self._bootstyle,
        )

对,就是这东西创造了选择日期的窗口,那么,我们继续深入看看他是怎么做的

chooser = DatePickerDialog(
            parent=parent,
            title=title,
            firstweekday=firstweekday,
            startdate=startdate,
            bootstyle=bootstyle,
        )
return chooser.date_selected

在静态方法get_date这里,会发现他实例化了DatePickerDialog这个类,所以并且会返回这个实例的一个属性,而且属性叫date_selected,所以我们再点开查看这个DatePickerDialog类
于是功夫不负有心人,我们能找到这个画日历的方法,仔细一看,他是在最底下可以很明显看到btn = Radiobutton,所以我们终于明白那个可以选中日期的东西,就是Radiobutton,并且,我们看到,里面有一个variable参数是self.datevar,在初始化函数中又有self.datevar = ttk.IntVar(),所以我们可以知道只需要一个变量即可获取所有这些Radiobutton的值,所以我们就开始动手吧

    def _draw_calendar(self):
        self._update_widget_bootstyle()
        self._set_title()
        self._current_month_days()
        self.frm_dates = ttk.Frame(self.frm_calendar)
        self.frm_dates.pack(fill=BOTH, expand=YES)

        for row, weekday_list in enumerate(self.monthdays):
            for col, day in enumerate(weekday_list):
                self.frm_dates.columnconfigure(col, weight=1)
                if day == 0:
                    ttk.Label(
                        master=self.frm_dates,
                        text=self.monthdates[row][col].day,
                        anchor=CENTER,
                        padding=5,
                        bootstyle=SECONDARY,
                    ).grid(row=row, column=col, sticky=NSEW)
                else:
                    if all(
                        [
                            day == self.date_selected.day,
                            self.date.month == self.date_selected.month,
                            self.date.year == self.date_selected.year,
                        ]
                    ):
                        day_style = "secondary-toolbutton"
                    else:
                        day_style = f"{self.bootstyle}-calendar"

                    def selected(x=row, y=col):
                        self._on_date_selected(x, y)

                    btn = ttk.Radiobutton(
                        master=self.frm_dates,
                        variable=self.datevar,
                        value=day,
                        text=day,
                        bootstyle=day_style,
                        padding=5,
                        command=selected,
                    )
                    btn.grid(row=row, column=col, sticky=NSEW)
制作表情区域
emoji_list = ['🐻', '🗿', '🙃', '😊', '🥲',
              '🥰', '🤬', '🥶', '🥵', '😳',
              '🤮', '🤩', '🤓', '😝', '🌚',
              '🙈', '🤪', '🏩', '🚸','🤺',
              '🚾', '🉑', '🉐', '㊙', '🈶',
              '🈚', '🆘', '🆗', '🪙', '🤟',
              '👊', '😭', '🙏', '🙌', '🦓',
              '🦜', '🦄', '🎃', '✔', '™']
    def show_emoji_list(self):
        row = 1
        col = 1
        for e in emoji_list:
            btn = Radiobutton(self.frame, bootstyle='dark-outline-toolbutton', variable=self.emoji_var, value=e,
                              text=e, command=lambda: self.add_emoji(self.emoji_var.get()))
            btn.grid(row=row, column=col, sticky='nsew')
            col += 1
            if col == 6:
                row += 1
                col = 1

    def add_emoji(self, emoji):
        self.e.insert('end', emoji)
总结

如有建议,还请多多指教

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/570732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存