Python 类内函数的参数数与类外函数的参数数不一样吗?

Python 类内函数的参数数与类外函数的参数数不一样吗?,python,python-2.7,class,tkinter,Python,Python 2.7,Class,Tkinter,我试图提高我一开始的Python(2.7)技能(以及我的英语…) 我已经编写了一个代码来比较图形中的两个文件。这就是工作! 因此,我尝试制作一个界面,以便更轻松地更改标题、范围、轴的名称 我使用Tk库和ttk。我首先为框架创建一个类,并为重复任务定义函数。“这是个好主意”,我想。哈哈哈。 我遇到的一些问题: 函数中的变量不是全局变量,因此我无法使用函数的结果,也没有找到如何解决该问题的方法 当函数内置到类中时,参数总是更多,并且函数在类外运行良好 我解释: Class App(Object)

我试图提高我一开始的Python(2.7)技能(以及我的英语…)

我已经编写了一个代码来比较图形中的两个文件。这就是工作! 因此,我尝试制作一个界面,以便更轻松地更改标题、范围、轴的名称

我使用Tk库和ttk。我首先为框架创建一个类,并为重复任务定义函数。“这是个好主意”,我想。哈哈哈。 我遇到的一些问题:

  • 函数中的变量不是全局变量,因此我无法使用函数的结果,也没有找到如何解决该问题的方法
  • 当函数内置到类中时,参数总是更多,并且函数在类外运行良好
我解释:

Class App(Object):
    functionInClass(arg1, arg2):
        pass

当我调用functionOutClass时没问题,但当我使用相同的参数调用App.functionInClass时,我总是会收到一条错误消息(函数需要2个参数,给出了3个参数)。我没有找到解决办法

我从Python开始,虽然很难,但很有趣

最后,我的代码运行时没有类,也没有重复任务的函数,但它非常丑陋

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from os import getcwd, path
import Tkinter as tk
from Tkinter import *
import tkFileDialog as filedialog
import shutil
import ttk
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.style.use('ggplot')
wd = getcwd() # working directory

class Application(ttk.Frame):  # Not use
    def __init__(self, master=None):
        ttk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = ttk.Button(self, text='Quitter', command=self.quit)
        self.quitButton.grid(column=2, row=3)


def champ(nom, defaut, col, ran, lab, collab, ranlab, largeur=7):
    nom = StringVar()  # Don't run
    nom = ttk.Entry(mainframe, width=largeur, textvariable=nom)
    nom.insert(0, defaut)
    if nom.bind('<FocusIn>'):
        nom.delete(0, "end")
    nom.grid(column=col, row=ran, sticky=W)
    ttk.Label(mainframe, text=lab).grid(column=collab, row=ranlab, sticky=E)

def champdouble(nom1, defaut1, nom2, defaut2, col, ran, lab, lab2, collab, ranlab, largeur=7):  # Don't run
    nom1 = StringVar()
    nom1 = ttk.Entry(mainframe, width=largeur, textvariable=nom1)
    nom1.insert(0, defaut1)
    nom1.grid(column=col, row=ran, sticky=W)
    ttk.Label(mainframe, text=lab).grid(column=collab, row=ranlab, sticky=E)
    nom2 = StringVar()
    nom2 = ttk.Entry(mainframe, width=largeur, textvariable=nom2)
    nom2.insert(0, defaut2)
    nom2.grid(column=col+2, row=ran, sticky=W)
    ttk.Label(mainframe, text=lab2).grid(column=collab+2, row=ranlab, sticky=E)

def on_entry_click(event):
    """function that gets called whenever entry is clicked"""
    global dirname
    if file1.get() == 'Choisissez un fichier...':
        file1.delete(0, "end") # delete all the text in the entry
        dirinit = r'C:/'
        dirname = filedialog.askopenfilename(parent=mainframe, initialdir=dirinit, title='Sélectionnez le fichier')
        file1.insert(0, dirname) #Insert blank for user input

def on_entry_click1(event):
    """function that gets called whenever entry is clicked"""
    global dirname2
    if file2.get() == 'Choisissez un fichier...':
       file2.delete(0, "end") # delete all the text in the entry
       dirinit = r'C:/'
       dirname2 = filedialog.askopenfilename(parent=mainframe, initialdir=dirinit, title='Sélectionnez le fichier')
       file2.insert(0, dirname2) #Insert blank for user input

