Как динамически добавить многострочный текст в tkinter python? - PullRequest
0 голосов
/ 29 ноября 2018

Я создал приложение для чата, в котором я использую ListBox для отображения истории чата.Это выглядит хорошо, пока я не войду в длинный укус, который выходит за пределы экрана.Есть ли способ разбить строку и показать в новой строке или любым другим способом показать всю строку.Я новичок в Tkinter и не знаю многих доступных виджетов.

Вот мой пример кода

from tkinter import *

class Actions:
    def chatUpdate(chat):
        chatlist.insert(Actions.chatLast,chat)
        Actions.chatLast=Actions.chatLast+1
        chatlist.pack( side=LEFT, fill=BOTH)
        chatBox.config(command=chatlist.yview)


def callUpdater():
    txt=textBox.get()
    text_text.set("")
    Actions.chatUpdate(txt)


root = Tk()
root.title("Chat App")
frame1 = Frame(root, bd=4)
frame1.pack(side=TOP)

frame2 = Frame(root, bd=4)
frame2.pack(side=TOP)

frame3 = Frame(root, bd=4)
frame3.pack(side=TOP)

# chat box
chatBox = Scrollbar(frame1)
chatBox.pack(side=RIGHT, fill=Y)
chatlist = Listbox(frame1, yscrollcommand = chatBox.set, width=50)
Actions.chatLast=0
Actions.chatUpdate("                        ")

# text box
textView = Label(frame2, text="Input: ")
textView.pack(side=LEFT)
text_text = StringVar()
textBox = Entry(frame2, textvariable=text_text, bd=0, width=40, bg="pink")
textBox.pack(side=RIGHT)

# send button
button = Button(frame3, text="Send", fg="black", command=callUpdater)
button.pack(side=TOP)
root.mainloop()

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете заменить Listbox виджетом Text в режиме «отключен», который автоматически переносит длинные строки.Вам просто нужно будет возвращать виджет в «нормальный» режим каждый раз, когда вы вставляете текст:

from tkinter import *

def callUpdater():
    text = textBox.get()
    textBox.delete(0, 'end')
    chat.configure(state='normal')
    chat.insert('end', text + '\n')
    chat.configure(state='disabled')

root = Tk()
chatBox = Scrollbar(root)
chat = Text(root, wrap='word', state='disabled', width=50,
            yscrollcommand=chatBox.set)
chatBox.configure(command=chat.yview)

chat.grid(row=0, columnspan=2, sticky='ewns')
chatBox.grid(row=0, column=2, sticky='ns')
Label(root, text="Input: ").grid(row=1, column=0)

textBox = Entry(root, bd=0, width=40, bg="pink")
textBox.grid(row=1, column=1)

Button(root, text="Send", command=callUpdater).grid(row=2, columnspan=2)
root.mainloop()

Кстати, оба виджета Listbox и Text поддерживают индекс end, так чтовам не нужно отслеживать, сколько строк вы вставили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...