Tkinter — Как ограничить пространство, используемое текстом?

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я пытаюсь создать графический интерфейс факториального калькулятора. Программа работает нормально, но проблема, с которой я сталкиваюсь, заключается в том, что когда на выходе поступает слишком много чисел, экран автоматически увеличивается в ширину. Я попытался использовать tk.Text , чтобы создать ограничение на размер текстового поля, и поэтому текст переходит к следующей строке, когда столбцы заполнены.

Но когда мне пришлось вводить текст в tk.Text файл, это не сработало, так как переменная, которую я использовал, обрабатывается в функции, которая вызывается при нажатии кнопки. Я пытался погуглить эту проблему, но ничего не смог найти, я нашел несколько людей, объясняющих, как использовать переменные, которые создаются / обрабатываются внутри функции, но это не сработало, поэтому я думаю, что я сделал что-то не так в своем коде.

Примечание: я использую lambda для вызова своей функции (не уверен, важно это или нет).

TLDR: текст становится слишком длинным, когда выводится слишком много информации. tk.Text у меня это не сработало, так как я не мог понять, как использовать переменную, которая создается / обрабатывается внутри функции, которая вызывается только при нажатии кнопки.

Вот весь мой код: https://pastebin.com/1MkdRjVE

Код для моей функции:

 def start_calc():
    output_array = ["placehold"]
    start_text.set("Loading...")
    i = 1
    global e1
    global e2
    output_array.clear()
    string = e1.get()
    string2 = e2.get()
    integr = int(string)
    integr2 = int(string2)
    if string == "":
        error_message.set("Please enter correct numbers.")
    elif string2 == "":
        error_message.set("Please enter correct numbers.")
    else:
        while integr2 >= i:
            calc = integr ** i
            calcstr = (str(calc))
            output_array.append(calcstr)
            i  = 1

    start_text.set("Start!")
    output_array_str = (', '.join(output_array))
    output_msg.set("Output: "   output_array_str)
    print(output_array_str) #This is just so I know if it's working or not in the terminal
 

Код для моего вывода:

 output_msg = tk.StringVar()
output_text = tk.Label(root, textvariable=output_msg, font="Raleway")
output_msg.set("Output: ")
output_text.grid(columnspan=3, column=0, row=14)
 

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

1. Вам также нужна полоса прокрутки для вывода?

Ответ №1:

Я думаю, это то, что вы ищете:

 #Imports
import tkinter as tk

#Variables
root = tk.Tk()


#Tkinter GUI setup basic
canvas = tk.Canvas(root, width= 400, height=400)
canvas.grid(columnspan=3, rowspan=120)

#Title
text = tk.Label(root, text="Calculating factorials", font="Raleway")
text.grid(column=1, row=1)

#Function
def start_calc():
    output_array = ["", ""]
    start_text.set("Loading...")
    i = 1
    global e1
    global e2
    output_array.clear()
    string = e1.get() 
    string2 = e2.get()
    integr = int(string)
    integr2 = int(string2)
    if string == "":
        error_message.set("Please enter correct numbers.")
    elif string2 == "":
        error_message.set("Please enter correct numbers.")
    else:
        while integr2 >= i:
            calc = integr ** i
            calcstr = (str(calc))
            output_array.append(calcstr)
            i  = 1   
    start_text.set("Start!")
    output_array_str = (', '.join(output_array))
    # Change the output
    output_text.config(state="normal")
    # delete last output:
    output_text.delete("0.0", "end")
    # insert new output:
    output_text.insert("end", output_array_str)
    output_text.config(state="disabled")
    print(output_array_str) #This is just so I know if it's working or not in the terminal
    
    
#input
tk.Label(root, text="Number :").grid(row=10)
tk.Label(root, text="Factorial :").grid(row=11)
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.grid(row=10, column=1)
e2.grid(row=11, column=1)

#Error message if the input is invalid
error_message = tk.StringVar()
error_text = tk.Label(root, textvariable=error_message, font="Raleway")
error_message.set(" ")
error_text.grid(column=1, row=12)

#Startbutton
start_text = tk.StringVar()
start_btn = tk.Button(root, textvariable=start_text, command=start_calc, font="Raleway", bg="#20bebe", fg="white", height=2, width=15)
start_text.set("Start!")
start_btn.grid(column=1, row=13, pady=10)

#output
output_text = tk.Text(root, height=1, width=20, wrap="none", font="Raleway")
output_text.insert("end", "Output")
output_text.config(state="disabled")
output_text.grid(columnspan=3, column=0, row=14, sticky="news")

#Adding a scrollbar
scrollbar = tk.Scrollbar(root, orient="horizontal", command=output_text.xview)
scrollbar.grid(columnspan=3, column=0, row=15, sticky="news")
output_text.config(xscrollcommand=scrollbar.set)

#disclaimer message
disclaimer_text = tk.Label(root, text="Disclaimer: The factorials will be printed from 1 to the number you entered.")
disclaimer_text.grid(columnspan=3, column=0, row=110)

root.mainloop()
 

Я использовал <tkinter.Text> виджет с wrap="none" , height=1 и width=20 для создания окна вывода. Я отключил запись, чтобы пользователь не мог изменить результаты, но все равно мог скопировать ее.

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

1. Большое спасибо!