def callback():
    def traitement(fichier, deb, fin):
        df = pd.read_csv(fichier, sep = '\t', engine = 'python', header = deb, skipfooter = fin)  # Lecture des fichiers
        df = df.rename(columns={'$Relations :NumZoneE': 'NumZoneE'})  # Renommage des entêtes de colonnes
        df = df[(df.NumZoneE != df.NumZoneA)]  # supression des intrazonaux
        df = df[(df.NumZoneE <= 1289)]  # supression des zones superieures a 1289
        df = df[(df.NumZoneA <= 1289)]
        df['OD_possible']=np.where(df['JRTA'] < 999999, 'oui', 'non')  # creation d'une colonne OD_possible
        df = pd.merge(df, dvol, on = ['NumZoneE', 'NumZoneA'])  # jointure des tables avec dvol
        dfg = df.groupby('OD_possible')  # groupage selon oui ou non
        return dfg

    titrel = titre.get()
    file1_debl = int(file1_deb.get())
    file1_finl = int(file1_fin.get())
    file2_debl = int(file2_deb.get())
    file2_finl = int(file2_fin.get())
    cettecolonnel = cettecolonne.get()
    range1l = int(range1.get())
    range2l = int(range2.get())
    binsl = int(bins.get())
    legend1l = legend1.get()
    legend2l = legend2.get()
    axeXl = axeX.get()
    axeYl = axeY.get()
    sortiel = sortie.get()

    # Chemin d'acces vers les fichiers à traiter
    dvol = r'\\C:\1704_Test_maj_horaire_RERD_Sc2012\090721_DVOL_km.txt'

    # Traitement de dvol
    dvol = pd.read_csv(dvol, sep = '\t')  # Lecture
    dvol = dvol.rename(columns = {'ZONEO': 'NumZoneE', 'ZONED': 'NumZoneA'})  # Renommage entete
    dvol = dvol[(dvol.DVOL != 0)]  # Suppression intrazonaux

    fig = plt.figure()
    gss_oui = traitement(dirname, file1_debl, file1_finl).get_group('oui')
    gss_non = traitement(dirname, file1_debl, file1_finl).get_group('non')
    gac_oui = traitement(dirname2, file2_debl, file2_finl).get_group('oui')
    gac_non = traitement(dirname2, file2_debl, file2_finl).get_group('non')

    plt.hist([gss_oui[cettecolonnel], gac_oui[cettecolonnel]], range = (range1l, range2l), bins = binsl, label = [legend1l, legend2l])
    plt.legend(loc = 'best')
    plt.title(titrel)
    plt.xlabel(axeXl, labelpad = 5)
    plt.ylabel(axeYl)
    plt.savefig(path.join(wd, sortiel))
    plt.show()
    plt.close()

