Найти - Пользователи
Полная версия: Странное поведение кнопки (Tkinter)
Начало » Python для новичков » Странное поведение кнопки (Tkinter)
1
chemic
Всем привет.
После нажатия кнопки с текстом “метод 1” отрабатывает сообщение (messagebox.showinfo), далее кнопка так и остается в нажатом состоянии. Дефект чисто косметический, но хотелось бы от него избавиться.

Собственно код:
from tkinter import *
from tkinter.messagebox import *
# функция для фильтрации строк
def numbs(x):
    if '0' <= x <= '9':
        return 1
    elif x == '.':
        return 1
    else:
        return 0
# функция для проверки и исправления вводимых в entry строк
# заменяем ',' на '.'; удаляем все нечисловые символы; обнуляем строку где больше одной точки
def check_data(x):
    # получаем строки из текстовых полей
    mas = list(range(7))
    for n in range(0, 7):
        mas[n] = ent[n].get()
        mas[n] = mas[n].replace(",", ".")
    
    # отфильтруем из введенных строк все кроме чисел и точек
    mas1 = list(range(7))
    mas2 = list(range(7))
    for n in range(0, 7):
        mas1[n] = filter(numbs, mas[n])
        mas1[n] = list(mas1[n])
        mas2[n] = ''.join(mas1[n])
        # если в строке более 1-й точки
        if mas2[n].count(".", 0, len(mas2[n])) > 1:
            mas2[n] = "0"
    # поместим в текстовые поля исправленные строки
    for n in range(0, 7):
        ent[n].delete(0, END)
        ent[n].insert(0, mas2[n])
def metod_1(event):
    check_data(0)
    print("расчет методом 1")
    # получаем массовые концентрации компонентов (строки)
    mas = list(range(6))
    for n in range(0, 6):
        mas[n] = ent[n].get()
        if mas[n] == "":
            mas[n] = "0"
    
    # получаем температуру (строка)
    T = ent[6].get()
    if T == "":
        T = "0"
    
    # преобразуем полученные строки в тип float
    mas1 = list(range(6))
    for n in range(0, 6):
        mas1[n] = float(mas[n])
    T1 = float(T)
    
    # проверяем корректность введеных данных
    summ = sum(mas1)
    if summ != 100.0 or T1 < 1600 or T1 > 2000:
        messagebox.showinfo("Исправте данные", "Сумма компонентов должна быть 100 \n\
    температура должна быть в диапазоне 1600 - 2000 К")
    else:
        # данные введены корректно, начинаем расчет
        a = -(2825/T1)+2.7+0.0165*mas1[1]+0.012*mas1[3]-0.0128*mas1[0]-0.0056*mas1[4]-0.011*mas1[5]
        M = 10**a
        M = 0.876*M+3.383
        # выводим результаты расчета
        ent_ex.delete(0, END)
        ent_ex.insert(0, str(M))
        
    
def metod_2(event):
    print("расчет методом 2")
# создание главного окна
root = Tk()
root.title("Расчет растворимости MgO в шлаках")
# создаем метки и строки для входных данных
a = ["CaO", "SiO2", "MgO", "Al2O3", "FeO", "MnO", "T, K"]
lab = list(range(7))
ent = list(range(7))
i = 0
for x in a:
    lab[i] = Label(root, text=x, font="Arial 12")
    ent[i] = Entry(root)
    i = i + 1
# располагаем метки и строки для входных данных
for n in range(0, 7):
    lab[n].grid(row=0, column=n, padx=5)
    ent[n].grid(row=1, column=n, padx=5)
# создаем и располагаем метку и строку для выходных данных
lab_ex = Label(root, text="конц нас-я MgO", font="Arial 12")
ent_ex = Entry(root)
lab_ex.grid(row=2, padx=5, pady=5)
ent_ex.grid(row=3, padx=5, pady=5)
# создаем и располагаем кнопки
but1 = Button(root, text="метод 1", font="Arial 12")
but2 = Button(root, text="метод 2", font="Arial 12")
but1.grid(row=4, column=0, pady=5)
but2.grid(row=4, column=1, pady=5)
# события для кнопок и текстовых полей
but1.bind("<Button-1>", metod_1)
but2.bind("<Button-1>", metod_2)
for n in range(0, 7):
    ent[n].bind("<FocusOut>", check_data)
root.mainloop()
4kpt_III
Уже было обширное общение по этому поводу. Попробую найти. Для таких вопросов используйте раздел GUI. Там же и ищите ответы.

P.S.

from tkinter import *
from tkinter.messagebox import *

Так делать нельзя.

P.S.S. Нашел. Смотрим тут
chemic
Благодарю, с кнопкой разобрался.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB