我尝试用Python(2.7)(以及我的英语......)来提高我的初学技能。
我写了一个代码来比较图表中的2个文件。那是有用的! 因此,我尝试创建一个界面,以便更轻松地更改标题,范围,轴的名称......
我使用Tk库和ttk。我首先为框架创建一个类并为重复任务定义函数。 “这是一个好主意”,我想。哈哈哈。 我遇到的一些问题:
我解释说:
Class App(Object):
functionInClass(arg1, arg2):
pass
和
functionOutClass(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()
答案 0 :(得分:0)
您只是忘记了用于引用该实例的self
参数。在C ++或Java中,this
是自动引用实例的关键字。 Python使用不同的约定:方法的定义的第一个参数是对实例的引用,并且按照惯例,Python程序员使用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