if __name__ == '__main__':
    #app = Application()
    style = ttk.Style()
    style.configure("BW.TEntry", foreground="grey", background="white")
    style.configure("BW1.TEntry", foreground="black", background="white")
    #app.master.title('Comparaison de fichiers')

    mainframe = ttk.Frame(padding="3 3 12 12")
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)

    # construction du champ file1
    file1 = StringVar()
    file1_deb = StringVar()
    file1_fin = StringVar()
    file1 = ttk.Entry(mainframe, width=20, style="BW.TEntry")
    file1.insert(0, 'Choisissez un fichier...')
    file1.grid(column=2, row=1, sticky=W)
    file1.bind('<FocusIn>', on_entry_click)
    ttk.Label(mainframe, text="Fichier n° 1 : ").grid(column=1, row=1, sticky=E)
    file1_deb = ttk.Entry(mainframe, width=5, textvariable=file1_deb)
    file1_deb.insert(0, "26")
    file1_deb.grid(column=4, row=1, sticky=W)
    ttk.Label(mainframe, text="ligne de début").grid(column=3, row=1, sticky=E)
    file1_fin = ttk.Entry(mainframe, width=5, textvariable=file1_fin)
    file1_fin.insert(0, "1307")
    file1_fin.grid(column=6, row=1, sticky=W)
    ttk.Label(mainframe, text="lignes de fin à supprimer").grid(column=5, row=1, sticky=E)

    # construction du champ file2
    file2 = StringVar()
    file2_deb = StringVar()
    file2_fin = StringVar()
    file2 = ttk.Entry(mainframe, width=20, style="BW.TEntry")
    file2.insert(0, 'Choisissez un fichier...')
    file2.grid(column=2, row=2, sticky=W)
    file2.bind('<FocusIn>', on_entry_click1)
    ttk.Label(mainframe, text="Fichier n° 2 : ").grid(column=1, row=2, sticky=E)
    file2_deb = ttk.Entry(mainframe, width=5, textvariable=file2_deb)
    file2_deb.insert(0, "26")
    file2_deb.grid(column=4, row=2, sticky=W)
    ttk.Label(mainframe, text="ligne de début").grid(column=3, row=2, sticky=E)
    file2_fin = ttk.Entry(mainframe, width=5, textvariable=file2_fin)
    file2_fin.insert(0, "1307")
    file2_fin.grid(column=6, row=2, sticky=W)
    ttk.Label(mainframe, text="lignes de fin à supprimer").grid(column=5, row=2, sticky=E)

    #champ("cettecolonne", "JRTA", 2, 3, "Champ à comparer :", 1, 3, 20)
    cettecolonne = StringVar()
    cettecolonne = ttk.Entry(mainframe, width=20, textvariable=cettecolonne)
    cettecolonne.insert(0, "JRTA")
    cettecolonne.grid(column=2, row=3, sticky=W)
    ttk.Label(mainframe, text="Champ à comparer :").grid(column=1, row=3, sticky=E)

    #champ("titre", "Titre du graphique", 2, 4, "Titre du graphique :", 1, 4, 20)
    titre = StringVar()
    titre = ttk.Entry(mainframe, width=20, textvariable=titre)
    titre.insert(0, "Titre du graphique")
    titre.grid(column=2, row=4, sticky=W)
    ttk.Label(mainframe, text="Titre du graphique").grid(column=1, row=4, sticky=E)

    #champdouble("range1", 0, "range2", 100, 2, 5, "Xmin :", "Xmax :", 1, 5)
    range1 = StringVar()
    range1 = ttk.Entry(mainframe, width=7, textvariable=range1)
    range1.insert(0, 0)
    range1.grid(column=2, row=5, sticky=W)
    ttk.Label(mainframe, text="Xmin :").grid(column=1, row=5, sticky=E)
    range2 = StringVar()
    range2 = ttk.Entry(mainframe, width=7, textvariable=range2)
    range2.insert(0, 100)
    range2.grid(column=4, row=5, sticky=W)
    ttk.Label(mainframe, text="Xmax :").grid(column=3, row=5, sticky=E)

    #champ("bins", 20, 2, 6, "Nombre d'intervalle :", 1, 6, 5)
    bins = StringVar()
    bins = ttk.Entry(mainframe, width=5, textvariable=bins)
    bins.insert(0, 20)
    bins.grid(column=2, row=6, sticky=W)
    ttk.Label(mainframe, text="Nombre d'intervalle :").grid(column=1, row=6, sticky=E)

    #champdouble("legend1", "file1", "legend2", "file2", 2, 7, "Légende du fichier n°1 :", "Légende du fichier n°2 :", 1, 7, 20)
    legend1 = StringVar()
    legend1 = ttk.Entry(mainframe, width=20, textvariable=legend1)
    legend1.insert(0, "fichier 1")
    legend1.grid(column=2, row=7, sticky=W)
    ttk.Label(mainframe, text="Légende du fichier n°1 :").grid(column=1, row=7, sticky=E)
    legend2 = StringVar()
    legend2 = ttk.Entry(mainframe, width=20, textvariable=legend2)
    legend2.insert(0, "fichier 2")
    legend2.grid(column=4, row=7, sticky=W)
    ttk.Label(mainframe, text="Légende du fichier n°2 :").grid(column=3, row=7, sticky=E)

    #champ("axeX", "Axe des X", 2, 8, "Nom de l'axe des x :", 1, 8, 20)
    axeX = StringVar()
    axeX = ttk.Entry(mainframe, width=20, textvariable=axeX)
    axeX.insert(0, "Axe des X")
    axeX.grid(column=2, row=8, sticky=W)
    ttk.Label(mainframe, text="Nom de l'axe des x :").grid(column=1, row=8, sticky=E)

    #champ("axeY", "Axe des Y", 2, 9, "Nom de l'axe des y :", 1, 9, 20)
    axeY = StringVar()
    axeY = ttk.Entry(mainframe, width=20, textvariable=axeY)
    axeY.insert(0, "Axe des Y")
    axeY.grid(column=2, row=9, sticky=W)
    ttk.Label(mainframe, text="Nom de l'axe des y :").grid(column=1, row=9, sticky=E)

    #champ("sortie", "image.png", 2, 10, "Nom du .png sauvegardé :", 1, 10, 20)
    sortie = StringVar()
    sortie = ttk.Entry(mainframe, width=20, textvariable=sortie)
    sortie.insert(0, "image.png")
    sortie.grid(column=2, row=10, sticky=W)
    ttk.Label(mainframe, text="Nom du .png sauvegardé :").grid(column=1, row=10, sticky=E)

    ttk.Button(mainframe, text="clic !", command=callback).grid(column=4, row=10, sticky=W)
    ttk.Button(mainframe, text='Quitter', command=quit).grid(column=5, row=10, sticky=W)

    for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
    mainloop()
