首页 > 解决方案 > 我想将来自多个文本框的值加起来并插入到最终的文本框中

问题描述

我的文件包含 106 个框架、62 个文本框和 183 个单选按钮,它们会将值插入关联的文本框中。每个文本框都与 3 个单选按钮相关联。每个文本框都将从选定的单选按钮中获取值。

我的目标是将 textbox1 到 textbox61 中的所有值加起来,然后将该值插入到 textbox62 中。

我从我的原始文件中附加了 4 帧及其单选按钮和文本框。Deff 7 打印框架或生成名称错误 textbox2 未定义

我知道这远远超出了我的水平,如果我看到一段代码,我可以进入项目的最后阶段。我的下一步将是根据 textbox62 中的值打开一个框架 提前致谢。

from tkinter import *
from tkinter import Tk
import tkinter as tk
from tkinter import ttk
root=tk.Tk()
root.title("Dental Milling Machines")
root.geometry("600x900")

def onclick1():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '2.83')

def onclick2():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '5.66')

def onclick3():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '8.49')

def onclick4():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '8.83')

def onclick5():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '17.66')

def onclick6():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '26.49')

def onclick7():
    textbox2.get('1.0', 'end')
    textbox3.insert("end", frame2)
    #textbox3.insert("end", frame2, Textbox2.text)

button_var1 = tk.IntVar()
button_var2 = tk.IntVar()
button_var3 = tk.IntVar()
button_var4 = tk.IntVar()
button_var5 = tk.IntVar()
button_var6 = tk.IntVar()
button_var7 = tk.IntVar()

frame1 = Frame(root, height = 150, width= 150, relief= RAISED, bd=8, bg="blue")
frame1.grid(row=0, column=0, pady=2,sticky="NW")
frame2 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame2.grid(row=0, column=0, pady=2,sticky="NW")
frame3 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame3.grid(row=1, column=0, pady=2,sticky="NW")
frame4 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame4.grid(row=1, column=1, pady=2,sticky="NW")

label = Label(frame2, text="Select # of LAV CNC 240 Units", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")
label = Label(frame3, text="Select # Of LAV CNC 500 Units", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")
label = Label(frame4, text="Total CFM Values", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")

textbox1 = Text(frame2, borderwidth=1, wrap="none", width=10, height=1)
textbox1.grid(row=1, column=1, sticky="w")
textbox2 = Text(frame3, borderwidth=1, wrap="none", width=10, height=1)
textbox2.grid(row=1, column=1, sticky="w")
textbox3 = Text(frame4, textbox1, borderwidth=1, wrap="none", width=30, height=1)
textbox3.grid(row=1, column=0, sticky="w")

button1=Radiobutton(frame2, text="1 Unit ", variable=button_var1, command=onclick1)
button1.grid(row=1, column=0, pady= 1, padx= 5, sticky= "W")
button2=Radiobutton(frame2, text="2 Units ", variable=button_var2, command=onclick2)
button2.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")
button3=Radiobutton(frame2, text="3 Units ", variable=button_var3, command=onclick3)
button3.grid(row=3, column=0, pady= 1, padx= 5, sticky= "W")
button4=Radiobutton(frame3, text="1 Unit ", variable=button_var4, command=onclick4)
button4.grid(row=1, column=0, pady= 1, padx= 5, sticky= "W")
button5=Radiobutton(frame3, text="2 Units ", variable=button_var5, command=onclick5)
button5.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")
button6=Radiobutton(frame3, text="3 Units ", variable=button_var6, command=onclick6)
button6.grid(row=3, column=0, pady= 1, padx= 5, sticky= "W")
button7=Radiobutton(frame4, text="Show Values ", variable=button_var7, command=onclick7)
button7.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")

root.mainloop()

标签: python-3.xtkinter

解决方案


分组Radiobuttons需要链接到同一个IntVar。它可能更容易使用Labels而不是Texts. 下面是通用 2 组应用程序的代码。它用于DoubleVars维护标签文本并允许对 Var 字段进行简单的求和。

import tkinter as tk
from tkinter import ttk
    
root = tk.Tk()
    
group1 = tk.IntVar()
group2 = tk.IntVar()
    
v0 = tk.DoubleVar( value = 0.0 )
v1 = tk.DoubleVar( value = 0.0 )
    
v_tot = tk.DoubleVar()
    
def do_sum():
    v_tot.set( v0.get() + v1.get() )
    
def do_group1():
    ix = group1.get()
    v0.set( { 1: 2.82, 2: 5.66, 3: 8.49 }[ix] )
    do_sum()
    
def do_group2():
    ix = group2.get()
    v1.set( { 1: 8.83, 2: 17.66, 3: 26.49 }[ix] )
    do_sum()
    
spacer = { 'padx': 3, 'pady': 3 }
    
# Group 1
r = 0
ttk.Label( root, text = 'Group 1  : ').grid( row = r, column = 0, **spacer )
ttk.Label( root, text = "", textvariable = v0 ).grid( row = r, column = 1 )
ttk.Radiobutton( root, text = 'Button 1', variable = group1, value = 1,
                     command = do_group1 ).grid( row = r, column = 2, **spacer )
ttk.Radiobutton( root, text = 'Button 2', variable = group1, value = 2,
                     command = do_group1 ).grid( row = r, column = 3, **spacer )
ttk.Radiobutton( root, text = 'Button 3', variable = group1, value = 3,
                     command = do_group1 ).grid( row = r, column = 4, **spacer )
    
# Group 2
r = 1
ttk.Label( root, text = 'Group 2  : ').grid( row = r, column = 0)
ttk.Label( root, text = "", textvariable = v1 ).grid( row = r, column = 1 )
ttk.Radiobutton( root, text = 'Button 1', variable = group2, value = 1,
                 command = do_group2 ).grid( row = r, column = 2, **spacer )
ttk.Radiobutton( root, text = 'Button 2', variable = group2, value = 2,
                 command = do_group2 ).grid( row = r, column = 3, **spacer )
ttk.Radiobutton( root, text = 'Button 3', variable = group2, value = 3,
                 command = do_group2 ).grid( row = r, column = 4, **spacer )
    
# Total
r = 3
ttk.Label( root, text = 'Total  : ').grid( row = r, column = 0)
ttk.Label( root, text = "", textvariable = v_tot ).grid( row = r, column = 1 )
    
root.mainloop()

根据您在下面的评论, 我尝试对问题中的代码进行最小更改,并在 frame3 中显示总和。这回答了你的问题了吗?

onclick7可以由每个人执行onclickX以保持运行总计,并且根本不需要总计按钮。

应该可以减少onclickX使用 s 中返回的值的数量IntVar。这将使以后的维护更容易。

from tkinter import *
from tkinter import Tk
import tkinter as tk
from tkinter import ttk
    
root=tk.Tk()
root.title("Dental Milling Machines")
root.geometry("600x900")
    
# text_boxes_to_sum = [ textbox1, textbox2 ]
    
def onclick1():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '2.83')
    
def onclick2():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '5.66')
    
def onclick3():
    textbox1.delete('1.0', 'end')
    textbox1.insert('end', '8.49')
    
def onclick4():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '8.83')
    
