#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. Большое спасибо!