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。