def onclick5():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '17.66')
    
def onclick6():
    textbox2.delete('1.0', 'end')
    textbox2.insert('end', '26.49')
    
# *********   Changes   **************
    
def to_float( string ):
    # Return the float from a valid string or zero if invalid.
    try: 
        return float( string )
    except ValueError:
        return 0.0
    
def onclick7():
    tot = 0.0
    for box in text_boxes_to_sum:
        # text_boxes_to_sum is defined below after textbox3
        v = box.get( '1.0', 'end' )
        tot += to_float( v )
    textbox3.delete( '1.0', 'end' )
    textbox3.insert( 'end', str(tot) )
    
# ************************************
    
button_var1 = tk.IntVar()
button_var2 = tk.IntVar()
button_var3 = tk.IntVar()
    
frame1 = Frame(root, height = 150, width= 150, relief= RAISED, bd=8, bg="blue")
frame1.grid(row=0, column=0, pady=2,sticky="NW")
frame2 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame2.grid(row=0, column=0, pady=2,sticky="NW")
frame3 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame3.grid(row=1, column=0, pady=2,sticky="NW")
frame4 = Frame(frame1, height = 150, width= 150, relief= RAISED, bd=8, bg="lightblue")
frame4.grid(row=1, column=1, pady=2,sticky="NW")
    
label = Label(frame2, text="Select # of LAV CNC 240 Units", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")
label = Label(frame3, text="Select # Of LAV CNC 500 Units", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")
label = Label(frame4, text="Total CFM Values", fg="red")
label.grid(row=0, columnspan=3, pady= 1, sticky= "W")
    
textbox1 = Text(frame2, borderwidth=1, wrap="none", width=10, height=1)
textbox1.grid(row=1, column=1, sticky="w")
textbox2 = Text(frame3, borderwidth=1, wrap="none", width=10, height=1)
textbox2.grid(row=1, column=1, sticky="w")
textbox3 = Text(frame4, textbox1, borderwidth=1, wrap="none", width=30, height=1)
textbox3.grid(row=1, column=0, sticky="w")
    
text_boxes_to_sum = [ textbox1, textbox2 ]  
# Used in on_click7 but can't be created until the textboxes are defined.
    
button1=Radiobutton(frame2, text="1 Unit ", variable=button_var1, command=onclick1, value = 0 )
button1.grid(row=1, column=0, pady= 1, padx= 5, sticky= "W")
button2=Radiobutton(frame2, text="2 Units ", variable=button_var1, command=onclick2, value = 1 )
button2.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")
button3=Radiobutton(frame2, text="3 Units ", variable=button_var1, command=onclick3, value = 2 )
button3.grid(row=3, column=0, pady= 1, padx= 5, sticky= "W")
button4=Radiobutton(frame3, text="1 Unit ", variable=button_var2, command=onclick4, value = 1 )
button4.grid(row=1, column=0, pady= 1, padx= 5, sticky= "W")
button5=Radiobutton(frame3, text="2 Units ", variable=button_var2, command=onclick5, value = 2 )
button5.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")
button6=Radiobutton(frame3, text="3 Units ", variable=button_var2, command=onclick6, value= 3 )
button6.grid(row=3, column=0, pady= 1, padx= 5, sticky= "W")
button7=Radiobutton(frame4, text="Show Values ", variable=button_var3, command=onclick7, value = 0 )
button7.grid(row=2, column=0, pady= 1, padx= 5, sticky= "W")
    
root.mainloop()

推荐阅读