Я создаю калькулятор python tkinter. И я хочу добавить кнопку запятой. Но, как мы знаем, запятая появляется в каждом окне калькулятора только один раз. Я сделал условие, согласно которому вы можете печатать только один раз, но когда вы вводите другой знак, вы можете вводить более одного знака запятой. Как выполнить условие, которое в любом случае можно ввести только один раз.

from tkinter import*
from tkinter.ttk import *

root=Tk()

def show_point():
    if e.get()==".":
        pass
    else:
        e.insert(END,".")

e=Entry(root,width=30,justify="right",font=(None,20))
e.grid(row=0,column=0,columnspan=3,ipady=10,sticky=W)
but19 = Button(root,text=".", style='my.TButton',command=show_point)
but19.grid(row=5,column=3,ipadx=10,ipady=15)
root.mainloop()
1
Maria 14 Сен 2020 в 17:11

3 ответа

Лучший ответ

Попробуйте это вместо оператора if

    input = e.get()
    try:
        input.index(".")
    except:
        e.insert(END, ".")
1
CCSpaceCoder 14 Сен 2020 в 14:54

Я думаю, что вам нужно кое-что, называемое "валидацией", которую поддерживают виджеты Entry. Это позволит вам убедиться, что символ не вводится более одного раза (или любое другое правило, которое вы хотите применить), либо щелкнув Button, либо введя его вручную. Для справки см. Добавление проверка виджета Entry .

Вот как это сделать в контексте того, что вы пытаетесь сделать:

from tkinter import*
from tkinter.ttk import *

PERIOD = '.'

root = Tk()

def insert_point():
    if e.get().count(PERIOD) < 1:  # Allow at most one in entry.
        e.insert(END, PERIOD)

def check_okay(new_value):
    return new_value.count(PERIOD) < 2  # Only zero or one allowed in entry.

ok_command = root.register(check_okay)  # Register the callback function.

e = Entry(root, width=30, justify="right", font=(None, 20),
          validate='all', validatecommand=(ok_command, '%P'))
e.grid(row=0, column=0, columnspan=3, ipady=10, sticky=W)
but19 = Button(root, text=PERIOD, style='my.TButton', command=insert_point)
but19.grid(row=5, column=3, ipadx=10, ipady=15)
root.mainloop()
1
martineau 14 Сен 2020 в 15:32

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

from tkinter import*
from tkinter.ttk import *

root = Tk()

def correct(inp):
    try:
        if inp == '': #or replace try block with the one liner - 
            return True #return True if inp == '' else float(inp) <= 1000
        else:
            return float(inp) <= 100000000000000 #setting limit to placevalues of a number
    except ValueError: #catching error because strings cannot be converted to string
        return False

reg = root.register(correct) #registering validation
e = Entry(root, width=30, justify="right", font=(None, 20),validate='key', validatecommand=(reg, '%P')) #assigning it while declaring
e.grid(row=0, column=0, columnspan=3, ipady=10, sticky=W)

#but19 = Button(root,text=".", style='my.TButton',command=correct)
# but19.grid(row=5,column=3,ipadx=10,ipady=15)

root.mainloop()

Это просто проверка, вы позволяете пользователю просто вводить десятичные дроби, все, кроме этого, будет запрещено вообще.

Посмотрите здесь для получения дополнительной информации о валидации

Ура

1
Cool Cloud 14 Сен 2020 в 15:34