python-3.x - 我想将来自多个文本框的值加起来并插入到最终的文本框中
问题描述
我的文件包含 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()
解决方案
分组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()
推荐阅读
- debugging - 如何在 delve 中打印字符串变量的完整值?
- ruby-on-rails - 尝试调用 DELETE 时出现路由错误
- python - 如何在 python 脚本和外部命令行中使用 pdfminer.six 的 pdf2txt.py?
- react-native - React Native 0.56/0.57 Geolocation watchPosition 更新率
- ios - 有没有办法在 GPS 给出的位置上获得更好的精度?
- r - 条件绑定
- laravel - TypeError: Vue.component 不是函数 laravel 项目
- javascript - 如何使用超时重置循环参数
- java - Mongo DB 在 FindIterable 迭代中抛出 NullPointerException
- javascript - Vue渲染顺序