Python Tkinter中某个函数的GUI故障排除
考虑:Python Tkinter中某个函数的GUI故障排除,python,math,Python,Math,考虑: from Tkinter import * class App(Frame): def __init__(self, master): Frame.__init__(self, master) self.grid() self.create_widgets() def create_widgets(self): self.entryLabel = Label(self, text="Please ente
from Tkinter import *
class App(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.create_widgets()
def create_widgets(self):
self.entryLabel = Label(self, text="Please enter a list of numbers (no commas):")
self.entryLabel.grid(row=0, column=0, columnspan=2)
self.listEntry = Entry(self)
self.listEntry.grid(row=0, column=2, sticky=E)
self.entryLabel = Label(self, text="Please enter an index value:")
self.entryLabel.grid(row=1, column=0, columnspan=2, sticky=E)
self.indexEntry = Entry(self)
self.indexEntry.grid(row=1, column=2)
self.runBttn = Button(self, text="Run Function", command=self.psiFunction)
self.runBttn.grid(row=2, column=0, sticky=W)
self.answerLabel = Label(self, text="Output List:")
self.answerLabel.grid(row=2, column=1, sticky=W)
此代码构建一个小型用户界面,然后用于以下功能:
def psiFunction(self):
j = int(self.indexEntry.get())
valueList = list(self.listEntry.get())
x = map(int, valueList)
if x[0] != 0:
x.insert(0, 0)
rtn = []
for n2 in range(0, len(x) * j - 2):
n = n2 / j
r = n2 - n * j
if r == 0:
rtn.append(j * x[n])
else:
rtn.append(j * x[n] + r * (x[n + 1] - x[n]))
self.answer = Label(self, text=rtn)
self.answer.grid(row=2, column=2, sticky=W)
if __name__ == "__main__":
root = Tk()
app = App(root)
root.mainloop()
例如,如果我们取j=3,我们的列表x=[0,1,2,3,4,5],我们得到[0,1,2,3…,13,14,15]作为我们的输出列表(尽管程序将其作为字符串输出)。这是通过使用固定参数j的输入列表中的项来计算长度len(x)*j-2的输出列表的值来实现的。现在,这个例子可以很好地处理上面的代码。然而,如果我尝试,比如说,j=4x=[0,1,2,3,4,5]什么都没有出现,我没有得到任何输出。我也没有收到任何错误消息,所以我不确定为什么会出现这个问题。起初我认为这可能与列表长度小于j值有关(只是随便猜测一下),但这个例子表明我的想法是错误的。有人知道为什么会这样吗
注意:标题是指在使用从tkinter代码中删除的python函数时不会发生这种情况
编辑:已更改定义的代码
def psiFunction(self):
j = int(self.indexEntry.get())
valueList = list(self.listEntry.get())
x = map(int, valueList)
length = len(x)
if x[0] != 0:
x.insert(0, 0)
rtn = []
for n2 in range(0, length * j):
n = n2 / j
r = n2 - n * j
if r == 0:
rtn.append(j * x[n])
else:
rtn.append(j * x[n] + r * (x[n + 1] - x[n]))
self.answer = Label(self, text=rtn)
self.answer.grid(row=2, column=2, sticky=W)
我不知道为什么您的计算机中没有错误,但这部分代码确实给出了一个错误,
x=[0,1,2,3,4,5]
和j=4
for n2 in range(0, len(x) * j - 2):
n = n2 / j
r = n2 - n * j
if r == 0:
rtn.append(j * x[n])
else:
rtn.append(j * x[n] + r * (x[n + 1] - x[n]))
让我们看看,
range(0,len(x)*j-2)
等于range(0,22)
,所以当n2
达到21时,n=5,j=1
。它将进入else,将出现x[6]
,这将抛出一个索引器,而您无法获得所需的输出。说得好。是否有办法对此进行修改,使其不成为问题?我想我基本上明白了问题所在。最初,当我做这个时,我只想把[1,2,3,4,5]算作x的长度。0始终存在,不应被计算在内。除了从len(x)*j中减去值之外,我想不出从计数中排除零的方法。如果我可以,那么我们只能得到5 x 4=20个条件,这将是完美的。有没有一种方法可以让它以这种方式计数,使像x=[0,1,2,3,4,5]j=3这样的情况保持不变?这很简单。在将0追加到x之前,可以将len(x)
存储到变量中,例如length=len(x)
,然后使用length*j
。或者使用(len(x)-1)*j
。我不清楚。我只能从您的代码和一些简单的解决方案中判断错误。至于逻辑,我无能为力(我理解你所描述的后半部分,但第一部分长度=len(x)不是也会产生同样的结果吗?这可能很简单,但我只是尝试了j=4和x=[012345]与你所描述的变化。除了第21个术语(即0,1,2,3…17,18,19)外,我得到了每个术语).现在,我理想的情况是函数将其视为第20项(0是第0项1是第1项2是第2项…),因此它将是4*x[5]+0*(x[n+1]-x[n]),并进入语句的“if”部分。我的意思是在x=map之后,在if[0]之前使用length=len(x)
!=0
。因此此长度将是列表的长度,不包括0。