Случайный { } в текстовом виджете Python Tkinter

#python #tkinter

Вопрос:

В Python я использовал Tkinter и сделал текстовый виджет для бота для отображения случайной даты. Но по какой-то причине текстовый виджет отображал случайные { } в тексте. Я не могу понять, что вызывает появление всех {}. вот скриншот

Часть кода, которая это делает, находится здесь:

 self.text_widget = Text(self.ui, width=20, height=2, bg="#f1f1f1", fg="#656565",
                            font=Font1, padx=5, pady=5)
self.text_widget.place(relheight=0.845, relwidth=1, rely=0.08)
self.text_widget.configure(cursor="arrow", state=DISABLED)

# Create Random Date
year = random.randrange(2021, 2121)
    monthd = random.randrange(1, 12)
    if monthd == 1:
        month = "January"
    if monthd == 2:
        month = "Febuary"
    if monthd == 3:
        month = "March"
    if monthd == 4:
        month = "April"
    if monthd == 5:
        month = "May"
    if monthd == 6:
        month = "June"
    if monthd == 7:
        month = "July"
    if monthd == 8:
        month = "August"
    if monthd == 9:
        month = "September"
    if monthd == 10:
        month = "October"
    if monthd == 11:
        month = "November"
    if monthd == 12:
        month = "December"
    date = random.randrange(1, 29)
    answer = ""
    answer = "on " , date , ", " , month , year
    
    

    # Display Date
    msg2 = "Bot:   " , answer ,  "nnn"
    self.text_widget.configure(state=NORMAL)
    self.text_widget.insert(END, msg2)
    self.text_widget.configure(state=DISABLED)
    print("[OK] Self Message Displayedn")

    self.text_widget.see(END)
 

Кто-нибудь знает, как избавиться от {} ?

Комментарии:

1. Вы пробовали использовать randint ?

2.Похоже, что каждый элемент кортежей оборачивается { } при преобразовании их в строки. Если вам не нужны фигурные скобки, вам нужно будет отформатировать строки самостоятельно.

3. @CoderTang, Да, я сделал это, все тот же результат.

4. @Brian я заменил его на: msg2 = «Бот: {d1} {d2}, {d3} nnn».формат(d1 = дата, d2 = месяц, d3 = год), казалось, решил проблему.

5. @Terry-065 Вы также можете использовать литерал f-строки (например msg2 = f"Bot: {date} {month}, {year} nnn" , или, что еще лучше, правильное форматирование даты и времени

Ответ №1:

Ваша проблема, похоже, заключается в

 msg2 = "Bot:   " , answer ,  "nnn"
 

потому что это создает кортеж.

Просто измените его на

 msg2 = "Bot:   "   answer    "nnn"
 

Также я замечаю еще одну проблему

 monthd = random.randrange(1, 12) 
 

вернутся только с 1 по 11.

answer имеет ту же проблему, msg2 что и, следовательно, то же решение.

Комментарии:

1. msg2 = «Бот:» ответ «nnn» создает ошибку : ошибка типа: можно только объединить str (не «кортеж») в str

2. Для: месяц = случайный.рандрейндж(1, 12). Спасибо за исправление, я уже исправил это.

3. @Terry-065 изменить answer на answer = "on " str(date) ", " month str(year) . answer является кортежем в вашем текущем коде, поэтому он вызовет ту же ошибку

4. @bdbd Еще одна ошибка: TypeError: can only concatenate str (not "int") to str

5. Ок обновил это. Приведите ints к строке или используйте f-строки answer = f"on {date}, {month} {year}"

Ответ №2:

Вам нужно отформатировать строку самостоятельно. Python добавляет {} при преобразовании его в строку.

Попробуйте заменить answer на:

 answer = f"{date} {month}, {year}"
 

А затем заменить msg2 на:

 msg2 = f"PyPhet: {answer} nnn"