Tkinter应用程序返回随机值 [英] Tkinter application returns random values

查看:50
本文介绍了Tkinter应用程序返回随机值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Tkinter开发了一个Python应用程序,用于进行电磁学分配.它是用于3维矢量的幅度计算器.

代码:

来自tkinter导入的

  *根= Tk()root.title(计算器")坐标= []n = 0X =条目(根)X.insert(END,输入x坐标")X.grid(行= 0,列= 0,列跨度= 3,padx = 12,pady = 15)Y =条目(根)Y.insert(结束,输入y坐标")Y.grid(行= 1,列= 0,列跨度= 3,padx = 12,pady = 15)Z =条目(根)Z.insert(END,输入z坐标")Z.grid(行= 2,列= 0,列跨度= 3,padx = 12,pady = 15)def x():全局nn = 1def y():全局nn = 2def z():全局nn = 3定义S(m):如果n == 1:一个= X.get()X.delete(0,END)X.insert(0,str(a)+ str(m))坐标.附加(X)如果n == 2:b = Y.get()Y.delete(0,END)Y.插入(0,str(b)+ str(m))坐标.附加(Y)如果n == 3:c = Z.get()Z.delete(0,END)Z.insert(0,str(c)+ str(m))坐标.附加(Z)def clear():X.delete(0,END)Y.delete(0,END)Z.delete(0,END)def equal():平方= 0对于d中的坐标:e =浮点数(d.get())平方=平方+ e ** 2大小=平方** 0.5val = Label(root,text =向量的大小为:"+ str(mag))".val.grid(行= 3,列= 0,列跨度= 3,padx = 12,pady = 15)b1 =按钮(root,文本="1",padx = 30,pady = 15,command = lambda:S("1"))b2 =按钮(根,文本="2",padx = 30,pady = 15,命令= lambda:S("2")))b3 =按钮(根,文本="3",padx = 30,pady = 15,命令= lambda:S("3")))b4 =按钮(根,文本="4",padx = 30,pady = 15,命令= lambda:S("4")))b5 =按钮(root,文本="5",padx = 30,pady = 15,command = lambda:S("5"))b6 =按钮(root,文本="6",padx = 30,pady = 15,command = lambda:S("6"))b7 =按钮(根,文本="7",padx = 30,pady = 15,命令= lambda:S("7"))b8 =按钮(根,文本="8",padx = 30,pady = 15,命令= lambda:S("8")))b9 =按钮(root,文本="9",padx = 30,pady = 15,command = lambda:S("9"))b0 =按钮(root,文本="0",padx = 30,pady = 15,command = lambda:S("0"))bx =按钮(根目录,文本="x",padx = 30,pady = 15,command = x)by = Button(root,text ="y",padx = 30,pady = 15,command = y)bz =按钮(根目录,文本="z",padx = 30,pady = 15,command = z)bclear =按钮(根目录,文本=清除",padx = 19,pady = 15,command =清除)bequal = Button(root,text ="=",padx = 29,pady = 15,command =等于)b1.grid(第6行,第0列)b2.grid(第6行,第1列)b3.grid(第6行,第2列)b4.grid(行= 5,列= 0)b5.grid(第5行,第1列)b6.grid(第5行,第2列)b7.grid(行= 4,列= 0)b8.grid(第4行,第1列)b9.grid(第4行,第2列)b0.grid(第7行,第1列)bx.grid(第8行,第0列)by.grid(第8行,第1列)bz.grid(第8行,第2列)bclear.grid(第7行,第2列)bequal.grid(第7行,第0列)root.mainloop() 

似乎只有一个问题:

当用户甚至为其中一个输入输入了大于10的值时,输出似乎大于实际值.它仅适用于很小的输入,例如,如果输入的数字是3、4、5.

解决方案

好吧,我的代码结构对我来说太苛刻了,所以我不得不考虑其他逻辑方法,但最终还是遇到了麻烦.>

我对代码进行了注释,以使在旅途中更容易理解:

来自tkinter导入的

  *根= Tk()root.title(计算器")坐标 = [] # 制作空列表以保存所有数字xi,yi,zi = [],[],[]#制作一个空列表,仅保留相应的数字n = 0#n的初始值X =条目(根)X.grid(行= 0,列= 0,列跨度= 3,padx = 12,pady = 15)Y =条目(根)Y.grid(行= 1,列= 0,列跨度= 3,padx = 12,pady = 15)Z =条目(根)Z.grid(行= 2,列= 0,列跨度= 3,padx = 12,pady = 15)def x():全局nn = 1def y():全局nn = 2def z():全局nn = 3定义S(m):如果n == 1:#如果n为1X.insert(END,str(m))#然后将单击的数字插入相应输入框的末尾坐标.append(X.get())#追加到所有数字的主列表中如果n == 2:Y.insert(END,str(m))#与y的操作相同axes.append(Y.get())如果n == 3:Z.insert(END,str(m))#与z相同axes.append(Z.get())def clear():#删除所有条目小部件X.delete(0,END)Y.delete(0,END)Z.delete(0,END)#清除所有列表坐标.clear()xi.clear()yi.clear()zi.clear()def equal():xi.append(coordinates [len(X.get())-1])#从x的整个数字列表中获取最后输入的值yi.append(coordinates [len(Y.get())+ len(X.get())-1])#从y的整个数字列表中获取最后输入的值zi.append(coordinates [len(Z.get())+ len(X.get())+ len(Y.get())-1])#从z的整个数字列表中获取最后输入的值final_coordinates = xi + yi + zi#创建一个仅包含坐标的新最终列表平方= 0对于final_coordinates中的d:e =浮点数(d)平方=平方+ e ** 2大小=平方** 0.5val.config(text = f向量的大小为:{round(mag,3)}")#这样做是为了摆脱标签的覆盖val.grid(行= 3,列= 0,列跨度= 4,padx = 12,pady = 15)b1 =按钮(root,text ="1",padx = 30,pady = 15,command = lambda:S(1))b2 =按钮(root,text ="2",padx = 30,pady = 15,command = lambda:S(2))b3 =按钮(root,text ="3",padx = 30,pady = 15,command = lambda:S(3))b4 =按钮(root,text ="4",padx = 30,pady = 15,command = lambda:S(4))b5 =按钮(root,text ="5",padx = 30,pady = 15,command = lambda:S(5))b6 =按钮(root,text ="6",padx = 30,pady = 15,command = lambda:S(6))b7 =按钮(root,text ="7",padx = 30,pady = 15,command = lambda:S(7))b8 =按钮(root,text ="8",padx = 30,pady = 15,command = lambda:S(8))b9 =按钮(root,text ="9",padx = 30,pady = 15,command = lambda:S(9))b0 =按钮(root,文本="0",padx = 30,pady = 15,command = lambda:S(0))bx =按钮(根目录,文本="x",padx = 30,pady = 15,command = x)by = Button(root,text ="y",padx = 30,pady = 15,command = y)bz =按钮(根目录,文本="z",padx = 30,pady = 15,command = z)bclear =按钮(根目录,文本=清除",padx = 19,pady = 15,command =清除)bequal = Button(root,text ="=",padx = 29,pady = 15,command =等于)b1.grid(第6行,第0列)b2.grid(第6行,第1列)b3.grid(第6行,第2列)b4.grid(行= 5,列= 0)b5.grid(第5行,第1列)b6.grid(第5行,第2列)b7.grid(行= 4,列= 0)b8.grid(第4行,第1列)b9.grid(第4行,第2列)b0.grid(第7行,第1列)bx.grid(第8行,第0列)by.grid(第8行,第1列)bz.grid(第8行,第2列)bclear.grid(第7行,第2列)bequal.grid(第7行,第0列)val = Label(root)#在此声明,以便以后可以配置标签root.mainloop() 

说明:

想象一下,我们在x框中输入 123 ,在y框中输入 852 ,在z框中输入 369 ,所以最终列表,坐标,将所有x,y,z都添加为

['1', '12', '123', '8', '85', '852', '3', '36', '369'] 

因此,现在x上的输入长度为3,这是列表上的第三项.类似地,y上条目的长度为3,即列表中的第6个项目(x的长度+ y的长度),z的情况也相同.现在,由于我们正在对其进行索引,因此我们将始终向下1(减去1),因为索引从0开始,而计数从1开始.

此外,我从输入框内删除了占位符,因为它可能导致效率低下,也许只是在每个条目的顶部贴上标签,说明条目小部件的用途.我还使用了 round(mag,3)将数字四舍五入到3个十进制值,因为在那之后我觉得很尴尬(对我来说),您可以摆脱它并使整个数字吐出

希望这可以完成工作,但是如果有任何疑问,请告诉我.

I made a Python application using Tkinter for an electromagnetics assignment. It is a magnitude calculator for a 3-dimensional vector.

The code:

from tkinter import *

root = Tk()

root.title("Calculator")

coordinates = []

n=0

X = Entry(root)
X.insert(END, "Enter the x-coordinate")
X.grid(row=0, column=0, columnspan=3, padx=12, pady=15)

Y = Entry(root)
Y.insert(END, "Enter the y-coordinate")
Y.grid(row=1, column=0, columnspan=3, padx=12, pady=15)

Z = Entry(root)
Z.insert(END, "Enter the z-coordinate")
Z.grid(row=2, column=0, columnspan=3, padx=12, pady=15)

def x():
    global n
    n=1
    
def y():
    global n
    n=2
    
def z():
    global n
    n=3
    
def S(m):
    if n == 1:
        a = X.get()
        X.delete(0,END)
        X.insert(0,str(a)+str(m))
        coordinates.append(X)
    if n == 2:
        b = Y.get()
        Y.delete(0,END)
        Y.insert(0,str(b)+str(m))
        coordinates.append(Y)
    if n == 3:
        c = Z.get()
        Z.delete(0,END)
        Z.insert(0,str(c)+str(m))
        coordinates.append(Z)
        
def clear():
    X.delete(0,END)
    Y.delete(0,END)
    Z.delete(0,END)
    
def equal():
    sq = 0
    for d in coordinates:
        e = float(d.get())
        sq = sq + e**2 
    mag = sq**0.5
    val = Label(root, text="The magnitude of the vector is: " + str(mag))
    val.grid(row=3, column=0, columnspan=3, padx=12, pady=15)
    
b1 = Button(root, text="1", padx=30, pady=15, command=lambda: S("1"))
b2 = Button(root, text="2", padx=30, pady=15, command=lambda: S("2"))
b3 = Button(root, text="3", padx=30, pady=15, command=lambda: S("3"))
b4 = Button(root, text="4", padx=30, pady=15, command=lambda: S("4"))
b5 = Button(root, text="5", padx=30, pady=15, command=lambda: S("5"))
b6 = Button(root, text="6", padx=30, pady=15, command=lambda: S("6"))
b7 = Button(root, text="7", padx=30, pady=15, command=lambda: S("7"))
b8 = Button(root, text="8", padx=30, pady=15, command=lambda: S("8"))
b9 = Button(root, text="9", padx=30, pady=15, command=lambda: S("9"))
b0 = Button(root, text="0", padx=30, pady=15, command=lambda: S("0"))
bx = Button(root, text="x", padx=30, pady=15, command=x)
by = Button(root, text="y", padx=30, pady=15, command=y)
bz = Button(root, text="z", padx=30, pady=15, command=z)
bclear = Button(root, text="Clear", padx=19, pady=15, command=clear)
bequal = Button(root, text="=", padx=29, pady=15, command=equal)

b1.grid(row=6, column=0)
b2.grid(row=6, column=1)
b3.grid(row=6, column=2)
b4.grid(row=5, column=0)
b5.grid(row=5, column=1)
b6.grid(row=5, column=2)
b7.grid(row=4, column=0)
b8.grid(row=4, column=1)
b9.grid(row=4, column=2)
b0.grid(row=7, column=1)
bx.grid(row=8, column=0)
by.grid(row=8, column=1)
bz.grid(row=8, column=2)
bclear.grid(row=7, column=2)
bequal.grid(row=7, column=0)

root.mainloop()

There seems to be just the one problem:

When the user enters a value greater than 10 for even one of the inputs, the output seems to be greater than the actual value. It only works for very small inputs, for instance, if the numbers entered were 3, 4, 5.

解决方案

Well the code structure was a bit too harsh on me, so I had to think of other logical ways but ended up getting a hacky way around.

I've commented the code so as to make the understand easier on-the-go:

from tkinter import *

root = Tk()
root.title("Calculator")

coordinates = [] # making empty list to hold all the numbers
xi,yi,zi = [],[],[] #making empty list to hold only the corresponding numbers

n = 0 #initial value of n

X = Entry(root)
X.grid(row=0, column=0, columnspan=3, padx=12, pady=15)

Y = Entry(root)
Y.grid(row=1, column=0, columnspan=3, padx=12, pady=15)

Z = Entry(root)
Z.grid(row=2, column=0, columnspan=3, padx=12, pady=15)

def x():
    global n
    n = 1
    
def y():
    global n
    n = 2
    
def z():
    global n
    n = 3
    
def S(m):
    if n == 1: #if n is 1
        X.insert(END,str(m)) #then insert the clicked number to the end of the corresponding entry box 
        coordinates.append(X.get()) #append to the main list of all numbers 
    if n == 2:
        Y.insert(END,str(m)) #doing same as above for y
        coordinates.append(Y.get())
    if n == 3:
        Z.insert(END,str(m)) #doing same as above for z
        coordinates.append(Z.get())

def clear():
    #removing all the entry widget 
    X.delete(0,END)
    Y.delete(0,END)
    Z.delete(0,END)

    #clearing all the lists
    coordinates.clear()
    xi.clear()
    yi.clear()
    zi.clear()
    
def equal():
    xi.append(coordinates[len(X.get())-1]) #get the last entered value from the entire list of numbers for x
    yi.append(coordinates[len(Y.get())+len(X.get())-1]) #get the last entered value from the entire list of numbers for y
    zi.append(coordinates[len(Z.get())+len(X.get())+len(Y.get())-1]) #get the last entered value from the entire list of numbers for z
    final_coordinates = xi+yi+zi #make a new final list that has the cordinates only

    sq = 0
    for d in final_coordinates:
        e = float(d)
        sq = sq + e**2 
    mag = sq**0.5
    val.config(text=f"The magnitude of the vector is: {round(mag,3)}") #doing this to get rid of overwriting of labels
    val.grid(row=3, column=0, columnspan=4, padx=12, pady=15)
    
b1 = Button(root, text="1", padx=30, pady=15, command=lambda: S(1))
b2 = Button(root, text="2", padx=30, pady=15, command=lambda: S(2))
b3 = Button(root, text="3", padx=30, pady=15, command=lambda: S(3))
b4 = Button(root, text="4", padx=30, pady=15, command=lambda: S(4))
b5 = Button(root, text="5", padx=30, pady=15, command=lambda: S(5))
b6 = Button(root, text="6", padx=30, pady=15, command=lambda: S(6))
b7 = Button(root, text="7", padx=30, pady=15, command=lambda: S(7))
b8 = Button(root, text="8", padx=30, pady=15, command=lambda: S(8))
b9 = Button(root, text="9", padx=30, pady=15, command=lambda: S(9))
b0 = Button(root, text="0", padx=30, pady=15, command=lambda: S(0))
bx = Button(root, text="x", padx=30, pady=15, command=x)
by = Button(root, text="y", padx=30, pady=15, command=y)
bz = Button(root, text="z", padx=30, pady=15, command=z)
bclear = Button(root, text="Clear", padx=19, pady=15, command=clear)
bequal = Button(root, text="=", padx=29, pady=15, command=equal)

b1.grid(row=6, column=0)
b2.grid(row=6, column=1)
b3.grid(row=6, column=2)
b4.grid(row=5, column=0)
b5.grid(row=5, column=1)
b6.grid(row=5, column=2)
b7.grid(row=4, column=0)
b8.grid(row=4, column=1)
b9.grid(row=4, column=2)
b0.grid(row=7, column=1)
bx.grid(row=8, column=0)
by.grid(row=8, column=1)
bz.grid(row=8, column=2)
bclear.grid(row=7, column=2)
bequal.grid(row=7, column=0)

val = Label(root) #declaring here, so that label can be configured later 

root.mainloop()

Explanation:

Imagine, we entered 123 in the x box, 852 in the y box and 369 in the z box, so the final list, coordinates, after appending all x, y, z is

['1', '12', '123', '8', '85', '852', '3', '36', '369']

So now the length of entry on x is 3, and that is our 3rd item on the list. Similarly, the length of the entry on y is 3, that is the 6th item on the list(which is length of x + length of y), same applies to z too. Now since we are indexing it, we will go 1 down(subtract 1) always, because indexing starts from 0, whereas our counting starts from 1.

Also, I removed the placeholders from inside the entry box as it can cause inefficiency, maybe just put a label on top of each entry, stating whats the purpose of the entry widget. Also I have used round(mag,3) to round the digit upto 3 decimal values, since I gets awkward after that(for me), you could just get rid of it and have the entire numbers spit out.

Hope this gets the job done, but do let me know if any doubts.

这篇关于Tkinter应用程序返回随机值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