我认为通过的2个不需要的算法究竟在哪里?

时间:2014-07-09 13:56:58

标签: python function scale typeerror args

我不熟悉Python脚本。我只是想创建一个小GUI,允许我使用Tkinter Scale更改ArcGIS模型中的参数,然后通过单击TKinter按钮运行模型。 (下面的代码没有完成,正在用于测试目的,因此按钮实际上并没有调用另一个脚本。)

我在Traceback中得到了这个TypeError:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\ArcGIS10.1\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
TypeError: GetScale() takes no arguments (2 given)

我尝试从我的代码中删除许多不同的东西来确定这些参数可能是什么但无济于事。令人难以置信的是,我确信这是最简单的问题。

我的代码如下:

import Tkinter

from Tkinter import *

class createBuffer(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        #Define variable for text field
        self.entryVariable = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self, textvariable=self.entryVariable)
        self.entry.grid(column=0,row=0,sticky='EW')
        self.entry.bind("<Return>", self.OnPressEnter)

        #Set default text field text
        self.entryVariable.set(u"Enter desired radius here.")

        button = Tkinter.Button(self,text=u"Create Buffer",
                            command = self.OnButtonClick)
        button.grid(column=1, row=0)



        scale = Tkinter.Scale(self, variable = StringVar, orient = HORIZONTAL, from_ =              0, to = 100, resolution = 10, width = 30, length = 300, command = self.GetScale)
        scale.grid(row = 4)
        scale.set(50)



        #Create a Tkinter variable and bind it to a widget
        self.labelVariable = Tkinter.StringVar()
        label = Tkinter.Label(self, textvariable = self.labelVariable,
                          anchor = "w", fg = "black", bg = "white")
        label.grid(column=0, row=1, columnspan=2, sticky="EW")
        self.labelVariable.set(u"Radius:")

        self.grid_columnconfigure(0, weight=1)
        self.resizable(True,False)

        #Fix the size of the window as its own size (doesn't automatically resize with long text string input)
        #self.update()
        #self.geometry(self.geometry())



        #set focus to text field 
        self.entry.focus_set()        
        self.entry.selection_range(0, Tkinter.END)


    def OnButtonClick(self):
        self.labelVariable.set("Radius:    " +self.entryVariable.get())

    def OnPressEnter(self,event):
        self.labelVariable.set("Radius:    " + self.entryVariable.get())
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def GetScale():
        sliderValue = scale.get()
        print (sliderValue)



if __name__ == "__main__":
    app = createBuffer(None)
    app.title('Buffer Tool')
    app.mainloop()

3 个答案:

答案 0 :(得分:1)

在这一行:

return self.func(*args)

有两个参数,一个是隐式的,一个是显式的。第一个是隐式的,它是self。每当您调用附加到对象(即obj.func())的函数时,obj对象本身就是隐含的第一个参数。第二个参数是显式传递的*args数组,即使它包含零参数,它仍然作为参数本身计算(尽管它只包含一个空元组())。 / p>

现在查看代码中的以下行:

scale = Tkinter.Scale(self, variable = StringVar, orient = HORIZONTAL, from_ = 0, to = 100, resolution = 10, width = 30, length = 300, command = self.GetScale)

在这里,您将GetScale()作为函数参数传入,并且在Tkinter模块中以某种方式调用它。该模块基本上是调用self.GetScale(*args)。正如ambi建议的那样,您需要更改GetScale()的定义,可能更改为:

def GetScale(self, *args):
    sliderValue = scale.get()
    print (sliderValue)

在不太相关的说明中,如果您希望每个对象都有一个scale变量,那么将它称为self.scale可能更为明智。如果它是全局scale,则忽略此。

答案 1 :(得分:0)

GetScale函数的定义更改为:

def GetScale(*args, **kwargs):
    print(*args, **kwargs)
    sliderValue = scale.get()
    print (sliderValue)

这样你的函数就会接受任何位置或关键字参数,这样你就可以检查它们是什么。

答案 2 :(得分:0)

你的职能:

def GetScale():
    sliderValue = scale.get()
    print (sliderValue)

应改为:

def GetScale(self):
    sliderValue = scale.get()
    print (sliderValue)

由于这是一种课堂方法,你必须列出“自我”。作为参数,因为它将在调用时自动传递给函数。至于第二个论点,我并不完全确定。将方法绑定到TK命令(例如

)时
command = GetScale

您必须省略括号以避免过早发生呼叫。这意味着就我所知,您无法传递其他参数。我首先要对GetScale函数进行正确的更改,看看它是否会改变输出/错误。