代码之家  ›  专栏  ›  技术社区  ›  Mark K

仅考虑Tkinter GUI中可用的值

  •  0
  • Mark K  · 技术社区  · 10 年前

    我正在Tkinter上开发一个简单的GUI。我要的是把所有填好的空格加起来,如果有的话。如果有空字段,请将其作为0。

    enter image description here

    然而,这并不成功,问题在于:

    value2 = float(c.get())
    

    错误为:

    ValueError: could not convert string to float:
    

    以下是代码:

    from Tkinter import *
    import ttk
    
    
    def plus(*args):
        value = float(a.get())
        value1 = float(b.get())
        if c:
            value2 = float(c.get())
        else:
            value2 == float(0.0)
        if d:
            value3 = float(d.get())
        else:
            value3 == float(0.0)
    
        result.set(value + value1 + value2 + value3)
    
    root = Tk()
    root.title("Plus them")
    
    mainframe = ttk.Frame(root, padding="10 10 10 10")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)
    
    a = StringVar()
    b = StringVar()
    c = StringVar()
    d = StringVar()
    result = StringVar()
    
    feet_entry = ttk.Entry(mainframe, width=5, textvariable=a)
    feet_entry.grid(column=2, row=1, sticky=(W, E))
    
    feet_entry1 = ttk.Entry(mainframe, width=5, textvariable=b)
    feet_entry1.grid(column=5, row=1, sticky=(W, E))
    
    feet_entry2 = ttk.Entry(mainframe, width=5, textvariable=c)
    feet_entry2.grid(column=2, row=2, sticky=(W, E), pady = 5)
    
    feet_entry3 = ttk.Entry(mainframe, width=5, textvariable=d)
    feet_entry3.grid(column=5, row=2, sticky=(W, E), pady = 5)
    
    ttk.Label(mainframe, text="the result is").grid(column=3, row=3, sticky=W)
    ttk.Label(mainframe, textvariable = result).grid(column=5, row=3, sticky=(W, E))
    
    ttk.Button(mainframe, text="Plus", command=plus).grid(column=3, row=4, sticky=W)
    
    feet_entry.focus()
    root.bind('<Return>', plus)
    root.mainloop()
    

    我认为问题在于功能定义部分。我尝试了以下方法:

    def plus(*args):
        try:
            value = float(a.get())
            value1 = float(b.get())
            value2 = float(c.get())
            value3 = float(d.get())
    
            result.set(value + value1 + value2 + value3)
    
        except ValueError:
            pass
    

    但这无济于事。正确的表达方式是什么?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Cui Heng    10 年前

    c、 get()并不总是返回类似“0.02”的值,如果没有用户输入,它将返回“”,在这种情况下,它将抛出一个异常,显示错误,将“”转换为float。所以我修改了你的代码,添加了一些内容来检查用户输入。

    from Tkinter import *
    import ttk
    
    
    def inputToFloat(input):
        if isinstance(input, float):
            return input
        elif isinstance(input, basestring):
            input = input.strip()
            return 0.0 if not input else float(input)
        else:
            raise Exception("unsupported type")
    
    def plus(*args):
        value = inputToFloat(a.get())
        value1 = inputToFloat(b.get())
        if c:
            value2 = inputToFloat(c.get())
        else:
            value2 == inputToFloat(0.0)
        if d:
            value3 = inputToFloat(d.get())
        else:
            value3 == inputToFloat(0.0)
    
        result.set(value + value1 + value2 + value3)
    
    root = Tk()
    root.title("Plus them")
    
    mainframe = ttk.Frame(root, padding="10 10 10 10")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)
    
    a = StringVar()
    b = StringVar()
    c = StringVar()
    d = StringVar()
    result = StringVar()
    
    feet_entry = ttk.Entry(mainframe, width=5, textvariable=a)
    feet_entry.grid(column=2, row=1, sticky=(W, E))
    
    feet_entry1 = ttk.Entry(mainframe, width=5, textvariable=b)
    feet_entry1.grid(column=5, row=1, sticky=(W, E))
    
    feet_entry2 = ttk.Entry(mainframe, width=5, textvariable=c)
    feet_entry2.grid(column=2, row=2, sticky=(W, E), pady = 5)
    
    feet_entry3 = ttk.Entry(mainframe, width=5, textvariable=d)
    feet_entry3.grid(column=5, row=2, sticky=(W, E), pady = 5)
    
    ttk.Label(mainframe, text="the result is").grid(column=3, row=3, sticky=W)
    ttk.Label(mainframe, textvariable = result).grid(column=5, row=3, sticky=(W, E))
    
    ttk.Button(mainframe, text="Plus", command=plus).grid(column=3, row=4, sticky=W)
    
    feet_entry.focus()
    root.bind('<Return>', plus)
    root.mainloop()
    
        2
  •  0
  •   Mark K    10 年前

    在fhdrsdg的建议下,它被更改为下面,并且可以工作。

    def plus(*args):
        value = float(a.get())
        value1 = float(b.get())
        if c.get():
            value2 = float(c.get())
        else:
            value2 = 0.0
        if d.get():
            value3 = float(d.get())
        else:
            value3 = 0.0
    
        result.set(value + value1 + value2 + value3)