#/usr/bin/env python
#-*-编码:utf-8-*-
从操作系统导入getcwd,路径
将Tkinter作为tk导入
从Tkinter进口*
将tkFileDialog作为filedialog导入
进口舒蒂尔
导入ttk
作为pd进口熊猫
将numpy作为np导入
将matplotlib.pyplot作为plt导入
导入matplotlib
matplotlib.style.use('ggplot')
wd=getcwd()#工作目录
类应用程序(ttk.Frame):#不使用
def uuu init uuu(self,master=None):
ttk.Frame.\uuuuu初始化(自,主)
self.grid()
self.createWidgets()
def createWidgets(自):
self.quitButton=ttk.Button(self,text='Quitter',command=self.quit)
self.quitButton.grid(列=2,行=3)
def champ(名称、德法特、上校、兰、实验室、合作、兰实验室、拉格乌尔=7):
nom=StringVar()#不要运行
nom=ttk.Entry(大型机,宽度=largeur,文本变量=nom)
编号插入(0,脱脂)
如果名称绑定(“”):
名称删除(0,“结束”)
名称网格(列=col,行=ran,粘滞=W)
标签(大型机,text=lab).grid(列=collab,行=ranlab,粘滞=E)
def champdouble(nom1,defaut1,nom2,defaut2,col,ran,lab,lab2,collab,ranlab,largeur=7):#不要运行
nom1=StringVar()
nom1=ttk.Entry(大型机,宽度=largeur,textvariable=nom1)
编号1.插入(0,删除1)
nom1.网格(列=col,行=ran,粘性=W)
标签(大型机,text=lab).grid(列=collab,行=ranlab,粘滞=E)
nom2=StringVar()
nom2=ttk.Entry(大型机,宽度=largeur,textvariable=nom2)
编号2.插入(0,删除2)
nom2.网格(列=col+2,行=ran,粘性=W)
Label(大型机,text=lab2).grid(列=collab+2,行=ranlab,粘滞=E)
进入时的def单击(事件):
“”“每当单击条目时调用的函数”“”
全局目录名
如果file1.get()='Choisissez un fichier…':
file1.delete(0,“end”)#删除条目中的所有文本
dirinit=r'C:/'
dirname=filedialog.askopenfilename(父类=大型机,initialdir=dirinit,title='Sélectionnez le fichier')
文件1.插入(0,目录名)#为用户输入插入空白
def on_entry_click1(事件):
“”“每当单击条目时调用的函数”“”
全局dirname2
如果file2.get()=“Choisissez un fichier…”:
file2.delete(0,“end”)#删除条目中的所有文本
dirinit=r'C:/'
dirname2=filedialog.askopenfilename(父级=大型机,initialdir=dirinit,title='Sélectionnez le fichier')
文件2.插入(0,目录名2)#为用户输入插入空白
def callback():
def培训(菲希尔、德布、财务):
df=pd.read#csv(fichier,sep='\t',engine='python',header=deb,skipfooter=fin)#
df=df.rename(columns={'$Relations:NumZoneE':'NumZoneE'})#Renommage des entêtes de colonnes
df=df[(df.NumZoneE!=df.NumZoneA)]#区内抑制

df=df[(Df.NoZoNee)p>您只忘记引用实例的<代码>“自我/代码>参数”。在C++或java中,<>代码>该代码是自动引用实例的关键字。Python使用了不同的约定:方法定义的第一个参数是对实例的引用,按照惯例,Python程序员使用“COD”。e> self
作为实例引用名称。常用用法为:

>>> class App(object):   # defines a class
    def functionInClass(self, arg1, arg2):  # declares a method with 2 parameters
        pass # add more insteresting stuff later...
        self._arg1 = arg1  # how to set a instance member for later reuse


>>> a = App() # creates an instance of App
>>> a.functionInClass("arg1", "arg2") # and call the method on the instance

哦,我的…我在其他代码中使用了它…这是一个拼写错误,self中的“u”。_arg1?否则我不明白。谢谢你的回答!
>>> class App(object):   # defines a class
    def functionInClass(self, arg1, arg2):  # declares a method with 2 parameters
        pass # add more insteresting stuff later...
        self._arg1 = arg1  # how to set a instance member for later reuse


>>> a = App() # creates an instance of App
>>> a.functionInClass("arg1", "arg2") # and call the method on the instance