问题描述
我正在尝试将用户输入的右侧(使用tkinter python)与scrolledtext对齐,并将chatbot的输出与左侧对齐,但没有成功.文本背景也应具有浅色.我的意思是,它应该看起来像Messenger或其他消息传递平台,双方都有不同的方面,有时甚至是颜色.请帮助我,这是我最后一年项目的一部分.我对此很担心.这是我的代码:
i'am trying to align the user input on right side (using tkinter python) in scrolledtext and chatbot's output on left side but no success.also the text beckground should have light color. i mean it should be just look like messanger or other messaging platform where both sides have different sides and sometimes colors.please help me its a part of my final year project.m very worried about it.here is my code:
from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
import os
import tkinter as tk
try:
import ttk as ttk
import ScrolledText
except ImportError:
import tkinter.ttk as ttk
import tkinter.scrolledtext as ScrolledText
import time
class TkinterGUIExample(tk.Tk):
def __init__(self, *args, **kwargs):
"""
Create & set window variables.
"""
tk.Tk.__init__(self, *args, **kwargs)
self.chatbot = ChatBot(
"GUI Bot",
storage_adapter="chatterbot.storage.SQLStorageAdapter",
logic_adapters=[{
'import_path': 'chatterbot.logic.BestMatch',
'default_response': 'I am sorry, but I do not understand.',
'maximum_similarity_threshold': 1.0
} ]
)
for files in os.listdir('C:/Users/HP/Desktop/FYP BOT/training_data/'):
con=open('C:/Users/HP/Desktop/FYP BOT/training_data/'+files,'r').readlines()
trainer = ListTrainer(self.chatbot)
trainer.train(con)
self.title("Chatterbot")
self.initialize()
def initialize(self):
"""
Set window layout.
"""
self.grid()
ttk.Style().configure("TButton", padding=6, relief="flat",background="#ccc")
style = ttk.Style()
style.map("C.TButton",
foreground=[('pressed', 'red'), ('active', 'blue')],
background=[('pressed', '!disabled', 'black'), ('active', 'white')]
)
self.respond = ttk.Button(self, text='Get Response', command=self.get_response,style="C.TButton")
self.respond.grid(column=1, row=2, sticky='nesw', padx=3, pady=10)
self.usr_input = tk.Entry(self, state='normal',text='Enter your query here!')
self.usr_input.grid(column=0, row=2, sticky='nesw', padx=1, pady=5)
self.conversation_lbl = tk.Label(self, anchor=tk.E, text='Conversation',font=('Arial Bold Underline',18),bg="#f89406",fg="#feffff")
self.conversation_lbl.grid(column=0, row=0,columnspan=2, padx=3, pady=3)
self.conversation = ScrolledText.ScrolledText(self,
state='disabled',borderwidth=5,
highlightthickness=1,
bg='#15202b',fg='#ffffff',
font=('Arial Bold',8))
self.conversation.grid(column=0, row=1, columnspan=2, sticky='nesw', padx=3, pady=3)
def get_response(self):
"""
Get a response from the chatbot and display it.
"""
user_input = self.usr_input.get()
self.usr_input.delete(0, tk.END)
response = self.chatbot.get_response(user_input)
self.conversation['state'] = 'normal'
self.conversation.insert(
tk.END, "Human: " + user_input + "\n" + "ChatBot: " + str(response.text) + "\n"
)
self.conversation['state'] = 'disabled'
time.sleep(0.5)
gui_example = TkinterGUIExample()
gui_example.geometry('930x600+10+10')
gui_example.configure(background='#3a8fc5')
gui_example.mainloop()
推荐答案
您可以使用标签
将属性分配给部分文本.
You can use tags
to assign properties to part of text.
使用 justify
,您可以在右侧显示文本,但所有行都将在右侧对齐.
Using justify
you can have text on right side but all lines will be aligned to the right.
import tkinter as tk
import tkinter.scrolledtext as ScrolledText
root = tk.Tk()
#text_widget = tk.Text()
text_widget = ScrolledText.ScrolledText()
text_widget.pack(fill='both', expand=True)
text_widget.tag_configure('tag-center', justify='center')
text_widget.tag_configure('tag-left', justify='left')
text_widget.tag_configure('tag-right', justify='right')
text_widget.insert('end', 'Hello\nWorld!!!\n', 'tag-center')
text_widget.insert('end', 'Hello\nWorld!!!\n', 'tag-left')
text_widget.insert('end', 'Hello\nWorld!!!\n', 'tag-right')
root.mainloop()
为了更好地控制,您可以尝试将 Canvas
与 Labels
和 Scrollbar
For better control you would try to use Canvas
with Labels
and Scrollbar
您可以使用 window_create
将 Label
添加到 ScrolledText
,并使用上一个标记将其移至正确的.然后,您可以更改 Label
-颜色,边距(padx,pady)等.您可以尝试在图像中添加 Label
甚至是 Frame
放置更多不同的小部件.
Using window_create
you can add Label
to ScrolledText
and using previous tag you can move it to the right. And then you can change Label
- color, margin (padx, pady), etc. You may try to add Label
with image or even Frame
to put more different widgets.
import tkinter as tk
import tkinter.scrolledtext as ScrolledText
root = tk.Tk()
#text_widget = tk.Text()
text_widget = ScrolledText.ScrolledText()
text_widget.pack(fill='both', expand=True)
label1 = tk.Label(text_widget, text="Hello\nWorld!!!", background='#d0ffff', justify='left', padx=10, pady=5)
label2 = tk.Label(text_widget, text="Hello\nWorld!!!", background='#ffffd0', justify='left', padx=10, pady=5)
label3 = tk.Label(text_widget, text="Hello\nWorld!!!", background='#d0ffff', justify='left', padx=10, pady=5)
text_widget.tag_configure('tag-left', justify='left')
text_widget.tag_configure('tag-right', justify='right')
text_widget.insert('end', '\n')
text_widget.window_create('end', window=label1)
text_widget.insert('end', '\n ', 'tag-right') # space to move Label to the right
text_widget.window_create('end', window=label2)
text_widget.insert('end', '\n')
text_widget.window_create('end', window=label3)
root.mainloop()
这篇关于Tkinter滚动文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!