Небольшие программы с использованием библиотеки Tkinter

Программа "Решение примеров" (Tkinter)

Пользователь вводит в текстовое поле арифметический пример, нажимает Enter, и в метке ниже отображается ответ.
Программа для решения примеров, написанная с использованием Tkinter

В программе используется функция eval() языка программирования Python. Она позволяет выполнять переданную ей строку как код. С другой стороны это создает опасность, так как передать eval() можно совсем не то, что предусматривал программист. Например, если в текстовое поле ввести команду win.quit(), то она будет выполнена, и приложение завершится. Также может быть обработано любое однострочное выражение Python (например, конкатенация строк, списков и др.). То есть, чтобы программа обрабатывала только арифметические выражения, надо написать еще "анализатор" строки.

Метод focus() позволяет установить фокус (сделать активным) текстовое поле сразу при запуске приложения. Без него в это поле требовалось бы щелкнуть, или перейти туда с помощью Tab.

Также здесь можно обратить внимание, как обрабатывается нажатие клавиши Enter.

from tkinter import *
win = Tk()
win.title("Решение примеров")
 
def test(e):
    try:
        lab2["text"] = eval(ent.get())
    except:
        lab2["text"] = "Выражение введено с ошибкой"
 
 
lab = Label(text="Введите математическое выражение из чисел и знаков +, -, *, /, //, %, **")
lab.pack()
ent = Entry(width=50,bg="white",justify=CENTER)
ent.focus()
ent.pack()
ent.bind('<Return>', test)
lab2 = Label()
lab2.pack()
 
win.mainloop()

Программа для вычисления НОД, НОК и разложения чисел на простые сомножители

Интерфейс программы для вычисления НОД и др.

Программа позволяет получить наибольший общий делитель и наименьшее общее кратное двух чисел, которые можно вписать в текстовые поля. Кроме того она раскладывает каждое число на простые множители.

Алгоритм работы программы:
Кнопка вызывает функцию-обработчик. Из нее по-очереди вызываются функции проверки корректности данных, разложения чисел на простые сомножители, функция, вычисляющая НОД и НОК.

Интерфейс программы состоит из меток (для подписи и вывода данных), двух текстовых полей (для ввода чисел) и кнопки.

from tkinter import *
 
def gcd():
    n1,n2 = correct()
    prime1 = prime(n1)
    prime2 = prime(n2)
    gcd,lcm = gcd_lcm(n1,n2)
    lab_prime_n1["text"] = prime1
    lab_prime_n2["text"] = prime2
    lab_gcd["text"] = gcd
    lab_lcm["text"] = lcm
 
def correct():
    a = ent_n1.get()
    b = ent_n2.get()
    try:
        a = int(a)
    except ValueError:
        a = 0
        ent_n1.delete(0,END)
        ent_n1.insert(0,0)
    try:
        b = int(b)
    except ValueError:
        b = 0
        ent_n2.delete(0,END)
        ent_n2.insert(0,0)
    return abs(a), abs(b)
 
def prime(n):
    a = []
    while n > 1:
        i = 2
        while 1:
            if n%i==0:
                a.append(i)
                n //= i
                break
            else:
                i += 1
    return a
 
def gcd_lcm(a,b):
    m = a*b
    while a!=0 and b!=0:
        if a > b: a %= b
        else: b %= a
    g = a + b
    l = m // g
    return g, l
 
win = Tk()
win.title('НОД и НОК')
lab_n1 = Label(text="Число 1")
lab_n1.grid(row=2,column=0)
 
lab_n2 = Label(text="Число 2")
lab_n2.grid(row=3,column=0)
 
ent_n1 = Entry(width=10,bg="white")
ent_n1.grid(row=2,column=1)
 
ent_n2 = Entry(width=10,bg="white")
ent_n2.grid(row=3,column=1)
 
lab_prime = Label(text="Простые сомножители:")
lab_prime.grid(row=1,column=3,columnspan=2)
 
lab_prime_n1 = Label(bg="white")
lab_prime_n1.grid(row=2,column=3,columnspan=2)
 
lab_prime_n2 = Label(bg="white")
lab_prime_n2.grid(row=3,column=3,columnspan=2)
 
lab_gcd_ = Label(text="НОД",bg="lightgreen",width=7)
lab_gcd_.grid(row=4,column=3)
lab_gcd = Label(bg="lightgreen",width=10)
lab_gcd.grid(row=4,column=4)
 
lab_lcm_ = Label(text="НОК",bg="lightblue",width=7)
lab_lcm_.grid(row=5,column=3)
lab_lcm = Label(bg="lightblue",width=10)
lab_lcm.grid(row=5,column=4)
 
but = Button(text="Вычислить",command=gcd,pady=10)
but.grid(row=4,column=0,rowspan=2,columnspan=2,sticky=W+N+S+E)
 
win.mainloop()