排除Tkinter中某个函数的GUI故障



考虑:

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],这将引发索引错误,并且您无法获得所需的输出。

最新更新