Python 如何在tkinter计算器中只显示一次逗号

Python 如何在tkinter计算器中只显示一次逗号,python,tkinter,Python,Tkinter,我正在构建tkinter python计算器。我想添加逗号按钮。但众所周知,逗号在每个计算器的窗口中只出现一次。我设置了一个条件,使您只能键入一次,但当您键入其他符号时,您可以键入多个逗号符号。如何处理在任何情况下只能键入一次的条件 from tkinter import* from tkinter.ttk import * root=Tk() def show_point(): if e.get()==".": pass else:

我正在构建tkinter python计算器。我想添加逗号按钮。但众所周知,逗号在每个计算器的窗口中只出现一次。我设置了一个条件,使您只能键入一次,但当您键入其他符号时,您可以键入多个逗号符号。如何处理在任何情况下只能键入一次的条件

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()

尝试使用该语句而不是if语句

    input = e.get()
    try:
        input.index(".")
    except:
        e.insert(END, ".")

尝试使用该语句而不是if语句

    input = e.get()
    try:
        input.index(".")
    except:
        e.insert(END, ".")

我想这就是你想要的:

from tkinter import*
from tkinter.ttk import *

root = Tk()

def correct(inp):
    if inp == '':
        return True
    if ' ' in inp:
        return False
    try:
        float(inp)
    except ValueError: #catching error because strings cannot be converted to string
        return False
    else:
        return True

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()
这只是验证,您允许用户只输入小数,除此之外的任何操作都是不允许的


干杯

我想这就是你想要的:

from tkinter import*
from tkinter.ttk import *

root = Tk()

def correct(inp):
    if inp == '':
        return True
    if ' ' in inp:
        return False
    try:
        float(inp)
    except ValueError: #catching error because strings cannot be converted to string
        return False
    else:
        return True

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()
这只是验证,您允许用户只输入小数,除此之外的任何操作都是不允许的


干杯

我想您需要的是一种叫做验证的东西,它支持条目小部件。这将允许您通过单击按钮或手动键入来确保该字符不会被输入多次或任何其他要强制执行的规则。有关参考,请参阅

以下是如何在您试图做的事情的背景下做这件事:

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()

我想你需要的是一种叫做验证的东西,它支持条目小部件。这将允许您通过单击按钮或手动键入来确保该字符不会被输入多次或任何其他要强制执行的规则。有关参考,请参阅

以下是如何在您试图做的事情的背景下做这件事:

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()

你用错了术语。这个被称为句点,而不是逗号,即.quick fix:if。在e.get中:当您在条目中键入句点或逗号时,我正在寻找句点或逗号,您不能再添加句点/逗号。这在大多数普通计算器中都会发生。但我还是向你求助。@Maria记住,在我的回答中,1000000000000代表你可以输入的数字,比如123456789123456.1231231231。。。。。。。小数点后可以有无限位数,但小数点前可以有1000000000000位数。如果你想要超过15位数,你可以增加它numbers@Maria嗨,我知道结束了,但是当我在这里遇到另一个问题时,我找到了一个更容易回答的方法,我更新了我的问题,看一看。在出现缺陷之前,用户可以在数字之间输入空格,现在已修复。您使用了错误的术语。这个被称为句点,而不是逗号,即.quick fix:if。在e.get中:当您在条目中键入句点或逗号时,我正在寻找句点或逗号,您不能再添加句点/逗号。这在大多数普通计算器中都会发生。但我还是向你求助。@Maria记住,在我的回答中,1000000000000代表你可以输入的数字,比如123456789123456.1231231231。。。。。。。小数点后可以有无限位数,但小数点前可以有1000000000000位数。如果你想要超过15位数,你可以增加它numbers@Maria嗨,我知道结束了,但是当我在这里遇到另一个问题时,我找到了一个更容易回答的方法,我更新了我的问题,看一看。在出现漏洞之前,用户可以在数字之间输入空格,现在已修复。好的,但问题不是将句点更改为逗号,而是当您在pc、平板电脑或智能手机中使用普通计算器时,无论之后键入什么,您都只能键入一次com或句点。问题是如何写出你只使用过一次的陈述。@Maria如果答案不正确,你为什么要接受这个答案?xpI最终接受了您的建议,并为每个人的努力加分。我认为有人找到了自己的解决方案,但问题不是将句号改为逗号,而是当你在pc、平板电脑或智能手机上使用普通计算器时,无论你在后面键入什么,你只能键入一次com或句号。问题是如何写出你只使用过一次的陈述。@Maria如果答案不正确,你为什么要接受这个答案?xpI最终接受了您的建议,并为每个人的努力加分。我想有人找到了自己的解决办法谢谢你的帮助谢谢你的帮助