【问题标题】:Tkinter Chatbot Speech Bubbles designTkinter 聊天机器人语音气泡设计
【发布时间】:2019-05-06 12:52:40
【问题描述】:

首先我很抱歉我的英语不好。我正在设计一个与 tkinter 作为业余爱好者的聊天机器人。我想在对话框窗口中添加类似whatsapp 的气球。我还希望文字从下往上放在窗口中。我试图把它当作画布,但它没有发生。我尝试作为标签但给出了错误。如果您能帮助我,我将不胜感激。 “TypeError:只能将 str(不是“Canvas”)连接到 str”。 The sample design I want

import tkinter as tk
from tkinter import *
import random
import re
import datetime
from tkinter import messagebox
from tkinter.font import Font
root = tk.Tk()
root.title('deneme')
root.geometry('410x600+400+100')
root.config(bg='lightblue')
buton_işlevi=StringVar(root)
buton_işlevi.set("")


#buton oluşturma ve konumu
buton = tk.Button(root, width=10, height=2, relief='raised',state='active',command=lambda :add_text(pencere,giriş,buton_işlevi))
buton.pack()
buton.place(x=310, y=550)
buton.config(text='GÖNDER', bg='lightblue', font='Verdana 8 bold')
root.bind('<Return>',lambda x:add_text(pencere,giriş,buton_işlevi))

#mesaj yazma alanı ve konumu
giriş = tk.Entry(root, textvariable=buton_işlevi,font=('NanumGothic', 12)) 
giriş.pack()
giriş.place(x=10, y=550, width=290, height=40)

canvas = Canvas(width=300, height=300, bg='white')
canvas.create_oval(200, 200, 300, 300, width=5, fill='red')

#pencere ve konumu
pencere = tk.Text(root, bg='white', yscrollcommand='YES', font=('NanumGothic', 12))
pencere.config(state='disabled')
pencere.pack()
pencere.place(x=10, y=10, width=390, height=530)      


#bot ve user mesaj arka plan rengi
pencere.tag_config('bot_renk', background='#fccbc7', foreground='black')
pencere.tag_config('user_renk', background='yellow')
pencere.config(state='normal')

#bot karşılama mesajı
karşılama = 'Hoşgeldiniz'
soru1  = ['merhaba', 'selam']
cevap1 = ["sanada", "iyiyim"]
soru2  = ["deneme", "merhaba", "selam"]

pencere.insert('end', '\nBOT:\t')
pencere.insert('end', karşılama +'\n', 'bot_renk')


#Mesaj ayarları
def add_text(mw,st,imsg):
#mw:message window/st:state/imsg:input message
    bot_mesaj=""
    user_mesaj = imsg.get()

    if user_mesaj in soru1:
        user_mesaj='\nUSER :\t'+imsg.get()+'\n'+canvas
        bot_mesaj = '\nBOT  :\t'+ random.choice(cevap1)+'\n'
        mw.config(state='normal')        
        mw.insert('end',user_mesaj, 'user_renk')
        mw.insert('end',bot_mesaj, 'bot_renk')
        imsg.set("")
        mw.see('end')
        mw.config(state='disabled')

    elif user_mesaj in soru2:
        user_mesaj='\nERÇİN   :\t'+imsg.get()+'\n'
        bot_mesaj='\nBOT   :\t'+ random.choice(cevap2)+'\n'
        mw.config(state='normal')               
        mw.insert('end',user_mesaj, 'user_renk')  
        mw.insert('end',bot_mesaj, 'bot_renk')    
        imsg.set("")
        mw.see('end')
        mw.config(state='disabled')

    else :
        user_mesaj='\nUSER:\t' +imsg.get()+'\n'
        bot_mesaj='\nBOT:\t' + 'Bu kelimeyi henüz öğrenmedim' +'\n'
        mw.config(state='normal')
        mw.insert('end',user_mesaj, 'user_renk')
        mw.insert('end',bot_mesaj, 'bot_renk')
        imsg.set("")
        mw.see('end')
        mw.config(state='disabled')

root.mainloop()

【问题讨论】:

  • 你遇到了什么错误?请edit您的问题包含完整的堆栈跟踪。
  • @BryanOakley 谢谢你的回答。我重新安排了它。但是我不能完全按照我想要的画布来做。

标签: python-3.x tkinter chatbot


【解决方案1】:

我运行了您的代码,没有错误。但既然你提到了 Whatsapp 气泡,这里有一个你可以使用的基本版本。

from tkinter import *
from datetime import datetime

root = Tk()
root.config(bg="lightblue")

canvas = Canvas(root, width=200, height=200,bg="white")
canvas.grid(row=0,column=0,columnspan=2)

bubbles = []

class BotBubble:
    def __init__(self,master,message=""):
        self.master = master
        self.frame = Frame(master,bg="light grey")
        self.i = self.master.create_window(90,160,window=self.frame)
        Label(self.frame,text=datetime.now().strftime("%Y-%m-%d %H:%m"),font=("Helvetica", 7),bg="light grey").grid(row=0,column=0,sticky="w",padx=5)
        Label(self.frame, text=message,font=("Helvetica", 9),bg="light grey").grid(row=1, column=0,sticky="w",padx=5,pady=3)
        root.update_idletasks()
        self.master.create_polygon(self.draw_triangle(self.i), fill="light grey", outline="light grey")

    def draw_triangle(self,widget):
        x1, y1, x2, y2 = self.master.bbox(widget)
        return x1, y2 - 10, x1 - 15, y2 + 10, x1, y2

def send_message():
    if bubbles:
        canvas.move(ALL, 0, -65)
    a = BotBubble(canvas,message=entry.get())
    bubbles.append(a)

entry = Entry(root,width=26)
entry.grid(row=1,column=0)
Button(root,text="Send",command=send_message).grid(row=1,column=1)
root.mainloop()

【讨论】:

  • 谢谢。我遇到了问题,无法解决。当我写长消息时,气泡会移出窗口。如何让气泡在窗口中保持在一定的范围内,让长线通到底部?
  • 您可以导入textwrap 模块。阅读A good way to make long strings wrap to newline in Python?
  • 我试过但不能。 ` Label(self.frame,text=datetime.now().strftime("%d-%m-%Y %X"),font=("Helvetica", 7),bg="浅绿色").grid (row=0,column=0,sticky="w",padx=5) #tarih saat 标签(self.frame, text=message,font=("Helvetica", 9),bg="浅绿色")。 grid(row=1, column=0,sticky="w",padx=5,pady=3) textwrap.fill(message, 15).strip()`
  • 它不是那样工作的。 Label(self.frame, text=message(textwrap, 7),font=("Helvetica", 9),bg="浅绿色").grid(row=1, column=0,sticky="w ",padx=5,pady=3)
  • 什么是message(textwrap,7)?语法为textwrap.fill(text, width=70, **kwargs),如链接问题所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多